Saltar al contenido
Volver a Crang

Desarrolladores

Conecta tu CRM o tu propia aplicación con tu espacio de trabajo de Crang mediante la API REST, recibe eventos como webhooks o deja que un asistente de IA trabaje con él por MCP. Todo está protegido con una clave de API que creas en Ajustes, Integraciones.

Resumen

Tu espacio de trabajo tiene tres vías de entrada: una API REST para leer y cambiar datos, webhooks que te avisan cuando algo ocurre y un servidor MCP para asistentes de IA. Cada una pertenece a un único espacio de trabajo: lo decide la clave de API.

URL base de la API REST
https://api.crang.ai/v1
URL del servidor MCP
https://mcp.crang.ai/mcp

Versiones

La versión va en la ruta (/v1). Dentro de una versión se añaden rutas nuevas y campos nuevos en las respuestas, así que ignora los campos que no conozcas. Un cambio incompatible sale como versión nueva y la anterior sigue funcionando durante un periodo de aviso.

Autenticación

Crea una clave de API en Ajustes, Integraciones, y envíala en cada solicitud como Authorization: Bearer <clave>. La clave se muestra una sola vez: guárdala como una contraseña.

Una clave pertenece a un espacio de trabajo y actúa con el rol de la persona que la creó. El espacio de trabajo nunca forma parte de una solicitud: no hay un id de espacio de trabajo que enviar ni que se pueda cambiar.

Cada ruta necesita un permiso en la clave. Sin él, la API responde 403. Una clave ausente, desconocida, revocada o caducada responde 401.

curl "https://api.crang.ai/v1/usage" \
  -H "Authorization: Bearer $CRANG_API_KEY"

Permisos

Eliges los permisos al crear una clave. Una clave nunca recibe más de lo que permite el rol de quien la creó.

PermisoPermite
calls:readLeer llamadas, transcripciones y resultados
contacts:readLeer listas de contactos y contactos
contacts:writeImportar contactos y añadir números a la lista de no llamar
campaigns:readLeer campañas y su estado
campaigns:writeCrear y editar campañas
campaigns:runIniciar, pausar, reanudar y cancelar campañas
agents:readListar agentes y leer sus ajustes
agents:writeEditar el borrador de un agente. Nada se publica
agents:publishPublicar un agente. Los cambios llegan a las llamadas reales
knowledge:readListar los documentos de la base de conocimiento
knowledge:writeAñadir documentos a la base de conocimiento. Se suman a todos los agentes, también a las versiones publicadas, así que el asistente también necesita agents:publish
numbers:readListar los números de teléfono y el agente que atiende cada uno
analytics:readLeer la analítica y los resultados de los objetivos
usage:readLeer los minutos restantes y el consumo
mcpConectar un asistente de IA al servidor MCP

Errores

Los errores son JSON, { "error": { "code": "...", "details": ... } }. Decide según code, nunca según el texto HTTP.

EstadoCódigoSignificado
400common.validationLa solicitud no es válida. details enumera los problemas.
401api_keys.invalidLa clave falta, es desconocida, está revocada o ha caducado.
402tenant.subscription_suspendedLa suscripción del espacio de trabajo está suspendida.
403api_keys.scope_missingA la clave le falta el permiso que necesita la ruta (details.scope), o la integración está desactivada para el espacio de trabajo.
404common.not_foundNo hay nada con ese id en tu espacio de trabajo.
429common.rate_limitedDemasiadas solicitudes. Espera los segundos de la cabecera Retry-After.

Límites de uso

Por defecto, 120 solicitudes por minuto por clave y 600 por minuto por espacio de trabajo entre todas sus claves, compartidas por la API REST y el servidor MCP. Superado el límite, la API responde 429 con una cabecera Retry-After (segundos).

API REST

Las solicitudes y respuestas son JSON salvo que una ruta indique otra cosa. Los campos obligatorios deben enviarse. En las respuestas, ignora los campos que no conozcas.

Contactos

GET/v1/contact-lists

Listar listas de contactos

Permiso necesariocontacts:read

Respuesta 200
CampoTipoDescripción
idobligatoriostring (uuid)
nameobligatoriostring
statusobligatorio"importing" | "ready" | "failed"
contactsobligatoriointeger
reportobligatorioobject | null
report.rowsobligatoriointeger
report.importedobligatoriointeger
report.invalidobligatoriointeger
report.duplicatesobligatoriointeger
report.suppressedobligatoriointeger
report.invalidRowsobligatorioobject[]
report.invalidRows[].rowobligatoriointeger
report.invalidRows[].reasonobligatorio"phone_missing" | "phone_invalid" | "phone_premium" | "timezone_invalid" | "language_invalid"
variablesobligatoriostring[]
lawfulBasisConfirmedAtobligatoriostring (date-time)
createdAtobligatoriostring (date-time)
Solicitud de ejemplo
curl "https://api.crang.ai/v1/contact-lists" \
  -H "Authorization: Bearer $CRANG_API_KEY"
POST/v1/contact-lists

Importar un CSV en una lista de contactos nueva

Responde 202 con la lista en importing; consulta la lista hasta que pase a ready y tenga su informe, o suscríbete a contact_list.imported.

Permiso necesariocontacts:write

Cuerpo de la solicitud · Formulario multipart
CampoTipoDescripción
fileobligatoriostring (binary)CSV con una fila de encabezado
nameobligatoriostring
mappingobligatoriostringJSON: {"phone": "<columna>", "name"?, "language"?, "timezone"?, "externalId"?, "variables"?: {"<variable de llamada>": "<columna>"}}
lawfulBasisobligatorio"true"Confirma que el espacio de trabajo puede llamar a estas personas
Respuesta 202
CampoTipoDescripción
idobligatoriostring (uuid)
nameobligatoriostring
statusobligatorio"importing" | "ready" | "failed"
contactsobligatoriointeger
reportobligatorioobject | null
report.rowsobligatoriointeger
report.importedobligatoriointeger
report.invalidobligatoriointeger
report.duplicatesobligatoriointeger
report.suppressedobligatoriointeger
report.invalidRowsobligatorioobject[]
report.invalidRows[].rowobligatoriointeger
report.invalidRows[].reasonobligatorio"phone_missing" | "phone_invalid" | "phone_premium" | "timezone_invalid" | "language_invalid"
variablesobligatoriostring[]
lawfulBasisConfirmedAtobligatoriostring (date-time)
createdAtobligatoriostring (date-time)
Solicitud de ejemplo
curl -X POST "https://api.crang.ai/v1/contact-lists" \
  -H "Authorization: Bearer $CRANG_API_KEY" \
  -F file='@contacts.csv' \
  -F name='Spring customers' \
  -F mapping='{"phone": "Phone"}' \
  -F lawfulBasis='true'
GET/v1/contact-lists/{id}

Obtener una lista de contactos

Permiso necesariocontacts:read

Parámetros
CampoTipoDescripción
idobligatoriostring (uuid) · ruta
Respuesta 200
CampoTipoDescripción
idobligatoriostring (uuid)
nameobligatoriostring
statusobligatorio"importing" | "ready" | "failed"
contactsobligatoriointeger
reportobligatorioobject | null
report.rowsobligatoriointeger
report.importedobligatoriointeger
report.invalidobligatoriointeger
report.duplicatesobligatoriointeger
report.suppressedobligatoriointeger
report.invalidRowsobligatorioobject[]
report.invalidRows[].rowobligatoriointeger
report.invalidRows[].reasonobligatorio"phone_missing" | "phone_invalid" | "phone_premium" | "timezone_invalid" | "language_invalid"
variablesobligatoriostring[]
lawfulBasisConfirmedAtobligatoriostring (date-time)
createdAtobligatoriostring (date-time)
Solicitud de ejemplo
curl "https://api.crang.ai/v1/contact-lists/<id>" \
  -H "Authorization: Bearer $CRANG_API_KEY"
GET/v1/contact-lists/{id}/contacts

Listar los contactos de una lista

Permiso necesariocontacts:read

Parámetros
CampoTipoDescripción
idobligatoriostring (uuid) · ruta
cursorstring (uuid) · consulta
limitinteger · consulta = 50
Respuesta 200
CampoTipoDescripción
itemsobligatorioobject[]
items[].idobligatoriostring (uuid)
items[].phoneobligatoriostring
items[].nameobligatoriostring | null
items[].languageobligatoriostring | null
items[].timezoneobligatoriostring | null
items[].externalIdobligatoriostring | null
items[].variablesobligatorioobject<string, string>
items[].createdAtobligatoriostring (date-time)
nextCursorobligatoriostring (uuid) | null
Solicitud de ejemplo
curl "https://api.crang.ai/v1/contact-lists/<id>/contacts" \
  -H "Authorization: Bearer $CRANG_API_KEY"
POST/v1/dnc

Añadir números a la lista de no llamar

Responde 400 con los números no válidos en details.invalid.

Permiso necesariocontacts:write

Cuerpo de la solicitud · JSON
CampoTipoDescripción
phonesobligatoriostring[]
sourceobligatorio"manual" | "csv"
notestring
Respuesta 200
CampoTipoDescripción
addedobligatoriointeger
Solicitud de ejemplo
curl -X POST "https://api.crang.ai/v1/dnc" \
  -H "Authorization: Bearer $CRANG_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"phones":["string"],"source":"manual"}'
POST/v1/contacts/{id}/erase

