curl --request POST \
--url https://api.voice.mergenlab.ai/v1/reachability-checks/{id}/cancel \
--header 'Authorization: Bearer <token>'const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.voice.mergenlab.ai/v1/reachability-checks/{id}/cancel', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.voice.mergenlab.ai/v1/reachability-checks/{id}/cancel"
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, headers=headers)
print(response.text){
"id": "rch_9b1d3f5a7c9e4b2d8f0a2c4e6b8d0f2a",
"status": "canceled",
"mode": "answer",
"from": "+9180XXXXXX79",
"hold_sec": 12,
"ring_sec": null,
"ring_timeout_sec": 45,
"machine_detection": true,
"answer_message": null,
"max_attempts": 1,
"retry_delays_min": [
5,
10
],
"created_at": "2026-10-12T07:00:00.000Z",
"updated_at": "2026-10-12T07:00:00.000Z",
"completed_at": null,
"canceled_at": "2026-10-12T07:01:12.345Z",
"counts": {
"total": 250,
"pending": 0,
"dialling": 1,
"reachable": 31,
"voicemail": 9,
"no_answer": 22,
"ringing": 0,
"switched_off": 0,
"busy": 3,
"failed": 0,
"invalid": 1,
"skipped": 4,
"canceled": 179
},
"cost": {
"amount_micros": 20150000,
"currency": "INR",
"status": "pending"
},
"metadata": {}
}Cancel a reachability check
Stops numbers that have not been dialled yet (each gets a canceled result and a reachability.result
webhook); dials already on the line finish their hold. The check keeps status: "canceled" and gets
completed_at (and a reachability.completed webhook) when its last live dial ends. No body. Canceling a
canceled check again answers 200; a completed check cannot be canceled (409 not_cancelable).
curl --request POST \
--url https://api.voice.mergenlab.ai/v1/reachability-checks/{id}/cancel \
--header 'Authorization: Bearer <token>'const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.voice.mergenlab.ai/v1/reachability-checks/{id}/cancel', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.voice.mergenlab.ai/v1/reachability-checks/{id}/cancel"
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, headers=headers)
print(response.text){
"id": "rch_9b1d3f5a7c9e4b2d8f0a2c4e6b8d0f2a",
"status": "canceled",
"mode": "answer",
"from": "+9180XXXXXX79",
"hold_sec": 12,
"ring_sec": null,
"ring_timeout_sec": 45,
"machine_detection": true,
"answer_message": null,
"max_attempts": 1,
"retry_delays_min": [
5,
10
],
"created_at": "2026-10-12T07:00:00.000Z",
"updated_at": "2026-10-12T07:00:00.000Z",
"completed_at": null,
"canceled_at": "2026-10-12T07:01:12.345Z",
"counts": {
"total": 250,
"pending": 0,
"dialling": 1,
"reachable": 31,
"voicemail": 9,
"no_answer": 22,
"ringing": 0,
"switched_off": 0,
"busy": 3,
"failed": 0,
"invalid": 1,
"skipped": 4,
"canceled": 179
},
"cost": {
"amount_micros": 20150000,
"currency": "INR",
"status": "pending"
},
"metadata": {}
}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
Reachability check id (rch_ + 32 hex characters).
Response
The check after the cancel.
rch_ + 32 hex characters.
"rch_4e7b1c9d2a3f4e5b8c6d7a8b9c0d1e2f"
running (dialling), waiting_window (outside your calling hours, numbers wait), queued (paused on our side,
for example reachability was disabled after creation), then completed or canceled.
queued, running, waiting_window, completed, canceled answer (default): wait for a pick-up, hold the line hold_sec seconds and hang up. ring: hang up as soon as
the phone has rung ring_sec seconds; nobody needs to pick up (the customer sees a missed call).
answer, ring Caller ID used, E.164.
null for a ring check.
null for an answer check.
false for a ring check.
null for a ring check.
When the batch finished (also set on a canceled check once its last dial ends).
Numbers per result (computed when read). total = numbers sent, duplicates and invalid inputs included.
Show child attributes
Show child attributes
Your cost (never the provider's). pending until every part of the cost is known, then final. no_rule:
no pricing is configured for your account yet (amount_micros is null). Integer INR micros
(1,000,000 = INR 1).
Show child attributes
Show child attributes
The metadata you sent; {} when none.
Only on a check a campaign placed (a ring_check step; lists show those with include_campaign=true); absent otherwise, as on a CallView. Also in the reachability.* webhooks.
The campaign contact (cct_...) the check was placed for; with campaign_id only.
The campaign step that placed it; with campaign_id only.