DocsAPI reference

Reference

API reference

Nine endpoints and five objects. Every endpoint needs a bearer key and is scoped to the key's project.

Agents

List agents

GET/v1/agents
Lists the project's agents. Use it to find the id of the agent to call with, and to check that it is ready.

Returns

An array of Agent objects in their short form, most recently updated first. The whole list is returned; there is no pagination.

Errors

GET /v1/agentscURL
curl --fail-with-body "http://localhost:4000/v1/agents" \  -H "Authorization: Bearer $OXUMI_API_KEY"
200ResponseCaptured
[  {    "id": "81ee2426-7abe-444b-96f8-b8e195ddde49",    "projectId": "bf98c165-b0d8-4006-91b9-0c97df86ba15",    "name": "Driver check-in",    "description": "Calls a driver mid-trip and records location, schedule and any issue.",    "model": "",    "speech": "",    "telephony": "",    "phoneNumber": "",    "ready": true,    "stepCount": 10,    "updatedAt": "2026-10-12T22:57:57.858Z"  },  {    "id": "f9e6ed3c-89f1-48bb-956e-130578ce1287",    "projectId": "bf98c165-b0d8-4006-91b9-0c97df86ba15",    "name": "Feedback call",    "description": "",    "model": "",    "speech": "",    "telephony": "",    "phoneNumber": "",    "ready": false,    "stepCount": 3,    "updatedAt": "2026-10-12T21:26:42.806Z"  }]

Retrieve an agent

GET/v1/agents/:id
Returns one agent in full, including its flow. Read flow.variables to learn what a call must be given and flow.fields to learn what it will collect.

Path parameters

idstring (UUID) · required
The agent's id.

Returns

One Agent with its flow, issues and createdAt.

Errors

  • 400The id in the path is not a UUID.
  • 404No agent with this id in the key's project.
  • 401 · 429As for every endpoint: see Authentication and Rate limits.
GET /v1/agents/81ee2426-7abe-444b-96f8-b8e195ddde49cURL
curl --fail-with-body "http://localhost:4000/v1/agents/81ee2426-7abe-444b-96f8-b8e195ddde49" \  -H "Authorization: Bearer $OXUMI_API_KEY"
200Response · flow.nodes (4 of 10), flow.fields (3 of 6) and flow.variables (2 of 4) shortenedCaptured
{  "id": "81ee2426-7abe-444b-96f8-b8e195ddde49",  "projectId": "bf98c165-b0d8-4006-91b9-0c97df86ba15",  "name": "Driver check-in",  "description": "Calls a driver mid-trip and records location, schedule and any issue.",  "model": "",  "speech": "",  "telephony": "",  "phoneNumber": "",  "ready": true,  "stepCount": 10,  "updatedAt": "2026-10-12T22:57:57.858Z",  "flow": {    "id": "driver-status-check",    "name": "Truck driver status check",    "nodes": [      {        "id": "greeting",        "say": "Namaste {{driver_name}} ji, this is the automated assistant from {{company}}, calling for a quick update on your {{route}} trip.",        "next": "ask_location",        "type": "start"      },      {        "id": "ask_location",        "next": "ask_schedule",        "type": "ask",        "fields": [          "current_location"        ],        "guidance": "A nearby town, toll plaza or highway number is enough. Do not ask for an exact address."      },      {        "id": "check_schedule",        "type": "branch",        "default": "ask_help",        "branches": [          {            "next": "ask_delay",            "when": {              "op": "eq",              "field": "on_schedule",              "value": false            }          }        ]      },      {        "id": "goodbye",        "say": "Thank you, your update is recorded. Drive safe.",        "type": "end",        "outcome": "completed"      }    ],    "start": "greeting",    "fields": [      {        "name": "current_location",        "type": "string",        "required": true,        "description": "Where the truck is right now: a city, town or highway landmark"      },      {        "name": "on_schedule",        "type": "boolean",        "required": true,        "description": "Whether the driver expects to arrive by the planned time"      },      {        "name": "delay_reason",        "type": "enum",        "options": [          "traffic",          "breakdown",          "loading_delay",          "weather",          "paperwork",          "rest_stop",          "other"        ],        "required": true,        "description": "Main cause of the delay"      }    ],    "settings": {      "persona": "You are a dispatch assistant checking in with a truck driver who is on the road. Drivers are busy and often on noisy highways, so be brief, warm and patient.",      "languages": [        "hi",        "en"      ],      "maxAttempts": 2,      "maxDurationSec": 240    },    "variables": [      {        "name": "driver_name",        "example": "Ramesh",        "description": "Driver's first name"      },      {        "name": "company",        "example": "Shakti Logistics",        "description": "Fleet operator the call is made for"      }    ],    "description": "Calls a driver mid-trip and records location, schedule and any issue."  },  "issues": [],  "createdAt": "2026-10-12T21:26:42.639Z"}