Suprimir a una persona (solicitud de supresión del RGPD)

Elimina todos los contactos con el número de este contacto, en todas las listas, y borra el número, la transcripción, el resumen, los datos capturados y el análisis en texto libre de sus llamadas (el resultado, los minutos y los objetivos siguen en las cifras). Una entrada de no llamar para el número se conserva como registro de exclusión sin el número, así que el número sigue sin llamarse. Solo para una clave creada por el propietario del espacio de trabajo (si no, 403). Responde 409 contacts.erase_call_recent mientras hay una llamada en curso con la persona o terminó hace menos de 10 minutos.

Permiso necesariocontacts:write

Parámetros
CampoTipoDescripción
idobligatoriostring (uuid) · ruta
Respuesta 200
CampoTipoDescripción
contactsobligatoriointeger
callsobligatoriointeger
Solicitud de ejemplo
curl -X POST "https://api.crang.ai/v1/contacts/<id>/erase" \
  -H "Authorization: Bearer $CRANG_API_KEY"

Campañas

GET/v1/campaigns

Listar campañas

Permiso necesariocampaigns:read

Respuesta 200
CampoTipoDescripción
nameobligatoriostring
agentIdobligatoriostring (uuid)
listIdsobligatoriostring (uuid)[]
phoneNumberIdsobligatoriostring (uuid)[]
startsAtobligatoriostring (date-time) | null
settingsobligatorioobject
settings.timezoneobligatoriostring
settings.windowsobligatorioobject[]
settings.windows[].daysobligatoriointeger[]
settings.windows[].startobligatoriostring
settings.windows[].endobligatoriostring
settings.maxAttemptsobligatoriointeger
settings.retryMinutesobligatoriointeger
settings.retryOnobligatorio"no_answer" | "busy" | "failed" | "voicemail" | "cut_off"[]
settings.maxConcurrentobligatoriointeger
settings.callsPerMinuteobligatoriointeger
settings.ringTimeoutSecondsobligatoriointeger
settings.maxDurationSecondsobligatoriointeger
settings.protectionobjectAjustes de protección propios: pausa automática, límite de minutos, inicio lento y valores de pausa
settings.protection.autoPausebooleanPausar la campaña automáticamente cuando sus últimas llamadas van mal. Por defecto false: la campaña solo muestra sus métricas. El límite de minutos se aplica en ambos casos.
settings.protection.minuteLimitinteger | nullMáximo de minutos que puede usar esta campaña (descontados más los de llamadas en curso); null u omitido: sin límite
settings.protection.warmupbooleanInicio lento: las primeras llamadas se hacen de pocas en pocas. Por defecto false.
settings.protection.stopsobject<string, integer | null>Por indicador, el porcentaje de las últimas llamadas terminadas en el que se pausa la campaña (answer_rate: se pausa por debajo de él); null desactiva esa pausa. technical_failures está entre 5 y 60 y no puede ser null. Omitido: el valor predeterminado del espacio de trabajo.
idobligatoriostring (uuid)
statusobligatorio"draft" | "scheduled" | "running" | "paused" | "completed" | "cancelled"
pauseReasonobligatorio"manual" | "minutes" | "protection" | null
createdAtobligatoriostring (date-time)
startedAtobligatoriostring (date-time) | null
endedAtobligatoriostring (date-time) | null
progressobligatorioobject<string, integer>
statsobligatorioobject
stats.callsobligatoriointeger
stats.answeredobligatoriointeger
stats.successfulobligatoriointeger
stats.secondsobligatoriointeger
stats.hourlyobligatorioobject[]
stats.hourly[].hourobligatoriostring (date-time)
stats.hourly[].callsobligatoriointeger
Solicitud de ejemplo
curl "https://api.crang.ai/v1/campaigns" \
  -H "Authorization: Bearer $CRANG_API_KEY"
GET/v1/campaigns/{id}

Obtener una campaña

Permiso necesariocampaigns:read

Parámetros
CampoTipoDescripción
idobligatoriostring (uuid) · ruta
Respuesta 200
CampoTipoDescripción
nameobligatoriostring
agentIdobligatoriostring (uuid)
listIdsobligatoriostring (uuid)[]
phoneNumberIdsobligatoriostring (uuid)[]
startsAtobligatoriostring (date-time) | null
settingsobligatorioobject
settings.timezoneobligatoriostring
settings.windowsobligatorioobject[]
settings.windows[].daysobligatoriointeger[]
settings.windows[].startobligatoriostring
settings.windows[].endobligatoriostring
settings.maxAttemptsobligatoriointeger
settings.retryMinutesobligatoriointeger
settings.retryOnobligatorio"no_answer" | "busy" | "failed" | "voicemail" | "cut_off"[]
settings.maxConcurrentobligatoriointeger
settings.callsPerMinuteobligatoriointeger
settings.ringTimeoutSecondsobligatoriointeger
settings.maxDurationSecondsobligatoriointeger
settings.protectionobjectAjustes de protección propios: pausa automática, límite de minutos, inicio lento y valores de pausa
settings.protection.autoPausebooleanPausar la campaña automáticamente cuando sus últimas llamadas van mal. Por defecto false: la campaña solo muestra sus métricas. El límite de minutos se aplica en ambos casos.
settings.protection.minuteLimitinteger | nullMáximo de minutos que puede usar esta campaña (descontados más los de llamadas en curso); null u omitido: sin límite
settings.protection.warmupbooleanInicio lento: las primeras llamadas se hacen de pocas en pocas. Por defecto false.
settings.protection.stopsobject<string, integer | null>Por indicador, el porcentaje de las últimas llamadas terminadas en el que se pausa la campaña (answer_rate: se pausa por debajo de él); null desactiva esa pausa. technical_failures está entre 5 y 60 y no puede ser null. Omitido: el valor predeterminado del espacio de trabajo.
idobligatoriostring (uuid)
statusobligatorio"draft" | "scheduled" | "running" | "paused" | "completed" | "cancelled"
pauseReasonobligatorio"manual" | "minutes" | "protection" | null
createdAtobligatoriostring (date-time)
startedAtobligatoriostring (date-time) | null
endedAtobligatoriostring (date-time) | null
progressobligatorioobject<string, integer>
statsobligatorioobject
stats.callsobligatoriointeger
stats.answeredobligatoriointeger
stats.successfulobligatoriointeger
stats.secondsobligatoriointeger
stats.hourlyobligatorioobject[]
stats.hourly[].hourobligatoriostring (date-time)
stats.hourly[].callsobligatoriointeger
Solicitud de ejemplo
curl "https://api.crang.ai/v1/campaigns/<id>" \
  -H "Authorization: Bearer $CRANG_API_KEY"
POST/v1/campaigns/{id}/start

Iniciar una campaña

Permiso necesariocampaigns:run

Parámetros
CampoTipoDescripción
idobligatoriostring (uuid) · ruta
Respuesta 200
CampoTipoDescripción
nameobligatoriostring
agentIdobligatoriostring (uuid)
listIdsobligatoriostring (uuid)[]
phoneNumberIdsobligatoriostring (uuid)[]
startsAtobligatoriostring (date-time) | null
settingsobligatorioobject
settings.timezoneobligatoriostring
settings.windowsobligatorioobject[]
settings.windows[].daysobligatoriointeger[]
settings.windows[].startobligatoriostring
settings.windows[].endobligatoriostring
settings.maxAttemptsobligatoriointeger
settings.retryMinutesobligatoriointeger
settings.retryOnobligatorio"no_answer" | "busy" | "failed" | "voicemail" | "cut_off"[]
settings.maxConcurrentobligatoriointeger
settings.callsPerMinuteobligatoriointeger
settings.ringTimeoutSecondsobligatoriointeger
settings.maxDurationSecondsobligatoriointeger
settings.protectionobjectAjustes de protección propios: pausa automática, límite de minutos, inicio lento y valores de pausa
settings.protection.autoPausebooleanPausar la campaña automáticamente cuando sus últimas llamadas van mal. Por defecto false: la campaña solo muestra sus métricas. El límite de minutos se aplica en ambos casos.
settings.protection.minuteLimitinteger | nullMáximo de minutos que puede usar esta campaña (descontados más los de llamadas en curso); null u omitido: sin límite
settings.protection.warmupbooleanInicio lento: las primeras llamadas se hacen de pocas en pocas. Por defecto false.
settings.protection.stopsobject<string, integer | null>Por indicador, el porcentaje de las últimas llamadas terminadas en el que se pausa la campaña (answer_rate: se pausa por debajo de él); null desactiva esa pausa. technical_failures está entre 5 y 60 y no puede ser null. Omitido: el valor predeterminado del espacio de trabajo.
idobligatoriostring (uuid)
statusobligatorio"draft" | "scheduled" | "running" | "paused" | "completed" | "cancelled"
pauseReasonobligatorio"manual" | "minutes" | "protection" | null
createdAtobligatoriostring (date-time)
startedAtobligatoriostring (date-time) | null
endedAtobligatoriostring (date-time) | null
progressobligatorioobject<string, integer>
statsobligatorioobject
stats.callsobligatoriointeger
stats.answeredobligatoriointeger
stats.successfulobligatoriointeger
stats.secondsobligatoriointeger
stats.hourlyobligatorioobject[]
stats.hourly[].hourobligatoriostring (date-time)
stats.hourly[].callsobligatoriointeger
Solicitud de ejemplo
curl -X POST "https://api.crang.ai/v1/campaigns/<id>/start" \
  -H "Authorization: Bearer $CRANG_API_KEY"
