Zoho CRM
Accede a la API de Zoho CRM con autenticación OAuth administrada. Gestiona prospectos, contactos, cuentas, negocios y otros módulos de CRM con operaciones CRUD completas, incluyendo búsqueda y operaciones masivas. También admite detalles de organización, gestión de usuarios y recuperación de metadatos de módulos.
Inicio Rápido
# Listar prospectos
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
URL Base
https://gateway.maton.ai/zoho-crm/crm/v8/{endpoint}
La pasarela envía las peticiones a www.zohoapis.com/crm/v8 e inyecta automáticamente tu token OAuth.
Autenticación
Todas las solicitudes requieren la clave de API de Maton en el encabezado Authorization:
Authorization: Bearer $MATON_API_KEY
Variable de Entorno: Establece tu clave de API como MATON_API_KEY:
export MATON_API_KEY="YOUR_API_KEY"
Cómo Obtener tu Clave de API
- Inicia sesión o crea una cuenta en maton.ai
- Ve a maton.ai/settings
- Copia tu clave de API
Gestión de Conexiones
Gestiona tus conexiones OAuth de Zoho CRM en https://ctrl.maton.ai.
Listar Conexiones
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
Crear Conexión
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
Obtener Conexión
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
Respuesta:
{
"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": {}
}
}
Abre la url devuelta en un navegador para completar la autorización OAuth.
Eliminar Conexión
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
Especificar Conexión
Si tienes varias conexiones de Zoho CRM, especifica cuál usar con el encabezado Maton-Connection:
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
Si se omite, la pasarela usa la conexión activa por defecto (la más antigua).
Referencia de la API
Módulos
Zoho CRM organiza los datos en módulos. Los módulos principales incluyen:
| Módulo | Nombre de API | Descripción |
|---|---|---|
| Prospectos | Leads | Clientes potenciales |
| Contactos | Contacts | Personas individuales |
| Cuentas | Accounts | Organizaciones/empresas |
| Negocios | Deals | Oportunidades de venta |
| Campañas | Campaigns | Campañas de marketing |
| Tareas | Tasks | Elementos pendientes |
| Llamadas | Calls | Registros de llamadas telefónicas |
| Eventos | Events | Citas del calendario |
| Productos | Products | Artículos que vendes |
Listar Registros
GET /zoho-crm/crm/v8/{module_api_name}?fields={field1},{field2}
Parámetros de Consulta:
| Parámetro | Tipo | Descripción |
|---|---|---|
fields | string | Obligatorio. Nombres de campo de API separados por comas (máx. 50) |
page | integer | Número de página (por defecto: 1) |
per_page | integer | Registros por página (por defecto/máx.: 200) |
sort_by | string | Ordenar por: id, Created_Time, o Modified_Time |
sort_order | string | asc o desc (por defecto) |
cvid | long | ID de vista personalizada |
page_token | string | Para paginación de >2000 registros |
Ejemplo - Listar Prospectos:
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
Respuesta:
{
"data": [
{
"First_Name": "Christopher",
"Email": "[email protected]",
"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
}
}
Ejemplo - Listar Contactos:
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
Ejemplo - Listar Cuentas:
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
Ejemplo - Listar Negocios:
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
Obtener Registro
GET /zoho-crm/crm/v8/{module_api_name}/{record_id}
Ejemplo:
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
Crear Registros
POST /zoho-crm/crm/v8/{module_api_name}
Content-Type: application/json
{
"data": [
{
"field_api_name": "value"
}
]
}
Campos Obligatorios por Módulo:
| Módulo | Campos Obligatorios |
|---|---|
| Prospectos | Last_Name |
| Contactos | Last_Name |
| Cuentas | Account_Name |
| Negocios | Deal_Name, Stage |
| Tareas | Subject |
| Llamadas | Subject, Call_Type, Call_Start_Time, Call_Duration |
| Eventos | Event_Title, Start_DateTime, End_DateTime |
Ejemplo - Crear Prospecto:
python <<'EOF'
import urllib.request, os, json
data = json.dumps({
"data": [{
"Last_Name": "Smith",
"First_Name": "John",
"Email": "[email protected]",
"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
Respuesta:
{
"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"
}
]
}
Ejemplo - Crear Contacto:
python <<'EOF'
import urllib.request, os, json
data = json.dumps({
"data": [{
"Last_Name": "Doe",
"First_Name": "Jane",
"Email": "[email protected]",
"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
Ejemplo - Crear Cuenta:
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
Actualizar Registros
PUT /zoho-crm/crm/v8/{module_api_name}
Content-Type: application/json
{
"data": [
{
"id": "record_id",
"field_api_name": "updated_value"
}
]
}
Ejemplo:
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
Respuesta:
{
"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"
}
]
}
Eliminar Registros
DELETE /zoho-crm/crm/v8/{module_api_name}?ids={record_id1},{record_id2}
Parámetros de Consulta:
| Parámetro | Tipo | Descripción |
|---|---|---|
ids | string | IDs de registros separados por comas (obligatorio, máx. 100) |
wf_trigger | boolean | Ejecutar flujos de trabajo (por defecto: true) |
Ejemplo:
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
Respuesta:
{
"data": [
{
"code": "SUCCESS",
"details": {
"id": "7243485000000619001"
},
"message": "record deleted",
"status": "success"
}
]
}
Buscar Registros
GET /zoho-crm/crm/v8/{module_api_name}/search
Parámetros de Consulta (uno obligatorio):
| Parámetro | Tipo | Descripción |
|---|---|---|
criteria | string | Criterio de búsqueda (ej., (Last_Name:equals:Smith)) |
email | string | Buscar por dirección de correo electrónico |
phone | string | Buscar por número de teléfono |
word | string | Búsqueda de texto global |
page | integer | Número de página |
per_page | integer | Registros por página (máx. 200) |
Formato de Criterio: ((field_api_name:operator:value) and/or (...))
Operadores:
- Campos de texto:
equals,not_equal,starts_with,in - Campos de fecha/número:
equals,not_equal,greater_than,less_than,between,in - Campos booleanos:
equals,not_equal
Ejemplo - Buscar por email:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/Leads/[email protected]')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Ejemplo - Buscar por criterio:
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
Respuesta:
{
"data": [
{
"First_Name": "Christopher",
"Email": "[email protected]",
"Last_Name": "Maclead (Sample)",
"id": "7243485000000597000"
}
],
"info": {
"per_page": 200,
"count": 1,
"page": 1,
"more_records": false
}
}
Detalles de la Organización
Obtener Detalles de la Organización
GET /zoho-crm/crm/v8/org
Ejemplo:
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
Obtener Metadatos de Módulos
GET /zoho-crm/crm/v8/settings/modules/{module_api_name_or_id}
Ejemplo - Obtener metadatos de Prospectos:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/settings/modules/Leads')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Obtener Todos los Módulos
GET /zoho-crm/crm/v8/settings/modules
Gestión de Usuarios
GET /zoho-crm/crm/v8/users?type={type}
Parámetros de Consulta:
| Parámetro | Tipo | Descripción |
|---|---|---|
type | string | Tipo de usuario: ActiveUsers, DeactiveUsers, AllUsers, AdminUsers, ActiveConfirmedAdmins |
page | integer | Número de página |
per_page | integer | Registros por página (máx. 200) |
Ejemplo - Listar Usuarios Activos:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/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
Gestión de Roles
GET /zoho-crm/crm/v8/settings/roles
Gestión de Perfiles
GET /zoho-crm/crm/v8/settings/profiles
Obtener Campos de Módulo Personalizados
GET /zoho-crm/crm/v8/settings/fields?module={module_api_name}
Ejemplo - Obtener campos de Prospectos:
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
Pipeline de Ventas
Obtener Etapas de Pipeline
GET /zoho-crm/crm/v8/settings/pipelines/{module_api_name}
Ejemplo - Obtener pipelines de Negocios:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/settings/pipelines/Deals')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Operaciones Masivas
Crear Registros Masivamente
POST /zoho-crm/crm/v8/{module_api_name}
Content-Type: application/json
{
"data": [
{ ... },
{ ... },
{ ... }
]
}
Ejemplo - Crear Múltiples Prospectos:
python <<'EOF'
import urllib.request, os, json
data = json.dumps({
"data": [
{"Last_Name": "Smith", "First_Name": "John", "Company": "Acme Corp"},
{"Last_Name": "Doe", "First_Name": "Jane", "Company": "Beta Inc"},
{"Last_Name": "Brown", "First_Name": "Bob", "Company": "Gamma LLC"}
]
}).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
Actualizar Registros Masivamente
PUT /zoho-crm/crm/v8/{module_api_name}
Content-Type: application/json
{
"data": [
{"id": "1", ...},
{"id": "2", ...},
...
]
}
Ejemplo - Actualizar Múltiples Prospectos:
python <<'EOF'
import urllib.request, os, json
data = json.dumps({
"data": [
{"id": "7243485000000619001", "Phone": "+1-555-1111"},
{"id": "7243485000000619002", "Phone": "+1-555-2222"}
]
}).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
Eliminar Registros Masivamente
DELETE /zoho-crm/crm/v8/{module_api_name}?ids=1,2,3
Manejo de Errores
La API responde con códigos de error HTTP estándar junto con el cuerpo:
{
"data": [
{
"code": "INVALID_DATA",
"details": {},
"message": "El campo obligatorio Last_Name no se ha proporcionado.",
"status": "error"
}
]
}
Códigos de Error Comunes
| Código HTTP | Significado |
|---|---|
400 | Solicitud incorrecta - Campos faltantes o inválidos |
401 | No autorizado - Clave de API de Maton inválida |
403 | Prohibido - Token OAuth inválido |
404 | No encontrado - Registro o módulo no encontrado |
429 | Demasiadas solicitudes - Límite de tasa excedido |
500 | Error interno del servidor |