Skip to navigation

Webhook Payloads

View as Markdown

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

FieldDescription
data.call.agent_idAgent that handled the call.
data.call.call_parametersCall-time parameters from API request or CSV row.
data.call.conversation_idID used to fetch the conversation and recording.
data.call.duration_secondsCall duration in seconds. Null when the call did not connect.
data.call.recording_urlAPI URL to download the recording. Present only when enabled and available.
data.call.trace_idTrace ID returned by call initiation or generated by the platform.
data.resultsStructured outputs extracted by the agent. Shape depends on agent configuration.
data.retryRetry metadata when a retry strategy evaluated this event.
data.retry_contextResume context for future attempts when configured.
data.transcriptFull 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.