通过 Maton 托管的 OAuth 代理读写 Zoho CRM 记录,所有写入操作均需用户确认。
文档
zoho-bigin
试用通过 Maton 代管的 OAuth,读写 Zoho Bigin 中的联系人、客户、管道和产品记录。
它能做什么
通过 Maton 网关调用 Zoho Bigin v2 API,在 Authorization 头中携带 Bearer Token,OAuth 连接由 Maton 统一管理。支持对 Contacts(联系人)、Accounts(客户)、Pipelines(管道)和 Products(产品)模块进行列表、读取、创建、更新、删除和搜索。Tasks、Events、Calls、Notes 需要额外的 OAuth 授权范围。所有写操作都需先与用户确认;读取和列表调用可默认执行。
什么时候用它
- 按指定字段分页列出联系人
- 按邮箱、条件搜索客户记录
- 创建或更新销售管道商机
- 批量删除记录(单次最多 100 条)
技能文档
Zoho Bigin
Access the Zoho Bigin API with managed OAuth authentication. Manage contacts, companies, pipelines, and products with full CRUD operations.
Quick Start
# List contacts
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/zoho-bigin/bigin/v2/Contacts?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://api.maton.ai/zoho-bigin/bigin/v2/{endpoint}
Maton proxies requests to www.zohoapis.com/bigin/v2 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
- Sign in or create an account at maton.ai
- Go to maton.ai/settings
- Copy your API key
Connection Management
Manage your Zoho Bigin OAuth connections at https://api.maton.ai.
List Connections
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/connections?app=zoho-bigin&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-bigin'}).encode()
req = urllib.request.Request('https://api.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://api.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
Response:
{
"connection": {
"connection_id": "{connection_id}",
"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-bigin",
"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://api.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 Bigin connections, specify which one to use with the Maton-Connection header:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/zoho-bigin/bigin/v2/Contacts?fields=First_Name,Last_Name,Email')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Maton-Connection', '{connection_id}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
If you have multiple connections, always include this header to ensure requests go to the intended account.
Security & Permissions
- Access is scoped to contacts, companies, pipelines, and products in Bigin CRM within the connected Zoho Bigin account.
- All write operations require explicit user approval. Before executing any create, update, or delete call, confirm the target resource and intended effect with the user.
API Reference
Modules
Zoho Bigin organizes data into modules. Available modules include:
| Module | API Name | Description |
|---|---|---|
| Contacts | Contacts | Individual people |
| Companies | Accounts | Organizations/businesses |
| Pipelines | Pipelines | Sales opportunities/deals |
| Products | Products | Items you sell |
| Tasks | Tasks | To-do items (requires additional OAuth scope) |
| Events | Events | Calendar appointments (requires additional OAuth scope) |
| Calls | Calls | Phone call logs (requires additional OAuth scope) |
| Notes | Notes | Notes attached to records (requires additional OAuth scope) |
List Records
GET /zoho-bigin/bigin/v2/{module_api_name}?fields={field1},{field2}
Query Parameters:
| Parameter | Type | Description |
|---|---|---|
fields | string | Required. Comma-separated field API names to retrieve |
sort_order | string | asc or desc |
sort_by | string | Field API name to sort by |
page | integer | Page number (default: 1) |
per_page | integer | Records per page (default: 200, max: 200) |
cvid | string | Custom view ID for filtered results |
Example - List Contacts:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/zoho-bigin/bigin/v2/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
Response:
{
"data": [
{
"First_Name": "Ted",
"Email": "support@bigin.com",
"Last_Name": "Watson",
"id": "7255024000000596045"
}
],
"info": {
"per_page": 200,
"count": 1,
"page": 1,
"more_records": false
}
}
Example - List Companies (Accounts):
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/zoho-bigin/bigin/v2/Accounts?fields=Account_Name,Website')
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-bigin/bigin/v2/{module_api_name}/{record_id}
Example:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/zoho-bigin/bigin/v2/Contacts/7255024000000596045')
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-bigin/bigin/v2/{module_api_name}
Content-Type: application/json
{
"data": [
{
"field_api_name": "value"
}
]
}
Mandatory Fields by Module:
| Module | Required Fields |
|---|---|
| Contacts | Last_Name |
| Accounts | Account_Name |
| Pipelines | Pipeline_Name, Stage |
| Products | Product_Name |
Example - Create Contact:
python <<'EOF'
import urllib.request, os, json
data = json.dumps({
"data": [{
"Last_Name": "Smith",
"First_Name": "John",
"Email": "john.smith@example.com",
"Phone": "+1-555-0123"
}]
}).encode()
req = urllib.request.Request('https://api.maton.ai/zoho-bigin/bigin/v2/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
Response:
{
"data": [
{
"code": "SUCCESS",
"details": {
"Modified_Time": "2026-02-06T00:28:53-08:00",
"Modified_By": {
"name": "User Name",
"id": "7255024000000590001"
},
"Created_Time": "2026-02-06T00:28:53-08:00",
"id": "7255024000000605002",
"Created_By": {
"name": "User Name",
"id": "7255024000000590001"
}
},
"message": "record added",
"status": "success"
}
]
}
Example - Create Company (Account):
python <<'EOF'
import urllib.request, os, json
data = json.dumps({
"data": [{
"Account_Name": "Acme Corporation",
"Website": "https://acme.com"
}]
}).encode()
req = urllib.request.Request('https://api.maton.ai/zoho-bigin/bigin/v2/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-bigin/bigin/v2/{module_api_name}
Content-Type: application/json
{
"data": [
{
"id": "record_id",
"field_api_name": "updated_value"
}
]
}
Example:
python <<'EOF'
import urllib.request, os, json
data = json.dumps({
"data": [{
"id": "7255024000000605002",
"Phone": "+1-555-9999"
}]
}).encode()
req = urllib.request.Request('https://api.maton.ai/zoho-bigin/bigin/v2/Contacts', 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
Response:
{
"data": [
{
"code": "SUCCESS",
"details": {
"Modified_Time": "2026-02-06T00:29:07-08:00",
"id": "7255024000000605002"
},
"message": "record updated",
"status": "success"
}
]
}
Delete Records
DELETE /zoho-bigin/bigin/v2/{module_api_name}?ids={record_id1},{record_id2}
Query Parameters:
| Parameter | Type | Description |
|---|---|---|
ids | string | Comma-separated record IDs (required, max 100) |
wf_trigger | boolean | Execute workflows (default: true) |
Example:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/zoho-bigin/bigin/v2/Contacts?ids=7255024000000605002', 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
Response:
{
"data": [
{
"code": "SUCCESS",
"details": {
"id": "7255024000000605002"
},
"message": "record deleted",
"status": "success"
}
]
}
Search Records
GET /zoho-bigin/bigin/v2/{module_api_name}/search
Query Parameters:
| Parameter | Type | Description |
|---|---|---|
criteria | string | Search criteria (e.g., (Last_Name:equals:Smith)) |
email | string | Search by email address |
phone | string | Search by phone number |
word | string | Global text search |
page | integer | Page number |
per_page | integer | Records per page (max 200) |
Criteria Format: ((field_api_name:operator:value)and/or(...))
Operators: equals, starts_with
Example - Search by email:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/zoho-bigin/bigin/v2/Contacts/search?email=support@bigin.com')
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:equals:Watson)')
req = urllib.request.Request(f'https://api.maton.ai/zoho-bigin/bigin/v2/Contacts/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
Metadata APIs
Get Modules
GET /zoho-bigin/bigin/v2/settings/modules
Example:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/zoho-bigin/bigin/v2/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
Get Users
GET /zoho-bigin/bigin/v2/users
Query Parameters:
| Parameter | Type | Description |
|---|---|---|
type | string | AllUsers, ActiveUsers, AdminUsers, CurrentUser |
page | integer | Page number |
per_page | integer | Users per page (max 200) |
Example:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/zoho-bigin/bigin/v2/users?type=ActiveUsers')
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 Bigin uses page-based pagination with page and per_page parameters:
GET /zoho-bigin/bigin/v2/{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,
"more_records": true
}
}
Continue fetching while more_records is true, incrementing page each time.
Code Examples
JavaScript
const response = await fetch(
'https://api.maton.ai/zoho-bigin/bigin/v2/Contacts?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://api.maton.ai/zoho-bigin/bigin/v2/Contacts',
headers={'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}'},
params={'fields': 'First_Name,Last_Name,Email'}
)
data = response.json()
Notes
- The
fieldsparameter is required for list operations - Module API names are case-sensitive (e.g.,
Contacts, notcontacts) - Companies are accessed via the
Accountsmodule API name - Sales opportunities are accessed via the
Pipelinesmodule (notDeals) - Maximum 100 records per create/update request
- Maximum 100 records per delete request
- Maximum 200 records returned per GET request
- Use field API names (not display names) in requests
- Some modules (Tasks, Events, Calls, Notes) require additional OAuth scopes. If you receive a scope error, contact Maton support at support@maton.ai with the specific operations/APIs you need and your use-case
- IMPORTANT: When using curl commands, use
curl -gwhen URLs contain brackets to disable glob parsing - IMPORTANT: When piping curl output to
jqor other commands, environment variables like$MATON_API_KEYmay not expand correctly in some shell environments
Error Handling
| Status | Meaning |
|---|---|
| 400 | Missing Zoho Bigin connection, missing required parameter, or invalid request |
| 401 | Invalid or missing Maton API key, or OAuth scope mismatch |
| 404 | Invalid URL pattern or resource not found |
| 429 | Rate limited |
| 4xx/5xx | Passthrough error from Zoho Bigin API |
Common Error Codes
| Code | Description |
|---|---|
REQUIRED_PARAM_MISSING | Required parameter (like fields) is missing |
INVALID_URL_PATTERN | Invalid API endpoint path |
INVALID_MODULE | Module does not exist or is not API-supported |
OAUTH_SCOPE_MISMATCH | OAuth token lacks required permissions for the endpoint |
NO_PERMISSION | Insufficient privileges for the operation |
MANDATORY_NOT_FOUND | Required field is missing |
INVALID_DATA | Data type mismatch or format error |
DUPLICATE_DATA | Record violates unique field constraint |
Troubleshooting: API Key Issues
- Check that the
MATON_API_KEYenvironment variable is set:
echo $MATON_API_KEY
- Verify the API key is valid by listing connections:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.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-bigin. For example:
- Correct:
https://api.maton.ai/zoho-bigin/bigin/v2/Contacts - Incorrect:
https://api.maton.ai/bigin/v2/Contacts
Resources
常见问题
- 如何进行身份认证?
- 请求通过 Authorization 头携带 Maton API Key,Maton 会自动代理到 www.zohoapis.com/bigin/v2 并注入 OAuth Token。存在多个 Zoho Bigin 连接时,可通过 Maton-Connection 头指定目标账户。
- 默认支持哪些模块?
- Contacts(联系人)、Accounts(客户)、Pipelines(管道)和 Products(产品)开箱即用;Tasks、Events、Calls、Notes 需要在连接中额外申请 OAuth Scope 才能使用。
- 写操作会自动执行吗?
- 不会。创建、更新、删除前必须先与用户确认目标资源和预期影响;只有读取和列表调用可以默认执行。
相关技能
通过托管 OAuth 网关读写 Zoho 日历的日历与事件。
通过 OAuth 代理调用 Zoho Mail REST API,管理账户、文件夹、标签以及邮件收发。
通过托管 OAuth 连接 Zoho Inventory API,对商品、销售订单、发票、联系人、账单等记录进行读写。
通过托管 OAuth 读写 Zoho Recruit 的候选人、职位和面试数据。
通过 Maton API 代理,使用托管 OAuth 管理 Zoho Bookings 的预约、服务、员工和工作区。