POST /v1/calls/outbound places a live phone call: it dials to from one of
your workspace’s numbers and puts a published voice agent on it.
A call
The request
uuid
required
Which of your numbers to dial from. It must be
active, have can_outbound
enabled, and sit on a carrier account that is ready. Its E.164 is the caller
ID the person sees.string
required
The number to dial. Any format — see normalization below.
uuid
A published
voice agent in this workspace. A video or text agent is
refused with this endpoint runs voice agents; '<name>' resolves to a <channel> agent.object
What this call starts knowing about the person, read as
{{userdata.field}} in
the prompt, the greeting and every tool. It is merged onto their contact record,
so it is there again on their next call. Keys beginning with _talqing are
reserved. See userdata.object
A flat map of strings read as
{{vars.name}}. It overrides the declared
defaults on every agent this session runs and is gone when the call ends —
never written onto anyone’s contact record, and no tool can change it mid-call.
Use userdata for facts about the person and vars for configuration of the
session. See variables.Running something other than the published agent
The same four fields every session-starting endpoint takes —agent_version
(including "draft"), agent_override, a whole inline agent, and
agent_team — work here too. They are mutually exclusive with each other in the
usual way: one agent, or a team of them. Prefer agent_id and userdata; reach
for the rest only when the definition is generated per request and would never
be reused. See per-call configuration for the
full reference.
The merged result is validated by the same rules that guard publishing, so a bad
override is a 400 at create rather than a call that connects and then fails.
How to is normalized
to is normalized to E.164 against the region of the number you are dialling
from, not against a platform-wide default. A bare national number is national
relative to your own number, which is the only honest reading — 07911123456 is
a UK mobile and an Indian national-format string, and only the number it is
being dialled from says which.
Validation is strict: the result has to be a number that is actually assignable
in its plan. A typo is refused with
to: '<what you sent>' is not a valid number to dial from <your number> rather
than dialled. There is money and a carrier at the other end.
Caller ID
The person sees the E.164 offrom_phone_number_id. You cannot set a different
caller ID per call — it is a property of the number, set at the carrier.
What comes back
status is queued: the call has been placed and is ringing. agent_version
is the published version this call runs, and is null when it runs an inline
definition or a draft. warnings carries anything the plan resolved but could
not refuse.
Following the call
Cost is
null until the call has been priced — a call in progress shows no cost
at all rather than a partial estimate.
Credit is checked before anything is dialled
If the workspace has no credit, the request is refused with a402 and nothing
is written or dialled:
What this does not do
A test call from the dashboard is exactly this endpoint. It is a real, billable call to whatever number you type into it, placed with a real agent. There is no test mode behind that button.Limits on a live call
The three-hour cap matters most where a call can be left open by something other
than a conversation — see transfers, where two humans on
a bridged call hold the line until one of them hangs up.
Errors
Next
Batch calling
The same call, to a list, on a schedule.
Close reasons
Every way a call can end, and what to do about each.