POST/v1/campaigns/{id}/pause

Pausar una campaña

Permiso necesariocampaigns:run

Parámetros
CampoTipoDescripción
idobligatoriostring (uuid) · ruta
Respuesta 200
CampoTipoDescripción
nameobligatoriostring
agentIdobligatoriostring (uuid)
listIdsobligatoriostring (uuid)[]
phoneNumberIdsobligatoriostring (uuid)[]
startsAtobligatoriostring (date-time) | null
settingsobligatorioobject
settings.timezoneobligatoriostring
settings.windowsobligatorioobject[]
settings.windows[].daysobligatoriointeger[]
settings.windows[].startobligatoriostring
settings.windows[].endobligatoriostring
settings.maxAttemptsobligatoriointeger
settings.retryMinutesobligatoriointeger
settings.retryOnobligatorio"no_answer" | "busy" | "failed" | "voicemail" | "cut_off"[]
settings.maxConcurrentobligatoriointeger
settings.callsPerMinuteobligatoriointeger
settings.ringTimeoutSecondsobligatoriointeger
settings.maxDurationSecondsobligatoriointeger
settings.protectionobjectAjustes de protección propios: pausa automática, límite de minutos, inicio lento y valores de pausa
settings.protection.autoPausebooleanPausar la campaña automáticamente cuando sus últimas llamadas van mal. Por defecto false: la campaña solo muestra sus métricas. El límite de minutos se aplica en ambos casos.
settings.protection.minuteLimitinteger | nullMáximo de minutos que puede usar esta campaña (descontados más los de llamadas en curso); null u omitido: sin límite
settings.protection.warmupbooleanInicio lento: las primeras llamadas se hacen de pocas en pocas. Por defecto false.
settings.protection.stopsobject<string, integer | null>Por indicador, el porcentaje de las últimas llamadas terminadas en el que se pausa la campaña (answer_rate: se pausa por debajo de él); null desactiva esa pausa. technical_failures está entre 5 y 60 y no puede ser null. Omitido: el valor predeterminado del espacio de trabajo.
idobligatoriostring (uuid)
statusobligatorio"draft" | "scheduled" | "running" | "paused" | "completed" | "cancelled"
pauseReasonobligatorio"manual" | "minutes" | "protection" | null
createdAtobligatoriostring (date-time)
startedAtobligatoriostring (date-time) | null
endedAtobligatoriostring (date-time) | null
progressobligatorioobject<string, integer>
statsobligatorioobject
stats.callsobligatoriointeger
stats.answeredobligatoriointeger
stats.successfulobligatoriointeger
stats.secondsobligatoriointeger
stats.hourlyobligatorioobject[]
stats.hourly[].hourobligatoriostring (date-time)
stats.hourly[].callsobligatoriointeger
Solicitud de ejemplo
curl -X POST "https://api.crang.ai/v1/campaigns/<id>/pause" \
  -H "Authorization: Bearer $CRANG_API_KEY"
POST/v1/campaigns/{id}/resume

Reanudar una campaña pausada

Permiso necesariocampaigns:run

Parámetros
CampoTipoDescripción
idobligatoriostring (uuid) · ruta
Respuesta 200
CampoTipoDescripción
nameobligatoriostring
agentIdobligatoriostring (uuid)
listIdsobligatoriostring (uuid)[]
phoneNumberIdsobligatoriostring (uuid)[]
startsAtobligatoriostring (date-time) | null
settingsobligatorioobject
settings.timezoneobligatoriostring
settings.windowsobligatorioobject[]
settings.windows[].daysobligatoriointeger[]
settings.windows[].startobligatoriostring
settings.windows[].endobligatoriostring
settings.maxAttemptsobligatoriointeger
settings.retryMinutesobligatoriointeger
settings.retryOnobligatorio"no_answer" | "busy" | "failed" | "voicemail" | "cut_off"[]
settings.maxConcurrentobligatoriointeger
settings.callsPerMinuteobligatoriointeger
settings.ringTimeoutSecondsobligatoriointeger
settings.maxDurationSecondsobligatoriointeger
settings.protectionobjectAjustes de protección propios: pausa automática, límite de minutos, inicio lento y valores de pausa
settings.protection.autoPausebooleanPausar la campaña automáticamente cuando sus últimas llamadas van mal. Por defecto false: la campaña solo muestra sus métricas. El límite de minutos se aplica en ambos casos.
settings.protection.minuteLimitinteger | nullMáximo de minutos que puede usar esta campaña (descontados más los de llamadas en curso); null u omitido: sin límite
settings.protection.warmupbooleanInicio lento: las primeras llamadas se hacen de pocas en pocas. Por defecto false.
settings.protection.stopsobject<string, integer | null>Por indicador, el porcentaje de las últimas llamadas terminadas en el que se pausa la campaña (answer_rate: se pausa por debajo de él); null desactiva esa pausa. technical_failures está entre 5 y 60 y no puede ser null. Omitido: el valor predeterminado del espacio de trabajo.
idobligatoriostring (uuid)
statusobligatorio"draft" | "scheduled" | "running" | "paused" | "completed" | "cancelled"
pauseReasonobligatorio"manual" | "minutes" | "protection" | null
createdAtobligatoriostring (date-time)
startedAtobligatoriostring (date-time) | null
endedAtobligatoriostring (date-time) | null
progressobligatorioobject<string, integer>
statsobligatorioobject
stats.callsobligatoriointeger
stats.answeredobligatoriointeger
stats.successfulobligatoriointeger
stats.secondsobligatoriointeger
stats.hourlyobligatorioobject[]
stats.hourly[].hourobligatoriostring (date-time)
stats.hourly[].callsobligatoriointeger
Solicitud de ejemplo
curl -X POST "https://api.crang.ai/v1/campaigns/<id>/resume" \
  -H "Authorization: Bearer $CRANG_API_KEY"

Llamadas

GET/v1/calls

Listar llamadas

Permiso necesariocalls:read

Parámetros
CampoTipoDescripción
cursorstring (uuid) · consulta
limitinteger · consulta = 50
direction"inbound" | "outbound" · consulta
agentIdstring (uuid) · consulta
campaignIdstring (uuid) · consulta
contactIdstring (uuid) · consulta
phoneNumberIdstring (uuid) · consulta
outcome"answered" | "voicemail" | "no_answer" | "busy" | "failed" · consulta
success"all_met" | "any_failed" | "unknown" · consulta
fromstring (date-time) · consulta
tostring (date-time) · consulta
minSecondsinteger · consulta
maxSecondsinteger · consulta
qstring · consulta
transferredstring · consulta
cutOffstring · consulta
Respuesta 200
CampoTipoDescripción
itemsobligatorioobject[]
items[].idobligatoriostring (uuid)
items[].directionobligatorio"inbound" | "outbound"
items[].statusobligatorio"active" | "ended"
items[].outcomeobligatorio"answered" | "voicemail" | "no_answer" | "busy" | "failed" | null
items[].successobligatorio"all_met" | "any_failed" | "unknown" | null
items[].agentobligatorioobject | null
items[].agent.idobligatoriostring (uuid)
items[].agent.nameobligatoriostring
items[].campaignobligatorioobject | null
items[].campaign.idobligatoriostring (uuid)
items[].campaign.nameobligatoriostring
items[].contactobligatorioobject | null
items[].contact.idobligatoriostring (uuid)
items[].contact.nameobligatoriostring | null
items[].phoneobligatoriostring
items[].lineobligatoriostring | null
items[].secondsobligatoriointeger | null
items[].startedAtobligatoriostring (date-time)
items[].endedAtobligatoriostring (date-time) | null
items[].transferredobligatorioboolean
items[].cutOffobligatoriobooleanVerdadero cuando una llamada atendida terminó sin que el agente la cerrara ni la derivara: la otra parte colgó o se cortó la línea.
nextCursorobligatoriostring (uuid) | null
Solicitud de ejemplo
curl "https://api.crang.ai/v1/calls" \
  -H "Authorization: Bearer $CRANG_API_KEY"
GET/v1/calls/{id}

Obtener una llamada

Permiso necesariocalls:read

Parámetros
CampoTipoDescripción
idobligatoriostring (uuid) · ruta
Respuesta 200
CampoTipoDescripción
idobligatoriostring (uuid)
directionobligatorio"inbound" | "outbound"
statusobligatorio"active" | "ended"
outcomeobligatorio"answered" | "voicemail" | "no_answer" | "busy" | "failed" | null
successobligatorio"all_met" | "any_failed" | "unknown" | null
agentobligatorioobject | null
agent.idobligatoriostring (uuid)
agent.nameobligatoriostring
campaignobligatorioobject | null
campaign.idobligatoriostring (uuid)
campaign.nameobligatoriostring
contactobligatorioobject | null
contact.idobligatoriostring (uuid)
contact.nameobligatoriostring | null
phoneobligatoriostring
lineobligatoriostring | null
secondsobligatoriointeger | null
startedAtobligatoriostring (date-time)
endedAtobligatoriostring (date-time) | null
transferredobligatorioboolean
cutOffobligatoriobooleanVerdadero cuando una llamada atendida terminó sin que el agente la cerrara ni la derivara: la otra parte colgó o se cortó la línea.
summaryobligatoriostring | null
transcriptobligatorioobject[]
transcript[].roleobligatorio"user" | "agent"
transcript[].textobligatoriostring
transcript[].atSecondsobligatorionumber
capturedDataobligatorioobject[]
capturedData[].nameobligatoriostring
capturedData[].valueobligatorioany
criteriaobligatorioobject[]
criteria[].nameobligatoriostring
criteria[].resultobligatorio"success" | "failure" | "unknown"
criteria[].rationaleobligatoriostring
goalsobligatorioobject[]
goals[].nameobligatoriostring
goals[].statusobligatorio"reached" | "not_reached" | "unknown" | "not_rated"
goals[].valueobligatoriostring | number | boolean
hasAudioobligatorioboolean
Solicitud de ejemplo
curl "https://api.crang.ai/v1/calls/<id>" \
  -H "Authorization: Bearer $CRANG_API_KEY"
