Saltar al contenido principal

Fin de Llamada

Envía una notificación HTTP a tu endpoint cuando finaliza una llamada, independientemente del intento. El payload contiene la transcripción completa, la grabación, la duración y el análisis de la llamada finalizada.

Entrega

  • Método: POST
  • Content-Type: application/json
  • Timeout de la petición: 30 segundos. Si tu endpoint no responde en 30s, tratamos el intento como fallido y reintentamos.
  • Autorización: Si se ha configurado un bearer token para el agente, las peticiones incluyen un header Authorization: Bearer <token>.

Payload

{
"id": "cHYqKdGz25Rq",
"session": {
"id": "sn_8Qd1mTbR"
},
"startedAt": "2024-09-24T18:20:22.724Z",
"endedReason": "customer-ended-call",
"messages": [{
"role": "system",
"message": "You are a helpful assistant"
}, {
"role": "agent",
"message": "Hello"
}, {
"role": "user",
"message": "Hi"
}],
"customer": {
"name": "Jane Doe",
"phoneNumber": "+15551234567"
},
"variableValues": {
"myVariable": "myValue"
},
"durationSeconds": 15,
"detailsURL": "https://fonema.ai/shareable/cHYqKdGz25Rq",
"recordingURL": "https://fonema.ai/api/v1/storage/calls/cHYqKdGz25Rq.mp3",
"analysis": {
"successEvaluation": true,
"structuredData": {
"myData": "myValueFromCall"
},
"summary": "The customer confirmed the appointment."
}
}

Campos Principales

CampoTipoDescripción
idstringID único de la llamada. Consistente en todos los webhooks que refieren a la misma llamada.
session.idstringID de sesión que agrupa todos los intentos de llamada al mismo cliente.
startedAtstringFecha y hora de inicio de la llamada en ISO 8601.
endedReasonstringMotivo por el que finalizó la llamada (por ejemplo customer-ended-call, user-not-contacted).
messagesarrayTranscripción completa de la conversación.
customer.namestringOpcional. Presente cuando se proporcionó un nombre al crear la llamada.
customer.phoneNumberstringNúmero telefónico de destino en formato E.164.
variableValuesobjectVariables de entrada proporcionadas al crear la llamada.
durationSecondsintegerDuración total de la llamada en segundos.
detailsURLstringURL para ver detalles de la llamada en el dashboard.
recordingURLstringOpcional. URL para descargar la grabación de audio. Presente solo cuando hay una grabación disponible.
analysis.successEvaluationbooleanSi el criterio de éxito se cumplió o no.
analysis.structuredDataobjectVariables de salida y sus respectivos valores.
analysis.summarystringResumen en lenguaje natural de la llamada.

Detalles de los Mensajes

El campo messages contiene la transcripción completa de la conversación:

  • role: Rol del participante (system, agent, user)
  • message: Contenido del mensaje

Respuesta a los eventos

Regresa cualquier código HTTP 2xx para confirmar la recepción. No inspeccionamos el cuerpo de la respuesta.

Cualquiera de los siguientes se trata como un fallo y dispara un reintento:

  • Una respuesta 3xx, 4xx o 5xx
  • Un error de red (conexión rechazada, fallo de DNS, error de TLS)
  • Sin respuesta dentro del timeout de 30 segundos

Tu endpoint debe ser idempotente. Dado que reintentamos ante cualquier respuesta no-2xx, el mismo evento puede ser entregado más de una vez. Deduplica usando id.

Intenta responder en mucho menos de 30 segundos — idealmente confirma de inmediato (por ejemplo, encolando el evento del lado de tu sistema) y realiza cualquier procesamiento pesado de forma asíncrona.

Política de reintentos

Las entregas fallidas se reintentan automáticamente con backoff exponencial (cada demora es 3× la anterior):

IntentoDemora tras el intento anterior
1— (entrega inicial)
25 segundos
315 segundos
445 segundos
52 min 15 seg
66 min 45 seg
720 min 15 seg
81 hr 45 seg
93 hr 2 min 15 seg

Después de nueve intentos el evento se descarta y no se reenviará. Si tu endpoint estuvo caído por más tiempo que la ventana de reintentos, deberías reconciliar el estado usando nuestra API en lugar de esperar un reenvío.