Zoho CRM
Read and write Leads, Contacts, and Deals in Zoho CRM through the official Zoho CRM REST API v6.
- Base URL:
https://www.zohoapis.com(override per data center viaapiDomain) - Auth:
Authorization: Zoho-oauthtoken <access_token> - Standard-library Python only (no external dependencies).
Operations
| operation | HTTP | Endpoint | Notes |
|---|---|---|---|
list_records |
GET | /crm/v6/{module}?fields=...&per_page=N |
Zoho v6 requires the fields param; a default set is sent per module. |
get_record |
GET | /crm/v6/{module}/{recordId} |
Fetch one record by id. |
insert_record |
POST | /crm/v6/{module} |
Body {"data": [ <fields> ]}. |
update_record |
PUT | /crm/v6/{module}/{recordId} |
Body {"data": [ {"id": <recordId>, <fields> } ]}. |
{module} is one of Leads, Contacts, Deals (defaults to Leads).
API key setup
- Go to the Zoho API Console and create a client (Self Client is simplest for server-to-server use).
- Generate an access token with a CRM scope such as
ZohoCRM.modules.ALL(or a narrowerZohoCRM.modules.leads.{READ,CREATE,UPDATE}). - Pass that token as
apiKey. It is sent asAuthorization: Zoho-oauthtoken <token>.
Zoho access tokens expire roughly every hour. For unattended automation, use your refresh token to mint a fresh access token before each run (e.g. a preceding
httptask hittinghttps://accounts.zoho.com/oauth/v2/token), then feed the result into this tool'sapiKey.
Data center
Pick apiDomain to match where your Zoho account lives:
| Data center | apiDomain |
|---|---|
| US (default) | https://www.zohoapis.com |
| EU | https://www.zohoapis.eu |
| India | https://www.zohoapis.in |
| Australia | https://www.zohoapis.com.au |
| Japan | https://www.zohoapis.jp |
Examples
List the 5 most recent leads
{
"apiKey": "1000.xxxx.yyyy",
"operation": "list_records",
"module": "Leads",
"perPage": "5"
}
Get one contact by id
{
"apiKey": "1000.xxxx.yyyy",
"operation": "get_record",
"module": "Contacts",
"recordId": "3652397000003852095"
}
Create a lead
{
"apiKey": "1000.xxxx.yyyy",
"operation": "insert_record",
"module": "Leads",
"fields": "{\"Last_Name\": \"Smith\", \"First_Name\": \"John\", \"Company\": \"ABC Corp\", \"Email\": \"[email protected]\"}"
}
Update a deal's stage
{
"apiKey": "1000.xxxx.yyyy",
"operation": "update_record",
"module": "Deals",
"recordId": "3652397000003852095",
"fields": "{\"Stage\": \"Closed Won\", \"Amount\": 25000}"
}
Output
Every call publishes:
result— the raw Zoho JSON response body (as a string).status— the HTTP status code (e.g.200,201,401).
Non-2xx responses are returned with their body intact (not thrown) so the
caller can inspect Zoho's error code. A transport-level failure emits
{"error": "..."} and exits non-zero, marking the step FAILED.
Publishes
The keys a later task may reference as {{taskName.key}}. Referencing anything not listed here resolves to nothing at run time.
errorresultstatus
Input Properties
Every property this tool accepts, from its own tool.iml.
| Property | Type | Required | Default | Description |
|---|---|---|---|---|
apiKey |
string | yes | — | Zoho OAuth access token. Generate via Zoho API Console (Self Client or OAuth flow) with scope ZohoCRM.modules.ALL; sent as 'Authorization: Zoho-oauthtoken |
operation |
string | yes | — | One of: list_records, get_record, insert_record, update_record |
module |
string | no | — | CRM module: Leads, Contacts, or Deals. Defaults to Leads. |
recordId |
string | no | — | Record id — required for get_record and update_record. |
fields |
string | no | — | JSON object of field API names to write, e.g. {"Last_Name": "Smith", "Company": "ABC Corp"}. Required for insert_record and update_record. |
queryFields |
string | no | — | Comma-separated field API names to return for list_records (Zoho v6 requires the 'fields' param). Defaults to a sensible set per module. |
perPage |
string | no | 10 |
Max records to return for list_records (1-200). |
apiDomain |
string | no | — | Zoho API domain for your data center. Defaults to https://www.zohoapis.com (US). Use https://www.zohoapis.eu, .in, .com.au, .jp, etc. as appropriate. |