POST https://ingest.zelto.ai/webhooks/calls. Una conversación de texto es una
llamada con transcripción y sin audio. Como la transcripción ya existe, Zelto
omite ese paso; todo lo demás —resúmenes, hallazgos,
revisiones e informes— funciona igual que con una llamada de voz.
La creación de claves, la idempotencia y la gestión de errores se comparten con
Proveedores personalizados y otros.
Esta página explica únicamente lo específico de las conversaciones de texto.
Crear una clave
Las cargas de texto utilizan la misma clave de API que cualquier otra carga personalizada. Sigue los pasos de Proveedores personalizados y otros → Crear una clave en Configuración → Integraciones → Carga de llamadas por API y expón la clave comoZELTO_API_KEY.
Subir una conversación de chat
Envía los mensajes entranscript.turns: utiliza role: "user" para la persona
y role: "assistant" para el agente. Omite los campos de audio y telefonía.
Solo son obligatorios call.externalId y una referencia al agente.
chat.json
200 con { "received": true }.
Campos que debes enviar:
agent.externalId, para que Zelto busque o cree el agente, oagentId, el UUID de un agente existente. Utiliza un identificador estable por agente, no por conversación.call.externalId, un identificador único y estable para la conversación y la clave de idempotencia.transcript.turns[], los mensajes en orden como turnosuseryassistant.call.startedAtycall.endedAt, las horas de inicio y fin en ISO 8601. Son opcionales, pero permiten ordenar y filtrar por hora.metadata.channel, para guardar el canal (web-chat,sms,whatsappoin-app) y poder filtrarlo después. No existe un campo específico para el canal.
recordingUrlyrecordingUploadId, porque no hay audio que volver a alojar.startSeconds,endSecondsywords[]por turno, ya que solo se utilizan para reproducir una transcripción sincronizada con audio.durationSecondsycustomer.numbercuando no tengan un equivalente útil en la conversación de texto.
Una entrega sin transcripción ni grabación se considera una llamada vacía.
Zelto responde con
200, pero no crea una conversación porque no hay nada que
analizar. Una conversación de texto debe incluir al menos un elemento en
transcript.turns.Invocaciones de herramientas
Si el chatbot invoca herramientas durante la conversación, por ejemplo para consultar disponibilidad o buscar un pedido, envía cada invocación como un turnotool con un objeto toolCall, igual que para un agente de voz. Zelto la muestra
en la transcripción y la incluye en el análisis. Consulta
Invocaciones de herramientas
para ver los campos y un ejemplo.
Cargas repetidas idempotentes
call.externalId es la clave de idempotencia. Si vuelves a enviar el mismo
identificador, Zelto actualiza la conversación existente y nunca la duplica.
Por eso, tanto los reintentos como los reenvíos posteriores de enriquecimiento
son seguros. Consulta
Cargas repetidas idempotentes.
Conversaciones representadas como llamadas
Zelto ingiere y analiza completamente las conversaciones de texto, pero su modelo y su interfaz todavía utilizan terminología de voz. Una conversación ingerida se etiqueta como una «llamada» y, si no proporcionas un nombre más descriptivo para el agente, recibe el nombreCall <externalId>. Tampoco existe todavía un campo
de modalidad o canal de primer nivel: el valor de metadata se guarda y se puede
consultar, pero la interfaz no identifica la conversación como chat. Todas las
funciones de análisis siguen disponibles; solo cambia la terminología visible.
Contenido relacionado
- Proveedores personalizados y otros — contrato compartido de carga, claves, errores y cargas nativas de Vapi y Retell.
- Conversaciones — dónde aparecen las conversaciones cargadas.
- Referencia de API — convenciones REST, formato completo y área de pruebas.
- MCP — utiliza la misma clave para ofrecer acceso de lectura y escritura a editores conectados.

