Webhooks
Envíe cada llamada terminada a su propio punto de conexión. Configure uno, elija qué lleva, lea la carga útil y revise las entregas.
Qué conseguirá
Cada vez que uno de sus agentes termine una llamada, Phynxa enviará el resumen, la transcripción y los datos de la llamada a una dirección web que usted controla. También puede avisarle cuando empieza una llamada y cada vez que se ejecuta una herramienta.
Requisitos previos
- Un punto de conexión
httpohttpspúblico que acepte la solicitud y responda con un estado 2xx. Se rechazan las direcciones privadas e internas. - El rol de owner o admin.
Configuración paso a paso
- Abra Tools y la pestaña Webhooks, y elija New webhook.
- Escriba un Name (para su referencia, por ejemplo CRM sync) y marque los Agents que deben enviar a él. Un agente usa un webhook, así que marcar un agente que ya tenga otro lo traslada a este.
- Elija crearlo. Se abre la página del webhook.
- En Where to send it, elija el Method (POST por defecto) y escriba la URL, por ejemplo
https://yoursite.com/hooks/calls. - Fije un Signing secret. Es opcional pero recomendable: le permite demostrar que cada solicitud procede de Phynxa. Consulte Verifique las firmas de los webhooks.
- En What to send, marque las partes que quiera (consulte más abajo). En Limits fije Timeout y Attempts.
- Elija Save changes.
- En cada agente, active Webhook en Tools, Built-in, y elíjalo en Send to.
Qué lleva cada entrega
El nombre del evento y el id de la llamada se envían siempre. Marque cualquiera de estos para añadirlos:
| Parte | Contenido |
|---|---|
| Call details | Agente, dirección, números, hora de inicio y de fin, duración, número de turnos, latencia y resultado. |
| Summary | La revisión: resumen, motivo, tono, etiqueta de resultado, puntuación y estado de la revisión. |
| Transcript | Cada frase hablada, de ambas partes, con el rol y la hora. |
| Action items | Lo que la IA decidió que todavía hay que hacer. |
| Captured details | Nombres, números y correos extraídos. |
Si no se marca nada, se envía todo.
Tipos de evento
Un webhook puede recibir tres eventos. Marque los que quiera en Events; Call completed viene marcado en un webhook nuevo.
| Evento | Cuándo se envía | Qué lleva |
|---|---|---|
call.started | Cuando la llamada se conecta | La parte Call details: agente, dirección, números y hora de inicio. |
tool.called | Cada vez que el agente ejecuta una de sus herramientas | La llamada y la herramienta: su nombre, si funcionó y cuánto tardó. No lo que se le pidió ni lo que devolvió. |
call.completed | Una vez revisada la llamada | Todo lo descrito en Qué lleva cada entrega. |
Las marcas de What to send se aplican a todos los eventos, pero solo a las partes que ese evento tiene: un call.started lleva los detalles de la llamada y no tiene dónde añadir una transcripción. Un tool.called lleva siempre su bloque tool.
Cómo se comportan los eventos en vivo:
- En orden.
call.started, después lostool.calledque haya y despuéscall.completed. - Nunca estorban a quien llama. Se envían en segundo plano. Un punto de conexión lento o inaccesible no puede hacer esperar a quien llama. Si hay más de 50 eventos esperando en una llamada, se descartan los más recientes. Al terminar la llamada, Phynxa espera unos segundos a lo que esté en cola y después envía
call.completed. - Gratis si no los usa. Un agente cuyo webhook no los ha marcado no hace ningún trabajo extra durante la llamada.
- Intentos. Se aplica Attempts, pero un evento en vivo espera como máximo 5 segundos una respuesta, diga lo que diga Timeout.
- Qué llamadas. El webhook se lee cuando empieza la llamada, así que marcar un evento afecta a las llamadas que empiecen después de guardar. Un webhook en pausa no envía nada.
call.started:
{
"event": "call.started",
"call_id": "b130a71059eb44e3bfff982ecc035585",
"call": {
"id": "b130a71059eb44e3bfff982ecc035585",
"agent_id": "230af209-7759-45af-839e-55cf5dcda8fd",
"agent_name": "Reception Marina",
"direction": "inbound",
"from_number": "+971501234567",
"to_number": "+97145551234",
"started_at": "2026-10-12T09:14:03.120000+00:00"
}
}tool.called:
{
"event": "tool.called",
"call_id": "b130a71059eb44e3bfff982ecc035585",
"call": {
"id": "b130a71059eb44e3bfff982ecc035585",
"agent_id": "230af209-7759-45af-839e-55cf5dcda8fd",
"agent_name": "Reception Marina",
"direction": "inbound"
},
"tool": { "id": "5d1f0c7a", "name": "check_order", "ok": true, "duration_ms": 420 }
}Ejemplo de carga útil
Con todas las partes marcadas (los valores son un ejemplo):
{
"event": "call.completed",
"call_id": "b130a71059eb44e3bfff982ecc035585",
"call": {
"id": "b130a71059eb44e3bfff982ecc035585",
"agent_id": "230af209-7759-45af-839e-55cf5dcda8fd",
"agent_name": "Reception Marina",
"direction": "inbound",
"from_number": "+971501234567",
"to_number": "+97145551234",
"started_at": "2026-10-12T09:14:03.120000+00:00",
"ended_at": "2026-10-12T09:15:41.880000+00:00",
"seconds": 98.8,
"turns": 9,
"p50_latency_ms": 820,
"p95_latency_ms": 1311,
"outcome": "completed"
},
"review": {
"summary": "Caller asked to book a cleaning on Thursday afternoon and was booked for 2:30 pm.",
"intent": "book an appointment",
"sentiment": "positive",
"outcome": "appointment_booked",
"score": 5,
"status": "complete"
},
"transcript": [
{ "role": "assistant", "text": "Thank you for calling Acme Dental. How can I help?", "at": "2026-10-12T09:14:04+00:00" },
{ "role": "user", "text": "Hi, can I book a cleaning this Thursday?", "at": "2026-10-12T09:14:09+00:00" }
],
"action_items": ["Send a reminder the day before"],
"entities": { "name": "Sara K.", "email": "sara@example.com" }
}Notas sobre los campos:
directionesinbound,outboundoweb(una prueba en el navegador).- El
rolede la transcripción esassistant(el agente) ouser(quien llama). review.statusescomplete,pending(la revisión no ha terminado) uoff(Call summary está desactivado para el agente). Las demás claves conservan su forma en cualquier caso.outcomedentro dereviewes uno deresolved,needs_followup,information_given,appointment_booked,no_answer,abandonedounclear.- Con solo Summary marcado recibe
event,call_idyreview, y nada más.
Detalles de la solicitud
Phynxa envía una solicitud a su URL con estas cabeceras:
| Cabecera | Valor |
|---|---|
Content-Type | application/json |
X-Voice-Agent-Event | call.completed, call.started o tool.called, según el caso |
X-Voice-Agent-Timestamp | Hora Unix en segundos (solo cuando hay un secreto fijado) |
X-Voice-Agent-Signature-V2 | HMAC-SHA256 en hexadecimal de <timestamp>.<raw body> (solo cuando hay un secreto fijado) |
X-Voice-Agent-Signature | HMAC-SHA256 en hexadecimal del cuerpo sin procesar (forma antigua; solo cuando hay un secreto fijado) |
Reintentos y qué cuenta como entregado
- Entregado: su punto de conexión responde con un estado 2xx.
- Reintentado: los tiempos de espera agotados, los errores de conexión y las respuestas 5xx, hasta Attempts intentos (de 1 a 5; los webhooks nuevos empiezan en 3), con una breve pausa entre ellos.
- No se reintenta: una respuesta 4xx. Phynxa supone que su punto de conexión rechazó la solicitud y seguirá rechazándola.
- Timeout: cuánto espera Phynxa una respuesta, hasta 60 segundos (los webhooks nuevos empiezan en 10).
- No se siguen las redirecciones.
Un webhook caído nunca pierde el registro de la llamada: la llamada se guarda en History en cualquier caso.
Revisar las entregas
En Recent deliveries (los últimos 50 intentos), cada fila muestra el evento, si tuvo éxito, el código de estado, el tiempo que tardó y cualquier error. En un agente, la pestaña Logs enumera las entregas del webhook al que envía.
Prueba
En la página del webhook elija Send test. Envía un ejemplo de cada evento que marcó (el ejemplo de fin de llamada si no marcó ninguno), con solo las partes que marcó y firmado exactamente igual que uno real. Muestra el resultado y, si un ejemplo falla, indica el evento. Cada ejemplo es una fila en Recent deliveries. Guarde primero: la prueba usa la versión guardada.
Resultado esperado
Su punto de conexión recibe la solicitud, responde 2xx y la fila de Recent deliveries figura como exitosa.
Solución de problemas
Consulte Problemas de entrega de webhooks.
Guías relacionadas
¿Algo de esto no coincide con lo que ve en el panel? Avísenos.
