Saltar al contenido
Delega by Overcloud

Para desarrolladores

API y MCP de Delega

Crea trámites, lanza llamadas, contesta las preguntas del asistente en vivo y recibe el resumen, el folio y la grabación desde tu sistema o desde tu asistente de IA.

https://delega.overcloud.us/api/v1 JSON · UTF-8
Contenido

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.

Encabezados
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:

200 OK
{
  "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:

422 Unprocessable Content
{
  "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. 1

    GET /tipos

    Consulta los tipos de trámite y qué datos pide cada uno.

  2. 2

    POST /tramites

    Crea el trámite con los datos que tienes.

  3. 3

    PATCH /tramites/{id}/datos

    Si faltan no está vacío, pide esos datos al usuario y complétalos. Nunca los inventes.

  4. 4

    POST /tramites/{id}/llamar

    Lanza la llamada.

  5. 5

    GET /tramites/{id}

    Consulta cada pocos segundos el estado y la pregunta_pendiente.

  6. 6

    POST /tramites/{id}/responder

    Si el estado es esperando_respuesta, contesta la pregunta cuanto antes.

  7. 7

    GET /tramites/{id}/transcripcion · /grabacion

    Al terminar, lee resumen, folio y siguiente_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.

GET /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.

Respuesta de ejemplo
{
  "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
}
GET /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.

Respuesta de ejemplo
{
  "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
}
GET /api/v1/tramites

Listar trámites

Trámites de tu cuenta, del más reciente al más antiguo, paginados.

Parámetros de Listar trámites
Parámetro Descripción
estado query Filtra por estado (ver Estados del trámite).
q query Busca en empresa, objetivo o folio.
por_pagina query Resultados por página. Por defecto 20, máximo 100.
page query Número de página.
Respuesta de ejemplo
{
  "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
}
POST /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ámetros de Crear un trámite
Parámetro Descripción
tipo string Tipo de trámite (ver /tipos). Por defecto generico.
empresa string Empresa a la que se llama. Obligatoria si el tipo no la trae.
telefono string Teléfono a marcar (México o Estados Unidos).
objetivo string Qué hay que lograr en la llamada, en una o dos frases.
a_nombre_de string De parte de quién llama el asistente. Por defecto, el de tu cuenta.
datos object Datos del trámite por clave, por ejemplo {"titular_nombre": "Ana López"}.
notas string Contexto extra o indicaciones para el asistente.
voz string ID de una voz disponible para tu cuenta (ver /tipos).
Cuerpo de la solicitud
{
  "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"
  }
}
Respuesta de ejemplo
{
  "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
}
GET /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.

Respuesta de ejemplo
{
  "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
}
PATCH /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ámetros de Completar o corregir datos
Parámetro Descripción
datos obligatorio object Datos por clave.
notas string Reemplaza las notas del trámite.
Cuerpo de la solicitud
{
  "datos": {
    "linea": "5512345678",
    "rfc_titular": ""
  }
}
Respuesta de ejemplo
{
  "data": {
    "id": "01JAB3QK6Z8W4N2P7R5T9V1X3C",
    "estado": "faltan_datos",
    "faltan": [
      { "clave": "titular_nombre", "etiqueta": "Nombre completo del titular", "ayuda": null }
    ]
  },
  "error": null
}
POST /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.

Respuesta de ejemplo
{
  "data": {
    "id": "01JAB3QK6Z8W4N2P7R5T9V1X3C",
    "estado": "llamando",
    "pregunta_pendiente": null,
    "intentos": 1
  },
  "error": null
}
POST /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ámetros de Responder al asistente
Parámetro Descripción
respuesta obligatorio string Respuesta o indicación (máximo 1,000 caracteres).
Cuerpo de la solicitud
{
  "respuesta": "Los últimos 4 dígitos de la tarjeta son 4321."
}
Respuesta de ejemplo
{
  "data": { "enviada": true },
  "error": null
}
POST /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ámetros de Marcar teclas
Parámetro Descripción
digitos obligatorio string Teclas a marcar, por ejemplo 2 o 5512345678#.
Cuerpo de la solicitud
{
  "digitos": "2"
}
Respuesta de ejemplo
{
  "data": { "marcado": true },
  "error": null
}
POST /api/v1/tramites/{id}/colgar

Colgar

Cuelga la llamada en curso. Responde 409 sin_llamada_activa si no hay llamada.

Respuesta de ejemplo
{
  "data": { "colgada": true },
  "error": null
}
POST /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.

Respuesta de ejemplo
{
  "data": {
    "id": "01JAB3QK6Z8W4N2P7R5T9V1X3C",
    "estado": "cancelado",
    "finalizado": "2026-10-18T10:20:31-06:00"
  },
  "error": null
}
GET /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).

Respuesta de ejemplo
{
  "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
}
GET /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.

GET /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.

Respuesta de ejemplo
{
  "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
}
GET /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ámetros de Consumo por llamada
Parámetro Descripción
periodo query Mes en formato AAAA-MM. Por defecto, el mes actual.
Respuesta de ejemplo
{
  "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": "…"}}.

Errores comunes de la API
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

Herramientas del servidor MCP de Delega
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:

bash
# 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):

Configuración del cliente MCP (JSON)
{
  "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

bash
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

bash
# 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

bash
# 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.