GET/v1/calls/{id}/transcript

Descargar la transcripción (txt o json)

Permiso necesariocalls:read

Parámetros
CampoTipoDescripción
idobligatoriostring (uuid) · ruta
format"txt" | "json" · consulta = "txt"
Solicitud de ejemplo
curl "https://api.crang.ai/v1/calls/<id>/transcript" \
  -H "Authorization: Bearer $CRANG_API_KEY"

Agentes

GET/v1/agents

Listar agentes

Permiso necesarioagents:read

Respuesta 200
CampoTipoDescripción
slotsobligatorioobject
slots.usedobligatoriointeger
slots.totalobligatoriointeger
agentsobligatorioobject[]
agents[].idobligatoriostring (uuid)
agents[].nameobligatoriostring
agents[].directionobligatorio"inbound" | "outbound" | "both"
agents[].statusobligatorio"draft_only" | "published" | "unpublished_changes"
agents[].voiceIdobligatoriostring (uuid) | null
agents[].languagesobligatoriostring[]
agents[].currentVersionobligatoriointeger | null
agents[].publishedAtobligatoriostring (date-time) | null
Solicitud de ejemplo
curl "https://api.crang.ai/v1/agents" \
  -H "Authorization: Bearer $CRANG_API_KEY"
GET/v1/agents/{id}

Obtener un agente

Permiso necesarioagents:read

Parámetros
CampoTipoDescripción
idobligatoriostring (uuid) · ruta
Respuesta 200
CampoTipoDescripción
idobligatoriostring (uuid)
nameobligatoriostring
directionobligatorio"inbound" | "outbound" | "both"
statusobligatorio"draft_only" | "published" | "unpublished_changes"
voiceIdobligatoriostring (uuid) | null
languagesobligatoriostring[]
currentVersionobligatoriointeger | null
publishedAtobligatoriostring (date-time) | null
templateKeyobligatoriostring | null
createdAtobligatoriostring (date-time)
configobligatorioobject
config.basicsobligatorioobject
config.basics.voiceIdobligatoriostring (uuid) | null
config.basics.stabilityobligatorionumber
config.basics.speedobligatorionumber
config.basics.languagesobligatorioobject[]
config.basics.callVariablesobligatorioobject[]
config.rulesobligatorioobject
config.rules.purposeobligatoriostring
config.rules.toneobligatoriostring
config.rules.alwaysSayobligatoriostring[]
config.rules.neverSayobligatoriostring[]
config.rules.transfersobligatorioobject[]
config.rules.endCallRulesobligatoriostring[]
config.rules.dataToCaptureobligatorioobject[]
config.rules.goalsobligatorioobject[]
config.rules.callHandlingobligatorioobject
config.rules.voicemailMessageobligatoriostring
config.rules.additionalInstructionsobligatoriostring
config.workflowobligatorioobject
config.workflow.stepsobligatorioobject[]
config.openingHoursobject
config.openingHours.enabledobligatorioboolean
config.openingHours.timezoneobligatoriostring
config.openingHours.windowsobligatorioobject[]
config.openingHours.outsideobligatorio"message" | "transfer" | "reject"
config.openingHours.transferNumberobligatoriostring | null
knowledgeBaseobligatoriostring (uuid)[]
revisionobligatoriointeger
draftUpdatedAtobligatoriostring (date-time)
draftBasedOnVersionobligatoriointeger | null
dataCollectionLimitobligatoriointeger
inboundPersonalizationobligatorioboolean
Solicitud de ejemplo
curl "https://api.crang.ai/v1/agents/<id>" \
  -H "Authorization: Bearer $CRANG_API_KEY"
PATCH/v1/agents/{id}

Editar el borrador del agente

Los cambios solo afectan al borrador; quien llama sigue hablando con la versión publicada hasta que se publique. La excepción es inboundPersonalization (desactivado por defecto), que se aplica desde la siguiente llamada entrante: si está activado, quien llama desde un número que su operador verificó por completo recibe las variables de llamada de su contacto. Envía la revision de la última lectura (409 si está desactualizada).

Permiso necesarioagents:write

Parámetros
CampoTipoDescripción
idobligatoriostring (uuid) · ruta
Cuerpo de la solicitud · JSON
CampoTipoDescripción
revisionobligatoriointeger
namestring
configobject
config.basicsobligatorioobject
config.basics.voiceIdobligatoriostring (uuid) | null
config.basics.stabilityobligatorionumber
config.basics.speedobligatorionumber
config.basics.languagesobligatorioobject[]
config.basics.callVariablesobligatorioobject[]
config.rulesobligatorioobject
config.rules.purposeobligatoriostring
config.rules.toneobligatoriostring
config.rules.alwaysSayobligatoriostring[]
config.rules.neverSayobligatoriostring[]
config.rules.transfersobligatorioobject[]
config.rules.endCallRulesobligatoriostring[]
config.rules.dataToCaptureobligatorioobject[]
config.rules.goalsobligatorioobject[]
config.rules.callHandlingobligatorioobject
config.rules.voicemailMessageobligatoriostring
config.rules.additionalInstructionsobligatoriostring
config.workflowobligatorioobject
config.workflow.stepsobligatorioobject[]
config.openingHoursobject
config.openingHours.enabledobligatorioboolean
config.openingHours.timezoneobligatoriostring
config.openingHours.windowsobligatorioobject[]
config.openingHours.outsideobligatorio"message" | "transfer" | "reject"
config.openingHours.transferNumberobligatoriostring | null
knowledgeBasestring (uuid)[]
inboundPersonalizationboolean
Respuesta 200
CampoTipoDescripción
idobligatoriostring (uuid)
nameobligatoriostring
directionobligatorio"inbound" | "outbound" | "both"
statusobligatorio"draft_only" | "published" | "unpublished_changes"
voiceIdobligatoriostring (uuid) | null
languagesobligatoriostring[]
currentVersionobligatoriointeger | null
publishedAtobligatoriostring (date-time) | null
templateKeyobligatoriostring | null
createdAtobligatoriostring (date-time)
configobligatorioobject
config.basicsobligatorioobject
config.basics.voiceIdobligatoriostring (uuid) | null
config.basics.stabilityobligatorionumber
config.basics.speedobligatorionumber
config.basics.languagesobligatorioobject[]
config.basics.callVariablesobligatorioobject[]
config.rulesobligatorioobject
config.rules.purposeobligatoriostring
config.rules.toneobligatoriostring
config.rules.alwaysSayobligatoriostring[]
config.rules.neverSayobligatoriostring[]
config.rules.transfersobligatorioobject[]
config.rules.endCallRulesobligatoriostring[]
config.rules.dataToCaptureobligatorioobject[]
config.rules.goalsobligatorioobject[]
config.rules.callHandlingobligatorioobject
config.rules.voicemailMessageobligatoriostring
config.rules.additionalInstructionsobligatoriostring
config.workflowobligatorioobject
config.workflow.stepsobligatorioobject[]
config.openingHoursobject
config.openingHours.enabledobligatorioboolean
config.openingHours.timezoneobligatoriostring
config.openingHours.windowsobligatorioobject[]
config.openingHours.outsideobligatorio"message" | "transfer" | "reject"
config.openingHours.transferNumberobligatoriostring | null
knowledgeBaseobligatoriostring (uuid)[]
revisionobligatoriointeger
draftUpdatedAtobligatoriostring (date-time)
draftBasedOnVersionobligatoriointeger | null
dataCollectionLimitobligatoriointeger
inboundPersonalizationobligatorioboolean
Solicitud de ejemplo
curl -X PATCH "https://api.crang.ai/v1/agents/<id>" \
  -H "Authorization: Bearer $CRANG_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"revision":0}'
POST/v1/agents/{id}/publish

Publicar el borrador: las llamadas nuevas lo usan desde ya

Permiso necesarioagents:publish

