{
"id": "whd_9c5e6f7a8b9c40a18293a4b5c6d7e8f2",
"type": "campaign.canceled",
"created_at": "2026-10-26T06:00:00.000Z",
"data": {
"campaign": {
"id": "cmp_7c1d2e3f4a5b4c6d8e9f0a1b2c3d4e5f",
"tenant_id": "ten_credfin",
"name": "Credfin pre-due Nov",
"description": "EMI due 5 Nov",
"status": "canceled",
"input_type": "csv",
"agent": {
"id": "agt_credfin_predue_m",
"name": "Credfin pre-due (Hindi, male)"
},
"agent_contract": {
"required_variables": [
"borrower_first_name",
"emi_amount",
"due_date"
],
"optional_variables": [
"lender_name"
],
"default_variables": {
"lender_name": "Credfin"
},
"post_call_variables": [
{
"name": "payment_date",
"type": "date",
"description": "Date the customer said they will pay",
"options": []
},
{
"name": "callback_at",
"type": "datetime",
"description": "When the customer asked to be called back",
"options": []
}
],
"outcomes": [
"confirmed_on_time",
"paid_early",
"callback_scheduled",
"do_not_call",
"wrong_number",
"refused",
"not_reached"
],
"read_at": "2026-10-24T05:00:00.000Z"
},
"goal": {
"outcomes": [
"confirmed_on_time",
"paid_early"
],
"label": "Confirmed or paid"
},
"variables": {
"static": {
"lender_name": "Credfin"
}
},
"csv": {
"phone_column": "phone_number",
"mapping": {
"borrower_first_name": "Name",
"emi_amount": "EMI"
},
"external_id_column": "loan_id"
},
"schedule": {
"start_date": "2026-10-26",
"end_date": "2026-11-05",
"timezone": "Asia/Kolkata",
"time_window_enabled": true,
"daily_start_time": "09:00",
"daily_end_time": "18:00",
"active_days": [
"monday",
"tuesday",
"wednesday",
"thursday",
"friday"
]
},
"execution": {
"max_concurrency": 20,
"max_attempts": 3,
"dnc_enabled": true,
"reschedule_enabled": true,
"dial_first_attempt_immediately": false,
"skip_duplicates": true,
"skip_invalid_phones": true,
"budget_micros": 5000000000,
"pause_reason": null,
"pause_details": null
},
"attempts": [
{
"attempt_number": 1,
"day": 1,
"start_time": "10:00",
"instant_redial": true,
"instant_redial_delay_minutes": 5,
"instant_redial_on_statuses": [
"no_answer",
"busy"
],
"conditions": {}
},
{
"attempt_number": 2,
"day": 1,
"start_time": "16:00",
"instant_redial": false,
"instant_redial_delay_minutes": 0,
"instant_redial_on_statuses": [],
"conditions": {
"previous_status_in": [
"no_answer",
"busy"
]
}
},
{
"attempt_number": 3,
"day": 2,
"start_time": "11:00",
"instant_redial": false,
"instant_redial_delay_minutes": 0,
"instant_redial_on_statuses": [],
"conditions": {}
}
],
"retry": {
"retry_on_no_answer": true,
"retry_on_busy": true,
"retry_on_short_call": true,
"short_call_threshold_seconds": 10,
"retry_delay_minutes": 30,
"insight_based_retry_conditions": []
},
"outcome_rules": {
"do_not_call": [
"do_not_call"
],
"callback": [
"callback_scheduled"
],
"wrong_number": [
"wrong_number"
],
"callback_variable": "callback_at"
},
"metadata": {
"portfolio": "nov-predue"
},
"counts": {
"total": 1200,
"pending": 0,
"calling": 0,
"completed": 431,
"exhausted": 25,
"closed": 732,
"skipped": 12
},
"results": {
"success": 286,
"wrong_number": 24,
"final_outcome": 121,
"exhausted": 25,
"end_date": 0,
"do_not_call": 6,
"paid": 6,
"canceled": 720,
"invalid_phone": 7,
"duplicate": 3,
"missing_variables": 2
},
"success_rate": 24.1,
"spend": {
"amount_micros": 1840000000,
"status": "pending",
"calls": 412,
"budget_micros": 5000000000
},
"collected": {
"amount_micros": 91480000000,
"events": 20
},
"window": {
"open_now": true,
"closes_at": "2026-10-26T12:30:00.000Z",
"next_open_at": null
},
"pause_reason": null,
"pause_details": null,
"test_report": {
"status": "passed_with_warnings",
"ran_at": "2026-10-25T10:00:00.000Z",
"checks": [
{
"id": "agent",
"level": "ok",
"title": "Agent",
"detail": "Credfin pre-due (Hindi, male) is active."
},
{
"id": "numbers",
"level": "ok",
"title": "Outbound numbers",
"detail": "2 usable numbers."
},
{
"id": "goal",
"level": "ok",
"title": "Goal",
"detail": "Success: confirmed_on_time, paid_early."
},
{
"id": "records",
"level": "ok",
"title": "Records",
"detail": "1188 of 1200 records will be called."
},
{
"id": "skipped",
"level": "warning",
"title": "Skipped records",
"detail": "12 (1%) will not be called: 7 invalid phone, 3 duplicate, 2 missing variables."
},
{
"id": "dnc",
"level": "warning",
"title": "Do-not-call list",
"detail": "4 records are on the do-not-call list and will be closed."
},
{
"id": "window",
"level": "ok",
"title": "Calling hours",
"detail": "First calls possible 2026-10-26 09:00 (Asia/Kolkata)."
},
{
"id": "ladder",
"level": "ok",
"title": "Attempt ladder",
"detail": "3 attempts per record."
},
{
"id": "capacity",
"level": "ok",
"title": "Capacity",
"detail": "About 2138 attempts, roughly 3.6 calling hours at 20 parallel calls."
}
],
"timeline": [
{
"attempt_number": 1,
"at": "2026-10-26T04:30:00.000Z",
"local": "2026-10-26 10:00",
"note": "day 1 from 10:00; redials 5 min later on no_answer, busy"
},
{
"attempt_number": 2,
"at": "2026-10-26T10:30:00.000Z",
"local": "2026-10-26 16:00",
"note": "day 1 from 16:00; only if its conditions hold"
},
{
"attempt_number": 3,
"at": "2026-10-27T05:30:00.000Z",
"local": "2026-10-27 11:00",
"note": "day 2 from 11:00"
}
],
"samples": [
{
"phone": "+9198XXXXXX01",
"variables": {
"borrower_first_name": "Ravi",
"emi_amount": "4574",
"due_date": "2026-11-05",
"lender_name": "Credfin"
}
}
],
"estimate": {
"records": 1188,
"expected_attempts": 2138,
"calls_per_hour": 600,
"open_hours": 81,
"hours_needed": 3.6,
"fits_schedule": true
}
},
"locked": true,
"actions": [
"duplicate"
],
"duplicated_from": null,
"launched_at": "2026-10-25T09:55:00.000Z",
"tested_at": "2026-10-25T10:00:00.000Z",
"locked_at": "2026-10-26T04:30:05.000Z",
"started_at": "2026-10-26T04:30:00.000Z",
"paused_at": null,
"completed_at": null,
"canceled_at": "2026-10-26T06:00:00.000Z",
"created_at": "2026-10-24T05:00:00.000Z",
"updated_at": "2026-10-26T06:00:00.000Z"
}
}
}Campaign canceled
Sent once when a canceled campaign ends, after its last call finished, with the same body as campaign.completed.
{
"id": "whd_9c5e6f7a8b9c40a18293a4b5c6d7e8f2",
"type": "campaign.canceled",
"created_at": "2026-10-26T06:00:00.000Z",
"data": {
"campaign": {
"id": "cmp_7c1d2e3f4a5b4c6d8e9f0a1b2c3d4e5f",
"tenant_id": "ten_credfin",
"name": "Credfin pre-due Nov",
"description": "EMI due 5 Nov",
"status": "canceled",
"input_type": "csv",
"agent": {
"id": "agt_credfin_predue_m",
"name": "Credfin pre-due (Hindi, male)"
},
"agent_contract": {
"required_variables": [
"borrower_first_name",
"emi_amount",
"due_date"
],
"optional_variables": [
"lender_name"
],
"default_variables": {
"lender_name": "Credfin"
},
"post_call_variables": [
{
"name": "payment_date",
"type": "date",
"description": "Date the customer said they will pay",
"options": []
},
{
"name": "callback_at",
"type": "datetime",
"description": "When the customer asked to be called back",
"options": []
}
],
"outcomes": [
"confirmed_on_time",
"paid_early",
"callback_scheduled",
"do_not_call",
"wrong_number",
"refused",
"not_reached"
],
"read_at": "2026-10-24T05:00:00.000Z"
},
"goal": {
"outcomes": [
"confirmed_on_time",
"paid_early"
],
"label": "Confirmed or paid"
},
"variables": {
"static": {
"lender_name": "Credfin"
}
},
"csv": {
"phone_column": "phone_number",
"mapping": {
"borrower_first_name": "Name",
"emi_amount": "EMI"
},
"external_id_column": "loan_id"
},
"schedule": {
"start_date": "2026-10-26",
"end_date": "2026-11-05",
"timezone": "Asia/Kolkata",
"time_window_enabled": true,
"daily_start_time": "09:00",
"daily_end_time": "18:00",
"active_days": [
"monday",
"tuesday",
"wednesday",
"thursday",
"friday"
]
},
"execution": {
"max_concurrency": 20,
"max_attempts": 3,
"dnc_enabled": true,
"reschedule_enabled": true,
"dial_first_attempt_immediately": false,
"skip_duplicates": true,
"skip_invalid_phones": true,
"budget_micros": 5000000000,
"pause_reason": null,
"pause_details": null
},
"attempts": [
{
"attempt_number": 1,
"day": 1,
"start_time": "10:00",
"instant_redial": true,
"instant_redial_delay_minutes": 5,
"instant_redial_on_statuses": [
"no_answer",
"busy"
],
"conditions": {}
},
{
"attempt_number": 2,
"day": 1,
"start_time": "16:00",
"instant_redial": false,
"instant_redial_delay_minutes": 0,
"instant_redial_on_statuses": [],
"conditions": {
"previous_status_in": [
"no_answer",
"busy"
]
}
},
{
"attempt_number": 3,
"day": 2,
"start_time": "11:00",
"instant_redial": false,
"instant_redial_delay_minutes": 0,
"instant_redial_on_statuses": [],
"conditions": {}
}
],
"retry": {
"retry_on_no_answer": true,
"retry_on_busy": true,
"retry_on_short_call": true,
"short_call_threshold_seconds": 10,
"retry_delay_minutes": 30,
"insight_based_retry_conditions": []
},
"outcome_rules": {
"do_not_call": [
"do_not_call"
],
"callback": [
"callback_scheduled"
],
"wrong_number": [
"wrong_number"
],
"callback_variable": "callback_at"
},
"metadata": {
"portfolio": "nov-predue"
},
"counts": {
"total": 1200,
"pending": 0,
"calling": 0,
"completed": 431,
"exhausted": 25,
"closed": 732,
"skipped": 12
},
"results": {
"success": 286,
"wrong_number": 24,
"final_outcome": 121,
"exhausted": 25,
"end_date": 0,
"do_not_call": 6,
"paid": 6,
"canceled": 720,
"invalid_phone": 7,
"duplicate": 3,
"missing_variables": 2
},
"success_rate": 24.1,
"spend": {
"amount_micros": 1840000000,
"status": "pending",
"calls": 412,
"budget_micros": 5000000000
},
"collected": {
"amount_micros": 91480000000,
"events": 20
},
"window": {
"open_now": true,
"closes_at": "2026-10-26T12:30:00.000Z",
"next_open_at": null
},
"pause_reason": null,
"pause_details": null,
"test_report": {
"status": "passed_with_warnings",
"ran_at": "2026-10-25T10:00:00.000Z",
"checks": [
{
"id": "agent",
"level": "ok",
"title": "Agent",
"detail": "Credfin pre-due (Hindi, male) is active."
},
{
"id": "numbers",
"level": "ok",
"title": "Outbound numbers",
"detail": "2 usable numbers."
},
{
"id": "goal",
"level": "ok",
"title": "Goal",
"detail": "Success: confirmed_on_time, paid_early."
},
{
"id": "records",
"level": "ok",
"title": "Records",
"detail": "1188 of 1200 records will be called."
},
{
"id": "skipped",
"level": "warning",
"title": "Skipped records",
"detail": "12 (1%) will not be called: 7 invalid phone, 3 duplicate, 2 missing variables."
},
{
"id": "dnc",
"level": "warning",
"title": "Do-not-call list",
"detail": "4 records are on the do-not-call list and will be closed."
},
{
"id": "window",
"level": "ok",
"title": "Calling hours",
"detail": "First calls possible 2026-10-26 09:00 (Asia/Kolkata)."
},
{
"id": "ladder",
"level": "ok",
"title": "Attempt ladder",
"detail": "3 attempts per record."
},
{
"id": "capacity",
"level": "ok",
"title": "Capacity",
"detail": "About 2138 attempts, roughly 3.6 calling hours at 20 parallel calls."
}
],
"timeline": [
{
"attempt_number": 1,
"at": "2026-10-26T04:30:00.000Z",
"local": "2026-10-26 10:00",
"note": "day 1 from 10:00; redials 5 min later on no_answer, busy"
},
{
"attempt_number": 2,
"at": "2026-10-26T10:30:00.000Z",
"local": "2026-10-26 16:00",
"note": "day 1 from 16:00; only if its conditions hold"
},
{
"attempt_number": 3,
"at": "2026-10-27T05:30:00.000Z",
"local": "2026-10-27 11:00",
"note": "day 2 from 11:00"
}
],
"samples": [
{
"phone": "+9198XXXXXX01",
"variables": {
"borrower_first_name": "Ravi",
"emi_amount": "4574",
"due_date": "2026-11-05",
"lender_name": "Credfin"
}
}
],
"estimate": {
"records": 1188,
"expected_attempts": 2138,
"calls_per_hour": 600,
"open_hours": 81,
"hours_needed": 3.6,
"fits_schedule": true
}
},
"locked": true,
"actions": [
"duplicate"
],
"duplicated_from": null,
"launched_at": "2026-10-25T09:55:00.000Z",
"tested_at": "2026-10-25T10:00:00.000Z",
"locked_at": "2026-10-26T04:30:05.000Z",
"started_at": "2026-10-26T04:30:00.000Z",
"paused_at": null,
"completed_at": null,
"canceled_at": "2026-10-26T06:00:00.000Z",
"created_at": "2026-10-24T05:00:00.000Z",
"updated_at": "2026-10-26T06:00:00.000Z"
}
}
}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.