Skip to main content
POST
Start a call

Authorizations

X-API-Key
string
header
required

Your AI calling API key (vak_call_…). Authorization: Bearer <key> also works.

Headers

Idempotency-Key
string

Any unique string, e.g. your lead id. Retrying with the same key and body returns the first call instead of calling twice.

Maximum string length: 255

Body

application/json
agent_id
string
required

The agent that makes the call. Required on POST /calls; on a batch row it overrides the batch's agent_id. List yours with GET /agents.

phone_number
string
required

E.164, e.g. +919876543210. Spaces, dashes, dots and brackets are ignored; a leading 00 is read as +.

Example:

"+919876543210"

contact
object
variables
object

Values for the {{placeholders}} in the agent's script. Keys: a letter, then letters, digits, _ or spaces, at most 40 characters. Values: text, number or boolean, at most 500 characters.

Example:
metadata
object

Anything you want back on the call and its webhook (at most 8 KB as JSON). The agent never sees it.

Example:
test
boolean
default:false

Simulate the call: no phone rings and nothing is billed. It completes at once with a sample outcome and fires your webhook.

Response

Replay: a call with this Idempotency-Key already exists and is returned unchanged (idempotent_replay: true).

id
string
Example:

"call_6f1d2c9a8b7e4f3a2d1c0b9a"

object
string
Allowed value: "call"
status
enum<string>
Available options:
queued,
dialing,
in_progress,
completed,
no_answer,
busy,
failed,
canceled,
expired
status_reason
string

Why a call is waiting or did not happen, in plain words. Present only when there is one.

scheduled_for
string<date-time>

Present while a queued call is held until a later time (outside calling hours, a recall gap, the daily limit).

agent_id
string
phone_number
string
contact
object
variables
object
metadata
object
batch_id
string | null
test
boolean
duration_seconds
integer | null
created_at
string<date-time>
dialed_at
string<date-time> | null
ended_at
string<date-time> | null
recording_url
string | null

A temporary link to the recording. Fetch the call again for a fresh link after recording_expires_at.

recording_expires_at
string<date-time> | null
outcome
object | null

What the AI took from the conversation. null until it has been processed (usually within a minute of the call ending), and for calls that did not connect.

idempotent_replay
boolean

Only on POST /calls: true when this is the call created by an earlier request with the same Idempotency-Key.