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.