curl --request POST \
--url https://api.voice.mergenlab.ai/v1/calls/{id}/hangup \
--header 'Authorization: Bearer <token>'const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.voice.mergenlab.ai/v1/calls/{id}/hangup', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.voice.mergenlab.ai/v1/calls/{id}/hangup"
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, headers=headers)
print(response.text){
"id": "call_5b8e1d2c3a4f4b6e9d7c8a1b2c3d4e5f",
"agent_id": null,
"call_type": "human",
"to": "+9198XXXXXX01",
"status": "dialling",
"scheduled_for": null,
"attempts_count": 1,
"outcome": null,
"summary": null,
"duration_sec": null,
"billable_minutes": 0,
"cost": {
"amount_micros": 0,
"currency": "INR",
"status": "pending"
},
"has_recording": false,
"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:02:31.774Z",
"ended_at": null,
"human": {
"agent_channel": "phone",
"transport": "vobiz",
"agent_phone": "+9198XXXXXX11",
"web_agent": null,
"agent_name": "Priya",
"from": "+9180XXXXXX79",
"topology": "agent_first",
"record": true,
"status": "connected",
"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"
}
],
"agent_answered": true,
"customer_answered": true,
"started_at": "2026-10-12T06:02:10.051Z",
"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": null,
"talk_sec": null,
"hangup_cause": null,
"end_reason": null
}
}Hang up a live human call
Ends a live human call now. No body. The answer usually still shows status: "dialling": the end arrives
within seconds (as call.status_changed and call.ended webhooks). A call that had not reached the telephony
network yet is canceled at once (status: "canceled", human.end_reason: "canceled_before_dispatch").
AI voice calls and reachability dials cannot be hung up (409 not_supported).
curl --request POST \
--url https://api.voice.mergenlab.ai/v1/calls/{id}/hangup \
--header 'Authorization: Bearer <token>'const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.voice.mergenlab.ai/v1/calls/{id}/hangup', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.voice.mergenlab.ai/v1/calls/{id}/hangup"
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, headers=headers)
print(response.text){
"id": "call_5b8e1d2c3a4f4b6e9d7c8a1b2c3d4e5f",
"agent_id": null,
"call_type": "human",
"to": "+9198XXXXXX01",
"status": "dialling",
"scheduled_for": null,
"attempts_count": 1,
"outcome": null,
"summary": null,
"duration_sec": null,
"billable_minutes": 0,
"cost": {
"amount_micros": 0,
"currency": "INR",
"status": "pending"
},
"has_recording": false,
"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:02:31.774Z",
"ended_at": null,
"human": {
"agent_channel": "phone",
"transport": "vobiz",
"agent_phone": "+9198XXXXXX11",
"web_agent": null,
"agent_name": "Priya",
"from": "+9180XXXXXX79",
"topology": "agent_first",
"record": true,
"status": "connected",
"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"
}
],
"agent_answered": true,
"customer_answered": true,
"started_at": "2026-10-12T06:02:10.051Z",
"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": null,
"talk_sec": null,
"hangup_cause": null,
"end_reason": null
}
}Authorizations
Authorization: Bearer vg_live_<32 hex characters>. Keys are issued by Mergen admins and shown once.
Missing or invalid key: 401 unauthorized. Suspended account: 403 tenant_suspended.
Path Parameters
Call id (call_ + 32 hex characters).
Response
The call after the hang-up request.
A call of any type. human is present only on human calls; reachability_check_id and reachability only on
reachability dials; broadcast_id and broadcast only on voice broadcast dials; campaign_id,
campaign_contact_id and campaign_step_id only on calls a campaign placed (absent, not null, on other
calls). outcome is the agent's outcome for AI calls, the terminal human.status for human calls and the
result for reachability and broadcast dials.
call_ + 32 hex characters.
"call_9f1c2a7e4b3d4c0e8a6b5d2f1e0c9b8a"
The voice agent; null for human calls, reachability dials and broadcast dials.
"agt_credfin_dpd_8_30_m"
ai_voice: a voice agent calls the customer. human: your agent and the customer bridged by phone.
reachability: one dial of a reachability check. broadcast: one dial of a voice broadcast.
ai_voice, human, reachability, broadcast Customer number, E.164.
"+9198XXXXXX01"
queued (waiting for its first dial, a scheduled time, the calling window or a retry), dialling (an attempt
is live), then terminal completed (a person was connected), no_answer, busy, failed, canceled.
An AI call goes back to queued while a retry is pending.
queued, dialling, completed, no_answer, busy, failed, canceled When a queued call will be dialled (a future schedule_at, the next calling window start, or the retry time). null when it is due now or the call is not queued.
Dial attempts made so far.
x >= 0AI calls: the outcome reported by the agent for the latest attempt (agent-specific, for example
promise_to_pay, no_commitment, callback_requested), null until analysed. Human calls: the terminal
human.status. Reachability and broadcast dials: the dial result.
"promise_to_pay"
Short summary of the conversation (AI calls), null otherwise or until analysed.
Seconds of the latest attempt: conversation length for AI calls, talk time (agent and customer bridged)
for human calls, seconds held after the answer for reachability dials, seconds from the answer to the
hangup for broadcast dials. null until known.
61.5
Billable minutes summed over the call's attempts (each connected attempt rounded up to whole minutes; 0 when not connected).
x >= 0Your cost summed over the call's attempts; pending while the call is not over or any attempt's cost is not final.
Show child attributes
Show child attributes
Always false for human calls, reachability dials and broadcast dials.
The metadata you sent (reachability dials carry the number's items_metadata, broadcast dials the broadcast's and the item's metadata), or null.
When the call reached a terminal status.
Only on AI calls, once dialled: the number the latest attempt dialled from (given at dial time from your
free numbers; see from on the request).
"+9180XXXXXX79"
When a call that is waiting for a free line is expected to start. An estimate; null once the call is placed.
Live state of a human call (human on CallView; only on human calls).
Show child attributes
Show child attributes
The check this dial belongs to (reachability dials only).
"rch_4e7b1c9d2a3f4e5b8c6d7a8b9c0d1e2f"
One dial of a reachability check (reachability on CallView; only on reachability calls). The call's
status for a ring-check dial: dialling while live, completed only when the customer picked up
(answered), no_answer for ringing (not answered) and switched_off, busy for busy, failed for
invalid and failed, canceled for canceled.
Show child attributes
Show child attributes
The voice broadcast this dial belongs to (broadcast dials only).
"vbc_7c1e9a3b5d2f4e6a8b0c2d4e6f8a1b3c"
One dial of a voice broadcast (broadcast on CallView; only on broadcast calls). The call's status:
dialling while live, completed for played and partial (a person heard the message; priced),
no_answer for voicemail and no_answer, busy, failed for failed and invalid, canceled.
Show child attributes
Show child attributes
Human calls only (absent on others); null until your agent sets one (PUT /v1/calls/{id}/disposition).
Show child attributes
Show child attributes
The campaign that placed this call (campaign calls only; GET /v1/calls?campaign_id=).
"cmp_3b9e1f7a2c4d4e6f8a0b1c2d3e4f5a6b"
The campaign record (rec_...) the call was for (campaign calls only).
"rec_1a2b3c4d5e6f40718293a4b5c6d7e8f9"
Which attempt of the record's ladder the call is, as attempt_<number> (campaign calls only).
"attempt_2"