{
  "schemaVersion": "1.0",
  "item": {
    "slug": "zoho-crm",
    "name": "Zoho CRM",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/byungkyu/zoho-crm",
    "canonicalUrl": "https://clawhub.ai/byungkyu/zoho-crm",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/zoho-crm",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=zoho-crm",
    "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-crm"
    },
    "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-crm",
    "agentPageUrl": "https://openagent3.xyz/skills/zoho-crm/agent",
    "manifestUrl": "https://openagent3.xyz/skills/zoho-crm/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/zoho-crm/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 CRM",
        "body": "Access the Zoho CRM API with managed OAuth authentication. Manage leads, contacts, accounts, deals, and other CRM modules with full CRUD operations including search and bulk operations. Also supports organization details, user management, and module metadata retrieval."
      },
      {
        "title": "Quick Start",
        "body": "# List leads\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/Leads?fields=First_Name,Last_Name,Email')\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-crm/crm/v8/{endpoint}\n\nThe gateway proxies requests to www.zohoapis.com/crm/v8 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 CRM 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-crm&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-crm'}).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\": \"e55c5bac-241a-4cc8-9db5-50d2cad09136\",\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-crm\",\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 CRM 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-crm/crm/v8/Leads?fields=First_Name,Last_Name,Email')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nreq.add_header('Maton-Connection', 'e55c5bac-241a-4cc8-9db5-50d2cad09136')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\nIf omitted, the gateway uses the default (oldest) active connection."
      },
      {
        "title": "Modules",
        "body": "Zoho CRM organizes data into modules. Core modules include:\n\nModuleAPI NameDescriptionLeadsLeadsPotential customersContactsContactsIndividual peopleAccountsAccountsOrganizations/companiesDealsDealsSales opportunitiesCampaignsCampaignsMarketing campaignsTasksTasksTo-do itemsCallsCallsPhone call logsEventsEventsCalendar appointmentsProductsProductsItems you sell"
      },
      {
        "title": "List Records",
        "body": "GET /zoho-crm/crm/v8/{module_api_name}?fields={field1},{field2}\n\nQuery Parameters:\n\nParameterTypeDescriptionfieldsstringRequired. Comma-separated field API names (max 50)pageintegerPage number (default: 1)per_pageintegerRecords per page (default/max: 200)sort_bystringSort by: id, Created_Time, or Modified_Timesort_orderstringasc or desc (default)cvidlongCustom view IDpage_tokenstringFor >2000 records pagination\n\nExample - List Leads:\n\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/Leads?fields=First_Name,Last_Name,Email,Phone,Company')\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  \"data\": [\n    {\n      \"First_Name\": \"Christopher\",\n      \"Email\": \"christopher-maclead@noemail.invalid\",\n      \"Last_Name\": \"Maclead (Sample)\",\n      \"Phone\": \"555-555-5555\",\n      \"Company\": \"Rangoni Of Florence\",\n      \"id\": \"7243485000000597000\"\n    }\n  ],\n  \"info\": {\n    \"per_page\": 200,\n    \"count\": 1,\n    \"page\": 1,\n    \"sort_by\": \"id\",\n    \"sort_order\": \"desc\",\n    \"more_records\": false,\n    \"next_page_token\": null\n  }\n}\n\nExample - List Contacts:\n\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/Contacts?fields=First_Name,Last_Name,Email,Phone')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\nExample - List Accounts:\n\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/Accounts?fields=Account_Name,Website,Phone')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\nExample - List Deals:\n\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/Deals?fields=Deal_Name,Stage,Amount')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF"
      },
      {
        "title": "Get Record",
        "body": "GET /zoho-crm/crm/v8/{module_api_name}/{record_id}\n\nExample:\n\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/Leads/7243485000000597000')\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 Records",
        "body": "POST /zoho-crm/crm/v8/{module_api_name}\nContent-Type: application/json\n\n{\n  \"data\": [\n    {\n      \"field_api_name\": \"value\"\n    }\n  ]\n}\n\nMandatory Fields by Module:\n\nModuleRequired FieldsLeadsLast_NameContactsLast_NameAccountsAccount_NameDealsDeal_Name, StageTasksSubjectCallsSubject, Call_Type, Call_Start_Time, Call_DurationEventsEvent_Title, Start_DateTime, End_DateTime\n\nExample - Create Lead:\n\npython <<'EOF'\nimport urllib.request, os, json\ndata = json.dumps({\n    \"data\": [{\n        \"Last_Name\": \"Smith\",\n        \"First_Name\": \"John\",\n        \"Email\": \"john.smith@example.com\",\n        \"Company\": \"Acme Corp\",\n        \"Phone\": \"+1-555-0123\"\n    }]\n}).encode()\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/Leads', 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  \"data\": [\n    {\n      \"code\": \"SUCCESS\",\n      \"details\": {\n        \"Modified_Time\": \"2026-02-06T01:10:56-08:00\",\n        \"Modified_By\": {\n          \"name\": \"User Name\",\n          \"id\": \"7243485000000590001\"\n        },\n        \"Created_Time\": \"2026-02-06T01:10:56-08:00\",\n        \"id\": \"7243485000000619001\",\n        \"Created_By\": {\n          \"name\": \"User Name\",\n          \"id\": \"7243485000000590001\"\n        }\n      },\n      \"message\": \"record added\",\n      \"status\": \"success\"\n    }\n  ]\n}\n\nExample - Create Contact:\n\npython <<'EOF'\nimport urllib.request, os, json\ndata = json.dumps({\n    \"data\": [{\n        \"Last_Name\": \"Doe\",\n        \"First_Name\": \"Jane\",\n        \"Email\": \"jane.doe@example.com\",\n        \"Phone\": \"+1-555-9876\"\n    }]\n}).encode()\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/Contacts', 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\nExample - Create Account:\n\npython <<'EOF'\nimport urllib.request, os, json\ndata = json.dumps({\n    \"data\": [{\n        \"Account_Name\": \"Acme Corporation\",\n        \"Website\": \"https://acme.com\",\n        \"Phone\": \"+1-555-1234\"\n    }]\n}).encode()\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/Accounts', 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": "Update Records",
        "body": "PUT /zoho-crm/crm/v8/{module_api_name}\nContent-Type: application/json\n\n{\n  \"data\": [\n    {\n      \"id\": \"record_id\",\n      \"field_api_name\": \"updated_value\"\n    }\n  ]\n}\n\nExample:\n\npython <<'EOF'\nimport urllib.request, os, json\ndata = json.dumps({\n    \"data\": [{\n        \"id\": \"7243485000000619001\",\n        \"Phone\": \"+1-555-9999\",\n        \"Company\": \"Updated Company Name\"\n    }]\n}).encode()\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/Leads', data=data, method='PUT')\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  \"data\": [\n    {\n      \"code\": \"SUCCESS\",\n      \"details\": {\n        \"Modified_Time\": \"2026-02-06T01:11:01-08:00\",\n        \"Modified_By\": {\n          \"name\": \"User Name\",\n          \"id\": \"7243485000000590001\"\n        },\n        \"Created_Time\": \"2026-02-06T01:10:56-08:00\",\n        \"id\": \"7243485000000619001\",\n        \"Created_By\": {\n          \"name\": \"User Name\",\n          \"id\": \"7243485000000590001\"\n        }\n      },\n      \"message\": \"record updated\",\n      \"status\": \"success\"\n    }\n  ]\n}"
      },
      {
        "title": "Delete Records",
        "body": "DELETE /zoho-crm/crm/v8/{module_api_name}?ids={record_id1},{record_id2}\n\nQuery Parameters:\n\nParameterTypeDescriptionidsstringComma-separated record IDs (required, max 100)wf_triggerbooleanExecute workflows (default: true)\n\nExample:\n\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/Leads?ids=7243485000000619001', 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\nResponse:\n\n{\n  \"data\": [\n    {\n      \"code\": \"SUCCESS\",\n      \"details\": {\n        \"id\": \"7243485000000619001\"\n      },\n      \"message\": \"record deleted\",\n      \"status\": \"success\"\n    }\n  ]\n}"
      },
      {
        "title": "Search Records",
        "body": "GET /zoho-crm/crm/v8/{module_api_name}/search\n\nQuery Parameters (one required):\n\nParameterTypeDescriptioncriteriastringSearch criteria (e.g., (Last_Name:equals:Smith))emailstringSearch by email addressphonestringSearch by phone numberwordstringGlobal text searchpageintegerPage numberper_pageintegerRecords per page (max 200)\n\nCriteria Format: ((field_api_name:operator:value) and/or (...))\n\nOperators:\n\nText fields: equals, not_equal, starts_with, in\nDate/Number fields: equals, not_equal, greater_than, less_than, between, in\nBoolean fields: equals, not_equal\n\nExample - Search by email:\n\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/Leads/search?email=christopher-maclead@noemail.invalid')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\nExample - Search by criteria:\n\npython <<'EOF'\nimport urllib.request, os, json\nimport urllib.parse\ncriteria = urllib.parse.quote('(Last_Name:starts_with:Smith)')\nreq = urllib.request.Request(f'https://gateway.maton.ai/zoho-crm/crm/v8/Leads/search?criteria={criteria}')\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  \"data\": [\n    {\n      \"First_Name\": \"Christopher\",\n      \"Email\": \"christopher-maclead@noemail.invalid\",\n      \"Last_Name\": \"Maclead (Sample)\",\n      \"id\": \"7243485000000597000\"\n    }\n  ],\n  \"info\": {\n    \"per_page\": 200,\n    \"count\": 1,\n    \"page\": 1,\n    \"more_records\": false\n  }\n}"
      },
      {
        "title": "Organization Details",
        "body": "Retrieve your Zoho CRM organization details.\n\nGET /zoho-crm/crm/v8/org\n\nExample:\n\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/org')\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  \"org\": [\n    {\n      \"id\": \"7243485000000020005\",\n      \"company_name\": \"Acme Corp\",\n      \"domain_name\": \"org123456789\",\n      \"primary_email\": \"admin@example.com\",\n      \"phone\": \"555-555-5555\",\n      \"currency\": \"US Dollar - USD\",\n      \"currency_symbol\": \"$\",\n      \"iso_code\": \"USD\",\n      \"time_zone\": \"PST\",\n      \"country_code\": \"US\",\n      \"zgid\": \"123456789\",\n      \"type\": \"production\",\n      \"mc_status\": false,\n      \"license_details\": {\n        \"paid\": true,\n        \"paid_type\": \"enterprise\",\n        \"users_license_purchased\": 10,\n        \"trial_expiry\": null\n      }\n    }\n  ]\n}"
      },
      {
        "title": "Users",
        "body": "Retrieve users in your Zoho CRM organization.\n\nGET /zoho-crm/crm/v8/users\n\nQuery Parameters:\n\nParameterTypeDescriptiontypestringFilter by user type: AllUsers, ActiveUsers, DeactiveUsers, ConfirmedUsers, NotConfirmedUsers, DeletedUsers, ActiveConfirmedUsers, AdminUsers, ActiveConfirmedAdmins, CurrentUserpageintegerPage number (default: 1)per_pageintegerRecords per page (default/max: 200)idsstringComma-separated user IDs (max 100)\n\nExample - List all users:\n\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/users?type=AllUsers')\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  \"users\": [\n    {\n      \"id\": \"7243485000000590001\",\n      \"first_name\": \"John\",\n      \"last_name\": \"Doe\",\n      \"full_name\": \"John Doe\",\n      \"email\": \"john.doe@example.com\",\n      \"status\": \"active\",\n      \"confirm\": true,\n      \"role\": {\n        \"name\": \"CEO\",\n        \"id\": \"7243485000000026005\"\n      },\n      \"profile\": {\n        \"name\": \"Administrator\",\n        \"id\": \"7243485000000026011\"\n      },\n      \"time_zone\": \"PST\",\n      \"country\": \"US\",\n      \"locale\": \"en_US\"\n    }\n  ],\n  \"info\": {\n    \"per_page\": 200,\n    \"count\": 1,\n    \"page\": 1,\n    \"more_records\": false\n  }\n}\n\nExample - Get specific user:\n\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/users/7243485000000590001')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF"
      },
      {
        "title": "Modules Metadata",
        "body": "Retrieve metadata about all available CRM modules.\n\nGET /zoho-crm/crm/v8/settings/modules\n\nQuery Parameters:\n\nParameterTypeDescriptionstatusstringFilter by status: user_hidden, system_hidden, scheduled_for_deletion, visible\n\nExample:\n\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/settings/modules')\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  \"modules\": [\n    {\n      \"api_name\": \"Leads\",\n      \"module_name\": \"Leads\",\n      \"singular_label\": \"Lead\",\n      \"plural_label\": \"Leads\",\n      \"api_supported\": true,\n      \"creatable\": true,\n      \"editable\": true,\n      \"deletable\": true,\n      \"viewable\": true,\n      \"status\": \"visible\",\n      \"generated_type\": \"default\",\n      \"id\": \"7243485000000002175\",\n      \"profiles\": [\n        {\"name\": \"Administrator\", \"id\": \"7243485000000026011\"}\n      ]\n    }\n  ]\n}"
      },
      {
        "title": "Fields Metadata",
        "body": "Retrieve field metadata for a specific module.\n\nGET /zoho-crm/crm/v8/settings/fields?module={module_api_name}\n\nQuery Parameters:\n\nParameterTypeDescriptionmodulestringRequired. API name of the module (e.g., Leads, Contacts)typestringall for all fields, unused for unused fields only\n\nExample:\n\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/settings/fields?module=Leads')\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  \"fields\": [\n    {\n      \"api_name\": \"Last_Name\",\n      \"field_label\": \"Last Name\",\n      \"data_type\": \"text\",\n      \"system_mandatory\": true,\n      \"custom_field\": false,\n      \"visible\": true,\n      \"searchable\": true,\n      \"sortable\": true,\n      \"id\": \"7243485000000002613\"\n    }\n  ]\n}"
      },
      {
        "title": "Layouts Metadata",
        "body": "Retrieve layout metadata for a specific module.\n\nGET /zoho-crm/crm/v8/settings/layouts?module={module_api_name}\n\nQuery Parameters:\n\nParameterTypeDescriptionmodulestringRequired. API name of the module (e.g., Leads, Contacts)\n\nExample:\n\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/settings/layouts?module=Leads')\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  \"layouts\": [\n    {\n      \"id\": \"7243485000000091055\",\n      \"name\": \"Standard\",\n      \"api_name\": \"Standard\",\n      \"status\": \"active\",\n      \"visible\": true,\n      \"profiles\": [\n        {\"name\": \"Administrator\", \"id\": \"7243485000000026011\"}\n      ],\n      \"sections\": [\n        {\n          \"display_label\": \"Lead Information\",\n          \"api_name\": \"Lead_Information\",\n          \"sequence_number\": 1,\n          \"fields\": [...]\n        }\n      ]\n    }\n  ]\n}"
      },
      {
        "title": "Roles",
        "body": "Retrieve roles in your Zoho CRM organization.\n\nGET /zoho-crm/crm/v8/settings/roles\n\nExample:\n\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/settings/roles')\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  \"roles\": [\n    {\n      \"id\": \"7243485000000026005\",\n      \"name\": \"CEO\",\n      \"display_label\": \"CEO\",\n      \"share_with_peers\": true,\n      \"description\": null,\n      \"reporting_to\": null\n    },\n    {\n      \"id\": \"7243485000000026008\",\n      \"name\": \"Manager\",\n      \"display_label\": \"Manager\",\n      \"share_with_peers\": false,\n      \"reporting_to\": {\n        \"name\": \"CEO\",\n        \"id\": \"7243485000000026005\"\n      }\n    }\n  ]\n}\n\nExample - Get specific role:\n\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/settings/roles/7243485000000026005')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF"
      },
      {
        "title": "Profiles",
        "body": "Retrieve profiles (permission sets) in your Zoho CRM organization.\n\nGET /zoho-crm/crm/v8/settings/profiles\n\nExample:\n\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/settings/profiles')\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  \"profiles\": [\n    {\n      \"id\": \"7243485000000026011\",\n      \"name\": \"Administrator\",\n      \"display_label\": \"Administrator\",\n      \"type\": \"normal_profile\",\n      \"custom\": false,\n      \"description\": null\n    },\n    {\n      \"id\": \"7243485000000026014\",\n      \"name\": \"Standard\",\n      \"display_label\": \"Standard\",\n      \"type\": \"normal_profile\",\n      \"custom\": false,\n      \"description\": null\n    }\n  ]\n}\n\nExample - Get specific profile:\n\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/settings/profiles/7243485000000026011')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF"
      },
      {
        "title": "Pagination",
        "body": "Zoho CRM uses page-based pagination with optional page tokens for large datasets:\n\nGET /zoho-crm/crm/v8/{module_api_name}?fields=First_Name,Last_Name&page=1&per_page=50\n\nResponse includes pagination info:\n\n{\n  \"data\": [...],\n  \"info\": {\n    \"per_page\": 50,\n    \"count\": 50,\n    \"page\": 1,\n    \"sort_by\": \"id\",\n    \"sort_order\": \"desc\",\n    \"more_records\": true,\n    \"next_page_token\": \"token_value\",\n    \"page_token_expiry\": \"2026-02-07T01:10:56-08:00\"\n  }\n}\n\nFor up to 2,000 records: Use page parameter (increment each request)\nFor 2,000+ records: Use page_token from previous response\nPage tokens expire after 24 hours"
      },
      {
        "title": "JavaScript",
        "body": "const response = await fetch(\n  'https://gateway.maton.ai/zoho-crm/crm/v8/Leads?fields=First_Name,Last_Name,Email',\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-crm/crm/v8/Leads',\n    headers={'Authorization': f'Bearer {os.environ[\"MATON_API_KEY\"]}'},\n    params={'fields': 'First_Name,Last_Name,Email'}\n)\ndata = response.json()"
      },
      {
        "title": "Notes",
        "body": "The fields parameter is required for list operations (max 50 fields)\nModule API names are case-sensitive (e.g., Leads, not leads)\nMaximum 100 records per create/update request\nMaximum 100 records per delete request\nMaximum 200 records returned per GET request\nMaximum 2,000 records without page_token; up to 100,000 with page_token\nUse field API names (not display names) in requests\nIf you receive a scope error, contact Maton support at support@maton.ai with the specific operations/APIs you need and your use-case\nEmpty datasets return HTTP 204 (No Content) with empty body\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 CRM connection, missing required parameter, or invalid request401Invalid or missing Maton API key, or OAuth scope mismatch404Resource not found429Rate limited4xx/5xxPassthrough error from Zoho CRM API"
      },
      {
        "title": "Common Error Codes",
        "body": "CodeDescriptionOAUTH_SCOPE_MISMATCHOAuth token lacks required permissions for the endpointMANDATORY_NOT_FOUNDRequired field is missingINVALID_DATAData type mismatch or format errorDUPLICATE_DATARecord violates unique field constraintRECORD_NOT_FOUNDThe specified record ID does not exist"
      },
      {
        "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-crm. For example:\n\nCorrect: https://gateway.maton.ai/zoho-crm/crm/v8/Leads\nIncorrect: https://gateway.maton.ai/crm/v8/Leads"
      },
      {
        "title": "Resources",
        "body": "Zoho CRM API v8 Documentation\nGet Records API\nInsert Records API\nUpdate Records API\nDelete Records API\nSearch Records API\nOrganization API\nUsers API\nModules API\nFields API\nLayouts API\nRoles API\nProfiles API\nMaton Community\nMaton Support"
      }
    ],
    "body": "Zoho CRM\n\nAccess the Zoho CRM API with managed OAuth authentication. Manage leads, contacts, accounts, deals, and other CRM modules with full CRUD operations including search and bulk operations. Also supports organization details, user management, and module metadata retrieval.\n\nQuick Start\n# List leads\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/Leads?fields=First_Name,Last_Name,Email')\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-crm/crm/v8/{endpoint}\n\n\nThe gateway proxies requests to www.zohoapis.com/crm/v8 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 CRM 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-crm&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-crm'}).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\": \"e55c5bac-241a-4cc8-9db5-50d2cad09136\",\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-crm\",\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 CRM 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-crm/crm/v8/Leads?fields=First_Name,Last_Name,Email')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nreq.add_header('Maton-Connection', 'e55c5bac-241a-4cc8-9db5-50d2cad09136')\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\nModules\n\nZoho CRM organizes data into modules. Core modules include:\n\nModule\tAPI Name\tDescription\nLeads\tLeads\tPotential customers\nContacts\tContacts\tIndividual people\nAccounts\tAccounts\tOrganizations/companies\nDeals\tDeals\tSales opportunities\nCampaigns\tCampaigns\tMarketing campaigns\nTasks\tTasks\tTo-do items\nCalls\tCalls\tPhone call logs\nEvents\tEvents\tCalendar appointments\nProducts\tProducts\tItems you sell\nList Records\nGET /zoho-crm/crm/v8/{module_api_name}?fields={field1},{field2}\n\n\nQuery Parameters:\n\nParameter\tType\tDescription\nfields\tstring\tRequired. Comma-separated field API names (max 50)\npage\tinteger\tPage number (default: 1)\nper_page\tinteger\tRecords per page (default/max: 200)\nsort_by\tstring\tSort by: id, Created_Time, or Modified_Time\nsort_order\tstring\tasc or desc (default)\ncvid\tlong\tCustom view ID\npage_token\tstring\tFor >2000 records pagination\n\nExample - List Leads:\n\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/Leads?fields=First_Name,Last_Name,Email,Phone,Company')\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  \"data\": [\n    {\n      \"First_Name\": \"Christopher\",\n      \"Email\": \"christopher-maclead@noemail.invalid\",\n      \"Last_Name\": \"Maclead (Sample)\",\n      \"Phone\": \"555-555-5555\",\n      \"Company\": \"Rangoni Of Florence\",\n      \"id\": \"7243485000000597000\"\n    }\n  ],\n  \"info\": {\n    \"per_page\": 200,\n    \"count\": 1,\n    \"page\": 1,\n    \"sort_by\": \"id\",\n    \"sort_order\": \"desc\",\n    \"more_records\": false,\n    \"next_page_token\": null\n  }\n}\n\n\nExample - List Contacts:\n\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/Contacts?fields=First_Name,Last_Name,Email,Phone')\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\nExample - List Accounts:\n\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/Accounts?fields=Account_Name,Website,Phone')\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\nExample - List Deals:\n\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/Deals?fields=Deal_Name,Stage,Amount')\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 Record\nGET /zoho-crm/crm/v8/{module_api_name}/{record_id}\n\n\nExample:\n\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/Leads/7243485000000597000')\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 Records\nPOST /zoho-crm/crm/v8/{module_api_name}\nContent-Type: application/json\n\n{\n  \"data\": [\n    {\n      \"field_api_name\": \"value\"\n    }\n  ]\n}\n\n\nMandatory Fields by Module:\n\nModule\tRequired Fields\nLeads\tLast_Name\nContacts\tLast_Name\nAccounts\tAccount_Name\nDeals\tDeal_Name, Stage\nTasks\tSubject\nCalls\tSubject, Call_Type, Call_Start_Time, Call_Duration\nEvents\tEvent_Title, Start_DateTime, End_DateTime\n\nExample - Create Lead:\n\npython <<'EOF'\nimport urllib.request, os, json\ndata = json.dumps({\n    \"data\": [{\n        \"Last_Name\": \"Smith\",\n        \"First_Name\": \"John\",\n        \"Email\": \"john.smith@example.com\",\n        \"Company\": \"Acme Corp\",\n        \"Phone\": \"+1-555-0123\"\n    }]\n}).encode()\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/Leads', 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  \"data\": [\n    {\n      \"code\": \"SUCCESS\",\n      \"details\": {\n        \"Modified_Time\": \"2026-02-06T01:10:56-08:00\",\n        \"Modified_By\": {\n          \"name\": \"User Name\",\n          \"id\": \"7243485000000590001\"\n        },\n        \"Created_Time\": \"2026-02-06T01:10:56-08:00\",\n        \"id\": \"7243485000000619001\",\n        \"Created_By\": {\n          \"name\": \"User Name\",\n          \"id\": \"7243485000000590001\"\n        }\n      },\n      \"message\": \"record added\",\n      \"status\": \"success\"\n    }\n  ]\n}\n\n\nExample - Create Contact:\n\npython <<'EOF'\nimport urllib.request, os, json\ndata = json.dumps({\n    \"data\": [{\n        \"Last_Name\": \"Doe\",\n        \"First_Name\": \"Jane\",\n        \"Email\": \"jane.doe@example.com\",\n        \"Phone\": \"+1-555-9876\"\n    }]\n}).encode()\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/Contacts', 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\nExample - Create Account:\n\npython <<'EOF'\nimport urllib.request, os, json\ndata = json.dumps({\n    \"data\": [{\n        \"Account_Name\": \"Acme Corporation\",\n        \"Website\": \"https://acme.com\",\n        \"Phone\": \"+1-555-1234\"\n    }]\n}).encode()\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/Accounts', 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\nUpdate Records\nPUT /zoho-crm/crm/v8/{module_api_name}\nContent-Type: application/json\n\n{\n  \"data\": [\n    {\n      \"id\": \"record_id\",\n      \"field_api_name\": \"updated_value\"\n    }\n  ]\n}\n\n\nExample:\n\npython <<'EOF'\nimport urllib.request, os, json\ndata = json.dumps({\n    \"data\": [{\n        \"id\": \"7243485000000619001\",\n        \"Phone\": \"+1-555-9999\",\n        \"Company\": \"Updated Company Name\"\n    }]\n}).encode()\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/Leads', data=data, method='PUT')\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  \"data\": [\n    {\n      \"code\": \"SUCCESS\",\n      \"details\": {\n        \"Modified_Time\": \"2026-02-06T01:11:01-08:00\",\n        \"Modified_By\": {\n          \"name\": \"User Name\",\n          \"id\": \"7243485000000590001\"\n        },\n        \"Created_Time\": \"2026-02-06T01:10:56-08:00\",\n        \"id\": \"7243485000000619001\",\n        \"Created_By\": {\n          \"name\": \"User Name\",\n          \"id\": \"7243485000000590001\"\n        }\n      },\n      \"message\": \"record updated\",\n      \"status\": \"success\"\n    }\n  ]\n}\n\nDelete Records\nDELETE /zoho-crm/crm/v8/{module_api_name}?ids={record_id1},{record_id2}\n\n\nQuery Parameters:\n\nParameter\tType\tDescription\nids\tstring\tComma-separated record IDs (required, max 100)\nwf_trigger\tboolean\tExecute workflows (default: true)\n\nExample:\n\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/Leads?ids=7243485000000619001', 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\n\nResponse:\n\n{\n  \"data\": [\n    {\n      \"code\": \"SUCCESS\",\n      \"details\": {\n        \"id\": \"7243485000000619001\"\n      },\n      \"message\": \"record deleted\",\n      \"status\": \"success\"\n    }\n  ]\n}\n\nSearch Records\nGET /zoho-crm/crm/v8/{module_api_name}/search\n\n\nQuery Parameters (one required):\n\nParameter\tType\tDescription\ncriteria\tstring\tSearch criteria (e.g., (Last_Name:equals:Smith))\nemail\tstring\tSearch by email address\nphone\tstring\tSearch by phone number\nword\tstring\tGlobal text search\npage\tinteger\tPage number\nper_page\tinteger\tRecords per page (max 200)\n\nCriteria Format: ((field_api_name:operator:value) and/or (...))\n\nOperators:\n\nText fields: equals, not_equal, starts_with, in\nDate/Number fields: equals, not_equal, greater_than, less_than, between, in\nBoolean fields: equals, not_equal\n\nExample - Search by email:\n\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/Leads/search?email=christopher-maclead@noemail.invalid')\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\nExample - Search by criteria:\n\npython <<'EOF'\nimport urllib.request, os, json\nimport urllib.parse\ncriteria = urllib.parse.quote('(Last_Name:starts_with:Smith)')\nreq = urllib.request.Request(f'https://gateway.maton.ai/zoho-crm/crm/v8/Leads/search?criteria={criteria}')\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  \"data\": [\n    {\n      \"First_Name\": \"Christopher\",\n      \"Email\": \"christopher-maclead@noemail.invalid\",\n      \"Last_Name\": \"Maclead (Sample)\",\n      \"id\": \"7243485000000597000\"\n    }\n  ],\n  \"info\": {\n    \"per_page\": 200,\n    \"count\": 1,\n    \"page\": 1,\n    \"more_records\": false\n  }\n}\n\nOrganization Details\n\nRetrieve your Zoho CRM organization details.\n\nGET /zoho-crm/crm/v8/org\n\n\nExample:\n\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/org')\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  \"org\": [\n    {\n      \"id\": \"7243485000000020005\",\n      \"company_name\": \"Acme Corp\",\n      \"domain_name\": \"org123456789\",\n      \"primary_email\": \"admin@example.com\",\n      \"phone\": \"555-555-5555\",\n      \"currency\": \"US Dollar - USD\",\n      \"currency_symbol\": \"$\",\n      \"iso_code\": \"USD\",\n      \"time_zone\": \"PST\",\n      \"country_code\": \"US\",\n      \"zgid\": \"123456789\",\n      \"type\": \"production\",\n      \"mc_status\": false,\n      \"license_details\": {\n        \"paid\": true,\n        \"paid_type\": \"enterprise\",\n        \"users_license_purchased\": 10,\n        \"trial_expiry\": null\n      }\n    }\n  ]\n}\n\nUsers\n\nRetrieve users in your Zoho CRM organization.\n\nGET /zoho-crm/crm/v8/users\n\n\nQuery Parameters:\n\nParameter\tType\tDescription\ntype\tstring\tFilter by user type: AllUsers, ActiveUsers, DeactiveUsers, ConfirmedUsers, NotConfirmedUsers, DeletedUsers, ActiveConfirmedUsers, AdminUsers, ActiveConfirmedAdmins, CurrentUser\npage\tinteger\tPage number (default: 1)\nper_page\tinteger\tRecords per page (default/max: 200)\nids\tstring\tComma-separated user IDs (max 100)\n\nExample - List all users:\n\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/users?type=AllUsers')\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  \"users\": [\n    {\n      \"id\": \"7243485000000590001\",\n      \"first_name\": \"John\",\n      \"last_name\": \"Doe\",\n      \"full_name\": \"John Doe\",\n      \"email\": \"john.doe@example.com\",\n      \"status\": \"active\",\n      \"confirm\": true,\n      \"role\": {\n        \"name\": \"CEO\",\n        \"id\": \"7243485000000026005\"\n      },\n      \"profile\": {\n        \"name\": \"Administrator\",\n        \"id\": \"7243485000000026011\"\n      },\n      \"time_zone\": \"PST\",\n      \"country\": \"US\",\n      \"locale\": \"en_US\"\n    }\n  ],\n  \"info\": {\n    \"per_page\": 200,\n    \"count\": 1,\n    \"page\": 1,\n    \"more_records\": false\n  }\n}\n\n\nExample - Get specific user:\n\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/users/7243485000000590001')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\nModules Metadata\n\nRetrieve metadata about all available CRM modules.\n\nGET /zoho-crm/crm/v8/settings/modules\n\n\nQuery Parameters:\n\nParameter\tType\tDescription\nstatus\tstring\tFilter by status: user_hidden, system_hidden, scheduled_for_deletion, visible\n\nExample:\n\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/settings/modules')\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  \"modules\": [\n    {\n      \"api_name\": \"Leads\",\n      \"module_name\": \"Leads\",\n      \"singular_label\": \"Lead\",\n      \"plural_label\": \"Leads\",\n      \"api_supported\": true,\n      \"creatable\": true,\n      \"editable\": true,\n      \"deletable\": true,\n      \"viewable\": true,\n      \"status\": \"visible\",\n      \"generated_type\": \"default\",\n      \"id\": \"7243485000000002175\",\n      \"profiles\": [\n        {\"name\": \"Administrator\", \"id\": \"7243485000000026011\"}\n      ]\n    }\n  ]\n}\n\nFields Metadata\n\nRetrieve field metadata for a specific module.\n\nGET /zoho-crm/crm/v8/settings/fields?module={module_api_name}\n\n\nQuery Parameters:\n\nParameter\tType\tDescription\nmodule\tstring\tRequired. API name of the module (e.g., Leads, Contacts)\ntype\tstring\tall for all fields, unused for unused fields only\n\nExample:\n\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/settings/fields?module=Leads')\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  \"fields\": [\n    {\n      \"api_name\": \"Last_Name\",\n      \"field_label\": \"Last Name\",\n      \"data_type\": \"text\",\n      \"system_mandatory\": true,\n      \"custom_field\": false,\n      \"visible\": true,\n      \"searchable\": true,\n      \"sortable\": true,\n      \"id\": \"7243485000000002613\"\n    }\n  ]\n}\n\nLayouts Metadata\n\nRetrieve layout metadata for a specific module.\n\nGET /zoho-crm/crm/v8/settings/layouts?module={module_api_name}\n\n\nQuery Parameters:\n\nParameter\tType\tDescription\nmodule\tstring\tRequired. API name of the module (e.g., Leads, Contacts)\n\nExample:\n\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/settings/layouts?module=Leads')\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  \"layouts\": [\n    {\n      \"id\": \"7243485000000091055\",\n      \"name\": \"Standard\",\n      \"api_name\": \"Standard\",\n      \"status\": \"active\",\n      \"visible\": true,\n      \"profiles\": [\n        {\"name\": \"Administrator\", \"id\": \"7243485000000026011\"}\n      ],\n      \"sections\": [\n        {\n          \"display_label\": \"Lead Information\",\n          \"api_name\": \"Lead_Information\",\n          \"sequence_number\": 1,\n          \"fields\": [...]\n        }\n      ]\n    }\n  ]\n}\n\nRoles\n\nRetrieve roles in your Zoho CRM organization.\n\nGET /zoho-crm/crm/v8/settings/roles\n\n\nExample:\n\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/settings/roles')\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  \"roles\": [\n    {\n      \"id\": \"7243485000000026005\",\n      \"name\": \"CEO\",\n      \"display_label\": \"CEO\",\n      \"share_with_peers\": true,\n      \"description\": null,\n      \"reporting_to\": null\n    },\n    {\n      \"id\": \"7243485000000026008\",\n      \"name\": \"Manager\",\n      \"display_label\": \"Manager\",\n      \"share_with_peers\": false,\n      \"reporting_to\": {\n        \"name\": \"CEO\",\n        \"id\": \"7243485000000026005\"\n      }\n    }\n  ]\n}\n\n\nExample - Get specific role:\n\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/settings/roles/7243485000000026005')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\nProfiles\n\nRetrieve profiles (permission sets) in your Zoho CRM organization.\n\nGET /zoho-crm/crm/v8/settings/profiles\n\n\nExample:\n\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/settings/profiles')\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  \"profiles\": [\n    {\n      \"id\": \"7243485000000026011\",\n      \"name\": \"Administrator\",\n      \"display_label\": \"Administrator\",\n      \"type\": \"normal_profile\",\n      \"custom\": false,\n      \"description\": null\n    },\n    {\n      \"id\": \"7243485000000026014\",\n      \"name\": \"Standard\",\n      \"display_label\": \"Standard\",\n      \"type\": \"normal_profile\",\n      \"custom\": false,\n      \"description\": null\n    }\n  ]\n}\n\n\nExample - Get specific profile:\n\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/settings/profiles/7243485000000026011')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\nPagination\n\nZoho CRM uses page-based pagination with optional page tokens for large datasets:\n\nGET /zoho-crm/crm/v8/{module_api_name}?fields=First_Name,Last_Name&page=1&per_page=50\n\n\nResponse includes pagination info:\n\n{\n  \"data\": [...],\n  \"info\": {\n    \"per_page\": 50,\n    \"count\": 50,\n    \"page\": 1,\n    \"sort_by\": \"id\",\n    \"sort_order\": \"desc\",\n    \"more_records\": true,\n    \"next_page_token\": \"token_value\",\n    \"page_token_expiry\": \"2026-02-07T01:10:56-08:00\"\n  }\n}\n\nFor up to 2,000 records: Use page parameter (increment each request)\nFor 2,000+ records: Use page_token from previous response\nPage tokens expire after 24 hours\nCode Examples\nJavaScript\nconst response = await fetch(\n  'https://gateway.maton.ai/zoho-crm/crm/v8/Leads?fields=First_Name,Last_Name,Email',\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-crm/crm/v8/Leads',\n    headers={'Authorization': f'Bearer {os.environ[\"MATON_API_KEY\"]}'},\n    params={'fields': 'First_Name,Last_Name,Email'}\n)\ndata = response.json()\n\nNotes\nThe fields parameter is required for list operations (max 50 fields)\nModule API names are case-sensitive (e.g., Leads, not leads)\nMaximum 100 records per create/update request\nMaximum 100 records per delete request\nMaximum 200 records returned per GET request\nMaximum 2,000 records without page_token; up to 100,000 with page_token\nUse field API names (not display names) in requests\nIf you receive a scope error, contact Maton support at support@maton.ai with the specific operations/APIs you need and your use-case\nEmpty datasets return HTTP 204 (No Content) with empty body\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 CRM connection, missing required parameter, 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 CRM API\nCommon Error Codes\nCode\tDescription\nOAUTH_SCOPE_MISMATCH\tOAuth token lacks required permissions for the endpoint\nMANDATORY_NOT_FOUND\tRequired field is missing\nINVALID_DATA\tData type mismatch or format error\nDUPLICATE_DATA\tRecord violates unique field constraint\nRECORD_NOT_FOUND\tThe specified record ID does not exist\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-crm. For example:\nCorrect: https://gateway.maton.ai/zoho-crm/crm/v8/Leads\nIncorrect: https://gateway.maton.ai/crm/v8/Leads\nResources\nZoho CRM API v8 Documentation\nGet Records API\nInsert Records API\nUpdate Records API\nDelete Records API\nSearch Records API\nOrganization API\nUsers API\nModules API\nFields API\nLayouts API\nRoles API\nProfiles API\nMaton Community\nMaton Support"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/byungkyu/zoho-crm",
    "publisherUrl": "https://clawhub.ai/byungkyu/zoho-crm",
    "owner": "byungkyu",
    "version": "1.0.4",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/zoho-crm",
    "downloadUrl": "https://openagent3.xyz/downloads/zoho-crm",
    "agentUrl": "https://openagent3.xyz/skills/zoho-crm/agent",
    "manifestUrl": "https://openagent3.xyz/skills/zoho-crm/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/zoho-crm/agent.md"
  }
}