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. GET /v1/calls/{call_id}/transcript returns what was said, turn by turn. It is 404 until the call has ended (the call.ended webhook), and is never included on the call object or in webhook bodies. Only the agent’s and the caller’s speech is included; tool calls and other internal events are not.
turns is the conversation in order; role is agent or user. started_at and ended_at are present when timing was captured and absent otherwise. text is the same conversation as plain text, one Agent: / Customer: line per turn.