Calls

Place a call

POST/v1/calls
Places a phone call and returns once the telephony provider has accepted it. The result arrives later as a call.completed webhook. Place a call covers the order of the checks and what happens when nobody answers.

Body

agentIdstring (UUID) · required
The agent to make the call. Its flow must be ready.
tostring · required
The number to dial in international format, such as +919876543210. Spaces, hyphens and parentheses are removed; the rest must be + and 8 to 15 digits.
variablesobject · optional
A value for every variable the flow declares. Required whenever the flow has variables. Strings, numbers and booleans are accepted and stored as strings.
metadataobject · optional
Your own key-value pairs, stored with the call and returned in the webhook. Strings, numbers and booleans are accepted and stored as strings.
providerstring · optional
twilio or exotel. Defaults to the agent's own telephony setting; if that is empty, to Twilio if connected, otherwise Exotel.
modelstring · optional
A language model as <provider>:<model>. Defaults to the agent's model, then the project's default.

Returns

202 and the new Call, with status ringing. This response has no agent, turns or turnCount.

Errors

  • 400agentId or to is missing or invalid; a variable has no value; provider or model is not recognised; a telephony, speech or model provider is not connected; or the telephony provider refused the call.
  • 404No agent with this id in the key's project.
  • 422The agent's flow has an error. The message quotes it.
  • 503The server has no public URL, so providers cannot call back.
  • 401 · 429As for every endpoint: see Authentication and Rate limits.
POST /v1/callscURL
curl --fail-with-body "http://localhost:4000/v1/calls" \  -X POST \  -H "Authorization: Bearer $OXUMI_API_KEY" \  -H "Content-Type: application/json" \  -d '{    "agentId": "81ee2426-7abe-444b-96f8-b8e195ddde49",    "to": "+919876543210",    "variables": {      "driver_name": "Ramesh",      "company": "Shakti Logistics",      "route": "Nagpur to Hyderabad",      "planned_eta": "tonight at 9 pm"    },    "metadata": {      "trip_id": "TRIP-2291"    }  }'
202ResponseExample
{  "id": "0b9f6c1e-52a7-4d1c-9b6e-3f2a8d4c7e10",  "projectId": "bf98c165-b0d8-4006-91b9-0c97df86ba15",  "agentId": "81ee2426-7abe-444b-96f8-b8e195ddde49",  "channel": "phone",  "model": "anthropic:claude-haiku-5-5",  "variables": {    "driver_name": "Ramesh",    "company": "Shakti Logistics",    "route": "Nagpur to Hyderabad",    "planned_eta": "tonight at 9 pm"  },  "fields": {},  "outcome": null,  "status": "ringing",  "error": null,  "to": "+919876543210",  "metadata": {    "trip_id": "TRIP-2291"  },  "telephony": "twilio",  "providerCallId": "CA5f0c2b6d1e9a4c7f8b3d2e1a0c9f8e7d",  "startedAt": "2026-10-12T14:02:11.412Z",  "endedAt": null}

List calls

GET/v1/calls
Lists the project's calls. There is no pagination: only the 200 most recent calls can be reached, after any agentId filter is applied.

Query parameters

agentIdstring (UUID) · optional
Return only calls made by this agent.
limitinteger · optional
How many calls to return, from 1 to 200. Defaults to 50. Larger values are treated as 200; 0 or a non-number is treated as 50.

Returns

An array of Call objects, newest first by startedAt. Each has agent and turnCount but not turns. Calls on every channel are included, among them test calls made in the app.

