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
| Campo | Tipo | Descripción |
|---|---|---|
id | string | ID único de la llamada. Consistente en todos los webhooks que refieren a la misma llamada. |
session.id | string | ID de sesión que agrupa todos los intentos de llamada al mismo cliente. |
startedAt | string | Fecha y hora de inicio de la llamada en ISO 8601. |
endedReason | string | Motivo por el que finalizó la llamada (por ejemplo customer-ended-call, user-not-contacted). |
messages | array | Transcripción completa de la conversación. |
customer.name | string | Opcional. Presente cuando se proporcionó un nombre al crear la llamada. |
customer.phoneNumber | string | Número telefónico de destino en formato E.164. |
variableValues | object | Variables de entrada proporcionadas al crear la llamada. |
durationSeconds | integer | Duración total de la llamada en segundos. |
detailsURL | string | URL para ver detalles de la llamada en el dashboard. |
recordingURL | string | Opcional. URL para descargar la grabación de audio. Presente solo cuando hay una grabación disponible. |
analysis.successEvaluation | boolean | Si el criterio de éxito se cumplió o no. |
analysis.structuredData | object | Variables de salida y sus respectivos valores. |
analysis.summary | string | Resumen 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):
| Intento | Demora tras el intento anterior |
|---|---|
| 1 | — (entrega inicial) |
| 2 | 5 segundos |
| 3 | 15 segundos |
| 4 | 45 segundos |
| 5 | 2 min 15 seg |
| 6 | 6 min 45 seg |
| 7 | 20 min 15 seg |
| 8 | 1 hr 45 seg |
| 9 | 3 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.