Introducción
Un trámite es una llamada que Delega hace por ti a una empresa: qué empresa, a qué teléfono, qué hay que lograr y con qué datos. El asistente navega el menú, espera en línea, habla con el agente y solo da los datos que tú le diste. Si el agente pide algo que no está en el trámite, el asistente te pregunta en vivo y espera tu respuesta.
La API es REST, recibe y devuelve JSON, y todas las rutas están bajo https://delega.overcloud.us/api/v1.
Autenticación
Cada solicitud lleva una llave de API de tu cuenta. Las llaves se crean en el panel, en Mi cuenta → Llaves de API; solo se muestran completas una vez, así que guárdala en un lugar seguro (por ejemplo, una variable de entorno o un gestor de secretos). Si una llave se expone, revócala desde el mismo lugar y crea otra.
Authorization: Bearer <tu llave>
Accept: application/json
La llave actúa en nombre de tu cuenta: ve y crea trámites de esa cuenta y de nadie más. Nunca la pongas en código del lado del navegador ni en un repositorio.
Formato de respuesta
Todas las respuestas JSON tienen la misma forma. Si salió bien, data trae el resultado y error es null:
{
"data": { "id": "01JAB3QK6Z8W4N2P7R5T9V1X3C", "estado": "listo" },
"error": null
}
Si algo falló, data es null y error trae message (en español, listo para mostrar), code (estable, para tu lógica) y, en errores de validación, campos con el detalle por campo:
{
"data": null,
"error": {
"message": "Falta el nombre de la empresa a la que se llama.",
"code": "validacion",
"campos": {
"empresa": ["Falta el nombre de la empresa a la que se llama."]
}
}
}
Límites
120
solicitudes por minuto a la API.
10
solicitudes por minuto a POST /tramites/{id}/llamar.
Además, cada cuenta tiene un máximo de llamadas simultáneas y puede tener un límite de minutos al mes. Si pasas un límite de solicitudes recibes un 429; si llegas al de llamadas o minutos, llamar responde 422 con el motivo.
Flujo recomendado
-
1
GET /tipos
Consulta los tipos de trámite y qué datos pide cada uno.
-
2
POST /tramites
Crea el trámite con los datos que tienes.
-
3
PATCH /tramites/{id}/datos
Si
faltanno está vacío, pide esos datos al usuario y complétalos. Nunca los inventes. -
4
POST /tramites/{id}/llamar
Lanza la llamada.
-
5
GET /tramites/{id}
Consulta cada pocos segundos el
estadoy lapregunta_pendiente. -
6
POST /tramites/{id}/responder
Si el estado es
esperando_respuesta, contesta la pregunta cuanto antes. -
7
GET /tramites/{id}/transcripcion · /grabacion
Al terminar, lee
resumen,folioysiguiente_paso, y descarga la transcripción y la grabación.
Endpoints
Rutas relativas a https://delega.overcloud.us/api/v1. Todas requieren la llave de API. {id} es el ID del trámite.
/api/v1/tipos
Tipos de trámite
Devuelve los tipos de trámite disponibles con los datos que pide cada uno (campos, con requerido), las voces disponibles para tu cuenta, la voz por defecto (voz_default) y el nombre que se usa por defecto en a_nombre_de (a_nombre_de_default). Úsalo antes de crear un trámite para saber qué pedirle al usuario.
{
"data": {
"tipos": [
{
"tipo": "generico",
"nombre": "Trámite general",
"descripcion": "Cualquier trámite por teléfono: aclaraciones, cambios, cancelaciones, citas.",
"empresa": null,
"telefono": null,
"objetivo": null,
"campos": [
{ "clave": "titular_nombre", "etiqueta": "Nombre completo del titular", "tipo": "texto", "requerido": true }
],
"requiere_alguno": []
}
],
"voces": [
{ "id": "a1B2c3D4e5F6g7H8", "nombre": "Voz natural" }
],
"voz_default": "a1B2c3D4e5F6g7H8",
"a_nombre_de_default": "Ana López"
},
"error": null
}
/api/v1/stats
Indicadores
Conteos de los trámites de tu cuenta: en curso, esperando tu respuesta, con datos faltantes, completados, creados hoy y total, más la actividad de los últimos 7 días.
{
"data": {
"en_curso": 1,
"esperando_respuesta": 0,
"faltan_datos": 2,
"completados": 14,
"hoy": 3,
"total": 19,
"semana": [
{ "dia": "2026-10-12", "total": 2, "completados": 2 },
{ "dia": "2026-10-13", "total": 4, "completados": 3 }
]
},
"error": null
}
/api/v1/tramites
Listar trámites
Trámites de tu cuenta, del más reciente al más antiguo, paginados.
| Parámetro | Tipo | Descripción |
|---|---|---|
| estado query | query | Filtra por estado (ver Estados del trámite). |
| q query | query | Busca en empresa, objetivo o folio. |
| por_pagina query | query | Resultados por página. Por defecto 20, máximo 100. |
| page query | query | Número de página. |
{
"data": {
"tramites": [
{
"id": "01JAB3QK6Z8W4N2P7R5T9V1X3C",
"tipo": "generico",
"empresa": "Telefonía Ejemplo",
"estado": "completado",
"folio": "PR5582",
"resumen": "Se actualizó el correo de contacto de la línea.",
"faltan": [],
"creado": "2026-10-18T10:15:02-06:00"
}
],
"pagina": 1,
"paginas": 1,
"total": 1
},
"error": null
}
/api/v1/tramites
Crear un trámite
Crea un trámite. Lo que no mandes se toma del tipo (empresa, teléfono y objetivo). Los datos que no correspondan a un campo del tipo se guardan como datos libres. La respuesta trae faltan: si no está vacío, el estado es faltan_datos y hay que completarlo antes de llamar. Delega nunca completa un dato del titular por su cuenta. Responde 201.
| Parámetro | Tipo | Descripción |
|---|---|---|
| tipo string | string | Tipo de trámite (ver /tipos). Por defecto generico. |
| empresa string | string | Empresa a la que se llama. Obligatoria si el tipo no la trae. |
| telefono string | string | Teléfono a marcar (México o Estados Unidos). |
| objetivo string | string | Qué hay que lograr en la llamada, en una o dos frases. |
| a_nombre_de string | string | De parte de quién llama el asistente. Por defecto, el de tu cuenta. |
| datos object | object | Datos del trámite por clave, por ejemplo {"titular_nombre": "Ana López"}. |
| notas string | string | Contexto extra o indicaciones para el asistente. |
| voz string | string | ID de una voz disponible para tu cuenta (ver /tipos). |
{
"tipo": "generico",
"empresa": "Telefonía Ejemplo",
"telefono": "8001234567",
"objetivo": "Actualizar el correo de contacto de la línea y obtener el folio del cambio.",
"a_nombre_de": "Ana López",
"datos": {
"titular_nombre": "Ana López",
"linea": "5512345678",
"correo_nuevo": "ana@ejemplo.com"
}
}
{
"data": {
"id": "01JAB3QK6Z8W4N2P7R5T9V1X3C",
"tipo": "generico",
"tipo_nombre": "Trámite general",
"empresa": "Telefonía Ejemplo",
"telefono_destino": "8001234567",
"objetivo": "Actualizar el correo de contacto de la línea y obtener el folio del cambio.",
"a_nombre_de": "Ana López",
"estado": "listo",
"pregunta_pendiente": null,
"resumen": null,
"folio": null,
"siguiente_paso": null,
"faltan": [],
"origen": "mcp",
"creado": "2026-10-18T10:15:02-06:00",
"finalizado": null,
"datos": {
"titular_nombre": "Ana López",
"linea": "5512345678",
"correo_nuevo": "ana@ejemplo.com"
},
"notas": null,
"voz": "a1B2c3D4e5F6g7H8",
"hallazgos": [],
"campos": [
{ "clave": "titular_nombre", "etiqueta": "Nombre completo del titular", "tipo": "texto", "requerido": true }
],
"llamada": null,
"intentos": 0
},
"error": null
}
/api/v1/tramites/{id}
Consultar un trámite
Detalle completo: estado, pregunta_pendiente (lo que el asistente te está preguntando en vivo), resumen, folio, siguiente_paso, los datos (los sensibles se muestran enmascarados) y la última llamada con su transcripción en llamada.turnos. Consúltalo cada pocos segundos mientras la llamada esté en curso.
{
"data": {
"id": "01JAB3QK6Z8W4N2P7R5T9V1X3C",
"empresa": "Telefonía Ejemplo",
"estado": "completado",
"pregunta_pendiente": null,
"resumen": "Se actualizó el correo de contacto de la línea a ana@ejemplo.com.",
"folio": "PR5582",
"siguiente_paso": "Ninguno: el cambio quedó registrado.",
"faltan": [],
"llamada": {
"id": 812,
"estado": "completed",
"duracion_seg": 214,
"motivo_falla": null,
"tiene_grabacion": true,
"turnos": [
{ "role": "dtmf", "text": "2", "at": "10:16:11" },
{ "role": "human", "text": "Buenas tardes, ¿en qué le puedo ayudar?", "at": "10:18:40" },
{ "role": "ai", "text": "Buenas tardes. Soy el asistente de Ana López y llamo de su parte…", "at": "10:18:44" }
]
},
"intentos": 1
},
"error": null
}
/api/v1/tramites/{id}/datos
Completar o corregir datos
Agrega o corrige datos. Un valor vacío borra ese dato. Devuelve el trámite con lo que todavía falta. No se puede mientras haya una llamada en curso; si el trámite ya había terminado, se reabre para otro intento.
| Parámetro | Tipo | Descripción |
|---|---|---|
| datos obligatorio object | object | Datos por clave. |
| notas string | string | Reemplaza las notas del trámite. |
{
"datos": {
"linea": "5512345678",
"rfc_titular": ""
}
}
{
"data": {
"id": "01JAB3QK6Z8W4N2P7R5T9V1X3C",
"estado": "faltan_datos",
"faltan": [
{ "clave": "titular_nombre", "etiqueta": "Nombre completo del titular", "ayuda": null }
]
},
"error": null
}
/api/v1/tramites/{id}/llamar
Llamar
Marca a la empresa y el asistente hace el trámite: navega el menú, espera en línea y habla con el agente. Solo funciona si no faltan datos. Antes de marcar se revisa que tu cuenta esté activa, que te queden minutos en el mes y que no hayas llegado al máximo de llamadas simultáneas. Límite: 10 solicitudes por minuto.
{
"data": {
"id": "01JAB3QK6Z8W4N2P7R5T9V1X3C",
"estado": "llamando",
"pregunta_pendiente": null,
"intentos": 1
},
"error": null
}
/api/v1/tramites/{id}/responder
Responder al asistente
Contesta la pregunta que el asistente hizo en vivo (estado esperando_respuesta) o dale una indicación durante la llamada. Hazlo rápido: el agente está esperando. Si no tienes el dato, dilo, por ejemplo «no lo tenemos, pide que lo envíen por correo».
| Parámetro | Tipo | Descripción |
|---|---|---|
| respuesta obligatorio string | string | Respuesta o indicación (máximo 1,000 caracteres). |
{
"respuesta": "Los últimos 4 dígitos de la tarjeta son 4321."
}
{
"data": { "enviada": true },
"error": null
}
/api/v1/tramites/{id}/marcar
Marcar teclas
Presiona teclas en la llamada en curso, por si hace falta ayudar al asistente en un menú. Solo se aceptan 0-9, * y #.
| Parámetro | Tipo | Descripción |
|---|---|---|
| digitos obligatorio string | string | Teclas a marcar, por ejemplo 2 o 5512345678#. |
{
"digitos": "2"
}
{
"data": { "marcado": true },
"error": null
}
/api/v1/tramites/{id}/colgar
Colgar
Cuelga la llamada en curso. Responde 409 sin_llamada_activa si no hay llamada.
{
"data": { "colgada": true },
"error": null
}
/api/v1/tramites/{id}/cancelar
Cancelar
Cancela el trámite; si hay una llamada en curso, la cuelga. Devuelve el trámite con estado cancelado.
{
"data": {
"id": "01JAB3QK6Z8W4N2P7R5T9V1X3C",
"estado": "cancelado",
"finalizado": "2026-10-18T10:20:31-06:00"
},
"error": null
}
/api/v1/tramites/{id}/transcripcion
Transcripción
Transcripción completa de todas las llamadas del trámite. En cada turno, role es ai (el asistente), human (la empresa) o dtmf (teclas marcadas).
{
"data": {
"tramite_id": "01JAB3QK6Z8W4N2P7R5T9V1X3C",
"llamadas": [
{
"id": 812,
"inicio": "2026-10-18T10:16:02-06:00",
"duracion_seg": 214,
"estado": "completed",
"turnos": [
{ "role": "dtmf", "text": "2", "at": "10:16:11" },
{ "role": "human", "text": "¿Me dicta el correo nuevo?", "at": "10:19:02" },
{ "role": "ai", "text": "Es ana@ejemplo.com. Se lo deletreo…", "at": "10:19:05" }
]
}
]
},
"error": null
}
/api/v1/tramites/{id}/grabacion
Grabación
Audio de la última llamada con grabación, como audio/mpeg (mp3). Solo se entrega con tu llave o tu sesión; nunca hay un enlace público. Responde 404 sin_grabacion si todavía no hay grabación.
Respuesta: el archivo de audio (Content-Type: audio/mpeg). Guárdalo directo a un archivo, por ejemplo con curl -o tramite.mp3.
/api/v1/cuenta
Tu cuenta
Datos de tu cuenta y el consumo del mes en minutos: minutos usados, límite mensual, minutos restantes, llamadas en curso e historial de los últimos meses. Un límite null significa sin límite.
{
"data": {
"cuenta": {
"id": 3,
"nombre": "Despacho Ejemplo",
"activa": true,
"limite_minutos_mes": 600,
"limite_llamadas_simultaneas": 2,
"voz_default": "a1B2c3D4e5F6g7H8",
"a_nombre_de_default": "Ana López"
},
"consumo": {
"periodo": "2026-10",
"minutos": 48,
"llamadas": 11,
"limite_minutos": 600,
"minutos_restantes": 552,
"llamadas_activas": 0,
"historial": [
{ "periodo": "2026-10", "minutos": 48, "llamadas": 11 }
]
},
"voces": [
{ "id": "a1B2c3D4e5F6g7H8", "nombre": "Voz natural" }
]
},
"error": null
}
/api/v1/cuenta/consumo
Consumo por llamada
Minutos por llamada en un mes (hasta 500 llamadas, de la más reciente a la más antigua).
| Parámetro | Tipo | Descripción |
|---|---|---|
| periodo query | query | Mes en formato AAAA-MM. Por defecto, el mes actual. |
{
"data": {
"periodo": "2026-10",
"minutos": 48,
"llamadas": 11,
"detalle": [
{
"fecha": "2026-10-18T10:19:36-06:00",
"tramite_id": "01JAB3QK6Z8W4N2P7R5T9V1X3C",
"empresa": "Telefonía Ejemplo",
"folio": "PR5582",
"segundos": 214,
"minutos": 4
}
]
},
"error": null
}
Estados del trámite
El campo estado dice en qué va cada trámite.
- faltan_datos
- Faltan datos obligatorios. Complétalos con PATCH /tramites/{id}/datos.
- listo
- Tiene todo lo necesario. Ya se puede llamar.
- llamando
- Se está marcando a la empresa.
- en_llamada
- La llamada está conectada: el asistente navega el menú, espera o habla con el agente.
- esperando_respuesta
- El asistente te hizo una pregunta y espera tu respuesta. Contesta con POST /tramites/{id}/responder.
- completado
- Se logró el objetivo. Revisa resumen, folio y siguiente paso.
- parcial
- Se avanzó, pero no se logró todo. El resumen y el siguiente paso dicen qué faltó.
- fallido
- No se pudo hacer el trámite (por ejemplo, no contestaron). Puedes corregir datos y volver a llamar.
- cancelado
- Lo cancelaste.
Errores
Usa siempre el código HTTP para decidir qué hacer. Todos los errores vienen como {"data": null, "error": {"message": "…", "code": "…"}}.
| HTTP | Código y significado |
|---|---|
| 401 | no_autenticado Falta la llave o no es válida. |
| 403 | cuenta_suspendida Tu cuenta está suspendida. |
| 403 | plan_sin_api Tu plan no incluye acceso por API. Las llaves de API y el MCP vienen desde el plan Profesional. |
| 404 |
no_encontrado El trámite no existe o es de otra cuenta. En /grabacion responde sin_grabacion cuando aún no hay grabación.
|
| 409 | sin_llamada_activa Pediste responder, marcar o colgar, pero no hay una llamada en curso. |
| 422 |
validacion Datos no válidos. campos dice qué campo falló. Incluye: «Ya usaste los N minutos de este mes», máximo de llamadas simultáneas alcanzado, voz no disponible para tu cuenta y trámite en llamada.
|
| 429 | demasiadas_solicitudes Demasiadas solicitudes. Espera un momento y vuelve a intentar. |
Consumo
El consumo se mide por llamada, en minutos, redondeando cada llamada hacia arriba: una llamada de 61 segundos cuenta como 2 minutos. Solo cuenta el tiempo de llamadas conectadas; si no contestan, no cuenta tiempo.
Consulta los minutos del mes y tu límite con GET /cuenta y el detalle por llamada con GET /cuenta/consumo.
Servidor MCP
Con el servidor MCP de Delega, tu asistente de IA puede hacer trámites por teléfono desde la conversación: crear el trámite, pedirte los datos que falten, lanzar la llamada, seguirla, contestar las preguntas del asistente en vivo y darte el folio al final.
- Funciona por stdio con cualquier cliente compatible con MCP y requiere Node 18 o superior.
- Usa la misma API v1 y la misma llave de tu cuenta, con los mismos límites.
- El paquete del servidor te lo entrega Overcloud cuando se habilita tu cuenta.
- Las herramientas que devuelven un trámite incluyen
siguiente_accion: una indicación corta de qué hacer después (pedir datos, llamar, esperar o responder).
Herramientas
| Herramienta | Qué hace |
|---|---|
| tramites_tipos | Lista los tipos de trámite y los datos que pide cada uno (obligatorios y opcionales). Úsala antes de crear un trámite para saber qué pedirle al usuario. |
| tramite_crear tipo, empresa, telefono, objetivo, a_nombre_de, datos, notas, voz | Crea un trámite y devuelve faltan: los datos que hay que pedirle al usuario antes de llamar. |
| tramite_completar_datos id, datos, notas | Agrega o corrige datos (un valor vacío borra el dato) y devuelve lo que todavía falta. |
| tramite_llamar id | Marca a la empresa y el asistente hace el trámite. Solo funciona si no faltan datos. |
| tramite_esperar id, segundos | Espera hasta segundos (5 a 240; por defecto 120) a que pase algo: que el asistente pregunte algo, que la llamada termine o que cambie de estado. Pensada para usarse en bucle mientras la llamada sigue. |
| tramite_responder id, respuesta | Contesta la pregunta que el asistente hizo en vivo, o le da una indicación. Hay que hacerlo rápido: el agente está esperando. |
| tramite_marcar id, digitos | Marca teclas (0-9, * y #) en la llamada en curso, por si el asistente se atora en un menú. |
| tramite_estado id | Estado actual: pregunta pendiente, resumen, folio, siguiente paso y transcripción de la última llamada. |
| tramite_transcripcion id | Transcripción completa de todas las llamadas del trámite. |
| tramite_grabacion id | Descarga la grabación (mp3) de la última llamada a un archivo local y devuelve la ruta. |
| tramite_colgar id | Cuelga la llamada en curso. |
| tramite_cancelar id | Cancela el trámite (y cuelga si hay llamada). |
| tramites_lista estado, q | Lista los trámites recientes, con filtro opcional por estado o búsqueda. |
| cuenta_consumo periodo | Minutos usados en el mes y límite de tu cuenta, con las llamadas en curso. Con periodo (AAAA-MM) devuelve el detalle de minutos por llamada. |
Configuración
El servidor lee estas variables de entorno:
- DELEGA_URL
- URL de la plataforma. Por defecto
https://delega.overcloud.us. - DELEGA_TOKEN_FILE
- Ruta a un archivo con tu llave, con permisos 600. Es la opción recomendada. Por defecto
~/.config/delega/token. - DELEGA_TOKEN
- La llave directamente. Si está definida, tiene prioridad sobre el archivo.
Primero guarda la llave en su archivo:
# Guarda tu llave en un archivo que solo tú puedas leer
mkdir -p ~/.config/delega
printf '%s' '<tu llave>' > ~/.config/delega/token
chmod 600 ~/.config/delega/token
Después agrega el servidor a la configuración de tu cliente MCP. El formato más común es este (cambia la ruta por la del paquete que te entregamos):
{
"mcpServers": {
"delega": {
"command": "node",
"args": ["/ruta/a/delega-mcp/index.js"],
"env": {
"DELEGA_URL": "https://delega.overcloud.us",
"DELEGA_TOKEN_FILE": "/Users/tu-usuario/.config/delega/token"
}
}
}
}
Reinicia tu cliente para que cargue las herramientas. Pídele, por ejemplo: «Llama a mi compañía de teléfono para actualizar el correo de contacto de mi línea».
Ejemplos con curl
Guarda tu llave en una variable de entorno (export DELEGA_TOKEN="<tu llave>") y prueba el flujo completo. Los datos son ficticios.
1. Crear un trámite
curl -X POST https://delega.overcloud.us/api/v1/tramites \
-H "Authorization: Bearer $DELEGA_TOKEN" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"tipo": "generico",
"empresa": "Telefonía Ejemplo",
"telefono": "8001234567",
"objetivo": "Actualizar el correo de contacto de la línea y obtener el folio del cambio.",
"a_nombre_de": "Ana López",
"datos": {
"titular_nombre": "Ana López",
"linea": "5512345678",
"correo_nuevo": "ana@ejemplo.com"
}
}'
2. Llamar
# Lanza la llamada (solo si "faltan" está vacío)
curl -X POST https://delega.overcloud.us/api/v1/tramites/01JAB3QK6Z8W4N2P7R5T9V1X3C/llamar \
-H "Authorization: Bearer $DELEGA_TOKEN" \
-H "Accept: application/json"
3. Seguir la llamada, responder y descargar la grabación
# Consulta el estado cada pocos segundos
curl https://delega.overcloud.us/api/v1/tramites/01JAB3QK6Z8W4N2P7R5T9V1X3C \
-H "Authorization: Bearer $DELEGA_TOKEN" \
-H "Accept: application/json"
# Si el estado es "esperando_respuesta", contesta la pregunta
curl -X POST https://delega.overcloud.us/api/v1/tramites/01JAB3QK6Z8W4N2P7R5T9V1X3C/responder \
-H "Authorization: Bearer $DELEGA_TOKEN" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{ "respuesta": "No tenemos el número de cuenta; pide que lo envíen por correo." }'
# Al terminar, descarga la grabación
curl https://delega.overcloud.us/api/v1/tramites/01JAB3QK6Z8W4N2P7R5T9V1X3C/grabacion \
-H "Authorization: Bearer $DELEGA_TOKEN" \
-o tramite.mp3
¿Quieres conectar Delega a tu sistema?
Escríbenos y te ayudamos a conectar Delega con tu sistema.