Errors

GET /v1/callscURL
curl --fail-with-body "http://localhost:4000/v1/calls?limit=1" \  -H "Authorization: Bearer $OXUMI_API_KEY"
200ResponseCaptured
[  {    "id": "7580e5e6-a4c8-4efc-8cab-d135e9478e8d",    "projectId": "bf98c165-b0d8-4006-91b9-0c97df86ba15",    "agentId": "81ee2426-7abe-444b-96f8-b8e195ddde49",    "agent": {      "id": "81ee2426-7abe-444b-96f8-b8e195ddde49",      "name": "Driver check-in"    },    "channel": "api_text",    "model": "anthropic:claude-opus-5-5",    "variables": {      "route": "A to B",      "company": "S",      "driver_name": "R",      "planned_eta": "9"    },    "fields": {},    "outcome": "failed",    "status": "ended",    "error": null,    "to": null,    "metadata": {},    "telephony": null,    "providerCallId": null,    "startedAt": "2026-10-12T22:30:11.948Z",    "endedAt": "2026-10-12T22:30:12.372Z",    "turnCount": 0  }]

Retrieve a call

GET/v1/calls/:id
Returns one call with its transcript. The sample is a test call made in the app, which is why its channel is browser_voice; a phone call has the same shape.

Path parameters

idstring (UUID) · required
The call's id.

Returns

One Call with agent and its turns in order. For a call still in progress, the turns recorded so far.

Errors

  • 400The id in the path is not a UUID.
  • 404No call with this id in the key's project.
  • 401 · 429As for every endpoint: see Authentication and Rate limits.
GET /v1/calls/dddddddd-0000-4000-8000-000000000007cURL
curl --fail-with-body "http://localhost:4000/v1/calls/dddddddd-0000-4000-8000-000000000007" \  -H "Authorization: Bearer $OXUMI_API_KEY"
200ResponseCaptured
{  "id": "dddddddd-0000-4000-8000-000000000007",  "projectId": "bf98c165-b0d8-4006-91b9-0c97df86ba15",  "agentId": "81ee2426-7abe-444b-96f8-b8e195ddde49",  "agent": {    "id": "81ee2426-7abe-444b-96f8-b8e195ddde49",    "name": "Driver check-in"  },  "channel": "browser_voice",  "model": "anthropic:claude-haiku-5-5",  "variables": {    "route": "Kolkata to Patna",    "company": "Shakti Logistics",    "driver_name": "Deepak",    "planned_eta": "tomorrow at 8 am"  },  "fields": {    "current_location": "Asansol"  },  "outcome": null,  "status": "in_progress",  "error": null,  "to": null,  "metadata": {},  "telephony": null,  "providerCallId": null,  "startedAt": "2026-10-12T21:38:51.218Z",  "endedAt": null,  "turns": [    {      "id": "c5ec414c-d122-4955-bb36-f980ee361f75",      "callId": "dddddddd-0000-4000-8000-000000000007",      "index": 0,      "callerText": null,      "agentText": "नमस्ते दीपक जी, मैं शक्ति लॉजिस्टिक्स की ओर से ऑटोमेटेड असिस्टेंट बोल रही हूँ। आपकी कोलकाता से पटना ट्रिप का एक छोटा सा अपडेट चाहिए था। अभी आप कहाँ हैं?",      "interrupted": false,      "nodeId": "greeting",      "llmMs": null,      "audioMs": 337,      "createdAt": "2026-10-12T21:38:51.218Z"    },    {      "id": "25b47bb5-81a8-4e96-984f-dcfbd3c58630",      "callId": "dddddddd-0000-4000-8000-000000000007",      "index": 1,      "callerText": "आसनसोल पहुँच गया हूँ।",      "agentText": "ठीक है, आसनसोल। आपको कल सुबह 8 बजे तक पहुँचना है। क्या समय पर पहुँच जाएँगे?",      "interrupted": false,      "nodeId": "ask_schedule",      "llmMs": 409,      "audioMs": 761,      "createdAt": "2026-10-12T21:39:06.218Z"    }  ]}

Hang up a call