Parámetros
CampoTipoDescripción
idobligatoriostring (uuid) · ruta
Cuerpo de la solicitud · JSON
CampoTipoDescripción
notestring
revisioninteger
Respuesta 200
CampoTipoDescripción
idobligatoriostring (uuid)
nameobligatoriostring
directionobligatorio"inbound" | "outbound" | "both"
statusobligatorio"draft_only" | "published" | "unpublished_changes"
voiceIdobligatoriostring (uuid) | null
languagesobligatoriostring[]
currentVersionobligatoriointeger | null
publishedAtobligatoriostring (date-time) | null
templateKeyobligatoriostring | null
createdAtobligatoriostring (date-time)
configobligatorioobject
config.basicsobligatorioobject
config.basics.voiceIdobligatoriostring (uuid) | null
config.basics.stabilityobligatorionumber
config.basics.speedobligatorionumber
config.basics.languagesobligatorioobject[]
config.basics.callVariablesobligatorioobject[]
config.rulesobligatorioobject
config.rules.purposeobligatoriostring
config.rules.toneobligatoriostring
config.rules.alwaysSayobligatoriostring[]
config.rules.neverSayobligatoriostring[]
config.rules.transfersobligatorioobject[]
config.rules.endCallRulesobligatoriostring[]
config.rules.dataToCaptureobligatorioobject[]
config.rules.goalsobligatorioobject[]
config.rules.callHandlingobligatorioobject
config.rules.voicemailMessageobligatoriostring
config.rules.additionalInstructionsobligatoriostring
config.workflowobligatorioobject
config.workflow.stepsobligatorioobject[]
config.openingHoursobject
config.openingHours.enabledobligatorioboolean
config.openingHours.timezoneobligatoriostring
config.openingHours.windowsobligatorioobject[]
config.openingHours.outsideobligatorio"message" | "transfer" | "reject"
config.openingHours.transferNumberobligatoriostring | null
knowledgeBaseobligatoriostring (uuid)[]
revisionobligatoriointeger
draftUpdatedAtobligatoriostring (date-time)
draftBasedOnVersionobligatoriointeger | null
dataCollectionLimitobligatoriointeger
inboundPersonalizationobligatorioboolean
Solicitud de ejemplo
curl -X POST "https://api.crang.ai/v1/agents/<id>/publish" \
  -H "Authorization: Bearer $CRANG_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'

Consumo

GET/v1/usage

Obtener el consumo

Permiso necesariousage:read

Respuesta 200
CampoTipoDescripción
statusobligatorio"pending_payment" | "setup" | "active" | "past_due" | "suspended" | "cancelled" | "pending_deletion"
billingCycleobligatorio"monthly" | "annual" | null
monthobligatorioobject | null
month.leftSecondsobligatoriointeger
month.grantedSecondsobligatoriointeger
month.endsAtobligatoriostring (date-time)
packSecondsobligatoriointeger
overdraftSecondsobligatoriointeger
liveCallsobligatoriointeger
callLimitobligatoriointeger
packPriceobligatorioobject | null
packPrice.amountobligatoriointeger
packPrice.currencyobligatoriostring
Solicitud de ejemplo
curl "https://api.crang.ai/v1/usage" \
  -H "Authorization: Bearer $CRANG_API_KEY"

Webhooks

Un webhook es una dirección HTTPS tuya. Crang le envía un POST cuando ocurre algo en el espacio de trabajo. Añade endpoints en Ajustes, Integraciones, elige sus eventos y copia el secreto de firma.

La solicitud

Todos los eventos tienen el mismo cuerpo, enviado como JSON con las cabeceras Content-Type, User-Agent: Crang-Webhooks/1.0 y Crang-Signature. Solo cambian los campos de data.

CampoTipoDescripción
idobligatoriostringId del evento. Es el mismo en cada reintento y reenvío: descarta duplicados por él.
typeobligatoriostringEl tipo de evento.
createdAtobligatoriostring (date-time)Cuándo se registró el evento.
dataobligatorioobjectLos campos del evento, indicados más abajo.

Verifica la firma

Crang-Signature es t={segundos unix},v1={hex}, donde v1 es el HMAC-SHA256 de {t}.{cuerpo sin procesar} con el secreto de firma de tu endpoint (whsec_...). Durante una rotación del secreto hay dos valores v1 durante 24 horas: acepta cualquiera que coincida.

Calcúlala sobre el cuerpo sin procesar, compara en tiempo constante y rechaza una t de más de 5 minutos.

import { createHmac, timingSafeEqual } from "node:crypto";

export function verify(rawBody, header, secret) {
  const parts = header.split(",").map((p) => p.split("="));
  const t = parts.find(([k]) => k === "t")?.[1];
  if (!t || Math.abs(Date.now() / 1000 - Number(t)) > 300) return false;
  const expected = createHmac("sha256", secret).update(`${t}.${rawBody}`).digest("hex");
  return parts
    .filter(([k]) => k === "v1")
    .some(([, v]) => v?.length === expected.length && timingSafeEqual(Buffer.from(v), Buffer.from(expected)));
}

Entrega y reintentos

Responde con cualquier 2xx en 10 segundos; solo se lee el estado y no se siguen redirecciones. Si no, Crang reintenta 6 veces, tras 1 min, 5 min, 30 min, 2 h, 6 h, 15 h, unas 24 horas en total, y luego marca la entrega como fallida. Un endpoint cuyas entregas siguen fallando se desactiva y se avisa por correo a los propietarios. La entrega es al menos una vez.

Mientras el espacio de trabajo está suspendido no se entrega nada, salvo el único evento tenant.suspended.

Ajustes, Integraciones muestra las entregas recientes con su estado, intentos y carga útil. Puedes reenviar una o enviar un evento de prueba (webhook.test) a un solo endpoint.

Eventos

Elige los eventos que recibe cada endpoint. webhook.test solo llega al endpoint que pruebas.

call.completed

Una llamada fue contestada o llegó al buzón de voz, y su resultado está guardado.

CampoTipoDescripción
callIdobligatoriostring (uuid)La llamada. Úsala con GET /v1/calls/{id}
directionobligatorio"inbound" | "outbound"
outcomeobligatorio"answered" | "voicemail" | "no_answer" | "busy" | "failed"Cómo terminó la llamada
secondsobligatoriointegerDuración de la llamada en segundos
billedSecondsobligatoriointegerSegundos descontados de tus minutos
startedAtobligatoriostring (date-time)
cutOffobligatoriobooleanVerdadero cuando una llamada atendida terminó sin que el agente la cerrara ni la derivara: la otra parte colgó o se cortó la línea.
Carga útil de ejemplo
{
  "id": "evt_0f1e2d3c4b5a69788796a5b4c3d2e1f0",
  "type": "call.completed",
  "createdAt": "2026-03-02T14:05:09.000Z",
  "data": {
    "callId": "7b0e5f1c-3a52-4d0e-9a55-2f1d6f0c9a10",
    "direction": "outbound",
    "outcome": "answered",
    "seconds": 94,
    "billedSeconds": 94,
    "startedAt": "2026-03-02T14:05:09.000Z",
    "cutOff": false
  }
}

call.failed

Una llamada terminó sin ser contestada: sin respuesta, ocupado o fallida.

CampoTipoDescripción
callIdobligatoriostring (uuid)La llamada. Úsala con GET /v1/calls/{id}
directionobligatorio"inbound" | "outbound"
outcomeobligatorio"answered" | "voicemail" | "no_answer" | "busy" | "failed"Cómo terminó la llamada
secondsobligatoriointegerDuración de la llamada en segundos
billedSecondsobligatoriointegerSegundos descontados de tus minutos
startedAtobligatoriostring (date-time)
cutOffobligatoriobooleanVerdadero cuando una llamada atendida terminó sin que el agente la cerrara ni la derivara: la otra parte colgó o se cortó la línea.
Carga útil de ejemplo
{
  "id": "evt_0f1e2d3c4b5a69788796a5b4c3d2e1f0",
  "type": "call.failed",
  "createdAt": "2026-03-02T14:05:09.000Z",
  "data": {
    "callId": "7b0e5f1c-3a52-4d0e-9a55-2f1d6f0c9a10",
    "direction": "outbound",
    "outcome": "no_answer",
    "seconds": 0,
    "billedSeconds": 0,
    "startedAt": "2026-03-02T14:05:09.000Z",
    "cutOff": false
  }
}

campaign.completed

Una campaña no tiene nada más que marcar ni esperar.

CampoTipoDescripción
campaignIdobligatoriostring (uuid)La campaña. Úsala con GET /v1/campaigns/{id}
Carga útil de ejemplo
{
  "id": "evt_0f1e2d3c4b5a69788796a5b4c3d2e1f0",
  "type": "campaign.completed",
  "createdAt": "2026-03-02T14:05:09.000Z",
  "data": {
    "campaignId": "7b0e5f1c-3a52-4d0e-9a55-2f1d6f0c9a10"
  }
}

contact_list.imported

Terminó una importación de CSV, lista o fallida.

CampoTipoDescripción
listIdobligatoriostring (uuid)La lista. Úsala con GET /v1/contact-lists/{id}
statusobligatorio"ready" | "failed"
importedobligatoriointegerContactos añadidos
invalidobligatoriointegerFilas sin un número de teléfono utilizable
duplicatesobligatoriointegerFilas descartadas por duplicadas
suppressedobligatoriointegerFilas descartadas porque el número está en la lista de no llamar
Carga útil de ejemplo
{
  "id": "evt_0f1e2d3c4b5a69788796a5b4c3d2e1f0",
  "type": "contact_list.imported",
  "createdAt": "2026-03-02T14:05:09.000Z",
  "data": {
    "listId": "7b0e5f1c-3a52-4d0e-9a55-2f1d6f0c9a10",
    "status": "ready",
    "imported": 940,
    "invalid": 12,
    "duplicates": 31,
    "suppressed": 17
  }
}

usage.threshold_reached

Los minutos del mes superaron el 80, el 95 o el 100 por ciento.

