Reference
API reference
Nine endpoints and five objects. Every endpoint needs a bearer key and is scoped to the key's project.
All endpoints
GET
/v1/agentsThe project's agents, and whether each is ready.GET/v1/agents/:idOne agent with its flow, variables and fields.POST/v1/callsPlace a phone call. Answers 202 once it is ringing.GET/v1/callsRecent calls, newest first.GET/v1/calls/:idOne call with its outcome, fields and transcript.DELETE/v1/calls/:idEnd a call that is ringing or in progress (Twilio).POST/v1/conversationsStart a text conversation; returns the agent's first line.POST/v1/conversations/:id/messagesRelay what the person typed; returns the reply.DELETE/v1/conversations/:idClose a conversation before its flow finishes.Agents
List agents
GET
/v1/agentsLists 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
- 401 · 429As for every endpoint: see Authentication and Rate limits.
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/:idReturns 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
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/callsPlaces 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
twilioorexotel. Defaults to the agent's owntelephonysetting; 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
Errors
- 400
agentIdortois missing or invalid; a variable has no value;providerormodelis 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/callsLists 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;
0or 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
- 500
agentIdis not a UUID. A known issue. - 401 · 429As for every endpoint: see Authentication and Rate limits.
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/:idReturns 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/:idEnds 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/conversationsStarts 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
Errors
- 400
agentIdis missing; a variable has no value;modelis 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/messagesRelays 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/:idCloses 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
- 400The id in the path is not a UUID.
- 401 · 429As for every endpoint: see Authentication and Rate limits.
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:
twilioorexotel. 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
truewhen 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 }, whereleveliserrororwarning. Anyerrormakesreadyfalse. - 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 asvariables. - flow.fieldsarray · Retrieve only
- What a call collects:
{ name, type, description, options, required }.typeisstring,number,booleanorenum;optionslists the allowed values of an enum. - flow.settingsobject · Retrieve only
persona,languages(hi,en),maxAttemptsper question,maxDurationSecfor the whole call, and optionallyvoiceId.- flow.nodesarray · Retrieve only
- The steps. Each has an
idand atype:start,say,ask,branchorend.flow.startnames 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
phonefor a call placed through the API,api_textfor a text conversation, andbrowser_voiceorbrowser_textfor test calls made in the app.- statusstring
queued,ringing,in_progressorended. 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) orfailed(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
twilioorexotelfor 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"}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
endedis true. One ofcompleted(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) orfailed(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.