DELETE/v1/calls/:id
Ends a call that is ringing or in progress. Works for calls placed through Twilio. The call's result is still delivered by webhook.

Path parameters

idstring (UUID) · required
The call's id.

Returns

204 with no body. Also 204, with no effect, when the call has already ended.

Errors

  • 400The call was placed through Exotel, which cannot end a call through its API. Or the id is not a UUID.
  • 404No call with this id in the key's project.
  • 401 · 429As for every endpoint: see Authentication and Rate limits.
DEL /v1/calls/0b9f6c1e-52a7-4d1c-9b6e-3f2a8d4c7e10cURL
curl --fail-with-body "http://localhost:4000/v1/calls/0b9f6c1e-52a7-4d1c-9b6e-3f2a8d4c7e10" \  -X DELETE \  -H "Authorization: Bearer $OXUMI_API_KEY"

Conversations

Start a conversation

POST/v1/conversations
Starts a text conversation with an agent and returns its first line. See Text conversations for the whole exchange.

Body

agentIdstring (UUID) · required
The agent to talk to. Its flow must be ready.
variablesobject · optional
A value for every variable the flow declares. Required whenever the flow has variables. Every value must be a string; otherwise the whole object is ignored.
modelstring · optional
A language model as <provider>:<model>. Defaults to the agent's model, then the project's default.

Returns

201 and a Reply holding the new callId and the agent's opening line.

Errors

  • 400agentId is missing; a variable has no value; model is not recognised; or the model's provider is not connected.
  • 404No agent with this id in the key's project.
  • 422The agent's flow has an error. The message quotes it.
  • 502The language model could not be reached. The conversation is closed with outcome failed.
  • 401 · 429As for every endpoint: see Authentication and Rate limits.
POST /v1/conversationscURL
curl --fail-with-body "http://localhost:4000/v1/conversations" \  -X POST \  -H "Authorization: Bearer $OXUMI_API_KEY" \  -H "Content-Type: application/json" \  -d '{    "agentId": "81ee2426-7abe-444b-96f8-b8e195ddde49",    "variables": {      "driver_name": "Ramesh",      "company": "Shakti Logistics",      "route": "Nagpur to Hyderabad",      "planned_eta": "tonight at 9 pm"    }  }'
201ResponseExample
{  "callId": "5d2c9a44-8e1b-4f0a-b7c3-91e6a2d4f8b0",  "reply": "Namaste Ramesh ji, this is the automated assistant from Shakti Logistics, calling for a quick update on your Nagpur to Hyderabad trip. Where have you reached?",  "fields": {},  "step": "ask_location",  "ended": false,  "outcome": null}

Send a message

POST/v1/conversations/:id/messages
Relays what the person typed and returns the agent's reply.

Path parameters

idstring (UUID) · required
The conversation's callId.

Body

textstring · required
What the person typed. Surrounding whitespace is removed; it must not be empty.

Returns

200 and a Reply with the agent's next line and the fields collected so far.

Errors

  • 400text is missing or empty, or the id is not a UUID.
  • 409The previous message is still being answered.
  • 410The conversation has ended, expired after 15 idle minutes, never existed, or was lost in a restart.
  • 502The language model could not be reached. The conversation is closed with outcome failed.
  • 401 · 429As for every endpoint: see Authentication and Rate limits.
POST /v1/conversations/5d2c9a44-8e1b-4f0a-b7c3-91e6a2d4f8b0/messagescURL
curl --fail-with-body "http://localhost:4000/v1/conversations/5d2c9a44-8e1b-4f0a-b7c3-91e6a2d4f8b0/messages" \  -X POST \  -H "Authorization: Bearer $OXUMI_API_KEY" \  -H "Content-Type: application/json" \  -d '{    "text": "Just crossed the Adilabad toll."  }'
200ResponseExample
{  "callId": "5d2c9a44-8e1b-4f0a-b7c3-91e6a2d4f8b0",  "reply": "Thank you. Will you reach by nine tonight?",  "fields": {    "current_location": "Adilabad toll"  },  "step": "ask_schedule",  "ended": false,  "outcome": null}

End a conversation

DELETE/v1/conversations/:id
Closes a conversation before its flow has finished. The call record gets outcome partial if any field was collected and failed if none was, and the webhook is sent.

