{
"id": "whd_2c3d4e5f6a7b40718293a4b5c6d7e8fb",
"type": "call.analyzed",
"created_at": "2026-10-12T05:31:52.733Z",
"data": {
"call": {
"id": "call_9f1c2a7e4b3d4c0e8a6b5d2f1e0c9b8a",
"agent_id": "agt_credfin_dpd_8_30_m",
"call_type": "ai_voice",
"to": "+9198XXXXXX01",
"status": "completed",
"scheduled_for": null,
"attempts_count": 1,
"outcome": "promise_to_pay",
"summary": "The borrower confirmed the overdue amount of INR 4,574 and promised to pay in full by Friday.",
"duration_sec": 61.5,
"billable_minutes": 2,
"cost": {
"amount_micros": 0,
"currency": "INR",
"status": "pending"
},
"has_recording": true,
"has_transcript": true,
"metadata": {
"loan_id": "CF-LN-208841",
"borrower_ref": "BR-55102"
},
"created_at": "2026-10-12T05:30:00.120Z",
"updated_at": "2026-10-12T05:31:52.730Z",
"ended_at": "2026-10-12T05:31:14.880Z"
},
"attempt": {
"id": "att_7b2e4c1d9a8f4e3b8c2d1a0f9e8d7c6b",
"attempt_number": 1,
"call_type": "ai_voice",
"status": "completed",
"failure_reason": null,
"ended_by": "user",
"duration_sec": 61.5,
"billable_minutes": 2,
"started_at": "2026-10-12T05:30:11.402Z",
"ended_at": "2026-10-12T05:31:14.880Z",
"outcome": "promise_to_pay",
"cost": {
"amount_micros": 0,
"currency": "INR",
"status": "pending"
}
},
"will_retry": false
}
}Call analyzed
Sent for an AI voice call attempt once the voice-AI provider has reported the outcome, summary, transcript
and recording (for connected attempts, a few seconds to minutes after call.ended). outcome can be null
when the analysis timed out. Human calls send it once their recording is analysed (summary, disposition and
QA in final_variables). Reachability dials do not send call.analyzed.
{
"id": "whd_2c3d4e5f6a7b40718293a4b5c6d7e8fb",
"type": "call.analyzed",
"created_at": "2026-10-12T05:31:52.733Z",
"data": {
"call": {
"id": "call_9f1c2a7e4b3d4c0e8a6b5d2f1e0c9b8a",
"agent_id": "agt_credfin_dpd_8_30_m",
"call_type": "ai_voice",
"to": "+9198XXXXXX01",
"status": "completed",
"scheduled_for": null,
"attempts_count": 1,
"outcome": "promise_to_pay",
"summary": "The borrower confirmed the overdue amount of INR 4,574 and promised to pay in full by Friday.",
"duration_sec": 61.5,
"billable_minutes": 2,
"cost": {
"amount_micros": 0,
"currency": "INR",
"status": "pending"
},
"has_recording": true,
"has_transcript": true,
"metadata": {
"loan_id": "CF-LN-208841",
"borrower_ref": "BR-55102"
},
"created_at": "2026-10-12T05:30:00.120Z",
"updated_at": "2026-10-12T05:31:52.730Z",
"ended_at": "2026-10-12T05:31:14.880Z"
},
"attempt": {
"id": "att_7b2e4c1d9a8f4e3b8c2d1a0f9e8d7c6b",
"attempt_number": 1,
"call_type": "ai_voice",
"status": "completed",
"failure_reason": null,
"ended_by": "user",
"duration_sec": 61.5,
"billable_minutes": 2,
"started_at": "2026-10-12T05:30:11.402Z",
"ended_at": "2026-10-12T05:31:14.880Z",
"outcome": "promise_to_pay",
"cost": {
"amount_micros": 0,
"currency": "INR",
"status": "pending"
}
},
"will_retry": false
}
}Headers
The event type, same as the body's type.
call.ended, call.analyzed, call.status_changed, reachability.result, reachability.completed, campaign.started, campaign.paused, campaign.resumed, campaign.completed, campaign.canceled, campaign.record.updated, call.dispositioned, dialer.contact_updated Delivery id (whd_...), same as the body's id. Stays the same across retries of one delivery: use it to
drop duplicates.
t=<unix seconds>,v1=<hex HMAC-SHA256(secret, t + "." + raw body)>. t is the time of this delivery try.
Verify it before trusting the body (see the Webhooks tag and the event descriptions).
^t=\d+,v1=[0-9a-f]{64}$Always voice-gateway-webhooks/1.
"voice-gateway-webhooks/1"Body
Response
Any 2xx status, within 10 seconds, acknowledges the delivery (the body is ignored). Anything else (other statuses, timeouts, connection errors) is retried: 8 tries in total, 30 seconds after the first failure, then doubling (30 s, 1 min, 2 min, 4 min, 8 min, 16 min, 32 min; about 63 minutes in all). Redirects are not a supported answer.