{
  "schemaVersion": "1.0",
  "item": {
    "slug": "zoho-inventory",
    "name": "Zoho Inventory",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/byungkyu/zoho-inventory",
    "canonicalUrl": "https://clawhub.ai/byungkyu/zoho-inventory",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/zoho-inventory",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=zoho-inventory",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md",
      "LICENSE.txt"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-05-07T17:22:31.273Z",
      "expiresAt": "2026-05-14T17:22:31.273Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=afrexai-annual-report",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=afrexai-annual-report",
        "contentDisposition": "attachment; filename=\"afrexai-annual-report-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/zoho-inventory"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/zoho-inventory",
    "agentPageUrl": "https://openagent3.xyz/skills/zoho-inventory/agent",
    "manifestUrl": "https://openagent3.xyz/skills/zoho-inventory/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/zoho-inventory/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "Zoho Inventory",
        "body": "Access the Zoho Inventory API with managed OAuth authentication. Manage items, sales orders, invoices, purchase orders, bills, contacts, shipment orders, and item groups with full CRUD operations."
      },
      {
        "title": "Quick Start",
        "body": "# List items\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-inventory/inventory/v1/items')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF"
      },
      {
        "title": "Base URL",
        "body": "https://gateway.maton.ai/zoho-inventory/inventory/v1/{endpoint}\n\nThe gateway proxies requests to www.zohoapis.com/inventory/v1 and automatically injects your OAuth token."
      },
      {
        "title": "Authentication",
        "body": "All requests require the Maton API key in the Authorization header:\n\nAuthorization: Bearer $MATON_API_KEY\n\nEnvironment Variable: Set your API key as MATON_API_KEY:\n\nexport MATON_API_KEY=\"YOUR_API_KEY\""
      },
      {
        "title": "Getting Your API Key",
        "body": "Sign in or create an account at maton.ai\nGo to maton.ai/settings\nCopy your API key"
      },
      {
        "title": "Connection Management",
        "body": "Manage your Zoho Inventory OAuth connections at https://ctrl.maton.ai."
      },
      {
        "title": "List Connections",
        "body": "python <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://ctrl.maton.ai/connections?app=zoho-inventory&status=ACTIVE')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF"
      },
      {
        "title": "Create Connection",
        "body": "python <<'EOF'\nimport urllib.request, os, json\ndata = json.dumps({'app': 'zoho-inventory'}).encode()\nreq = urllib.request.Request('https://ctrl.maton.ai/connections', data=data, method='POST')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nreq.add_header('Content-Type', 'application/json')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF"
      },
      {
        "title": "Get Connection",
        "body": "python <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\nResponse:\n\n{\n  \"connection\": {\n    \"connection_id\": \"21fd90f9-5935-43cd-b6c8-bde9d915ca80\",\n    \"status\": \"ACTIVE\",\n    \"creation_time\": \"2025-12-08T07:20:53.488460Z\",\n    \"last_updated_time\": \"2026-01-31T20:03:32.593153Z\",\n    \"url\": \"https://connect.maton.ai/?session_token=...\",\n    \"app\": \"zoho-inventory\",\n    \"metadata\": {}\n  }\n}\n\nOpen the returned url in a browser to complete OAuth authorization."
      },
      {
        "title": "Delete Connection",
        "body": "python <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}', method='DELETE')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF"
      },
      {
        "title": "Specifying Connection",
        "body": "If you have multiple Zoho Inventory connections, specify which one to use with the Maton-Connection header:\n\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-inventory/inventory/v1/items')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nreq.add_header('Maton-Connection', '21fd90f9-5935-43cd-b6c8-bde9d915ca80')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\nIf omitted, the gateway uses the default (oldest) active connection."
      },
      {
        "title": "Available Modules",
        "body": "ModuleEndpointDescriptionItems/itemsProducts and servicesItem Groups/itemgroupsGrouped product variantsContacts/contactsCustomers and vendorsSales Orders/salesordersSales ordersInvoices/invoicesSales invoicesPurchase Orders/purchaseordersPurchase ordersBills/billsVendor billsShipment Orders/shipmentordersShipment tracking"
      },
      {
        "title": "Items",
        "body": "List Items\n\nGET /zoho-inventory/inventory/v1/items\n\nExample:\n\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-inventory/inventory/v1/items')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\nResponse:\n\n{\n  \"code\": 0,\n  \"message\": \"success\",\n  \"items\": [\n    {\n      \"item_id\": \"1234567890000\",\n      \"name\": \"Widget\",\n      \"status\": \"active\",\n      \"sku\": \"WDG-001\",\n      \"rate\": 25.00,\n      \"purchase_rate\": 10.00,\n      \"is_taxable\": true\n    }\n  ],\n  \"page_context\": {\n    \"page\": 1,\n    \"per_page\": 200,\n    \"has_more_page\": false\n  }\n}\n\nGet Item\n\nGET /zoho-inventory/inventory/v1/items/{item_id}\n\nCreate Item\n\nPOST /zoho-inventory/inventory/v1/items\nContent-Type: application/json\n\n{\n  \"name\": \"Widget\",\n  \"rate\": 25.00,\n  \"purchase_rate\": 10.00,\n  \"sku\": \"WDG-001\",\n  \"item_type\": \"inventory\",\n  \"product_type\": \"goods\",\n  \"unit\": \"pcs\",\n  \"is_taxable\": true\n}\n\nRequired Fields:\n\nname - Item name\n\nOptional Fields:\n\nrate - Sales price\npurchase_rate - Purchase cost\nsku - Stock keeping unit (unique)\nitem_type - inventory, sales, purchases, or sales_and_purchases\nproduct_type - goods or service\nunit - Unit of measurement\nis_taxable - Tax applicability\ntax_id - Tax identifier\ndescription - Item description\nreorder_level - Reorder point\nvendor_id - Preferred vendor\n\nExample:\n\npython <<'EOF'\nimport urllib.request, os, json\ndata = json.dumps({\n    \"name\": \"Widget\",\n    \"rate\": 25.00,\n    \"purchase_rate\": 10.00,\n    \"sku\": \"WDG-001\",\n    \"item_type\": \"inventory\",\n    \"product_type\": \"goods\",\n    \"unit\": \"pcs\"\n}).encode()\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-inventory/inventory/v1/items', data=data, method='POST')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nreq.add_header('Content-Type', 'application/json')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\nResponse:\n\n{\n  \"code\": 0,\n  \"message\": \"The item has been added.\",\n  \"item\": {\n    \"item_id\": \"1234567890000\",\n    \"name\": \"Widget\",\n    \"status\": \"active\",\n    \"rate\": 25.00,\n    \"purchase_rate\": 10.00,\n    \"sku\": \"WDG-001\"\n  }\n}\n\nUpdate Item\n\nPUT /zoho-inventory/inventory/v1/items/{item_id}\nContent-Type: application/json\n\n{\n  \"name\": \"Updated Widget\",\n  \"rate\": 30.00\n}\n\nDelete Item\n\nDELETE /zoho-inventory/inventory/v1/items/{item_id}\n\nItem Status Actions\n\n# Mark as active\nPOST /zoho-inventory/inventory/v1/items/{item_id}/active\n\n# Mark as inactive\nPOST /zoho-inventory/inventory/v1/items/{item_id}/inactive"
      },
      {
        "title": "Contacts",
        "body": "List Contacts\n\nGET /zoho-inventory/inventory/v1/contacts\n\nQuery Parameters:\n\nfilter_by - Status.All, Status.Active, Status.Inactive, Status.Duplicate, Status.Crm\nsearch_text - Search across contact fields\nsort_column - contact_name, first_name, last_name, email, created_time, last_modified_time\ncontact_name, company_name, email, phone - Field-specific filters\n\nExample:\n\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-inventory/inventory/v1/contacts')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\nGet Contact\n\nGET /zoho-inventory/inventory/v1/contacts/{contact_id}\n\nCreate Contact\n\nPOST /zoho-inventory/inventory/v1/contacts\nContent-Type: application/json\n\n{\n  \"contact_name\": \"Acme Corporation\",\n  \"contact_type\": \"customer\",\n  \"company_name\": \"Acme Corp\",\n  \"email\": \"billing@acme.com\",\n  \"phone\": \"+1-555-1234\"\n}\n\nRequired Fields:\n\ncontact_name - Display name\n\nOptional Fields:\n\ncontact_type - customer or vendor\ncompany_name - Legal entity name\nemail - Email address\nphone - Phone number\nbilling_address - Address object\nshipping_address - Address object\npayment_terms - Days for payment\ncurrency_id - Currency identifier\nwebsite - Website URL\n\nUpdate Contact\n\nPUT /zoho-inventory/inventory/v1/contacts/{contact_id}\n\nDelete Contact\n\nDELETE /zoho-inventory/inventory/v1/contacts/{contact_id}\n\nContact Status Actions\n\n# Mark as active\nPOST /zoho-inventory/inventory/v1/contacts/{contact_id}/active\n\n# Mark as inactive\nPOST /zoho-inventory/inventory/v1/contacts/{contact_id}/inactive"
      },
      {
        "title": "Sales Orders",
        "body": "List Sales Orders\n\nGET /zoho-inventory/inventory/v1/salesorders\n\nExample:\n\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-inventory/inventory/v1/salesorders')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\nGet Sales Order\n\nGET /zoho-inventory/inventory/v1/salesorders/{salesorder_id}\n\nCreate Sales Order\n\nPOST /zoho-inventory/inventory/v1/salesorders\nContent-Type: application/json\n\n{\n  \"customer_id\": \"1234567890000\",\n  \"date\": \"2026-02-06\",\n  \"line_items\": [\n    {\n      \"item_id\": \"1234567890001\",\n      \"quantity\": 5,\n      \"rate\": 25.00\n    }\n  ]\n}\n\nRequired Fields:\n\ncustomer_id - Customer identifier\nline_items - Array of items with item_id, quantity, rate\n\nOptional Fields:\n\nsalesorder_number - Auto-generated if not specified (do not specify if auto-generation is enabled)\ndate - Order date (yyyy-mm-dd)\nshipment_date - Expected shipment date\nreference_number - External reference\nnotes - Internal notes\nterms - Terms and conditions\ndiscount - Discount percentage or amount\nshipping_charge - Shipping cost\nadjustment - Price adjustment\n\nUpdate Sales Order\n\nPUT /zoho-inventory/inventory/v1/salesorders/{salesorder_id}\n\nDelete Sales Order\n\nDELETE /zoho-inventory/inventory/v1/salesorders/{salesorder_id}\n\nSales Order Status Actions\n\n# Mark as confirmed\nPOST /zoho-inventory/inventory/v1/salesorders/{salesorder_id}/status/confirmed\n\n# Mark as void\nPOST /zoho-inventory/inventory/v1/salesorders/{salesorder_id}/status/void"
      },
      {
        "title": "Invoices",
        "body": "List Invoices\n\nGET /zoho-inventory/inventory/v1/invoices\n\nExample:\n\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-inventory/inventory/v1/invoices')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\nGet Invoice\n\nGET /zoho-inventory/inventory/v1/invoices/{invoice_id}\n\nCreate Invoice\n\nPOST /zoho-inventory/inventory/v1/invoices\nContent-Type: application/json\n\n{\n  \"customer_id\": \"1234567890000\",\n  \"line_items\": [\n    {\n      \"item_id\": \"1234567890001\",\n      \"quantity\": 5,\n      \"rate\": 25.00\n    }\n  ]\n}\n\nRequired Fields:\n\ncustomer_id - Customer identifier\nline_items - Array of items\n\nOptional Fields:\n\ninvoice_number - Auto-generated if not specified\ndate - Invoice date (yyyy-mm-dd)\ndue_date - Payment due date\npayment_terms - Days until due\ndiscount - Discount percentage or amount\nshipping_charge - Shipping cost\nnotes - Internal notes\nterms - Terms and conditions\n\nUpdate Invoice\n\nPUT /zoho-inventory/inventory/v1/invoices/{invoice_id}\n\nDelete Invoice\n\nDELETE /zoho-inventory/inventory/v1/invoices/{invoice_id}\n\nInvoice Status Actions\n\n# Mark as sent\nPOST /zoho-inventory/inventory/v1/invoices/{invoice_id}/status/sent\n\n# Mark as draft\nPOST /zoho-inventory/inventory/v1/invoices/{invoice_id}/status/draft\n\n# Void invoice\nPOST /zoho-inventory/inventory/v1/invoices/{invoice_id}/status/void\n\nInvoice Email\n\n# Email invoice to customer\nPOST /zoho-inventory/inventory/v1/invoices/{invoice_id}/email\n\n# Get email content template\nGET /zoho-inventory/inventory/v1/invoices/{invoice_id}/email\n\nInvoice Payments\n\n# List payments applied\nGET /zoho-inventory/inventory/v1/invoices/{invoice_id}/payments\n\n# Delete a payment\nDELETE /zoho-inventory/inventory/v1/invoices/{invoice_id}/payments/{invoice_payment_id}\n\nInvoice Credits\n\n# List credits applied\nGET /zoho-inventory/inventory/v1/invoices/{invoice_id}/creditsapplied\n\n# Apply credits\nPOST /zoho-inventory/inventory/v1/invoices/{invoice_id}/credits\n\n# Delete applied credit\nDELETE /zoho-inventory/inventory/v1/invoices/{invoice_id}/creditsapplied/{creditnotes_invoice_id}\n\nInvoice Comments\n\n# List comments\nGET /zoho-inventory/inventory/v1/invoices/{invoice_id}/comments\n\n# Add comment\nPOST /zoho-inventory/inventory/v1/invoices/{invoice_id}/comments\n\n# Update comment\nPUT /zoho-inventory/inventory/v1/invoices/{invoice_id}/comments/{comment_id}\n\n# Delete comment\nDELETE /zoho-inventory/inventory/v1/invoices/{invoice_id}/comments/{comment_id}"
      },
      {
        "title": "Purchase Orders",
        "body": "List Purchase Orders\n\nGET /zoho-inventory/inventory/v1/purchaseorders\n\nExample:\n\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-inventory/inventory/v1/purchaseorders')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\nGet Purchase Order\n\nGET /zoho-inventory/inventory/v1/purchaseorders/{purchaseorder_id}\n\nCreate Purchase Order\n\nPOST /zoho-inventory/inventory/v1/purchaseorders\nContent-Type: application/json\n\n{\n  \"vendor_id\": \"1234567890000\",\n  \"line_items\": [\n    {\n      \"item_id\": \"1234567890001\",\n      \"quantity\": 100,\n      \"rate\": 10.00\n    }\n  ]\n}\n\nRequired Fields:\n\nvendor_id - Vendor identifier\nline_items - Array of items\n\nOptional Fields:\n\npurchaseorder_number - Auto-generated if not specified (do not specify if auto-generation is enabled)\ndate - Order date (yyyy-mm-dd)\ndelivery_date - Expected delivery date\nreference_number - External reference\nship_via - Shipping method\nnotes - Internal notes\nterms - Terms and conditions\n\nUpdate Purchase Order\n\nPUT /zoho-inventory/inventory/v1/purchaseorders/{purchaseorder_id}\n\nDelete Purchase Order\n\nDELETE /zoho-inventory/inventory/v1/purchaseorders/{purchaseorder_id}\n\nPurchase Order Status Actions\n\n# Mark as issued\nPOST /zoho-inventory/inventory/v1/purchaseorders/{purchaseorder_id}/status/issued\n\n# Mark as cancelled\nPOST /zoho-inventory/inventory/v1/purchaseorders/{purchaseorder_id}/status/cancelled"
      },
      {
        "title": "Bills",
        "body": "List Bills\n\nGET /zoho-inventory/inventory/v1/bills\n\nExample:\n\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-inventory/inventory/v1/bills')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\nGet Bill\n\nGET /zoho-inventory/inventory/v1/bills/{bill_id}\n\nCreate Bill\n\nPOST /zoho-inventory/inventory/v1/bills\nContent-Type: application/json\n\n{\n  \"vendor_id\": \"1234567890000\",\n  \"bill_number\": \"BILL-001\",\n  \"date\": \"2026-02-06\",\n  \"due_date\": \"2026-03-06\",\n  \"line_items\": [\n    {\n      \"item_id\": \"1234567890001\",\n      \"quantity\": 100,\n      \"rate\": 10.00\n    }\n  ]\n}\n\nRequired Fields:\n\nvendor_id - Vendor identifier\nbill_number - Unique bill number (required, not auto-generated)\ndate - Bill date (yyyy-mm-dd)\ndue_date - Payment due date\nline_items - Array of items\n\nOptional Fields:\n\nreference_number - External reference\nnotes - Internal notes\nterms - Terms and conditions\ncurrency_id - Currency identifier\nexchange_rate - Exchange rate for foreign currency\n\nUpdate Bill\n\nPUT /zoho-inventory/inventory/v1/bills/{bill_id}\n\nDelete Bill\n\nDELETE /zoho-inventory/inventory/v1/bills/{bill_id}\n\nBill Status Actions\n\n# Mark as open\nPOST /zoho-inventory/inventory/v1/bills/{bill_id}/status/open\n\n# Mark as void\nPOST /zoho-inventory/inventory/v1/bills/{bill_id}/status/void"
      },
      {
        "title": "Shipment Orders",
        "body": "Create Shipment Order\n\nPOST /zoho-inventory/inventory/v1/shipmentorders\nContent-Type: application/json\n\n{\n  \"shipment_number\": \"SHP-001\",\n  \"date\": \"2026-02-06\",\n  \"delivery_method\": \"FedEx\",\n  \"tracking_number\": \"1234567890\"\n}\n\nRequired Fields:\n\nshipment_number - Unique shipment number\ndate - Shipment date\ndelivery_method - Carrier/delivery method\n\nOptional Fields:\n\ntracking_number - Carrier tracking number\nshipping_charge - Shipping cost\nnotes - Internal notes\nreference_number - External reference\n\nGet Shipment Order\n\nGET /zoho-inventory/inventory/v1/shipmentorders/{shipmentorder_id}\n\nUpdate Shipment Order\n\nPUT /zoho-inventory/inventory/v1/shipmentorders/{shipmentorder_id}\n\nDelete Shipment Order\n\nDELETE /zoho-inventory/inventory/v1/shipmentorders/{shipmentorder_id}\n\nMark as Delivered\n\nPOST /zoho-inventory/inventory/v1/shipmentorders/{shipmentorder_id}/status/delivered"
      },
      {
        "title": "Item Groups",
        "body": "List Item Groups\n\nGET /zoho-inventory/inventory/v1/itemgroups\n\nGet Item Group\n\nGET /zoho-inventory/inventory/v1/itemgroups/{itemgroup_id}\n\nCreate Item Group\n\nPOST /zoho-inventory/inventory/v1/itemgroups\nContent-Type: application/json\n\n{\n  \"group_name\": \"T-Shirts\",\n  \"unit\": \"pcs\",\n  \"items\": [\n    {\n      \"name\": \"T-Shirt - Small\",\n      \"rate\": 20.00,\n      \"purchase_rate\": 8.00,\n      \"sku\": \"TS-S\"\n    },\n    {\n      \"name\": \"T-Shirt - Medium\",\n      \"rate\": 20.00,\n      \"purchase_rate\": 8.00,\n      \"sku\": \"TS-M\"\n    }\n  ]\n}\n\nRequired Fields:\n\ngroup_name - Group name\nunit - Unit of measurement\n\nUpdate Item Group\n\nPUT /zoho-inventory/inventory/v1/itemgroups/{itemgroup_id}\n\nDelete Item Group\n\nDELETE /zoho-inventory/inventory/v1/itemgroups/{itemgroup_id}\n\nItem Group Status Actions\n\n# Mark as active\nPOST /zoho-inventory/inventory/v1/itemgroups/{itemgroup_id}/active\n\n# Mark as inactive\nPOST /zoho-inventory/inventory/v1/itemgroups/{itemgroup_id}/inactive"
      },
      {
        "title": "Pagination",
        "body": "Zoho Inventory uses page-based pagination:\n\nGET /zoho-inventory/inventory/v1/items?page=1&per_page=50\n\nResponse includes pagination info in page_context:\n\n{\n  \"code\": 0,\n  \"message\": \"success\",\n  \"items\": [...],\n  \"page_context\": {\n    \"page\": 1,\n    \"per_page\": 50,\n    \"has_more_page\": true,\n    \"sort_column\": \"name\",\n    \"sort_order\": \"A\"\n  }\n}\n\nContinue fetching while has_more_page is true, incrementing page each time."
      },
      {
        "title": "JavaScript",
        "body": "const response = await fetch(\n  'https://gateway.maton.ai/zoho-inventory/inventory/v1/items',\n  {\n    headers: {\n      'Authorization': `Bearer ${process.env.MATON_API_KEY}`\n    }\n  }\n);\nconst data = await response.json();"
      },
      {
        "title": "Python",
        "body": "import os\nimport requests\n\nresponse = requests.get(\n    'https://gateway.maton.ai/zoho-inventory/inventory/v1/items',\n    headers={'Authorization': f'Bearer {os.environ[\"MATON_API_KEY\"]}'}\n)\ndata = response.json()"
      },
      {
        "title": "Notes",
        "body": "All successful responses have code: 0 and a message field\nDates should be in yyyy-mm-dd format\nContact types are customer or vendor\nItem types: inventory, sales, purchases, sales_and_purchases\nProduct types: goods or service\nThe organization_id parameter is automatically handled by the gateway - you do not need to specify it\nSales order and purchase order numbers are auto-generated by default - do not specify salesorder_number or purchaseorder_number unless auto-generation is disabled in settings\nStatus action endpoints use POST method (e.g., /status/confirmed, /status/void)\nRate limits: 100 requests/minute per organization\nDaily limits vary by plan: Free (1,000), Standard (2,500), Professional (5,000), Premium (7,500), Enterprise (10,000)\nIMPORTANT: When using curl commands, use curl -g when URLs contain brackets to disable glob parsing\nIMPORTANT: When piping curl output to jq or other commands, environment variables like $MATON_API_KEY may not expand correctly in some shell environments"
      },
      {
        "title": "Error Handling",
        "body": "StatusMeaning400Missing Zoho Inventory connection or invalid request401Invalid or missing Maton API key, or OAuth scope mismatch404Resource not found429Rate limited4xx/5xxPassthrough error from Zoho Inventory API"
      },
      {
        "title": "Common Error Codes",
        "body": "CodeDescription0Success1Invalid value2Mandatory field missing3Resource does not exist5Invalid URL"
      },
      {
        "title": "Troubleshooting: API Key Issues",
        "body": "Check that the MATON_API_KEY environment variable is set:\n\necho $MATON_API_KEY\n\nVerify the API key is valid by listing connections:\n\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://ctrl.maton.ai/connections')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF"
      },
      {
        "title": "Troubleshooting: Invalid App Name",
        "body": "Ensure your URL path starts with zoho-inventory. For example:\n\nCorrect: https://gateway.maton.ai/zoho-inventory/inventory/v1/items\nIncorrect: https://gateway.maton.ai/inventory/v1/items"
      },
      {
        "title": "Resources",
        "body": "Zoho Inventory API v1 Introduction\nZoho Inventory Items API\nZoho Inventory Contacts API\nZoho Inventory Sales Orders API\nZoho Inventory Invoices API\nZoho Inventory Purchase Orders API\nZoho Inventory Bills API\nMaton Community\nMaton Support"
      }
    ],
    "body": "Zoho Inventory\n\nAccess the Zoho Inventory API with managed OAuth authentication. Manage items, sales orders, invoices, purchase orders, bills, contacts, shipment orders, and item groups with full CRUD operations.\n\nQuick Start\n# List items\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-inventory/inventory/v1/items')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\nBase URL\nhttps://gateway.maton.ai/zoho-inventory/inventory/v1/{endpoint}\n\n\nThe gateway proxies requests to www.zohoapis.com/inventory/v1 and automatically injects your OAuth token.\n\nAuthentication\n\nAll requests require the Maton API key in the Authorization header:\n\nAuthorization: Bearer $MATON_API_KEY\n\n\nEnvironment Variable: Set your API key as MATON_API_KEY:\n\nexport MATON_API_KEY=\"YOUR_API_KEY\"\n\nGetting Your API Key\nSign in or create an account at maton.ai\nGo to maton.ai/settings\nCopy your API key\nConnection Management\n\nManage your Zoho Inventory OAuth connections at https://ctrl.maton.ai.\n\nList Connections\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://ctrl.maton.ai/connections?app=zoho-inventory&status=ACTIVE')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\nCreate Connection\npython <<'EOF'\nimport urllib.request, os, json\ndata = json.dumps({'app': 'zoho-inventory'}).encode()\nreq = urllib.request.Request('https://ctrl.maton.ai/connections', data=data, method='POST')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nreq.add_header('Content-Type', 'application/json')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\nGet Connection\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\n\nResponse:\n\n{\n  \"connection\": {\n    \"connection_id\": \"21fd90f9-5935-43cd-b6c8-bde9d915ca80\",\n    \"status\": \"ACTIVE\",\n    \"creation_time\": \"2025-12-08T07:20:53.488460Z\",\n    \"last_updated_time\": \"2026-01-31T20:03:32.593153Z\",\n    \"url\": \"https://connect.maton.ai/?session_token=...\",\n    \"app\": \"zoho-inventory\",\n    \"metadata\": {}\n  }\n}\n\n\nOpen the returned url in a browser to complete OAuth authorization.\n\nDelete Connection\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}', method='DELETE')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\nSpecifying Connection\n\nIf you have multiple Zoho Inventory connections, specify which one to use with the Maton-Connection header:\n\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-inventory/inventory/v1/items')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nreq.add_header('Maton-Connection', '21fd90f9-5935-43cd-b6c8-bde9d915ca80')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\n\nIf omitted, the gateway uses the default (oldest) active connection.\n\nAPI Reference\nAvailable Modules\nModule\tEndpoint\tDescription\nItems\t/items\tProducts and services\nItem Groups\t/itemgroups\tGrouped product variants\nContacts\t/contacts\tCustomers and vendors\nSales Orders\t/salesorders\tSales orders\nInvoices\t/invoices\tSales invoices\nPurchase Orders\t/purchaseorders\tPurchase orders\nBills\t/bills\tVendor bills\nShipment Orders\t/shipmentorders\tShipment tracking\nItems\nList Items\nGET /zoho-inventory/inventory/v1/items\n\n\nExample:\n\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-inventory/inventory/v1/items')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\n\nResponse:\n\n{\n  \"code\": 0,\n  \"message\": \"success\",\n  \"items\": [\n    {\n      \"item_id\": \"1234567890000\",\n      \"name\": \"Widget\",\n      \"status\": \"active\",\n      \"sku\": \"WDG-001\",\n      \"rate\": 25.00,\n      \"purchase_rate\": 10.00,\n      \"is_taxable\": true\n    }\n  ],\n  \"page_context\": {\n    \"page\": 1,\n    \"per_page\": 200,\n    \"has_more_page\": false\n  }\n}\n\nGet Item\nGET /zoho-inventory/inventory/v1/items/{item_id}\n\nCreate Item\nPOST /zoho-inventory/inventory/v1/items\nContent-Type: application/json\n\n{\n  \"name\": \"Widget\",\n  \"rate\": 25.00,\n  \"purchase_rate\": 10.00,\n  \"sku\": \"WDG-001\",\n  \"item_type\": \"inventory\",\n  \"product_type\": \"goods\",\n  \"unit\": \"pcs\",\n  \"is_taxable\": true\n}\n\n\nRequired Fields:\n\nname - Item name\n\nOptional Fields:\n\nrate - Sales price\npurchase_rate - Purchase cost\nsku - Stock keeping unit (unique)\nitem_type - inventory, sales, purchases, or sales_and_purchases\nproduct_type - goods or service\nunit - Unit of measurement\nis_taxable - Tax applicability\ntax_id - Tax identifier\ndescription - Item description\nreorder_level - Reorder point\nvendor_id - Preferred vendor\n\nExample:\n\npython <<'EOF'\nimport urllib.request, os, json\ndata = json.dumps({\n    \"name\": \"Widget\",\n    \"rate\": 25.00,\n    \"purchase_rate\": 10.00,\n    \"sku\": \"WDG-001\",\n    \"item_type\": \"inventory\",\n    \"product_type\": \"goods\",\n    \"unit\": \"pcs\"\n}).encode()\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-inventory/inventory/v1/items', data=data, method='POST')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nreq.add_header('Content-Type', 'application/json')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\n\nResponse:\n\n{\n  \"code\": 0,\n  \"message\": \"The item has been added.\",\n  \"item\": {\n    \"item_id\": \"1234567890000\",\n    \"name\": \"Widget\",\n    \"status\": \"active\",\n    \"rate\": 25.00,\n    \"purchase_rate\": 10.00,\n    \"sku\": \"WDG-001\"\n  }\n}\n\nUpdate Item\nPUT /zoho-inventory/inventory/v1/items/{item_id}\nContent-Type: application/json\n\n{\n  \"name\": \"Updated Widget\",\n  \"rate\": 30.00\n}\n\nDelete Item\nDELETE /zoho-inventory/inventory/v1/items/{item_id}\n\nItem Status Actions\n# Mark as active\nPOST /zoho-inventory/inventory/v1/items/{item_id}/active\n\n# Mark as inactive\nPOST /zoho-inventory/inventory/v1/items/{item_id}/inactive\n\nContacts\nList Contacts\nGET /zoho-inventory/inventory/v1/contacts\n\n\nQuery Parameters:\n\nfilter_by - Status.All, Status.Active, Status.Inactive, Status.Duplicate, Status.Crm\nsearch_text - Search across contact fields\nsort_column - contact_name, first_name, last_name, email, created_time, last_modified_time\ncontact_name, company_name, email, phone - Field-specific filters\n\nExample:\n\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-inventory/inventory/v1/contacts')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\nGet Contact\nGET /zoho-inventory/inventory/v1/contacts/{contact_id}\n\nCreate Contact\nPOST /zoho-inventory/inventory/v1/contacts\nContent-Type: application/json\n\n{\n  \"contact_name\": \"Acme Corporation\",\n  \"contact_type\": \"customer\",\n  \"company_name\": \"Acme Corp\",\n  \"email\": \"billing@acme.com\",\n  \"phone\": \"+1-555-1234\"\n}\n\n\nRequired Fields:\n\ncontact_name - Display name\n\nOptional Fields:\n\ncontact_type - customer or vendor\ncompany_name - Legal entity name\nemail - Email address\nphone - Phone number\nbilling_address - Address object\nshipping_address - Address object\npayment_terms - Days for payment\ncurrency_id - Currency identifier\nwebsite - Website URL\nUpdate Contact\nPUT /zoho-inventory/inventory/v1/contacts/{contact_id}\n\nDelete Contact\nDELETE /zoho-inventory/inventory/v1/contacts/{contact_id}\n\nContact Status Actions\n# Mark as active\nPOST /zoho-inventory/inventory/v1/contacts/{contact_id}/active\n\n# Mark as inactive\nPOST /zoho-inventory/inventory/v1/contacts/{contact_id}/inactive\n\nSales Orders\nList Sales Orders\nGET /zoho-inventory/inventory/v1/salesorders\n\n\nExample:\n\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-inventory/inventory/v1/salesorders')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\nGet Sales Order\nGET /zoho-inventory/inventory/v1/salesorders/{salesorder_id}\n\nCreate Sales Order\nPOST /zoho-inventory/inventory/v1/salesorders\nContent-Type: application/json\n\n{\n  \"customer_id\": \"1234567890000\",\n  \"date\": \"2026-02-06\",\n  \"line_items\": [\n    {\n      \"item_id\": \"1234567890001\",\n      \"quantity\": 5,\n      \"rate\": 25.00\n    }\n  ]\n}\n\n\nRequired Fields:\n\ncustomer_id - Customer identifier\nline_items - Array of items with item_id, quantity, rate\n\nOptional Fields:\n\nsalesorder_number - Auto-generated if not specified (do not specify if auto-generation is enabled)\ndate - Order date (yyyy-mm-dd)\nshipment_date - Expected shipment date\nreference_number - External reference\nnotes - Internal notes\nterms - Terms and conditions\ndiscount - Discount percentage or amount\nshipping_charge - Shipping cost\nadjustment - Price adjustment\nUpdate Sales Order\nPUT /zoho-inventory/inventory/v1/salesorders/{salesorder_id}\n\nDelete Sales Order\nDELETE /zoho-inventory/inventory/v1/salesorders/{salesorder_id}\n\nSales Order Status Actions\n# Mark as confirmed\nPOST /zoho-inventory/inventory/v1/salesorders/{salesorder_id}/status/confirmed\n\n# Mark as void\nPOST /zoho-inventory/inventory/v1/salesorders/{salesorder_id}/status/void\n\nInvoices\nList Invoices\nGET /zoho-inventory/inventory/v1/invoices\n\n\nExample:\n\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-inventory/inventory/v1/invoices')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\nGet Invoice\nGET /zoho-inventory/inventory/v1/invoices/{invoice_id}\n\nCreate Invoice\nPOST /zoho-inventory/inventory/v1/invoices\nContent-Type: application/json\n\n{\n  \"customer_id\": \"1234567890000\",\n  \"line_items\": [\n    {\n      \"item_id\": \"1234567890001\",\n      \"quantity\": 5,\n      \"rate\": 25.00\n    }\n  ]\n}\n\n\nRequired Fields:\n\ncustomer_id - Customer identifier\nline_items - Array of items\n\nOptional Fields:\n\ninvoice_number - Auto-generated if not specified\ndate - Invoice date (yyyy-mm-dd)\ndue_date - Payment due date\npayment_terms - Days until due\ndiscount - Discount percentage or amount\nshipping_charge - Shipping cost\nnotes - Internal notes\nterms - Terms and conditions\nUpdate Invoice\nPUT /zoho-inventory/inventory/v1/invoices/{invoice_id}\n\nDelete Invoice\nDELETE /zoho-inventory/inventory/v1/invoices/{invoice_id}\n\nInvoice Status Actions\n# Mark as sent\nPOST /zoho-inventory/inventory/v1/invoices/{invoice_id}/status/sent\n\n# Mark as draft\nPOST /zoho-inventory/inventory/v1/invoices/{invoice_id}/status/draft\n\n# Void invoice\nPOST /zoho-inventory/inventory/v1/invoices/{invoice_id}/status/void\n\nInvoice Email\n# Email invoice to customer\nPOST /zoho-inventory/inventory/v1/invoices/{invoice_id}/email\n\n# Get email content template\nGET /zoho-inventory/inventory/v1/invoices/{invoice_id}/email\n\nInvoice Payments\n# List payments applied\nGET /zoho-inventory/inventory/v1/invoices/{invoice_id}/payments\n\n# Delete a payment\nDELETE /zoho-inventory/inventory/v1/invoices/{invoice_id}/payments/{invoice_payment_id}\n\nInvoice Credits\n# List credits applied\nGET /zoho-inventory/inventory/v1/invoices/{invoice_id}/creditsapplied\n\n# Apply credits\nPOST /zoho-inventory/inventory/v1/invoices/{invoice_id}/credits\n\n# Delete applied credit\nDELETE /zoho-inventory/inventory/v1/invoices/{invoice_id}/creditsapplied/{creditnotes_invoice_id}\n\nInvoice Comments\n# List comments\nGET /zoho-inventory/inventory/v1/invoices/{invoice_id}/comments\n\n# Add comment\nPOST /zoho-inventory/inventory/v1/invoices/{invoice_id}/comments\n\n# Update comment\nPUT /zoho-inventory/inventory/v1/invoices/{invoice_id}/comments/{comment_id}\n\n# Delete comment\nDELETE /zoho-inventory/inventory/v1/invoices/{invoice_id}/comments/{comment_id}\n\nPurchase Orders\nList Purchase Orders\nGET /zoho-inventory/inventory/v1/purchaseorders\n\n\nExample:\n\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-inventory/inventory/v1/purchaseorders')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\nGet Purchase Order\nGET /zoho-inventory/inventory/v1/purchaseorders/{purchaseorder_id}\n\nCreate Purchase Order\nPOST /zoho-inventory/inventory/v1/purchaseorders\nContent-Type: application/json\n\n{\n  \"vendor_id\": \"1234567890000\",\n  \"line_items\": [\n    {\n      \"item_id\": \"1234567890001\",\n      \"quantity\": 100,\n      \"rate\": 10.00\n    }\n  ]\n}\n\n\nRequired Fields:\n\nvendor_id - Vendor identifier\nline_items - Array of items\n\nOptional Fields:\n\npurchaseorder_number - Auto-generated if not specified (do not specify if auto-generation is enabled)\ndate - Order date (yyyy-mm-dd)\ndelivery_date - Expected delivery date\nreference_number - External reference\nship_via - Shipping method\nnotes - Internal notes\nterms - Terms and conditions\nUpdate Purchase Order\nPUT /zoho-inventory/inventory/v1/purchaseorders/{purchaseorder_id}\n\nDelete Purchase Order\nDELETE /zoho-inventory/inventory/v1/purchaseorders/{purchaseorder_id}\n\nPurchase Order Status Actions\n# Mark as issued\nPOST /zoho-inventory/inventory/v1/purchaseorders/{purchaseorder_id}/status/issued\n\n# Mark as cancelled\nPOST /zoho-inventory/inventory/v1/purchaseorders/{purchaseorder_id}/status/cancelled\n\nBills\nList Bills\nGET /zoho-inventory/inventory/v1/bills\n\n\nExample:\n\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-inventory/inventory/v1/bills')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\nGet Bill\nGET /zoho-inventory/inventory/v1/bills/{bill_id}\n\nCreate Bill\nPOST /zoho-inventory/inventory/v1/bills\nContent-Type: application/json\n\n{\n  \"vendor_id\": \"1234567890000\",\n  \"bill_number\": \"BILL-001\",\n  \"date\": \"2026-02-06\",\n  \"due_date\": \"2026-03-06\",\n  \"line_items\": [\n    {\n      \"item_id\": \"1234567890001\",\n      \"quantity\": 100,\n      \"rate\": 10.00\n    }\n  ]\n}\n\n\nRequired Fields:\n\nvendor_id - Vendor identifier\nbill_number - Unique bill number (required, not auto-generated)\ndate - Bill date (yyyy-mm-dd)\ndue_date - Payment due date\nline_items - Array of items\n\nOptional Fields:\n\nreference_number - External reference\nnotes - Internal notes\nterms - Terms and conditions\ncurrency_id - Currency identifier\nexchange_rate - Exchange rate for foreign currency\nUpdate Bill\nPUT /zoho-inventory/inventory/v1/bills/{bill_id}\n\nDelete Bill\nDELETE /zoho-inventory/inventory/v1/bills/{bill_id}\n\nBill Status Actions\n# Mark as open\nPOST /zoho-inventory/inventory/v1/bills/{bill_id}/status/open\n\n# Mark as void\nPOST /zoho-inventory/inventory/v1/bills/{bill_id}/status/void\n\nShipment Orders\nCreate Shipment Order\nPOST /zoho-inventory/inventory/v1/shipmentorders\nContent-Type: application/json\n\n{\n  \"shipment_number\": \"SHP-001\",\n  \"date\": \"2026-02-06\",\n  \"delivery_method\": \"FedEx\",\n  \"tracking_number\": \"1234567890\"\n}\n\n\nRequired Fields:\n\nshipment_number - Unique shipment number\ndate - Shipment date\ndelivery_method - Carrier/delivery method\n\nOptional Fields:\n\ntracking_number - Carrier tracking number\nshipping_charge - Shipping cost\nnotes - Internal notes\nreference_number - External reference\nGet Shipment Order\nGET /zoho-inventory/inventory/v1/shipmentorders/{shipmentorder_id}\n\nUpdate Shipment Order\nPUT /zoho-inventory/inventory/v1/shipmentorders/{shipmentorder_id}\n\nDelete Shipment Order\nDELETE /zoho-inventory/inventory/v1/shipmentorders/{shipmentorder_id}\n\nMark as Delivered\nPOST /zoho-inventory/inventory/v1/shipmentorders/{shipmentorder_id}/status/delivered\n\nItem Groups\nList Item Groups\nGET /zoho-inventory/inventory/v1/itemgroups\n\nGet Item Group\nGET /zoho-inventory/inventory/v1/itemgroups/{itemgroup_id}\n\nCreate Item Group\nPOST /zoho-inventory/inventory/v1/itemgroups\nContent-Type: application/json\n\n{\n  \"group_name\": \"T-Shirts\",\n  \"unit\": \"pcs\",\n  \"items\": [\n    {\n      \"name\": \"T-Shirt - Small\",\n      \"rate\": 20.00,\n      \"purchase_rate\": 8.00,\n      \"sku\": \"TS-S\"\n    },\n    {\n      \"name\": \"T-Shirt - Medium\",\n      \"rate\": 20.00,\n      \"purchase_rate\": 8.00,\n      \"sku\": \"TS-M\"\n    }\n  ]\n}\n\n\nRequired Fields:\n\ngroup_name - Group name\nunit - Unit of measurement\nUpdate Item Group\nPUT /zoho-inventory/inventory/v1/itemgroups/{itemgroup_id}\n\nDelete Item Group\nDELETE /zoho-inventory/inventory/v1/itemgroups/{itemgroup_id}\n\nItem Group Status Actions\n# Mark as active\nPOST /zoho-inventory/inventory/v1/itemgroups/{itemgroup_id}/active\n\n# Mark as inactive\nPOST /zoho-inventory/inventory/v1/itemgroups/{itemgroup_id}/inactive\n\nPagination\n\nZoho Inventory uses page-based pagination:\n\nGET /zoho-inventory/inventory/v1/items?page=1&per_page=50\n\n\nResponse includes pagination info in page_context:\n\n{\n  \"code\": 0,\n  \"message\": \"success\",\n  \"items\": [...],\n  \"page_context\": {\n    \"page\": 1,\n    \"per_page\": 50,\n    \"has_more_page\": true,\n    \"sort_column\": \"name\",\n    \"sort_order\": \"A\"\n  }\n}\n\n\nContinue fetching while has_more_page is true, incrementing page each time.\n\nCode Examples\nJavaScript\nconst response = await fetch(\n  'https://gateway.maton.ai/zoho-inventory/inventory/v1/items',\n  {\n    headers: {\n      'Authorization': `Bearer ${process.env.MATON_API_KEY}`\n    }\n  }\n);\nconst data = await response.json();\n\nPython\nimport os\nimport requests\n\nresponse = requests.get(\n    'https://gateway.maton.ai/zoho-inventory/inventory/v1/items',\n    headers={'Authorization': f'Bearer {os.environ[\"MATON_API_KEY\"]}'}\n)\ndata = response.json()\n\nNotes\nAll successful responses have code: 0 and a message field\nDates should be in yyyy-mm-dd format\nContact types are customer or vendor\nItem types: inventory, sales, purchases, sales_and_purchases\nProduct types: goods or service\nThe organization_id parameter is automatically handled by the gateway - you do not need to specify it\nSales order and purchase order numbers are auto-generated by default - do not specify salesorder_number or purchaseorder_number unless auto-generation is disabled in settings\nStatus action endpoints use POST method (e.g., /status/confirmed, /status/void)\nRate limits: 100 requests/minute per organization\nDaily limits vary by plan: Free (1,000), Standard (2,500), Professional (5,000), Premium (7,500), Enterprise (10,000)\nIMPORTANT: When using curl commands, use curl -g when URLs contain brackets to disable glob parsing\nIMPORTANT: When piping curl output to jq or other commands, environment variables like $MATON_API_KEY may not expand correctly in some shell environments\nError Handling\nStatus\tMeaning\n400\tMissing Zoho Inventory connection or invalid request\n401\tInvalid or missing Maton API key, or OAuth scope mismatch\n404\tResource not found\n429\tRate limited\n4xx/5xx\tPassthrough error from Zoho Inventory API\nCommon Error Codes\nCode\tDescription\n0\tSuccess\n1\tInvalid value\n2\tMandatory field missing\n3\tResource does not exist\n5\tInvalid URL\nTroubleshooting: API Key Issues\nCheck that the MATON_API_KEY environment variable is set:\necho $MATON_API_KEY\n\nVerify the API key is valid by listing connections:\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://ctrl.maton.ai/connections')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\nTroubleshooting: Invalid App Name\nEnsure your URL path starts with zoho-inventory. For example:\nCorrect: https://gateway.maton.ai/zoho-inventory/inventory/v1/items\nIncorrect: https://gateway.maton.ai/inventory/v1/items\nResources\nZoho Inventory API v1 Introduction\nZoho Inventory Items API\nZoho Inventory Contacts API\nZoho Inventory Sales Orders API\nZoho Inventory Invoices API\nZoho Inventory Purchase Orders API\nZoho Inventory Bills API\nMaton Community\nMaton Support"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/byungkyu/zoho-inventory",
    "publisherUrl": "https://clawhub.ai/byungkyu/zoho-inventory",
    "owner": "byungkyu",
    "version": "1.0.3",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/zoho-inventory",
    "downloadUrl": "https://openagent3.xyz/downloads/zoho-inventory",
    "agentUrl": "https://openagent3.xyz/skills/zoho-inventory/agent",
    "manifestUrl": "https://openagent3.xyz/skills/zoho-inventory/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/zoho-inventory/agent.md"
  }
}