Path parameters

idstring (UUID) · required
The conversation's callId.

Returns

204 with no body. Also 204 when the conversation has already ended or the id is unknown, so it is safe to call more than once.

Errors

DEL /v1/conversations/5d2c9a44-8e1b-4f0a-b7c3-91e6a2d4f8b0cURL
curl --fail-with-body "http://localhost:4000/v1/conversations/5d2c9a44-8e1b-4f0a-b7c3-91e6a2d4f8b0" \  -X DELETE \  -H "Authorization: Bearer $OXUMI_API_KEY"

Objects

The Agent object

An agent is a flow with a name, a model and a voice. Agents are designed in the app; the API reads them. The list returns the short form; retrieving one adds the attributes marked below.

Attributes

idstring (UUID)
The agent's id.
projectIdstring (UUID)
The project it belongs to.
namestring
Its name in the app.
descriptionstring
Free text. May be empty.
modelstring
The language model the agent uses, as <provider>:<model>. An empty string means the project's default.
speechstring
The speech provider the agent uses on phone calls. An empty string means the project's default.
telephonystring
The telephony provider this agent places calls through: twilio or exotel. An empty string means whichever the project has connected.
phoneNumberstring
The number this agent calls from, when it should not be the provider's default. An empty string means the default.
readyboolean
true when the flow has no errors. Only a ready agent can place calls or start conversations.
stepCountnumber
How many steps the flow has.
updatedAtstring (ISO 8601)
When the agent was last saved.
createdAtstring (ISO 8601) · Retrieve only
When the agent was created.
issuesarray · Retrieve only
Problems found in the flow. Each is { level, message }, where level is error or warning. Any error makes ready false.
flowobject · Retrieve only
The flow as saved in the builder. For an agent that is not ready it may be incomplete.
flow.variablesarray · Retrieve only
What a call must be given: { name, description, example } for each. These are the keys to send as variables.
flow.fieldsarray · Retrieve only
What a call collects: { name, type, description, options, required }. type is string, number, boolean or enum; options lists the allowed values of an enum.
flow.settingsobject · Retrieve only
persona, languages (hi, en), maxAttempts per question, maxDurationSec for the whole call, and optionally voiceId.
flow.nodesarray · Retrieve only
The steps. Each has an id and a type: start, say, ask, branch or end. flow.start names the first one.
Agent, as listedCaptured
{  "id": "81ee2426-7abe-444b-96f8-b8e195ddde49",  "projectId": "bf98c165-b0d8-4006-91b9-0c97df86ba15",  "name": "Driver check-in",  "description": "Calls a driver mid-trip and records location, schedule and any issue.",  "model": "",  "speech": "",  "telephony": "",  "phoneNumber": "",  "ready": true,  "stepCount": 10,  "updatedAt": "2026-10-12T22:57:57.858Z"}

The Call object

One conversation between an agent and a person, on any channel. A phone call and a text conversation are both calls.

Attributes

