Skip to main content 首页 创作者 johnalbertini14-glitch openclaw-skills zoho-crm
zoho-crm Zoho CRM API integration with managed OAuth. Manage leads, contacts, accounts, deals, and other CRM records.
Use this skill when users want to read, create, update, or delete CRM records, search contacts, manage sales pipelines, access organization settings, manage users, or retrieve module metadata in Zoho CRM.
For other third party apps, use the api-gateway skill (https://clawhub.ai/byungkyu/api-gateway).
Requires network access and valid Maton API key.
跳到安装 Skills Marketplace 发现并探索由社区构建的 Agent Skills
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/johnalbertini14-glitch/openclaw-skills --skill zoho-crm命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
下载 Zip 下载中... name zoho-crm description Zoho CRM API integration with managed OAuth. Manage leads, contacts, accounts, deals, and other CRM records.
Use this skill when users want to read, create, update, or delete CRM records, search contacts, manage sales pipelines, access organization settings, manage users, or retrieve module metadata in Zoho CRM.
For other third party apps, use the api-gateway skill (https://clawhub.ai/byungkyu/api-gateway).
Requires network access and valid Maton API key.
metadata {"author":"maton","version":"1.0","clawdbot":{"emoji":"🧠","requires":{"env":["MATON_API_KEY"]}}}
Zoho CRM
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.
Quick Start
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/Leads?fields=First_Name,Last_Name,Email' )
req.add_header('Authorization' , f'Bearer {os.environ["MATON_API_KEY"]}' )
print (json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Base URL
https://gateway.maton.ai/zoho-crm/crm/v8/{endpoint}
The gateway proxies requests to www.zohoapis.com/crm/v8 and automatically injects your OAuth token.
Authentication
All requests require the Maton API key in the Authorization header:
Authorization: Bearer $MATON_API_KEY
Environment Variable: Set your API key as MATON_API_KEY:
export MATON_API_KEY="YOUR_API_KEY"
Getting Your API Key
Connection Management Manage your Zoho CRM OAuth connections at https://ctrl.maton.ai.
List Connections python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections?app=zoho-crm&status=ACTIVE' )
req.add_header('Authorization' , f'Bearer {os.environ["MATON_API_KEY"]}' )
print (json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Create Connection python <<'EOF'
import urllib.request, os, json
data = json.dumps({'app' : 'zoho-crm' }).encode()
req = urllib.request.Request('https://ctrl.maton.ai/connections' , data=data, method='POST' )
req.add_header('Authorization' , f'Bearer {os.environ["MATON_API_KEY"]}' )
req.add_header('Content-Type' , 'application/json' )
print (json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Get Connection python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}' )
req.add_header('Authorization' , f'Bearer {os.environ["MATON_API_KEY"]}' )
print (json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
{
"connection" : {
"connection_id" : "e55c5bac-241a-4cc8-9db5-50d2cad09136" ,
"status" : "ACTIVE" ,
"creation_time" : "2025-12-08T07:20:53.488460Z" ,
"last_updated_time" : "2026-01-31T20:03:32.593153Z" ,
"url" : "https://connect.maton.ai/?session_token=..." ,
"app" : "zoho-crm" ,
"metadata" : { }
}
}
Open the returned url in a browser to complete OAuth authorization.
Delete Connection python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}' , method='DELETE' )
req.add_header('Authorization' , f'Bearer {os.environ["MATON_API_KEY"]}' )
print (json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Specifying Connection If you have multiple Zoho CRM connections, specify which one to use with the Maton-Connection header:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/Leads?fields=First_Name,Last_Name,Email' )
req.add_header('Authorization' , f'Bearer {os.environ["MATON_API_KEY"]}' )
req.add_header('Maton-Connection' , 'e55c5bac-241a-4cc8-9db5-50d2cad09136' )
print (json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
If omitted, the gateway uses the default (oldest) active connection.
API Reference
Modules Zoho CRM organizes data into modules. Core modules include:
Module API Name Description Leads LeadsPotential customers Contacts ContactsIndividual people Accounts AccountsOrganizations/companies Deals DealsSales opportunities Campaigns CampaignsMarketing campaigns Tasks TasksTo-do items Calls CallsPhone call logs Events EventsCalendar appointments Products ProductsItems you sell
List Records GET /zoho-crm/crm/v8/{module_api_name}?fields={field1},{field2}
Parameter Type Description fieldsstring Required. Comma-separated field API names (max 50)pageinteger Page number (default: 1) per_pageinteger Records per page (default/max: 200) sort_bystring Sort by: id, Created_Time, or Modified_Time sort_orderstring asc or desc (default)cvidlong Custom view ID page_tokenstring For >2000 records pagination
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/Leads?fields=First_Name,Last_Name,Email,Phone,Company' )
req.add_header('Authorization' , f'Bearer {os.environ["MATON_API_KEY"]}' )
print (json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
{
"data" : [
{
"First_Name" : "Christopher" ,
"Email" : "christopher-maclead@noemail.invalid" ,
"Last_Name" : "Maclead (Sample)" ,
"Phone" : "555-555-5555" ,
"Company" : "Rangoni Of Florence" ,
"id" : "7243485000000597000"
}
] ,
"info" : {
"per_page" : 200 ,
"count" : 1 ,
"page" : 1 ,
"sort_by" : "id" ,
"sort_order" : "desc" ,
"more_records" : false ,
"next_page_token" : null
}
}
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/Contacts?fields=First_Name,Last_Name,Email,Phone' )
req.add_header('Authorization' , f'Bearer {os.environ["MATON_API_KEY"]}' )
print (json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/Accounts?fields=Account_Name,Website,Phone' )
req.add_header('Authorization' , f'Bearer {os.environ["MATON_API_KEY"]}' )
print (json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/Deals?fields=Deal_Name,Stage,Amount' )
req.add_header('Authorization' , f'Bearer {os.environ["MATON_API_KEY"]}' )
print (json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Get Record GET /zoho-crm/crm/v8/{module_api_name}/{record_id}
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/Leads/7243485000000597000' )
req.add_header('Authorization' , f'Bearer {os.environ["MATON_API_KEY"]}' )
print (json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Create Records POST /zoho-crm/crm/v8/{module_api_name}
Content-Type: application/json
{
"data" : [
{
"field_api_name" : "value"
}
]
}
Mandatory Fields by Module:
Module Required Fields Leads Last_NameContacts Last_NameAccounts Account_NameDeals Deal_Name, StageTasks SubjectCalls Subject, Call_Type, Call_Start_Time, Call_DurationEvents Event_Title, Start_DateTime, End_DateTime
python <<'EOF'
import urllib.request, os, json
data = json.dumps({
"data" : [{
"Last_Name" : "Smith" ,
"First_Name" : "John" ,
"Email" : "john.smith@example.com" ,
"Company" : "Acme Corp" ,
"Phone" : "+1-555-0123"
}]
}).encode()
req = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/Leads' , data=data, method='POST' )
req.add_header('Authorization' , f'Bearer {os.environ["MATON_API_KEY"]}' )
req.add_header('Content-Type' , 'application/json' )
print (json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
{
"data" : [
{
"code" : "SUCCESS" ,
"details" : {
"Modified_Time" : "2026-02-06T01:10:56-08:00" ,
"Modified_By" : {
"name" : "User Name" ,
"id" : "7243485000000590001"
} ,
"Created_Time" : "2026-02-06T01:10:56-08:00" ,
"id" : "7243485000000619001" ,
"Created_By" : {
"name" : "User Name" ,
"id" : "7243485000000590001"
}
} ,
"message" : "record added" ,
"status" : "success"
}
]
}
Example - Create Contact:
python <<'EOF'
import urllib.request, os, json
data = json.dumps({
"data" : [{
"Last_Name" : "Doe" ,
"First_Name" : "Jane" ,
"Email" : "jane.doe@example.com" ,
"Phone" : "+1-555-9876"
}]
}).encode()
req = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/Contacts' , data=data, method='POST' )
req.add_header('Authorization' , f'Bearer {os.environ["MATON_API_KEY"]}' )
req.add_header('Content-Type' , 'application/json' )
print (json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Example - Create Account:
python <<'EOF'
import urllib.request, os, json
data = json.dumps({
"data" : [{
"Account_Name" : "Acme Corporation" ,
"Website" : "https://acme.com" ,
"Phone" : "+1-555-1234"
}]
}).encode()
req = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/Accounts' , data=data, method='POST' )
req.add_header('Authorization' , f'Bearer {os.environ["MATON_API_KEY"]}' )
req.add_header('Content-Type' , 'application/json' )
print (json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Update Records PUT /zoho-crm/crm/v8/{module_api_name}
Content-Type: application/json
{
"data" : [
{
"id" : "record_id" ,
"field_api_name" : "updated_value"
}
]
}
python <<'EOF'
import urllib.request, os, json
data = json.dumps({
"data" : [{
"id" : "7243485000000619001" ,
"Phone" : "+1-555-9999" ,
"Company" : "Updated Company Name"
}]
}).encode()
req = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/Leads' , data=data, method='PUT' )
req.add_header('Authorization' , f'Bearer {os.environ["MATON_API_KEY"]}' )
req.add_header('Content-Type' , 'application/json' )
print (json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
{
"data" : [
{
"code" : "SUCCESS" ,
"details" : {
"Modified_Time" : "2026-02-06T01:11:01-08:00" ,
"Modified_By" : {
"name" : "User Name" ,
"id" : "7243485000000590001"
} ,
"Created_Time" : "2026-02-06T01:10:56-08:00" ,
"id" : "7243485000000619001" ,
"Created_By" : {
"name" : "User Name" ,
"id" : "7243485000000590001"
}
} ,
"message" : "record updated" ,
"status" : "success"
}
]
}
Delete Records DELETE /zoho-crm/crm/v8/{module_api_name}?ids={record_id1},{record_id2}
Parameter Type Description idsstring Comma-separated record IDs (required, max 100) wf_triggerboolean Execute workflows (default: true)
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/Leads?ids=7243485000000619001' , method='DELETE' )
req.add_header('Authorization' , f'Bearer {os.environ["MATON_API_KEY"]}' )
print (json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
{
"data" : [
{
"code" : "SUCCESS" ,
"details" : {
"id" : "7243485000000619001"
} ,
"message" : "record deleted" ,
"status" : "success"
}
]
}
Search Records GET /zoho-crm/crm/v8/{module_api_name}/search
Query Parameters (one required):
Parameter Type Description criteriastring Search criteria (e.g., (Last_Name:equals:Smith)) emailstring Search by email address phonestring Search by phone number wordstring Global text search pageinteger Page number per_pageinteger Records per page (max 200)
Criteria Format: ((field_api_name:operator:value) and/or (...))
Text fields: equals, not_equal, starts_with, in
Date/Number fields: equals, not_equal, greater_than, less_than, between, in
Boolean fields: equals, not_equal
Example - Search by email:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/Leads/search?email=christopher-maclead@noemail.invalid' )
req.add_header('Authorization' , f'Bearer {os.environ["MATON_API_KEY"]}' )
print (json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Example - Search by criteria:
python <<'EOF'
import urllib.request, os, json
import urllib.parse
criteria = urllib.parse.quote('(Last_Name:starts_with:Smith)' )
req = urllib.request.Request(f'https://gateway.maton.ai/zoho-crm/crm/v8/Leads/search?criteria={criteria}' )
req.add_header('Authorization' , f'Bearer {os.environ["MATON_API_KEY"]}' )
print (json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
{
"data" : [
{
"First_Name" : "Christopher" ,
"Email" : "christopher-maclead@noemail.invalid" ,
"Last_Name" : "Maclead (Sample)" ,
"id" : "7243485000000597000"
}
] ,
"info" : {
"per_page" : 200 ,
"count" : 1 ,
"page" : 1 ,
"more_records" : false
}
}
Organization Details Retrieve your Zoho CRM organization details.
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/org' )
req.add_header('Authorization' , f'Bearer {os.environ["MATON_API_KEY"]}' )
print (json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
{
"org" : [
{
"id" : "7243485000000020005" ,
"company_name" : "Acme Corp" ,
"domain_name" : "org123456789" ,
"primary_email" : "admin@example.com" ,
"phone" : "555-555-5555" ,
"currency" : "US Dollar - USD" ,
"currency_symbol" : "$" ,
"iso_code" : "USD" ,
"time_zone" : "PST" ,
"country_code" : "US" ,
"zgid" : "123456789" ,
"type" : "production" ,
"mc_status" : false ,
"license_details" : {
"paid" : true ,
"paid_type" : "enterprise" ,
"users_license_purchased" : 10 ,
"trial_expiry" : null
}
}
]
}
Users Retrieve users in your Zoho CRM organization.
GET /zoho-crm/crm/v8/users
Parameter Type Description typestring Filter by user type: AllUsers, ActiveUsers, DeactiveUsers, ConfirmedUsers, NotConfirmedUsers, DeletedUsers, ActiveConfirmedUsers, AdminUsers, ActiveConfirmedAdmins, CurrentUser pageinteger Page number (default: 1) per_pageinteger Records per page (default/max: 200) idsstring Comma-separated user IDs (max 100)
Example - List all users:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/users?type=AllUsers' )
req.add_header('Authorization' , f'Bearer {os.environ["MATON_API_KEY"]}' )
print (json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
{
"users" : [
{
"id" : "7243485000000590001" ,
"first_name" : "John" ,
"last_name" : "Doe" ,
"full_name" : "John Doe" ,
"email" : "john.doe@example.com" ,
"status" : "active" ,
"confirm" : true ,
"role" : {
"name" : "CEO" ,
"id" : "7243485000000026005"
} ,
"profile" : {
"name" : "Administrator" ,
"id" : "7243485000000026011"
} ,
"time_zone" : "PST" ,
"country" : "US" ,
"locale" : "en_US"
}
] ,
"info" : {
"per_page" : 200 ,
"count" : 1 ,
"page" : 1 ,
"more_records" : false
}
}
Example - Get specific user:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/users/7243485000000590001' )
req.add_header('Authorization' , f'Bearer {os.environ["MATON_API_KEY"]}' )
print (json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Modules Metadata Retrieve metadata about all available CRM modules.
GET /zoho-crm/crm/v8/settings/modules
Parameter Type Description statusstring Filter by status: user_hidden, system_hidden, scheduled_for_deletion, visible
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/settings/modules' )
req.add_header('Authorization' , f'Bearer {os.environ["MATON_API_KEY"]}' )
print (json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
{
"modules" : [
{
"api_name" : "Leads" ,
"module_name" : "Leads" ,
"singular_label" : "Lead" ,
"plural_label" : "Leads" ,
"api_supported" : true ,
"creatable" : true ,
"editable" : true ,
"deletable" : true ,
"viewable" : true ,
"status" : "visible" ,
"generated_type" : "default" ,
"id" : "7243485000000002175" ,
"profiles" : [
{ "name" : "Administrator" , "id" : "7243485000000026011" }
]
}
]
}
Fields Metadata Retrieve field metadata for a specific module.
GET /zoho-crm/crm/v8/settings/fields?module={module_api_name}
Parameter Type Description modulestring Required. API name of the module (e.g., Leads, Contacts)typestring all for all fields, unused for unused fields only
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/settings/fields?module=Leads' )
req.add_header('Authorization' , f'Bearer {os.environ["MATON_API_KEY"]}' )
print (json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
{
"fields" : [
{
"api_name" : "Last_Name" ,
"field_label" : "Last Name" ,
"data_type" : "text" ,
"system_mandatory" : true ,
"custom_field" : false ,
"visible" : true ,
"searchable" : true ,
"sortable" : true ,
"id" : "7243485000000002613"
}
]
}
Layouts Metadata Retrieve layout metadata for a specific module.
GET /zoho-crm/crm/v8/settings/layouts?module={module_api_name}
Parameter Type Description modulestring Required. API name of the module (e.g., Leads, Contacts)
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/settings/layouts?module=Leads' )
req.add_header('Authorization' , f'Bearer {os.environ["MATON_API_KEY"]}' )
print (json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
{
"layouts" : [
{
"id" : "7243485000000091055" ,
"name" : "Standard" ,
"api_name" : "Standard" ,
"status" : "active" ,
"visible" : true ,
"profiles" : [
{ "name" : "Administrator" , "id" : "7243485000000026011" }
] ,
"sections" : [
{
"display_label" : "Lead Information" ,
"api_name" : "Lead_Information" ,
"sequence_number" : 1 ,
"fields" : [ ...]
}
]
}
]
}
Roles Retrieve roles in your Zoho CRM organization.
GET /zoho-crm/crm/v8/settings/roles
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/settings/roles' )
req.add_header('Authorization' , f'Bearer {os.environ["MATON_API_KEY"]}' )
print (json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
{
"roles" : [
{
"id" : "7243485000000026005" ,
"name" : "CEO" ,
"display_label" : "CEO" ,
"share_with_peers" : true ,
"description" : null ,
"reporting_to" : null
} ,
{
"id" : "7243485000000026008" ,
"name" : "Manager" ,
"display_label" : "Manager" ,
"share_with_peers" : false ,
"reporting_to" : {
"name" : "CEO" ,
"id" : "7243485000000026005"
}
}
]
}
Example - Get specific role:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/settings/roles/7243485000000026005' )
req.add_header('Authorization' , f'Bearer {os.environ["MATON_API_KEY"]}' )
print (json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Profiles Retrieve profiles (permission sets) in your Zoho CRM organization.
GET /zoho-crm/crm/v8/settings/profiles
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/settings/profiles' )
req.add_header('Authorization' , f'Bearer {os.environ["MATON_API_KEY"]}' )
print (json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
{
"profiles" : [
{
"id" : "7243485000000026011" ,
"name" : "Administrator" ,
"display_label" : "Administrator" ,
"type" : "normal_profile" ,
"custom" : false ,
"description" : null
} ,
{
"id" : "7243485000000026014" ,
"name" : "Standard" ,
"display_label" : "Standard" ,
"type" : "normal_profile" ,
"custom" : false ,
"description" : null
}
]
}
Example - Get specific profile:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/settings/profiles/7243485000000026011' )
req.add_header('Authorization' , f'Bearer {os.environ["MATON_API_KEY"]}' )
print (json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Pagination Zoho CRM uses page-based pagination with optional page tokens for large datasets:
GET /zoho-crm/crm/v8/{module_api_name}?fields=First_Name,Last_Name&page=1&per_page=50
Response includes pagination info:
{
"data" : [ ...] ,
"info" : {
"per_page" : 50 ,
"count" : 50 ,
"page" : 1 ,
"sort_by" : "id" ,
"sort_order" : "desc" ,
"more_records" : true ,
"next_page_token" : "token_value" ,
"page_token_expiry" : "2026-02-07T01:10:56-08:00"
}
}
For up to 2,000 records: Use page parameter (increment each request)
For 2,000+ records: Use page_token from previous response
Page tokens expire after 24 hours
Code Examples
JavaScript const response = await fetch (
'https://gateway.maton.ai/zoho-crm/crm/v8/Leads?fields=First_Name,Last_Name,Email' ,
{
headers : {
'Authorization' : `Bearer ${process.env.MATON_API_KEY} `
}
}
);
const data = await response.json ();
Python import os
import requests
response = requests.get(
'https://gateway.maton.ai/zoho-crm/crm/v8/Leads' ,
headers={'Authorization' : f'Bearer {os.environ["MATON_API_KEY" ]} ' },
params={'fields' : 'First_Name,Last_Name,Email' }
)
data = response.json()
Notes
The fields parameter is required for list operations (max 50 fields)
Module API names are case-sensitive (e.g., Leads, not leads)
Maximum 100 records per create/update request
Maximum 100 records per delete request
Maximum 200 records returned per GET request
Maximum 2,000 records without page_token; up to 100,000 with page_token
Use field API names (not display names) in requests
If you receive a scope error, contact Maton support at support@maton.ai with the specific operations/APIs you need and your use-case
Empty datasets return HTTP 204 (No Content) with empty body
IMPORTANT: When using curl commands, use curl -g when URLs contain brackets to disable glob parsing
IMPORTANT: When piping curl output to jq or other commands, environment variables like $MATON_API_KEY may not expand correctly in some shell environments
Error Handling Status Meaning 400 Missing Zoho CRM connection, missing required parameter, or invalid request 401 Invalid or missing Maton API key, or OAuth scope mismatch 404 Resource not found 429 Rate limited 4xx/5xx Passthrough error from Zoho CRM API
Common Error Codes Code Description OAUTH_SCOPE_MISMATCHOAuth token lacks required permissions for the endpoint MANDATORY_NOT_FOUNDRequired field is missing INVALID_DATAData type mismatch or format error DUPLICATE_DATARecord violates unique field constraint RECORD_NOT_FOUNDThe specified record ID does not exist
Troubleshooting: API Key Issues
Check that the MATON_API_KEY environment variable is set:
Verify the API key is valid by listing connections:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections' )
req.add_header('Authorization' , f'Bearer {os.environ["MATON_API_KEY"]}' )
print (json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Troubleshooting: Invalid App Name
Ensure your URL path starts with zoho-crm. For example:
Correct: https://gateway.maton.ai/zoho-crm/crm/v8/Leads
Incorrect: https://gateway.maton.ai/crm/v8/Leads
Resources