CampoTipoDescripción
thresholdobligatorio"80" | "95" | "100" | "zero"Parte de los minutos del mes usada, o sin minutos
Carga útil de ejemplo
{
  "id": "evt_0f1e2d3c4b5a69788796a5b4c3d2e1f0",
  "type": "usage.threshold_reached",
  "createdAt": "2026-03-02T14:05:09.000Z",
  "data": {
    "threshold": "80"
  }
}

usage.exhausted

Se agotaron los minutos del mes.

CampoTipoDescripción
thresholdobligatorio"80" | "95" | "100" | "zero"Parte de los minutos del mes usada, o sin minutos
Carga útil de ejemplo
{
  "id": "evt_0f1e2d3c4b5a69788796a5b4c3d2e1f0",
  "type": "usage.exhausted",
  "createdAt": "2026-03-02T14:05:09.000Z",
  "data": {
    "threshold": "zero"
  }
}

tenant.suspended

El espacio de trabajo se suspendió: las llamadas se detienen y no se entrega nada más.

CampoTipoDescripción
statusobligatorio"pending_payment" | "setup" | "active" | "past_due" | "suspended" | "cancelled" | "pending_deletion"
previousStatusobligatorio"pending_payment" | "setup" | "active" | "past_due" | "suspended" | "cancelled" | "pending_deletion"
Carga útil de ejemplo
{
  "id": "evt_0f1e2d3c4b5a69788796a5b4c3d2e1f0",
  "type": "tenant.suspended",
  "createdAt": "2026-03-02T14:05:09.000Z",
  "data": {
    "status": "suspended",
    "previousStatus": "active"
  }
}

tenant.reactivated

El espacio de trabajo vuelve a estar activo.

CampoTipoDescripción
statusobligatorio"pending_payment" | "setup" | "active" | "past_due" | "suspended" | "cancelled" | "pending_deletion"
previousStatusobligatorio"pending_payment" | "setup" | "active" | "past_due" | "suspended" | "cancelled" | "pending_deletion"
Carga útil de ejemplo
{
  "id": "evt_0f1e2d3c4b5a69788796a5b4c3d2e1f0",
  "type": "tenant.reactivated",
  "createdAt": "2026-03-02T14:05:09.000Z",
  "data": {
    "status": "active",
    "previousStatus": "suspended"
  }
}

webhook.test

Lo envía Enviar evento de prueba, solo a ese endpoint.

CampoTipoDescripción
endpointIdobligatoriostring (uuid)El endpoint al que se envió la prueba
Carga útil de ejemplo
{
  "id": "evt_0f1e2d3c4b5a69788796a5b4c3d2e1f0",
  "type": "webhook.test",
  "createdAt": "2026-03-02T14:05:09.000Z",
  "data": {
    "endpointId": "7b0e5f1c-3a52-4d0e-9a55-2f1d6f0c9a10"
  }
}

MCP

El servidor MCP permite que un asistente de IA trabaje con tu espacio de trabajo según lo que permita la clave de API, y nada más. Cada acción queda en el registro de auditoría. Es HTTP con streaming (Streamable HTTP), sin sesiones.

Autenticación

Envía la clave como Authorization: Bearer <clave>. La clave necesita el permiso mcp más los permisos de las herramientas que quieras usar. El asistente solo ve las herramientas que su clave permite; cualquier otra se responde como no encontrada. Las solicitudes cuentan para los mismos límites de uso que la API REST.

Conecta un asistente de IA

Añade el servidor a la configuración MCP del asistente y sustituye YOUR_API_KEY por tu clave. Las ediciones de un agente quedan en el borrador; nada sale en vivo hasta publish_agent.

{
  "mcpServers": {
    "crang": {
      "url": "https://mcp.crang.ai/mcp",
      "headers": {
        "Authorization": "Bearer YOUR_API_KEY"
      }
    }
  }
}

Herramientas

41 herramientas. Cada una necesita todos los permisos indicados.

Llamadas

list_calls

Lectura

Buscar llamadas

Solo lectura. Lista las llamadas, de la más reciente a la más antigua, con resultado, objetivo, agente, campaña, contacto y duración. Filtra por dirección, agente, campaña, contacto, número de teléfono, resultado, objetivo (success), rango de tiempo (from/to, fecha y hora ISO), duración en segundos, transferencias, llamadas cortadas (cutOff) o una búsqueda por teléfono o nombre (q). Pagina con cursor.

Permisoscalls:read

Argumentos
CampoTipoDescripción
cursorstring (uuid)nextCursor de la página anterior
direction"inbound" | "outbound"
agentIdstring (uuid)
campaignIdstring (uuid)
contactIdstring (uuid)
phoneNumberIdstring (uuid)
outcome"answered" | "voicemail" | "no_answer" | "busy" | "failed"
success"all_met" | "any_failed" | "unknown"
fromstring (date-time)
tostring (date-time)
minSecondsinteger
maxSecondsinteger
qstring
limitinteger = 50
transferredbooleanPasada a una persona u otro agente
cutOffbooleanVerdadero cuando una llamada atendida terminó sin que el agente la cerrara ni la derivara: la otra parte colgó o se cortó la línea.

get_call

Lectura

Obtener una llamada

Solo lectura. Una llamada con su resumen, la transcripción completa (turnos del interlocutor y del agente), los datos capturados y los resultados de los objetivos.

Permisoscalls:read

Argumentos
CampoTipoDescripción
callIdobligatoriostring (uuid)

Contactos

list_contact_lists

Lectura

Listar listas de contactos

Solo lectura. Listas de contactos con su estado (importando, lista, fallida), número de contactos e informe de importación.

Permisoscontacts:read

Argumentos

Sin argumentos.

get_contact_list

Lectura

Obtener una lista de contactos

Solo lectura. Una lista de contactos con su estado e informe de importación (filas importadas, no válidas, duplicadas y de no llamar). Úsala para seguir una importación.

Permisoscontacts:read

Argumentos
CampoTipoDescripción
listIdobligatoriostring (uuid)

list_contacts

Lectura

Listar contactos

Solo lectura. Los contactos de una lista, del más reciente al más antiguo. Pagina con cursor.

Permisoscontacts:read

Argumentos
CampoTipoDescripción
listIdobligatoriostring (uuid)
cursorstring (uuid)nextCursor de la página anterior
limitinteger = 50

search_do_not_call

Lectura

Buscar en la lista de no llamar

Solo lectura. Números a los que el espacio de trabajo nunca llama, del más reciente al más antiguo; query busca por dígitos del teléfono.

Permisoscontacts:read

Argumentos
CampoTipoDescripción
querystring
cursorstring (uuid)nextCursor de la página anterior
limitinteger = 50

import_contacts

Cambia datos

Importar contactos

Cambia datos. Crea una lista de contactos nueva a partir de filas (objetos de nombre de columna a valor), con las mismas comprobaciones que una importación de CSV en la app: los teléfonos se normalizan, las filas no válidas y duplicadas se omiten y los números de no llamar se suprimen. mapping indica la columna de cada campo de contacto y de cada variable de llamada; las demás columnas se ignoran. Como máximo 5.000 filas y 100.000 valores (filas × columnas asignadas) por llamada, y 30 variables de llamada: para más filas, vuelve a llamar (cada llamada crea su propia lista). Solo para personas a las que el espacio de trabajo puede llamar legalmente (lawfulBasis: true registra esa confirmación). Devuelve la lista en importing; llama a get_contact_list para ver el informe.

Permisoscontacts:write

Argumentos
CampoTipoDescripción
nameobligatoriostring
rowsobligatorioobject<string, string | number | boolean | null>[]
mappingobligatorioobject
mapping.phoneobligatoriostring
mapping.namestring
mapping.languagestring
mapping.timezonestring
mapping.externalIdstring
mapping.variablesobject<string, string> = {}
lawfulBasisobligatoriotrue

add_to_do_not_call

Cambia datos

Añadir números a no llamar

Cambia datos. Añade números de teléfono a la lista de no llamar; las campañas los omiten desde ese momento. Un solo número no válido rechaza toda la solicitud (details.invalid).

Permisoscontacts:write

Argumentos
CampoTipoDescripción
phonesobligatoriostring[]
notestring

Campañas

list_campaigns

Lectura

Listar campañas

Solo lectura. Campañas salientes con estado, progreso por estado de contacto y estadísticas de llamadas.

Permisoscampaigns:read

Argumentos

Sin argumentos.

get_campaign

Lectura

Obtener el estado de una campaña

Solo lectura. Una campaña: estado, motivo de pausa, ajustes, progreso y llamadas de las últimas 24 horas.

Permisoscampaigns:read

Argumentos
CampoTipoDescripción
campaignIdobligatoriostring (uuid)

create_campaign

Cambia datos

Crear una campaña

Cambia datos. Crea una campaña saliente en borrador (no se marca nada hasta start_campaign). Los ajustes por defecto son el horario laboral entre semana en la zona horaria del espacio de trabajo.

Permisoscampaigns:write