idstring (UUID)
The call's id.
projectIdstring (UUID)
The project it belongs to.
agentIdstring (UUID)
The agent that made it.
agentobject · List and retrieve
{ id, name } of that agent. Not present in the response to placing a call.
channelstring
phone for a call placed through the API, api_text for a text conversation, and browser_voice or browser_text for test calls made in the app.
statusstring
queued, ringing, in_progress or ended. See After the request.
outcomestring | null
null until the call ends. One of completed (the flow reached an end step with every required answer), partial (it ended with some required answers missing), callback_requested (the person asked to be called later), wrong_person, opted_out (the person asked not to be contacted) or failed (nobody was reached, or nothing was collected). An end step in the flow can also set its own outcome.
errorstring | null
Why the call failed, in words, when nobody was reached. See When nobody answers.
fieldsobject
The answers collected so far, keyed by field name. Values are strings, numbers or booleans, each already checked against its field's type.
variablesobject
The variables the call was started with, as strings.
metadataobject
What you attached when placing the call, as strings.
tostring | null
The number dialled, with spaces and punctuation removed. null unless the channel is phone.
modelstring
The language model the call runs on, as <provider>:<model>.
telephonystring | null
twilio or exotel for phone calls, otherwise null.
providerCallIdstring | null
The telephony provider's own id for the call, useful when reading that provider's logs.
startedAtstring (ISO 8601)
When the call record was created.
endedAtstring | null
When the call ended.
turnCountnumber · List only
How many turns the call has.
turnsarray · Retrieve only
The transcript: Turn objects in order of index.
Call, as listedCaptured
{  "id": "7580e5e6-a4c8-4efc-8cab-d135e9478e8d",  "projectId": "bf98c165-b0d8-4006-91b9-0c97df86ba15",  "agentId": "81ee2426-7abe-444b-96f8-b8e195ddde49",  "agent": {    "id": "81ee2426-7abe-444b-96f8-b8e195ddde49",    "name": "Driver check-in"  },  "channel": "api_text",  "model": "anthropic:claude-opus-5-5",  "variables": {    "route": "A to B",    "company": "S",    "driver_name": "R",    "planned_eta": "9"  },  "fields": {},  "outcome": "failed",  "status": "ended",  "error": null,  "to": null,  "metadata": {},  "telephony": null,  "providerCallId": null,  "startedAt": "2026-10-12T22:30:11.948Z",  "endedAt": "2026-10-12T22:30:12.372Z",  "turnCount": 0}

The Turn object

One exchange in a call: what the person said, and what the agent answered. The first turn of a call has no caller text, because the agent speaks first.

Attributes

idstring (UUID)
The turn's id.
callIdstring (UUID)
The call it belongs to.
indexnumber
Its position in the call, counting up.
callerTextstring | null
What the person said or typed. null on the agent's opening line.
agentTextstring
What the agent said in reply.
interruptedboolean
true when the person started talking before the agent finished the line.
nodeIdstring
The id of the flow step the call had reached once this turn was processed.
llmMsnumber | null
Milliseconds from the person finishing to the first text from the language model.
audioMsnumber | null
Milliseconds from the person finishing to the first audio. null for text.
createdAtstring (ISO 8601)
When the turn was recorded.
TurnCaptured
{  "id": "25b47bb5-81a8-4e96-984f-dcfbd3c58630",  "callId": "dddddddd-0000-4000-8000-000000000007",  "index": 1,  "callerText": "आसनसोल पहुँच गया हूँ।",  "agentText": "ठीक है, आसनसोल। आपको कल सुबह 8 बजे तक पहुँचना है। क्या समय पर पहुँच जाएँगे?",  "interrupted": false,  "nodeId": "ask_schedule",  "llmMs": 409,  "audioMs": 761,  "createdAt": "2026-10-12T21:39:06.218Z"}

The Reply object

What both conversation endpoints return: the agent's next line and the state of the conversation after it.

Attributes

callIdstring (UUID)
The conversation's id. Also the id of its call record.
replystring
What the agent says next. Show this to the person.
fieldsobject
Every field collected so far, keyed by name.
stepstring
The id of the flow step the conversation is now on.
endedboolean
true when this was the agent's final line.
outcomestring | null
null until ended is true. One of completed (the flow reached an end step with every required answer), partial (it ended with some required answers missing), callback_requested (the person asked to be called later), wrong_person, opted_out (the person asked not to be contacted) or failed (nobody was reached, or nothing was collected). An end step in the flow can also set its own outcome.
ReplyExample
{  "callId": "5d2c9a44-8e1b-4f0a-b7c3-91e6a2d4f8b0",  "reply": "Thank you. Will you reach by nine tonight?",  "fields": {    "current_location": "Adilabad toll"  },  "step": "ask_schedule",  "ended": false,  "outcome": null}

The webhook event

The body posted to your webhook endpoints. Paths below are written from the top of the body; [] means each item of an array.

Note · Different from the Call object

data.call is a summary, not the Call above. Compare the two before sharing code between your webhook handler and your API client. Receiving results has an interactive view of this payload.

Attributes

