{
"id": "whd_5e6f7a8b9c0d41e2a3b4c5d6e7f8a9b0",
"type": "call.dispositioned",
"created_at": "2026-10-12T06:10:02.118Z",
"data": {
"call": {
"id": "call_5b8e1d2c3a4f4b6e9d7c8a1b2c3d4e5f",
"agent_id": null,
"call_type": "human",
"to": "+9198XXXXXX01",
"status": "completed",
"scheduled_for": null,
"attempts_count": 1,
"outcome": "completed",
"summary": null,
"duration_sec": 142,
"billable_minutes": 3,
"cost": {
"amount_micros": 2400000,
"currency": "INR",
"status": "pending"
},
"has_recording": true,
"has_transcript": false,
"metadata": {
"loan_id": "CF-LN-208841",
"agent_user_id": "u_123"
},
"created_at": "2026-10-12T06:02:10.051Z",
"updated_at": "2026-10-12T06:05:03.229Z",
"ended_at": "2026-10-12T06:04:54.000Z",
"human": {
"agent_channel": "phone",
"transport": "vobiz",
"agent_phone": "+9198XXXXXX11",
"web_agent": null,
"agent_name": "Priya",
"from": "+9180XXXXXX79",
"topology": "agent_first",
"record": true,
"status": "completed",
"status_history": [
{
"status": "initiated",
"at": "2026-10-12T06:02:10.051Z"
},
{
"status": "ringing_agent",
"at": "2026-10-12T06:02:10.640Z"
},
{
"status": "agent_answered",
"at": "2026-10-12T06:02:18.212Z"
},
{
"status": "dialing_customer",
"at": "2026-10-12T06:02:18.300Z"
},
{
"status": "customer_answered",
"at": "2026-10-12T06:02:31.650Z"
},
{
"status": "connected",
"at": "2026-10-12T06:02:31.700Z"
},
{
"status": "completed",
"at": "2026-10-12T06:04:54.000Z"
}
],
"agent_answered": true,
"customer_answered": true,
"started_at": "2026-10-12T06:02:10.400Z",
"agent_answered_at": "2026-10-12T06:02:18.212Z",
"customer_answered_at": "2026-10-12T06:02:31.650Z",
"connected_at": "2026-10-12T06:02:31.700Z",
"ended_at": "2026-10-12T06:04:54.000Z",
"talk_sec": 142,
"hangup_cause": "NORMAL_CLEARING",
"end_reason": "completed"
},
"disposition": {
"disposition": "promise_to_pay",
"notes": "Will pay after salary on the 28th",
"promise_amount": 4500,
"promise_date": "2026-10-28",
"promise_time": null,
"callback_at": null,
"by": "api",
"at": "2026-10-12T06:10:02.118Z"
}
},
"disposition": {
"disposition": "promise_to_pay",
"notes": "Will pay after salary on the 28th",
"promise_amount": 4500,
"promise_date": "2026-10-28",
"promise_time": null,
"callback_at": null,
"by": "api",
"at": "2026-10-12T06:10:02.118Z"
}
}
}Call dispositioned
Sent when the agent’s disposition of a human call is saved (PUT /v1/calls/{id}/disposition, the client
portal, or POST /v1/web/calls/{id}/disposition from the agent’s browser). Saving again sends it again.
{
"id": "whd_5e6f7a8b9c0d41e2a3b4c5d6e7f8a9b0",
"type": "call.dispositioned",
"created_at": "2026-10-12T06:10:02.118Z",
"data": {
"call": {
"id": "call_5b8e1d2c3a4f4b6e9d7c8a1b2c3d4e5f",
"agent_id": null,
"call_type": "human",
"to": "+9198XXXXXX01",
"status": "completed",
"scheduled_for": null,
"attempts_count": 1,
"outcome": "completed",
"summary": null,
"duration_sec": 142,
"billable_minutes": 3,
"cost": {
"amount_micros": 2400000,
"currency": "INR",
"status": "pending"
},
"has_recording": true,
"has_transcript": false,
"metadata": {
"loan_id": "CF-LN-208841",
"agent_user_id": "u_123"
},
"created_at": "2026-10-12T06:02:10.051Z",
"updated_at": "2026-10-12T06:05:03.229Z",
"ended_at": "2026-10-12T06:04:54.000Z",
"human": {
"agent_channel": "phone",
"transport": "vobiz",
"agent_phone": "+9198XXXXXX11",
"web_agent": null,
"agent_name": "Priya",
"from": "+9180XXXXXX79",
"topology": "agent_first",
"record": true,
"status": "completed",
"status_history": [
{
"status": "initiated",
"at": "2026-10-12T06:02:10.051Z"
},
{
"status": "ringing_agent",
"at": "2026-10-12T06:02:10.640Z"
},
{
"status": "agent_answered",
"at": "2026-10-12T06:02:18.212Z"
},
{
"status": "dialing_customer",
"at": "2026-10-12T06:02:18.300Z"
},
{
"status": "customer_answered",
"at": "2026-10-12T06:02:31.650Z"
},
{
"status": "connected",
"at": "2026-10-12T06:02:31.700Z"
},
{
"status": "completed",
"at": "2026-10-12T06:04:54.000Z"
}
],
"agent_answered": true,
"customer_answered": true,
"started_at": "2026-10-12T06:02:10.400Z",
"agent_answered_at": "2026-10-12T06:02:18.212Z",
"customer_answered_at": "2026-10-12T06:02:31.650Z",
"connected_at": "2026-10-12T06:02:31.700Z",
"ended_at": "2026-10-12T06:04:54.000Z",
"talk_sec": 142,
"hangup_cause": "NORMAL_CLEARING",
"end_reason": "completed"
},
"disposition": {
"disposition": "promise_to_pay",
"notes": "Will pay after salary on the 28th",
"promise_amount": 4500,
"promise_date": "2026-10-28",
"promise_time": null,
"callback_at": null,
"by": "api",
"at": "2026-10-12T06:10:02.118Z"
}
},
"disposition": {
"disposition": "promise_to_pay",
"notes": "Will pay after salary on the 28th",
"promise_amount": 4500,
"promise_date": "2026-10-28",
"promise_time": null,
"callback_at": null,
"by": "api",
"at": "2026-10-12T06:10:02.118Z"
}
}
}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.