Argumentos
CampoTipoDescripción
nameobligatoriostring
agentIdobligatoriostring (uuid)Un agente con una versión publicada
listIdsobligatoriostring (uuid)[]Listas de contactos a las que llamar
phoneNumberIdsobligatoriostring (uuid)[]Números del espacio de trabajo desde los que llamar
startsAtstring (date-time) | nullCuándo puede empezar la marcación tras start_campaign; null u omitido: de inmediato
settingsobligatorioobjectAjustes de marcación; lo que se omite conserva su valor actual o por defecto
settings.timezonestring
settings.windowsobject[]
settings.windows[].daysobligatoriointeger[]
settings.windows[].startobligatoriostring
settings.windows[].endobligatoriostring
settings.maxAttemptsinteger
settings.retryMinutesinteger
settings.retryOn"no_answer" | "busy" | "failed" | "voicemail" | "cut_off"[]
settings.maxConcurrentinteger
settings.callsPerMinuteinteger
settings.ringTimeoutSecondsinteger
settings.maxDurationSecondsinteger
settings.protectionobjectAjustes de protección propios: pausa automática, límite de minutos, inicio lento y valores de pausa
settings.protection.autoPausebooleanPausar la campaña automáticamente cuando sus últimas llamadas van mal. Por defecto false: la campaña solo muestra sus métricas. El límite de minutos se aplica en ambos casos.
settings.protection.minuteLimitinteger | nullMáximo de minutos que puede usar esta campaña (descontados más los de llamadas en curso); null u omitido: sin límite
settings.protection.warmupbooleanInicio lento: las primeras llamadas se hacen de pocas en pocas. Por defecto false.
settings.protection.stopsobject<string, integer | null>Por indicador, el porcentaje de las últimas llamadas terminadas en el que se pausa la campaña (answer_rate: se pausa por debajo de él); null desactiva esa pausa. technical_failures está entre 5 y 60 y no puede ser null. Omitido: el valor predeterminado del espacio de trabajo.

update_campaign

Cambia datos

Editar una campaña

Cambia datos. Edita una campaña en borrador, programada o en pausa; los campos omitidos conservan su valor. Las campañas programadas y en pausa conservan su agente y sus listas.

Permisoscampaigns:write

Argumentos
CampoTipoDescripción
campaignIdobligatoriostring (uuid)
namestring
agentIdstring (uuid)Un agente con una versión publicada
listIdsstring (uuid)[]Listas de contactos a las que llamar
phoneNumberIdsstring (uuid)[]Números del espacio de trabajo desde los que llamar
startsAtstring (date-time) | nullCuándo puede empezar la marcación tras start_campaign; null u omitido: de inmediato
settingsobjectAjustes de marcación; lo que se omite conserva su valor actual o por defecto
settings.timezonestring
settings.windowsobject[]
settings.windows[].daysobligatoriointeger[]
settings.windows[].startobligatoriostring
settings.windows[].endobligatoriostring
settings.maxAttemptsinteger
settings.retryMinutesinteger
settings.retryOn"no_answer" | "busy" | "failed" | "voicemail" | "cut_off"[]
settings.maxConcurrentinteger
settings.callsPerMinuteinteger
settings.ringTimeoutSecondsinteger
settings.maxDurationSecondsinteger
settings.protectionobjectAjustes de protección propios: pausa automática, límite de minutos, inicio lento y valores de pausa
settings.protection.autoPausebooleanPausar la campaña automáticamente cuando sus últimas llamadas van mal. Por defecto false: la campaña solo muestra sus métricas. El límite de minutos se aplica en ambos casos.
settings.protection.minuteLimitinteger | nullMáximo de minutos que puede usar esta campaña (descontados más los de llamadas en curso); null u omitido: sin límite
settings.protection.warmupbooleanInicio lento: las primeras llamadas se hacen de pocas en pocas. Por defecto false.
settings.protection.stopsobject<string, integer | null>Por indicador, el porcentaje de las últimas llamadas terminadas en el que se pausa la campaña (answer_rate: se pausa por debajo de él); null desactiva esa pausa. technical_failures está entre 5 y 60 y no puede ser null. Omitido: el valor predeterminado del espacio de trabajo.

start_campaign

Se publica

Iniciar una campaña

Cambia datos. Inicia una campaña en borrador: salen llamadas reales (ahora, o en startsAt) y consumen minutos. Requiere un agente publicado, un número de teléfono y contactos.

Permisoscampaigns:run

Argumentos
CampoTipoDescripción
campaignIdobligatoriostring (uuid)

pause_campaign

Cambia datos

Pausar una campaña

Cambia datos. Pausa una campaña en curso o programada; las llamadas en curso terminan.

Permisoscampaigns:run

Argumentos
CampoTipoDescripción
campaignIdobligatoriostring (uuid)

resume_campaign

Se publica

Reanudar una campaña

Cambia datos. Reanuda una campaña en pausa: la marcación continúa.

Permisoscampaigns:run

Argumentos
CampoTipoDescripción
campaignIdobligatoriostring (uuid)

cancel_campaign

Cambia datos

Cancelar una campaña

Cambia datos, no se puede deshacer. Cancela una campaña para siempre; no volverá a marcar.

Permisoscampaigns:run

Argumentos
CampoTipoDescripción
campaignIdobligatoriostring (uuid)

duplicate_campaign

Cambia datos

Duplicar una campaña

Cambia datos. Un borrador nuevo con el mismo agente, números y ajustes: las mismas listas (all) o una lista nueva con los contactos aún no alcanzados (not_reached, llamada listName).

Permisoscampaigns:write

Argumentos
CampoTipoDescripción
campaignIdobligatoriostring (uuid)
contactsobligatorio"all" | "not_reached"
listNamestring

Agentes

list_agents

Lectura

Listar agentes

Solo lectura. Agentes con dirección, voz, idiomas, números de teléfono y estado (solo borrador, publicado, cambios sin publicar), más los espacios de agente usados y totales.

Permisosagents:read

Argumentos

Sin argumentos.

get_agent

Lectura

Obtener un agente

Solo lectura. El borrador de un agente: config (datos básicos, reglas con objetivos, flujo), documentos de conocimiento y la revision que necesita cada herramienta de edición. Las llamadas en vivo usan la última versión publicada hasta que se publica el borrador.

Permisosagents:read

Argumentos
CampoTipoDescripción
agentIdobligatoriostring (uuid)

list_agent_versions

Lectura

Listar versiones de un agente

Solo lectura. Versiones publicadas de un agente, de la más reciente a la más antigua, con quién las publicó y la nota. rollback_agent toma de aquí el id de una versión.

Permisosagents:read

Argumentos
CampoTipoDescripción
agentIdobligatoriostring (uuid)

list_voices

Lectura

Listar voces

Solo lectura. Voces que puede usar un agente, con idiomas, género y acento; kind es catalog o custom (las voces propias listas de este espacio de trabajo). basics.voiceId acepta un id de aquí.

Permisosagents:read

Argumentos

Sin argumentos.

list_agent_templates

Lectura

Listar plantillas de agente

Solo lectura. Las plantillas desde las que puede empezar un agente nuevo: key, nombre, descripción y dirección. create_agent toma de aquí una clave.

Permisosagents:read

Argumentos

Sin argumentos.

list_custom_voices

Lectura

Listar las voces propias del espacio de trabajo

Solo lectura. Las voces propias del espacio de trabajo con su estado (procesando, lista, fallida, desactivada), los agentes que usan cada una y cuántas más puede tener.

Permisosagents:read

Argumentos

Sin argumentos.

create_agent

Cambia datos

Crear un agente

Cambia datos. Crea un agente nuevo en el espacio de trabajo a partir de una plantilla (list_agent_templates), como borrador: nada está en vivo ni contesta llamadas hasta publish_agent. Usa uno de los espacios de agente libres del espacio de trabajo y se rechaza si no queda ninguno; nunca compra un espacio.

Permisosagents:write

Argumentos
CampoTipoDescripción
nameobligatoriostring
templateKeyobligatoriostring

update_agent_basics

Solo borrador

Editar los datos básicos de un agente

Solo cambia el borrador (las llamadas en vivo no cambian hasta publish_agent). Reemplaza el nombre y/o los basics del agente: voz, expresividad (estabilidad), velocidad, idiomas con su primer mensaje, variables de llamada.

Permisosagents:write

Argumentos
CampoTipoDescripción
agentIdobligatoriostring (uuid)
revisionobligatoriointegerLa revision del agente según get_agent. Una desactualizada se rechaza: vuelve a leer el agente.
namestring
basicsobject
basics.voiceIdobligatoriostring (uuid) | null
basics.stabilityobligatorionumber
basics.speedobligatorionumber
basics.languagesobligatorioobject[]
basics.languages[].codeobligatoriostring
basics.languages[].firstMessageobligatoriostring
basics.callVariablesobligatorioobject[]
basics.callVariables[].nameobligatoriostring
basics.callVariables[].exampleobligatoriostring

update_agent_rules

Solo borrador

Editar las reglas de un agente

Solo cambia el borrador. Reemplaza las rules del agente: propósito y tono, qué decir siempre y nunca, transferencias, reglas para terminar la llamada, datos a capturar, objetivos, gestión de llamadas, mensaje de buzón de voz e instrucciones adicionales. Envía el objeto de reglas completo de get_agent con tus cambios.

Permisosagents:write