idstring (UUID)
The delivery's id. The same value is sent in the Oxumi-Delivery header and stays the same across retries. Use it to ignore repeats.
eventstring
The event name: "call.completed" for a finished call, or "ping" for a test delivery sent from the app.
createdAtstring (ISO 8601)
When the event was created, moments after the call ended. It does not change on retries.
dataobject
The event's content. For call.completed it holds one key, call.
data.callobject
The finished call.
data.call.idstring (UUID)
The call's id: the one POST /v1/calls returned, or callId for a text conversation.
data.call.agentIdstring (UUID)
The agent that made the call.
data.call.agentNamestring | null
The agent's name at the time the call ended.
data.call.channelstring
"phone" for a phone call or "api_text" for a text conversation. Calls made in the app's Test tab do not produce webhooks.
data.call.tostring | null
The number dialled, as normalised by the API. null for text conversations.
data.call.statusstring
Always "ended" in this event.
data.call.outcomestring
How the call ended: completed, partial, callback_requested, wrong_person, opted_out or failed.
data.call.errorstring | null
Why the call failed, in words, when the person was never reached: for example "Nobody answered." Otherwise null.
data.call.fieldsobject
The answers collected, keyed by field name. Each value has passed its field's check and is a string, a number or a boolean. Fields that were never collected are absent.
data.call.variablesobject
The variables the call was started with, as strings.
data.call.metadataobject
Whatever you sent as metadata when placing the call, as strings. Empty for text conversations.
data.call.modelstring
The language model the call ran on, as "<provider>:<model>".
data.call.startedAtstring (ISO 8601)
When the call record was created, which is when you made the request.
data.call.endedAtstring (ISO 8601)
When the call ended.
data.call.durationSecondsnumber
Whole seconds from startedAt to endedAt. For a phone call this includes the time spent ringing.
data.call.turnsarray
The transcript, in order. One item per agent reply. Empty when the person was never reached.
data.call.turns[].indexnumber
The turn's position in the call, counting up.
data.call.turns[].callerstring | null
What the person said (transcribed, for phone calls). null on the agent's opening line.
data.call.turns[].agentstring
What the agent said in reply.
data.call.turns[].interruptedboolean
true when the person started talking before the agent finished this line.
data.call.turns[].stepstring
The id of the flow step the call had reached once this turn was processed.
call.completedExample
{  "id": "c7a1e0d2-3b54-4f6a-9d8e-2f1b0a9c8d7e",  "event": "call.completed",  "createdAt": "2026-10-12T14:03:25.871Z",  "data": {    "call": {      "id": "0b9f6c1e-52a7-4d1c-9b6e-3f2a8d4c7e10",      "agentId": "81ee2426-7abe-444b-96f8-b8e195ddde49",      "agentName": "Driver check-in",      "channel": "phone",      "to": "+919876543210",      "status": "ended",      "outcome": "completed",      "error": null,      "fields": {        "current_location": "Adilabad toll",        "on_schedule": false,        "delay_reason": "traffic",        "revised_eta": "around midnight",        "needs_help": false      },      "variables": {        "driver_name": "Ramesh",        "company": "Shakti Logistics",        "route": "Nagpur to Hyderabad",        "planned_eta": "tonight at 9 pm"      },      "metadata": {        "trip_id": "TRIP-2291"      },      "model": "anthropic:claude-haiku-5-5",      "startedAt": "2026-10-12T14:02:11.412Z",      "endedAt": "2026-10-12T14:03:25.803Z",      "durationSeconds": 74,      "turns": [        {          "index": 1,          "caller": null,          "agent": "Namaste Ramesh ji, this is the automated assistant from Shakti Logistics, calling for a quick update on your Nagpur to Hyderabad trip. Where have you reached?",          "interrupted": false,          "step": "ask_location"        },        {          "index": 2,          "caller": "Just crossed the Adilabad toll.",          "agent": "Thank you. Will you reach by nine tonight?",          "interrupted": false,          "step": "ask_schedule"        },        {          "index": 3,          "caller": "No, there is a jam on the highway. It will be around midnight.",          "agent": "Understood. Is there any problem with the truck, the load or the paperwork?",          "interrupted": false,          "step": "ask_help"        },        {          "index": 4,          "caller": "No, all fine.",          "agent": "Thank you, your update is recorded. Drive safe.",          "interrupted": false,          "step": "goodbye"        }      ]    }  }}

Looking for something that is not here? Versioning lists what v1 does not yet do.