FormantAI sends signed JSON payloads to every active target subscribed to the event.
call.completed
Sent after the call ends and the conversation is saved.
{"event_id": "evt_1c58c5d8c55a","event_type": "call.completed","timestamp": "2026-03-18T20:53:41.766Z","data": {"call": {"agent_id": 497,"call_parameters": {"customer_name": "Rahul","loan_id": "LN-12345"},"conversation_id": "e36853de-9cbb-441e-ad75-d3c8ac82abfb_1","duration_seconds": 142,"ended_at": "2026-03-18T20:55:41.766Z","failure_reason": null,"from_phone": "+918065177389","recording_url": "https://api.voice.formantai.com/v1/conversations/e36853de-.../recording","started_at": "2026-03-18T20:53:41.766Z","status": "completed","to_phone": "+917014675791","trace_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"},"results": {"intent": "payment_confirmed","sentiment": "positive"},"retry": {"attempt_number": 1,"is_final_attempt": true,"max_attempts": 3,"next_retry_at": null},"retry_context": {"collected_data": {"customer_name": "Rahul","intent": "payment_confirmed"},"retry_initial_message": "Hi Rahul, we spoke earlier about your payment.","retry_language": "hi-IN","retry_stage_id": "stage_follow_up"},"transcript": "BOT: Hello Rahul...\nHUMAN: Yes, I can talk."}}
call.no_answer
Sent when the call rang but was not answered.
{"event_id": "evt_4f8bf8gbf88d","event_type": "call.no_answer","timestamp": "2026-03-18T20:53:41.766Z","data": {"call": {"agent_id": 497,"call_parameters": { "customer_name": "Rahul" },"conversation_id": "e36853de-9cbb-441e-ad75-d3c8ac82abfb_1","duration_seconds": null,"ended_at": "2026-03-18T20:54:11.766Z","failure_reason": null,"from_phone": "+918065177389","recording_url": null,"started_at": "2026-03-18T20:53:41.766Z","status": "no_answer","to_phone": "+917014675791","trace_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"},"results": {},"retry": {"attempt_number": 2,"is_final_attempt": true,"max_attempts": 3,"next_retry_at": null},"retry_context": null}}
call.failed
Sent when call setup fails or the provider cannot connect the call.
{"event_id": "evt_2d69d6e9d66b","event_type": "call.failed","timestamp": "2026-03-18T20:53:41.766Z","data": {"call": {"agent_id": 497,"call_parameters": { "customer_name": "Rahul" },"conversation_id": "e36853de-9cbb-441e-ad75-d3c8ac82abfb_1","duration_seconds": null,"ended_at": null,"failure_reason": "provider_error","from_phone": "+918065177389","recording_url": null,"started_at": "2026-03-18T20:53:41.766Z","status": "failed","to_phone": "+917014675791","trace_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"},"results": {},"retry": null,"retry_context": null}}
Field reference
| Field | Description |
|---|---|
data.call.agent_id | Agent that handled the call. |
data.call.call_parameters | Call-time parameters from API request or CSV row. |
data.call.conversation_id | ID used to fetch the conversation and recording. |
data.call.duration_seconds | Call duration in seconds. Null when the call did not connect. |
data.call.recording_url | API URL to download the recording. Present only when enabled and available. |
data.call.trace_id | Trace ID returned by call initiation or generated by the platform. |
data.results | Structured outputs extracted by the agent. Shape depends on agent configuration. |
data.retry | Retry metadata when a retry strategy evaluated this event. |
data.retry_context | Resume context for future attempts when configured. |
data.transcript | Full conversation text. Present only when enabled and available. |
Treat results and call_parameters as dynamic objects. Store them as JSON so agent changes do not break your ingestion pipeline.
