Skip to main content
POST /v1/calls places a call and returns as soon as it is queued. It does not wait for the call to be answered. Full schema and playground: Create an outbound call.
string
required
The agent to place the call with. Find it in the dashboard under Agents: open the agent and copy the ID shown under its name. Only active, outbound agents can place calls; others are rejected with agent_inactive or agent_not_outbound.
string
required
Number to dial. E.164 (+1...) preferred.
string
Caller ID. If sent, it must equal the agent’s configured number or the request is rejected with from_number_mismatch.
object
Per-call values the agent’s script uses. Some are required per agent; a missing one is a 422 listing the keys.
object
Any JSON object. Stored untouched and echoed back on every webhook and on GET /v1/calls/{call_id}.

Retell-compatible aliases

A client written for Retell’s create-call endpoint works with only a URL change. override_agent_id maps to agent_id and retell_llm_dynamic_variables maps to variables. override_agent_version and any unknown fields are ignored.

Response

call_id is stable for the life of the call. It is the same id on every webhook and on GET /v1/calls/{call_id}.

Errors

Errors come wrapped in a detail key. For validation and dispatch failures detail is an object with error, error_code, and where applicable extra fields. For auth and not-found errors it is a plain string.

Reading a call

GET /v1/calls/{call_id} returns the call object as of now. GET /v1/calls/{call_id}/recording returns { "url": "...", "expires_at": "..." }, a fresh link to the recording valid for about an hour. It is 404 until a recording exists.