Skip to main content
POST
One request places a two-leg call: the agent is dialled first on your DID, and only when they answer is the customer dialled and the legs bridged. Both legs present your DID as the caller ID. Requires a provisioned trunk (Gate T), a number assigned to that trunk, and a positive wallet balance. See the Click-to-Call guide for the full flow.
A reference_id is permanent, and a failed call still consumes it. Omit the field and one is minted per call, which is what you want unless you’re deliberately making a request repeatable. To retry after a call that rang out, place a new call with a new reference.

Request

Headers

string
required
Bearer token with your API key

Body

string
required
The person dialled first. Indian mobile number as +919812345678, 919812345678 or 9812345678. Spaces, hyphens, dots and brackets are stripped.
string
required
Dialled once the agent answers. Must differ from agent_number.
string
The caller ID presented on both legs. Must be a number assigned to your workspace and to outbound_trunk_id. Defaults to your trunk’s saved caller ID.
string
UUID of the outbound trunk to place the call over. Defaults to your workspace’s active trunk.
string
Your idempotency key, unique per trunk. 1–128 characters of A-Za-z0-9._:-. Minted for you (qc2c-<uuid>) when omitted.
string
Public HTTPS URL that this call’s events are relayed to. Requires callback_secret. Private, loopback, link-local and CGNAT addresses are rejected.
string
16–256 characters you choose. Required whenever callback_url is sent — it is the HMAC key your endpoint verifies x-qcall-signature against. Encrypted at rest and never returned; only its last four characters are readable afterwards.
integer
default:"30"
Seconds to ring the agent. 5–60.
integer
default:"45"
Seconds to ring the customer. 5–60.
integer
default:"3600"
Maximum seconds of bridged talk time. 30–7200.
boolean
default:"false"
Record the bridged conversation. Audio is uploaded after the call ends — poll the call with ?refresh=1, then mint a playback URL.
object
Arbitrary JSON object echoed back on the call and in every webhook. At most 2048 bytes serialised, no NUL characters.

Response

201 Created — a call was admitted and the agent is being dialled. 200 OK — this reference_id was already bound to a live call. The original call is returned and nothing new was dialled. The bodies are identical, so branch on data.placed / data.replayed rather than on the shape.
boolean
true when a new call was dialled (201)
boolean
true when an existing call was returned and nothing was dialled (200)
object

Errors

Failures return { "success": false, "message": "...", "code": "..." }, plus request_id when the refusal came from the call platform (log it — it’s the handle support traces on) and retry_after in seconds on 429/503.
429 and 503 also carry a Retry-After header. A refused request never placed a call and never consumed its reference_id, so it is safe to retry with the same one.

Example