Argumentos
CampoTipoDescripción
agentIdobligatoriostring (uuid)
revisionobligatoriointegerLa revision del agente según get_agent. Una desactualizada se rechaza: vuelve a leer el agente.
rulesobligatorioobject
rules.purposeobligatoriostring
rules.toneobligatoriostring
rules.alwaysSayobligatoriostring[]
rules.neverSayobligatoriostring[]
rules.transfersobligatorioobject[]
rules.transfers[].toobligatorio"number"
rules.transfers[].destinationobligatoriostring
rules.transfers[].conditionobligatoriostring
rules.transfers[].transferTypeobligatorio"conference" | "blind"
rules.transfers[].hoursobligatoriostring
rules.transfers[].outsideHoursobligatoriostring
rules.transfers[].callerMessageobligatoriostring
rules.transfers[].summaryobligatoriostring
rules.transfers[].agentIdobligatoriostring (uuid)
rules.endCallRulesobligatoriostring[]
rules.dataToCaptureobligatorioobject[]
rules.dataToCapture[].nameobligatoriostring
rules.dataToCapture[].typeobligatorio"string" | "boolean" | "integer" | "number"
rules.dataToCapture[].descriptionobligatoriostring
rules.goalsobligatorioobject[]
rules.goals[].nameobligatoriostring
rules.goals[].descriptionobligatoriostring
rules.goals[].valueobject
rules.callHandlingobligatorioobject
rules.callHandling.languageDetectionobligatorioboolean
rules.callHandling.voicemailDetectionobligatorioboolean
rules.callHandling.keypadTonesobligatorioboolean
rules.callHandling.skipTurnobligatorioboolean
rules.voicemailMessageobligatoriostring
rules.additionalInstructionsobligatoriostring

update_agent_goals

Solo borrador

Editar los objetivos de un agente

Solo cambia el borrador. Reemplaza los objetivos del agente (rules.goals): qué cuenta como resultado de una llamada, cada uno con "se alcanza cuando" y un valor opcional a capturar. Se evalúan después de cada llamada.

Permisosagents:write

Argumentos
CampoTipoDescripción
agentIdobligatoriostring (uuid)
revisionobligatoriointegerLa revision del agente según get_agent. Una desactualizada se rechaza: vuelve a leer el agente.
goalsobligatorioobject[]
goals[].nameobligatoriostring
goals[].descriptionobligatoriostring
goals[].valueobject
goals[].value.typeobligatorio"text" | "number" | "date" | "yes_no"
goals[].value.nameobligatoriostring
goals[].value.unitstring

update_agent_workflow

Solo borrador

Editar el flujo de un agente

Solo cambia el borrador. Reemplaza el workflow del agente (los pasos y los caminos entre ellos). Los problemas del flujo se permiten en el borrador pero impiden publicar.

Permisosagents:write

Argumentos
CampoTipoDescripción
agentIdobligatoriostring (uuid)
revisionobligatoriointegerLa revision del agente según get_agent. Una desactualizada se rechaza: vuelve a leer el agente.
workflowobligatorioobject
workflow.stepsobligatorioobject[]
workflow.steps[].kindobligatorio"start"
workflow.steps[].idobligatoriostring
workflow.steps[].labelobligatoriostring
workflow.steps[].positionobligatorioobject
workflow.steps[].pathsobligatorioobject[]
workflow.steps[].instructionsobligatoriostring
workflow.steps[].collectobligatoriostring[]
workflow.steps[].documentIdsobligatoriostring (uuid)[]
workflow.steps[].voiceIdobligatoriostring (uuid) | null
workflow.steps[].messagesobligatorioobject<string, string>
workflow.steps[].actionobligatorio"save_data"
workflow.steps[].fieldobligatoriostring | ""
workflow.steps[].destinationobligatoriostring | ""
workflow.steps[].transferTypeobligatorio"conference" | "blind"
workflow.steps[].agentIdobligatoriostring (uuid) | null
workflow.steps[].messageobligatoriostring

attach_knowledge_document

Solo borrador

Adjuntar un documento de conocimiento

Solo cambia el borrador. Permite que el agente use un documento de la base de conocimiento (ids de list_knowledge_documents).

Permisosagents:write

Argumentos
CampoTipoDescripción
agentIdobligatoriostring (uuid)
revisionobligatoriointegerLa revision del agente según get_agent. Una desactualizada se rechaza: vuelve a leer el agente.
documentIdobligatoriostring (uuid)

detach_knowledge_document

Solo borrador

Desvincular un documento de conocimiento

Solo cambia el borrador. Una vez publicado, el agente deja de usar uno de sus documentos de la base de conocimiento; el documento sigue en el espacio de trabajo. Los documentos de empresa no se pueden desvincular (elimínalos en Ajustes).

Permisosagents:write

Argumentos
CampoTipoDescripción
agentIdobligatoriostring (uuid)
revisionobligatoriointegerLa revision del agente según get_agent. Una desactualizada se rechaza: vuelve a leer el agente.
documentIdobligatoriostring (uuid)

discard_agent_draft

Solo borrador

Descartar el borrador de un agente

Cambia datos, no se puede deshacer. Elimina todos los cambios sin publicar: el borrador vuelve a ser la versión en vivo.

Permisosagents:write

Argumentos
CampoTipoDescripción
agentIdobligatoriostring (uuid)
revisionobligatoriointegerLa revision del agente según get_agent. Una desactualizada se rechaza: vuelve a leer el agente.

publish_agent

Se publica

Publicar un agente

Sale en vivo. El borrador pasa a ser la siguiente versión y toda llamada real nueva (entrante y de campañas) la usa de inmediato. Requiere una voz, un idioma con primer mensaje y un flujo sin problemas. Confirma antes con el usuario.

Permisosagents:publish

Argumentos
CampoTipoDescripción
agentIdobligatoriostring (uuid)
revisionobligatoriointegerLa revision del agente según get_agent. Una desactualizada se rechaza: vuelve a leer el agente.
notestring

rollback_agent

Se publica

Revertir un agente

Sale en vivo. Publica una copia de una versión anterior (de list_agent_versions) como la siguiente versión; las llamadas reales la usan de inmediato. El borrador se conserva. Confirma antes con el usuario.

Permisosagents:publish

Argumentos
CampoTipoDescripción
agentIdobligatoriostring (uuid)
versionIdobligatoriostring (uuid)
notestring

assign_phone_number_agent

Se publica

Asignar el agente de un número de teléfono

Sale en vivo. El agente contesta de inmediato las llamadas entrantes de este número (agentId null: nadie contesta). El agente necesita una versión publicada. Confirma antes con el usuario.

Permisosagents:publish

Argumentos
CampoTipoDescripción
phoneNumberIdobligatoriostring (uuid)
agentIdobligatoriostring (uuid) | null

Base de conocimiento

list_knowledge_documents

Lectura

Listar documentos de conocimiento

Solo lectura. La base de conocimiento del espacio de trabajo: documentos con su estado (procesando, lista, fallida) y tamaño.

Permisosknowledge:read

Argumentos

Sin argumentos.

add_knowledge_text

Se publica

Añadir un documento de texto

Cambia datos, también en llamadas en vivo. Añade un documento de texto a la base de conocimiento. Una vez procesado, se une a todos los agentes, incluidas las versiones publicadas.

Permisosknowledge:writeagents:publish

Argumentos
CampoTipoDescripción
nameobligatoriostring
textobligatoriostring

add_knowledge_url

Se publica

Añadir una página web

Cambia datos, también en llamadas en vivo. Añade el contenido de una página web pública (https) a la base de conocimiento. Una vez procesado, se une a todos los agentes, incluidas las versiones publicadas.

Permisosknowledge:writeagents:publish

Argumentos
CampoTipoDescripción
urlobligatoriostring (uri)

Números de teléfono

list_phone_numbers

Lectura

Listar números de teléfono

Solo lectura. Los números de teléfono del espacio de trabajo con el agente que contesta cada uno, las campañas abiertas que lo usan y las llamadas entrantes de los últimos 7 días.

Permisosnumbers:read

Argumentos

Sin argumentos.

Analíticas

get_analytics

Lectura

Obtener analíticas

Solo lectura. Resultados de llamadas de un periodo en la zona horaria del espacio de trabajo: totales (llamadas, tasa de respuesta, objetivos alcanzados, minutos, transferencias, bajas) con el periodo anterior (compare), llamadas a lo largo del tiempo, resultados, duraciones, mejores horas para llamar, resultados por agente, campaña y número, y los valores capturados más frecuentes. custom requiere from y to (días locales). Indica agent para un solo agente.

Permisosanalytics:read

Argumentos
CampoTipoDescripción
period"today" | "yesterday" | "7d" | "30d" | "90d" | "this_month" | "this_year" | "custom" = "7d"
fromstring (date)
tostring (date)
direction"inbound" | "outbound"
agentIdstring (uuid)Solo este agente (la vista por agente)
campaignIdstring (uuid)
compareboolean = trueDevolver también el periodo anterior

get_goal_results

Lectura

Obtener resultados de objetivos

Solo lectura. Con qué frecuencia se alcanzó cada objetivo en un periodo: totales con la tasa del periodo anterior, por agente, campaña y número, a lo largo del tiempo, y valores capturados. Mismas opciones de periodo que get_analytics; indica agent para un solo agente.

Permisosanalytics:read

Argumentos
CampoTipoDescripción
period"today" | "yesterday" | "7d" | "30d" | "90d" | "this_month" | "this_year" | "custom" = "7d"
fromstring (date)
tostring (date)
direction"inbound" | "outbound"
agentIdstring (uuid)Solo este agente (la vista por agente)
campaignIdstring (uuid)
compareboolean = trueDevolver también el periodo anterior

Consumo

get_usage

Lectura

Obtener minutos y consumo

Solo lectura. Minutos restantes y usados en el periodo actual.

Permisosusage:read

Argumentos

Sin argumentos.