API reference
API reference
https://api.voximate.no/public/v1, authenticated with Authorization: Bearer vox_live_….Account
The API key in use and what it may do.
Retrieve the current API key
/meReturns the key that made the request: its id, workspace and scopes. Needs no scope, so it is the quickest way to check that a key works.
Returns · 200
The API key.
Show response fieldsHide response fields
objectstringrequiredAlways
"api_key"idstring (uuid)requiredThe key id (never the secret).
workspace_idstring (uuid)requiredYour workspace.
workspace_namestring | nullrequiredThe workspace name shown in the dashboard; null if it could not be read just now.
scopesarray of stringrequiredWhat the key may do, for example
calls:write.
Errors
401No API key, or the key is invalid, expired or revoked.
Every error has the same shape — see Errors.
curl "https://api.voximate.no/public/v1/me" \
-H "Authorization: Bearer $VOXIMATE_API_KEY"{
"object": "api_key",
"id": "0b6f3c2e-1a4d-4e5f-9a8b-7c6d5e4f3a2b",
"workspace_id": "4f1a2b3c-5d6e-4f70-8a9b-0c1d2e3f4a5b",
"scopes": [
"agents:read",
"calls:read",
"calls:write"
]
}Agents
AI voice agents: their instructions, greeting, voice and language.
List agents
/agentsReturns the agents in your workspace, newest first.
Query parameters
limitintegerHow many items to return, 1 to 100.
Default 20
cursorstringThe
next_cursorfrom the previous page.
Returns · 200
A page of agents.
Show response fieldsHide response fields
objectstringrequiredAlways
"list"dataarray of AgentrequiredShow child attributesHide child attributes
objectstringrequiredAlways
"agent"idstring (uuid)requirednamestringrequireddescriptionstring | nullrequiredstatusstringrequiredOnly a
publishedagent answers phone calls and can place outbound calls.One of
draftpublishedunpublishedarchivedlanguagestring | nullrequiredBCP 47 tag, for example
nb-NOoren-US.system_promptstring | nullrequiredThe instructions the agent follows on every call.
first_messagestring | nullrequiredWhat the agent says when it picks up.
outbound_first_messagestring | nullrequiredWhat the agent says first on calls it makes. When
null, those calls open withfirst_message. A call can set its own withfirst_messageonPOST /calls.voiceobjectrequiredShow child attributesHide child attributes
providerstring | nullrequiredvoice_idstring | nullrequired
llmobjectrequiredShow child attributesHide child attributes
providerstring | nullrequiredmodelstring | nullrequired
created_atstring (date-time)requiredupdated_atstring (date-time)required
has_morebooleanrequiredTrue when another page follows this one.
next_cursorstring | nullrequiredPass as
cursorto fetch the next page.nullon the last page.
Errors
400The request is malformed: a missing field, a wrong type, an unknown parameter or an id that is not a UUID.401No API key, or the key is invalid, expired or revoked.403The key is valid but lacks the scope this operation needs (`missing_scope`), or — for adding, changing, testing or removing a webhook endpoint — was not made by a workspace owner or admin (`role_required`).
Every error has the same shape — see Errors.
curl "https://api.voximate.no/public/v1/agents?limit=20" \
-H "Authorization: Bearer $VOXIMATE_API_KEY"{
"object": "list",
"data": [
{
"object": "agent",
"id": "7c3f1e90-5a44-4b21-9c07-2ed5b8f41a66",
"name": "Reception - Nordvik Dental",
"description": "Answers the main line and books check-ups.",
"status": "published",
"language": "nb-NO",
"system_prompt": "You are Sara, the receptionist at Nordvik Dental. Keep answers short.",
"first_message": "Hei, du har kommet til Nordvik Tannklinikk. Hva kan jeg hjelpe deg med?",
"outbound_first_message": "Hei, dette er Nordvik Tannklinikk.",
"voice": {
"provider": "elevenlabs",
"voice_id": "aya-norwegian"
},
"llm": {
"provider": "openai",
"model": "gpt-4o"
},
"created_at": "2026-10-01T09:12:44.000Z",
"updated_at": "2026-10-12T18:03:10.000Z"
}
],
"has_more": false,
"next_cursor": null
}Create an agent
/agentsCreates an agent as a draft. A draft answers in the dashboard test panel but takes no phone calls until it is published.
Headers
Idempotency-KeystringAny unique string (a UUID is ideal). Retrying a request with the same key within 24 hours returns the first answer instead of doing the work again.
Request body · application/json
namestringrequiredmax 200 characters
descriptionstringmax 1000 characters
languagestringBCP 47 tag. Default
nb-NO.max 20 characters
system_promptstringmax 50000 characters
first_messagestringmax 500 characters
outbound_first_messagestringWhat it says first on calls it makes.
max 500 characters
voice_idstringA voice id from the dashboard voice picker.
max 200 characters
Returns · 201
The new agent.
Show response fieldsHide response fields
objectstringrequiredAlways
"agent"idstring (uuid)requirednamestringrequireddescriptionstring | nullrequiredstatusstringrequiredOnly a
publishedagent answers phone calls and can place outbound calls.One of
draftpublishedunpublishedarchivedlanguagestring | nullrequiredBCP 47 tag, for example
nb-NOoren-US.system_promptstring | nullrequiredThe instructions the agent follows on every call.
first_messagestring | nullrequiredWhat the agent says when it picks up.
outbound_first_messagestring | nullrequiredWhat the agent says first on calls it makes. When
null, those calls open withfirst_message. A call can set its own withfirst_messageonPOST /calls.voiceobjectrequiredShow child attributesHide child attributes
providerstring | nullrequiredvoice_idstring | nullrequired
llmobjectrequiredShow child attributesHide child attributes
providerstring | nullrequiredmodelstring | nullrequired
created_atstring (date-time)requiredupdated_atstring (date-time)required
Errors
400The request is malformed: a missing field, a wrong type, an unknown parameter or an id that is not a UUID.401No API key, or the key is invalid, expired or revoked.403The key is valid but lacks the scope this operation needs (`missing_scope`), or — for adding, changing, testing or removing a webhook endpoint — was not made by a workspace owner or admin (`role_required`).409The Idempotency-Key was already used with a different request, or that request is still running.422The request is well-formed but cannot be carried out in the current state.
Every error has the same shape — see Errors.
curl -X POST "https://api.voximate.no/public/v1/agents" \
-H "Authorization: Bearer $VOXIMATE_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"name": "After-hours line",
"language": "nb-NO",
"system_prompt": "You take messages after opening hours. Ask for name, number and reason.",
"first_message": "Hei! Vi har stengt nå, men jeg kan ta imot en beskjed."
}'{
"object": "agent",
"id": "7c3f1e90-5a44-4b21-9c07-2ed5b8f41a66",
"name": "After-hours line",
"description": "Answers the main line and books check-ups.",
"status": "draft",
"language": "nb-NO",
"system_prompt": "You are Sara, the receptionist at Nordvik Dental. Keep answers short.",
"first_message": "Hei, du har kommet til Nordvik Tannklinikk. Hva kan jeg hjelpe deg med?",
"outbound_first_message": "Hei, dette er Nordvik Tannklinikk.",
"voice": {
"provider": "elevenlabs",
"voice_id": "aya-norwegian"
},
"llm": {
"provider": "openai",
"model": "gpt-4o"
},
"created_at": "2026-10-01T09:12:44.000Z",
"updated_at": "2026-10-12T18:03:10.000Z"
}Retrieve an agent
/agents/{agent_id}Path parameters
agent_idstring (uuid)requiredThe agent id.
Returns · 200
The agent.
Show response fieldsHide response fields
objectstringrequiredAlways
"agent"idstring (uuid)requirednamestringrequireddescriptionstring | nullrequiredstatusstringrequiredOnly a
publishedagent answers phone calls and can place outbound calls.One of
draftpublishedunpublishedarchivedlanguagestring | nullrequiredBCP 47 tag, for example
nb-NOoren-US.system_promptstring | nullrequiredThe instructions the agent follows on every call.
first_messagestring | nullrequiredWhat the agent says when it picks up.
outbound_first_messagestring | nullrequiredWhat the agent says first on calls it makes. When
null, those calls open withfirst_message. A call can set its own withfirst_messageonPOST /calls.voiceobjectrequiredShow child attributesHide child attributes
providerstring | nullrequiredvoice_idstring | nullrequired
llmobjectrequiredShow child attributesHide child attributes
providerstring | nullrequiredmodelstring | nullrequired
created_atstring (date-time)requiredupdated_atstring (date-time)required
Errors
400The request is malformed: a missing field, a wrong type, an unknown parameter or an id that is not a UUID.401No API key, or the key is invalid, expired or revoked.403The key is valid but lacks the scope this operation needs (`missing_scope`), or — for adding, changing, testing or removing a webhook endpoint — was not made by a workspace owner or admin (`role_required`).404Nothing with that id exists in your workspace.
Every error has the same shape — see Errors.
curl "https://api.voximate.no/public/v1/agents/7c3f1e90-5a44-4b21-9c07-2ed5b8f41a66" \
-H "Authorization: Bearer $VOXIMATE_API_KEY"{
"object": "agent",
"id": "7c3f1e90-5a44-4b21-9c07-2ed5b8f41a66",
"name": "Reception - Nordvik Dental",
"description": "Answers the main line and books check-ups.",
"status": "published",
"language": "nb-NO",
"system_prompt": "You are Sara, the receptionist at Nordvik Dental. Keep answers short.",
"first_message": "Hei, du har kommet til Nordvik Tannklinikk. Hva kan jeg hjelpe deg med?",
"outbound_first_message": "Hei, dette er Nordvik Tannklinikk.",
"voice": {
"provider": "elevenlabs",
"voice_id": "aya-norwegian"
},
"llm": {
"provider": "openai",
"model": "gpt-4o"
},
"created_at": "2026-10-01T09:12:44.000Z",
"updated_at": "2026-10-12T18:03:10.000Z"
}Update an agent
/agents/{agent_id}Changes only the fields you send. A published agent stays published, and the change applies from its next call.
Path parameters
agent_idstring (uuid)requiredThe agent id.
Request body · application/json
namestringmax 200 characters
descriptionstring | nullmax 1000 characters
languagestringmax 20 characters
system_promptstringmax 50000 characters
first_messagestring | nullmax 500 characters
outbound_first_messagestring | nullnullremoves it.max 500 characters
voice_idstringmax 200 characters
Returns · 200
The updated agent.
Show response fieldsHide response fields
objectstringrequiredAlways
"agent"idstring (uuid)requirednamestringrequireddescriptionstring | nullrequiredstatusstringrequiredOnly a
publishedagent answers phone calls and can place outbound calls.One of
draftpublishedunpublishedarchivedlanguagestring | nullrequiredBCP 47 tag, for example
nb-NOoren-US.system_promptstring | nullrequiredThe instructions the agent follows on every call.
first_messagestring | nullrequiredWhat the agent says when it picks up.
outbound_first_messagestring | nullrequiredWhat the agent says first on calls it makes. When
null, those calls open withfirst_message. A call can set its own withfirst_messageonPOST /calls.voiceobjectrequiredShow child attributesHide child attributes
providerstring | nullrequiredvoice_idstring | nullrequired
llmobjectrequiredShow child attributesHide child attributes
providerstring | nullrequiredmodelstring | nullrequired
created_atstring (date-time)requiredupdated_atstring (date-time)required
Errors
400The request is malformed: a missing field, a wrong type, an unknown parameter or an id that is not a UUID.401No API key, or the key is invalid, expired or revoked.403The key is valid but lacks the scope this operation needs (`missing_scope`), or — for adding, changing, testing or removing a webhook endpoint — was not made by a workspace owner or admin (`role_required`).404Nothing with that id exists in your workspace.422The request is well-formed but cannot be carried out in the current state.
Every error has the same shape — see Errors.
curl -X PATCH "https://api.voximate.no/public/v1/agents/7c3f1e90-5a44-4b21-9c07-2ed5b8f41a66" \
-H "Authorization: Bearer $VOXIMATE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"first_message": "Hei, du har kommet til Nordvik Tannklinikk. Hvordan kan jeg hjelpe?"
}'{
"object": "agent",
"id": "7c3f1e90-5a44-4b21-9c07-2ed5b8f41a66",
"name": "Reception - Nordvik Dental",
"description": "Answers the main line and books check-ups.",
"status": "published",
"language": "nb-NO",
"system_prompt": "You are Sara, the receptionist at Nordvik Dental. Keep answers short.",
"first_message": "Hei, du har kommet til Nordvik Tannklinikk. Hva kan jeg hjelpe deg med?",
"outbound_first_message": "Hei, dette er Nordvik Tannklinikk.",
"voice": {
"provider": "elevenlabs",
"voice_id": "aya-norwegian"
},
"llm": {
"provider": "openai",
"model": "gpt-4o"
},
"created_at": "2026-10-01T09:12:44.000Z",
"updated_at": "2026-10-12T18:03:10.000Z"
}Delete an agent
/agents/{agent_id}Deletes the agent. Phone numbers it answered are left without an agent. Past calls and their transcripts are kept.
Path parameters
agent_idstring (uuid)requiredThe agent id.
Returns · 200
The agent was deleted.
Show response fieldsHide response fields
objectstringrequiredidstring (uuid)requireddeletedbooleanrequiredAlways
true
Errors
400The request is malformed: a missing field, a wrong type, an unknown parameter or an id that is not a UUID.401No API key, or the key is invalid, expired or revoked.403The key is valid but lacks the scope this operation needs (`missing_scope`), or — for adding, changing, testing or removing a webhook endpoint — was not made by a workspace owner or admin (`role_required`).404Nothing with that id exists in your workspace.
Every error has the same shape — see Errors.
curl -X DELETE "https://api.voximate.no/public/v1/agents/7c3f1e90-5a44-4b21-9c07-2ed5b8f41a66" \
-H "Authorization: Bearer $VOXIMATE_API_KEY"{
"object": "agent",
"id": "7c3f1e90-5a44-4b21-9c07-2ed5b8f41a66",
"deleted": true
}Publish an agent
/agents/{agent_id}/publishMakes the agent live: phone numbers assigned to it start reaching it, and it can place outbound calls.
Path parameters
agent_idstring (uuid)requiredThe agent id.
Returns · 200
The published agent.
Show response fieldsHide response fields
objectstringrequiredAlways
"agent"idstring (uuid)requirednamestringrequireddescriptionstring | nullrequiredstatusstringrequiredOnly a
publishedagent answers phone calls and can place outbound calls.One of
draftpublishedunpublishedarchivedlanguagestring | nullrequiredBCP 47 tag, for example
nb-NOoren-US.system_promptstring | nullrequiredThe instructions the agent follows on every call.
first_messagestring | nullrequiredWhat the agent says when it picks up.
outbound_first_messagestring | nullrequiredWhat the agent says first on calls it makes. When
null, those calls open withfirst_message. A call can set its own withfirst_messageonPOST /calls.voiceobjectrequiredShow child attributesHide child attributes
providerstring | nullrequiredvoice_idstring | nullrequired
llmobjectrequiredShow child attributesHide child attributes
providerstring | nullrequiredmodelstring | nullrequired
created_atstring (date-time)requiredupdated_atstring (date-time)required
Errors
400The request is malformed: a missing field, a wrong type, an unknown parameter or an id that is not a UUID.401No API key, or the key is invalid, expired or revoked.403The key is valid but lacks the scope this operation needs (`missing_scope`), or — for adding, changing, testing or removing a webhook endpoint — was not made by a workspace owner or admin (`role_required`).404Nothing with that id exists in your workspace.422The request is well-formed but cannot be carried out in the current state.
Every error has the same shape — see Errors.
curl -X POST "https://api.voximate.no/public/v1/agents/7c3f1e90-5a44-4b21-9c07-2ed5b8f41a66/publish" \
-H "Authorization: Bearer $VOXIMATE_API_KEY"{
"object": "agent",
"id": "7c3f1e90-5a44-4b21-9c07-2ed5b8f41a66",
"name": "Reception - Nordvik Dental",
"description": "Answers the main line and books check-ups.",
"status": "published",
"language": "nb-NO",
"system_prompt": "You are Sara, the receptionist at Nordvik Dental. Keep answers short.",
"first_message": "Hei, du har kommet til Nordvik Tannklinikk. Hva kan jeg hjelpe deg med?",
"outbound_first_message": "Hei, dette er Nordvik Tannklinikk.",
"voice": {
"provider": "elevenlabs",
"voice_id": "aya-norwegian"
},
"llm": {
"provider": "openai",
"model": "gpt-4o"
},
"created_at": "2026-10-01T09:12:44.000Z",
"updated_at": "2026-10-12T18:03:10.000Z"
}Unpublish an agent
/agents/{agent_id}/unpublishTakes the agent off the phone. Its settings are kept and it can be published again.
Path parameters
agent_idstring (uuid)requiredThe agent id.
Returns · 200
The unpublished agent.
Show response fieldsHide response fields
objectstringrequiredAlways
"agent"idstring (uuid)requirednamestringrequireddescriptionstring | nullrequiredstatusstringrequiredOnly a
publishedagent answers phone calls and can place outbound calls.One of
draftpublishedunpublishedarchivedlanguagestring | nullrequiredBCP 47 tag, for example
nb-NOoren-US.system_promptstring | nullrequiredThe instructions the agent follows on every call.
first_messagestring | nullrequiredWhat the agent says when it picks up.
outbound_first_messagestring | nullrequiredWhat the agent says first on calls it makes. When
null, those calls open withfirst_message. A call can set its own withfirst_messageonPOST /calls.voiceobjectrequiredShow child attributesHide child attributes
providerstring | nullrequiredvoice_idstring | nullrequired
llmobjectrequiredShow child attributesHide child attributes
providerstring | nullrequiredmodelstring | nullrequired
created_atstring (date-time)requiredupdated_atstring (date-time)required
Errors
400The request is malformed: a missing field, a wrong type, an unknown parameter or an id that is not a UUID.401No API key, or the key is invalid, expired or revoked.403The key is valid but lacks the scope this operation needs (`missing_scope`), or — for adding, changing, testing or removing a webhook endpoint — was not made by a workspace owner or admin (`role_required`).404Nothing with that id exists in your workspace.
Every error has the same shape — see Errors.
curl -X POST "https://api.voximate.no/public/v1/agents/7c3f1e90-5a44-4b21-9c07-2ed5b8f41a66/unpublish" \
-H "Authorization: Bearer $VOXIMATE_API_KEY"{
"object": "agent",
"id": "7c3f1e90-5a44-4b21-9c07-2ed5b8f41a66",
"name": "Reception - Nordvik Dental",
"description": "Answers the main line and books check-ups.",
"status": "unpublished",
"language": "nb-NO",
"system_prompt": "You are Sara, the receptionist at Nordvik Dental. Keep answers short.",
"first_message": "Hei, du har kommet til Nordvik Tannklinikk. Hva kan jeg hjelpe deg med?",
"outbound_first_message": "Hei, dette er Nordvik Tannklinikk.",
"voice": {
"provider": "elevenlabs",
"voice_id": "aya-norwegian"
},
"llm": {
"provider": "openai",
"model": "gpt-4o"
},
"created_at": "2026-10-01T09:12:44.000Z",
"updated_at": "2026-10-12T18:03:10.000Z"
}Calls
Start outbound calls and read finished ones, with transcript and analysis.
List calls
/callsReturns calls newest first. Filter by agent, direction and time.
Query parameters
limitintegerHow many items to return, 1 to 100.
Default 20
cursorstringThe
next_cursorfrom the previous page.agent_idstring (uuid)Only calls handled by this agent.
directionstringOnly inbound or only outbound calls.
One of inbound, outbound
created_afterstring (date-time)Only calls that started at or after this time (ISO 8601).
created_beforestring (date-time)Only calls that started before this time (ISO 8601).
Returns · 200
A page of calls.
Show response fieldsHide response fields
objectstringrequiredAlways
"list"dataarray of CallrequiredShow child attributesHide child attributes
objectstringrequiredAlways
"call"idstring (uuid)requiredagent_idstring (uuid) | nullrequireddirectionstringrequiredOne of
inboundoutboundchannelstringrequiredphonefor calls over the phone network,webfor browser and widget calls.One of
phonewebstatusstringrequiredOne of
queuedringingin_progresscompletedfailedno_answerbusycanceledfromstring | nullrequiredThe calling number (E.164), when known.
tostring | nullrequiredThe called number (E.164), when known.
started_atstring (date-time)requiredended_atstring (date-time) | nullrequiredduration_secondsinteger | nullrequiredend_reasonstring | nullrequiredWhy the call ended, for example
caller_hangup.metadatamap of stringrequiredThe
metadatayou sent when you started the call.has_recordingboolean | nullrequiredWhether a recording exists.
nullin lists, where it is not looked up.analysisCallAnalysis | nullrequiredFilled in shortly after the call ends. Always
nullin lists.Show child attributesHide child attributes
summarystringrequiredoutcomestring | nullrequiredFor example
resolved,escalated,abandoned.sentimentstring | nullrequiredOne of
positiveneutralnegativeaction_itemsarray of stringrequiredcreated_atstring (date-time) | nullrequired
has_morebooleanrequiredTrue when another page follows this one.
next_cursorstring | nullrequiredPass as
cursorto fetch the next page.nullon the last page.
Errors
400The request is malformed: a missing field, a wrong type, an unknown parameter or an id that is not a UUID.401No API key, or the key is invalid, expired or revoked.403The key is valid but lacks the scope this operation needs (`missing_scope`), or — for adding, changing, testing or removing a webhook endpoint — was not made by a workspace owner or admin (`role_required`).
Every error has the same shape — see Errors.
curl "https://api.voximate.no/public/v1/calls?limit=20" \
-H "Authorization: Bearer $VOXIMATE_API_KEY"{
"object": "list",
"data": [
{
"object": "call",
"id": "3c27f11c-8a1e-4d55-9b0e-1f4c2a7d9e10",
"agent_id": "7c3f1e90-5a44-4b21-9c07-2ed5b8f41a66",
"direction": "outbound",
"channel": "phone",
"status": "completed",
"from": "+4721000000",
"to": "+4712345678",
"started_at": "2026-10-12T10:04:12.000Z",
"ended_at": "2026-10-12T10:07:33.000Z",
"duration_seconds": 201,
"end_reason": "caller_hangup",
"metadata": {
"crm_contact_id": "48213"
},
"has_recording": null,
"analysis": null
}
],
"has_more": true,
"next_cursor": "eyJvIjoyMH0"
}Start an outbound call
/callsAsks a published agent to call a phone number. Every check runs first (the agent is published, the number is yours, the number is not an emergency number, your plan has minutes); then the dial starts and this returns 202 with the call in status queued, without waiting for the phone to be answered.
How the call goes arrives as webhooks: call.started when it is answered, then call.completed with the analysis, or call.failed with reason no_answer, busy or not_connected. GET /calls/{call_id} shows the same.
The agent knows it placed the call: it says who it is and why it is calling, instead of answering as if it had been rung. It opens with first_message when you send one, else the agent's outbound_first_message, else its first_message.
Send an Idempotency-Key so a retried request can never ring the same person twice. If this answers 503 call_outcome_unknown, the call may already be ringing: look for it with GET /calls before trying again with a new key.
Headers
Idempotency-KeystringAny unique string (a UUID is ideal). Retrying a request with the same key within 24 hours returns the first answer instead of doing the work again.
Request body · application/json
agent_idstring (uuid)requiredA published agent.
tostringrequiredThe number to call, E.164.
pattern ^\+[1-9]\d{6,14}$
fromstringOne of your numbers, E.164. Optional when the agent has exactly one number assigned; required when it has several.
pattern ^\+[1-9]\d{6,14}$
metadatamap of stringUp to 20 string values, returned on the call and in its webhooks. Use it for your own ids.
at most 20 keys
ring_timeout_secondsintegerHow long to let it ring before the call counts as not answered. Default 30.
10–120
first_messagestringWhat the agent says first on this call, instead of its own greeting. Send an empty string to have the agent wait for the person to speak first. Left out: the agent's
outbound_first_message, or itsfirst_messagewhen it has none.max 500 characters
Returns · 202
The call passed every check and the dial has started.
Show response fieldsHide response fields
objectstringrequiredAlways
"call"idstring (uuid)requiredagent_idstring (uuid) | nullrequireddirectionstringrequiredOne of
inboundoutboundchannelstringrequiredphonefor calls over the phone network,webfor browser and widget calls.One of
phonewebstatusstringrequiredOne of
queuedringingin_progresscompletedfailedno_answerbusycanceledfromstring | nullrequiredThe calling number (E.164), when known.
tostring | nullrequiredThe called number (E.164), when known.
started_atstring (date-time)requiredended_atstring (date-time) | nullrequiredduration_secondsinteger | nullrequiredend_reasonstring | nullrequiredWhy the call ended, for example
caller_hangup.metadatamap of stringrequiredThe
metadatayou sent when you started the call.has_recordingboolean | nullrequiredWhether a recording exists.
nullin lists, where it is not looked up.analysisCallAnalysis | nullrequiredFilled in shortly after the call ends. Always
nullin lists.Show child attributesHide child attributes
summarystringrequiredoutcomestring | nullrequiredFor example
resolved,escalated,abandoned.sentimentstring | nullrequiredOne of
positiveneutralnegativeaction_itemsarray of stringrequiredcreated_atstring (date-time) | nullrequired
Errors
400The request is malformed: a missing field, a wrong type, an unknown parameter or an id that is not a UUID.401No API key, or the key is invalid, expired or revoked.403The key is valid but lacks the scope this operation needs (`missing_scope`), or — for adding, changing, testing or removing a webhook endpoint — was not made by a workspace owner or admin (`role_required`).404Nothing with that id exists in your workspace.409The Idempotency-Key was already used with a different request, or that request is still running.422The request is well-formed but cannot be carried out in the current state.429Too many requests, or too many calls started in a short time. Wait the number of seconds in the Retry-After header.503A Voximate service did not answer (`upstream_unavailable`); retrying is safe. On `POST /calls` the code is `call_outcome_unknown` instead: the call may already be ringing, so look for it with `GET /calls` before trying again with a new Idempotency-Key.
Every error has the same shape — see Errors.
curl -X POST "https://api.voximate.no/public/v1/calls" \
-H "Authorization: Bearer $VOXIMATE_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"agent_id": "7c3f1e90-5a44-4b21-9c07-2ed5b8f41a66",
"to": "+4712345678",
"first_message": "Hei, dette er Nordvik Tannklinikk. Jeg ringer om timen din i morgen.",
"metadata": {
"crm_contact_id": "48213"
}
}'{
"object": "call",
"id": "3c27f11c-8a1e-4d55-9b0e-1f4c2a7d9e10",
"agent_id": "7c3f1e90-5a44-4b21-9c07-2ed5b8f41a66",
"direction": "outbound",
"channel": "phone",
"status": "queued",
"from": "+4721000000",
"to": "+4712345678",
"started_at": "2026-10-12T10:04:12.000Z",
"ended_at": null,
"duration_seconds": null,
"end_reason": null,
"metadata": {
"crm_contact_id": "48213"
},
"has_recording": false,
"analysis": null
}Retrieve a call
/calls/{call_id}Returns the call with its analysis (summary, outcome, sentiment) once the analysis is ready.
Path parameters
call_idstring (uuid)requiredThe call id.
Returns · 200
The call.
Show response fieldsHide response fields
objectstringrequiredAlways
"call"idstring (uuid)requiredagent_idstring (uuid) | nullrequireddirectionstringrequiredOne of
inboundoutboundchannelstringrequiredphonefor calls over the phone network,webfor browser and widget calls.One of
phonewebstatusstringrequiredOne of
queuedringingin_progresscompletedfailedno_answerbusycanceledfromstring | nullrequiredThe calling number (E.164), when known.
tostring | nullrequiredThe called number (E.164), when known.
started_atstring (date-time)requiredended_atstring (date-time) | nullrequiredduration_secondsinteger | nullrequiredend_reasonstring | nullrequiredWhy the call ended, for example
caller_hangup.metadatamap of stringrequiredThe
metadatayou sent when you started the call.has_recordingboolean | nullrequiredWhether a recording exists.
nullin lists, where it is not looked up.analysisCallAnalysis | nullrequiredFilled in shortly after the call ends. Always
nullin lists.Show child attributesHide child attributes
summarystringrequiredoutcomestring | nullrequiredFor example
resolved,escalated,abandoned.sentimentstring | nullrequiredOne of
positiveneutralnegativeaction_itemsarray of stringrequiredcreated_atstring (date-time) | nullrequired
Errors
400The request is malformed: a missing field, a wrong type, an unknown parameter or an id that is not a UUID.401No API key, or the key is invalid, expired or revoked.403The key is valid but lacks the scope this operation needs (`missing_scope`), or — for adding, changing, testing or removing a webhook endpoint — was not made by a workspace owner or admin (`role_required`).404Nothing with that id exists in your workspace.
Every error has the same shape — see Errors.
curl "https://api.voximate.no/public/v1/calls/3c27f11c-8a1e-4d55-9b0e-1f4c2a7d9e10" \
-H "Authorization: Bearer $VOXIMATE_API_KEY"{
"object": "call",
"id": "3c27f11c-8a1e-4d55-9b0e-1f4c2a7d9e10",
"agent_id": "7c3f1e90-5a44-4b21-9c07-2ed5b8f41a66",
"direction": "outbound",
"channel": "phone",
"status": "completed",
"from": "+4721000000",
"to": "+4712345678",
"started_at": "2026-10-12T10:04:12.000Z",
"ended_at": "2026-10-12T10:07:33.000Z",
"duration_seconds": 201,
"end_reason": "caller_hangup",
"metadata": {
"crm_contact_id": "48213"
},
"has_recording": true,
"analysis": {
"summary": "The caller booked a check-up on Tuesday 14 October at 12:00.",
"outcome": "resolved",
"sentiment": "positive",
"action_items": [
"Send booking confirmation by SMS"
],
"created_at": "2026-10-12T10:07:51.000Z"
}
}Retrieve a call transcript
/calls/{call_id}/transcriptEvery line spoken on the call, in order.
Path parameters
call_idstring (uuid)requiredThe call id.
Returns · 200
The transcript.
Show response fieldsHide response fields
objectstringrequiredAlways
"transcript"call_idstring (uuid)requireddataarray of TranscriptEntryrequiredShow child attributesHide child attributes
indexintegerrequiredrolestringrequiredOne of
agentcallertextstringrequired
Errors
400The request is malformed: a missing field, a wrong type, an unknown parameter or an id that is not a UUID.401No API key, or the key is invalid, expired or revoked.403The key is valid but lacks the scope this operation needs (`missing_scope`), or — for adding, changing, testing or removing a webhook endpoint — was not made by a workspace owner or admin (`role_required`).404Nothing with that id exists in your workspace.
Every error has the same shape — see Errors.
curl "https://api.voximate.no/public/v1/calls/3c27f11c-8a1e-4d55-9b0e-1f4c2a7d9e10/transcript" \
-H "Authorization: Bearer $VOXIMATE_API_KEY"{
"object": "transcript",
"call_id": "3c27f11c-8a1e-4d55-9b0e-1f4c2a7d9e10",
"data": [
{
"index": 0,
"role": "agent",
"text": "Hei, du har kommet til Nordvik Tannklinikk. Hva kan jeg hjelpe deg med?"
},
{
"index": 1,
"role": "caller",
"text": "Jeg vil gjerne bestille en time til kontroll."
}
]
}Phone numbers
The numbers in your workspace and which agent answers each one.
List phone numbers
/phone-numbersQuery parameters
limitintegerHow many items to return, 1 to 100.
Default 20
cursorstringThe
next_cursorfrom the previous page.
Returns · 200
A page of phone numbers.
Show response fieldsHide response fields
objectstringrequiredAlways
"list"dataarray of PhoneNumberrequiredShow child attributesHide child attributes
objectstringrequiredAlways
"phone_number"idstring (uuid)requirednumberstringrequiredE.164.
labelstring | nullrequiredagent_idstring (uuid) | nullrequiredThe agent that answers it, or
null.statusstringrequiredcapabilitiesarray of stringrequiredcreated_atstring (date-time)required
has_morebooleanrequiredTrue when another page follows this one.
next_cursorstring | nullrequiredPass as
cursorto fetch the next page.nullon the last page.
Errors
400The request is malformed: a missing field, a wrong type, an unknown parameter or an id that is not a UUID.401No API key, or the key is invalid, expired or revoked.403The key is valid but lacks the scope this operation needs (`missing_scope`), or — for adding, changing, testing or removing a webhook endpoint — was not made by a workspace owner or admin (`role_required`).
Every error has the same shape — see Errors.
curl "https://api.voximate.no/public/v1/phone-numbers?limit=20" \
-H "Authorization: Bearer $VOXIMATE_API_KEY"{
"object": "list",
"data": [
{
"object": "phone_number",
"id": "b8f2a1c4-3d5e-4f60-8a71-92b3c4d5e6f7",
"number": "+4721000000",
"label": "Main line",
"agent_id": "7c3f1e90-5a44-4b21-9c07-2ed5b8f41a66",
"status": "active",
"capabilities": [
"voice"
],
"created_at": "2026-09-02T08:00:00.000Z"
}
],
"has_more": false,
"next_cursor": null
}Retrieve a phone number
/phone-numbers/{phone_number_id}Path parameters
phone_number_idstring (uuid)requiredThe phone number id (not the number itself).
Returns · 200
The phone number.
Show response fieldsHide response fields
objectstringrequiredAlways
"phone_number"idstring (uuid)requirednumberstringrequiredE.164.
labelstring | nullrequiredagent_idstring (uuid) | nullrequiredThe agent that answers it, or
null.statusstringrequiredcapabilitiesarray of stringrequiredcreated_atstring (date-time)required
Errors
400The request is malformed: a missing field, a wrong type, an unknown parameter or an id that is not a UUID.401No API key, or the key is invalid, expired or revoked.403The key is valid but lacks the scope this operation needs (`missing_scope`), or — for adding, changing, testing or removing a webhook endpoint — was not made by a workspace owner or admin (`role_required`).404Nothing with that id exists in your workspace.
Every error has the same shape — see Errors.
curl "https://api.voximate.no/public/v1/phone-numbers/b8f2a1c4-3d5e-4f60-8a71-92b3c4d5e6f7" \
-H "Authorization: Bearer $VOXIMATE_API_KEY"{
"object": "phone_number",
"id": "b8f2a1c4-3d5e-4f60-8a71-92b3c4d5e6f7",
"number": "+4721000000",
"label": "Main line",
"agent_id": "7c3f1e90-5a44-4b21-9c07-2ed5b8f41a66",
"status": "active",
"capabilities": [
"voice"
],
"created_at": "2026-09-02T08:00:00.000Z"
}Assign an agent to a phone number
/phone-numbers/{phone_number_id}Sets which agent answers calls to this number. Send null to leave the number without an agent.
Path parameters
phone_number_idstring (uuid)requiredThe phone number id (not the number itself).
Request body · application/json
agent_idstring (uuid) | nullrequired
Returns · 200
The updated number.
Show response fieldsHide response fields
objectstringrequiredAlways
"phone_number"idstring (uuid)requirednumberstringrequiredE.164.
labelstring | nullrequiredagent_idstring (uuid) | nullrequiredThe agent that answers it, or
null.statusstringrequiredcapabilitiesarray of stringrequiredcreated_atstring (date-time)required
Errors
400The request is malformed: a missing field, a wrong type, an unknown parameter or an id that is not a UUID.401No API key, or the key is invalid, expired or revoked.403The key is valid but lacks the scope this operation needs (`missing_scope`), or — for adding, changing, testing or removing a webhook endpoint — was not made by a workspace owner or admin (`role_required`).404Nothing with that id exists in your workspace.
Every error has the same shape — see Errors.
curl -X PATCH "https://api.voximate.no/public/v1/phone-numbers/b8f2a1c4-3d5e-4f60-8a71-92b3c4d5e6f7" \
-H "Authorization: Bearer $VOXIMATE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"agent_id": "7c3f1e90-5a44-4b21-9c07-2ed5b8f41a66"
}'{
"object": "phone_number",
"id": "b8f2a1c4-3d5e-4f60-8a71-92b3c4d5e6f7",
"number": "+4721000000",
"label": "Main line",
"agent_id": "7c3f1e90-5a44-4b21-9c07-2ed5b8f41a66",
"status": "active",
"capabilities": [
"voice"
],
"created_at": "2026-09-02T08:00:00.000Z"
}Webhooks
Endpoints that receive signed events from Voximate.
List webhook endpoints
/webhooksQuery parameters
limitintegerHow many items to return, 1 to 100.
Default 20
cursorstringThe
next_cursorfrom the previous page.
Returns · 200
A page of endpoints.
Show response fieldsHide response fields
objectstringrequiredAlways
"list"dataarray of WebhookEndpointrequiredShow child attributesHide child attributes
objectstringrequiredAlways
"webhook_endpoint"idstring (uuid)requiredurlstring (uri)requiredeventsarray of EventTyperequiredOne of
call.startedcall.completedcall.failedcall.transferredstatusstringrequiredOne of
activepauseddisableddescriptionstring | nullrequiredsecretstring | nullThe signing secret. Returned only when the endpoint is created and when the secret is rotated. An
Idempotency-Keyreplay of the create answersnullhere: the secret is kept only in the vault, never with the stored answer. Rotate it if it was lost.created_atstring (date-time)requiredupdated_atstring (date-time)required
has_morebooleanrequiredTrue when another page follows this one.
next_cursorstring | nullrequiredPass as
cursorto fetch the next page.nullon the last page.
Errors
400The request is malformed: a missing field, a wrong type, an unknown parameter or an id that is not a UUID.401No API key, or the key is invalid, expired or revoked.403The key is valid but lacks the scope this operation needs (`missing_scope`), or — for adding, changing, testing or removing a webhook endpoint — was not made by a workspace owner or admin (`role_required`).
Every error has the same shape — see Errors.
curl "https://api.voximate.no/public/v1/webhooks?limit=20" \
-H "Authorization: Bearer $VOXIMATE_API_KEY"{
"object": "list",
"data": [
{
"object": "webhook_endpoint",
"id": "d1e2f3a4-b5c6-4d7e-8f90-a1b2c3d4e5f6",
"url": "https://example.com/voximate/webhooks",
"events": [
"call.completed",
"call.failed"
],
"status": "active",
"description": "CRM sync",
"created_at": "2026-10-13T08:00:00.000Z",
"updated_at": "2026-10-13T08:00:00.000Z"
}
],
"has_more": false,
"next_cursor": null
}Create a webhook endpoint
/webhooksRegisters a URL that receives the events you choose. The response carries the signing secret once — store it, you need it to verify each delivery. The URL must be public https.
Headers
Idempotency-KeystringAny unique string (a UUID is ideal). Retrying a request with the same key within 24 hours returns the first answer instead of doing the work again.
Request body · application/json
urlstring (uri)requiredA public https URL.
eventsarray of EventTyperequiredOne of
call.startedcall.completedcall.failedcall.transferredat least 1 item · no duplicates
descriptionstringmax 500 characters
Returns · 201
The new endpoint, with its signing secret.
Show response fieldsHide response fields
objectstringrequiredAlways
"webhook_endpoint"idstring (uuid)requiredurlstring (uri)requiredeventsarray of EventTyperequiredOne of
call.startedcall.completedcall.failedcall.transferredstatusstringrequiredOne of
activepauseddisableddescriptionstring | nullrequiredsecretstring | nullThe signing secret. Returned only when the endpoint is created and when the secret is rotated. An
Idempotency-Keyreplay of the create answersnullhere: the secret is kept only in the vault, never with the stored answer. Rotate it if it was lost.created_atstring (date-time)requiredupdated_atstring (date-time)required
Errors
400The request is malformed: a missing field, a wrong type, an unknown parameter or an id that is not a UUID.401No API key, or the key is invalid, expired or revoked.403The key is valid but lacks the scope this operation needs (`missing_scope`), or — for adding, changing, testing or removing a webhook endpoint — was not made by a workspace owner or admin (`role_required`).409The Idempotency-Key was already used with a different request, or that request is still running.422The request is well-formed but cannot be carried out in the current state.
Every error has the same shape — see Errors.
curl -X POST "https://api.voximate.no/public/v1/webhooks" \
-H "Authorization: Bearer $VOXIMATE_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"url": "https://example.com/voximate/webhooks",
"events": [
"call.completed",
"call.failed"
],
"description": "CRM sync"
}'{
"object": "webhook_endpoint",
"id": "d1e2f3a4-b5c6-4d7e-8f90-a1b2c3d4e5f6",
"url": "https://example.com/voximate/webhooks",
"events": [
"call.completed",
"call.failed"
],
"status": "active",
"description": "CRM sync",
"created_at": "2026-10-13T08:00:00.000Z",
"updated_at": "2026-10-13T08:00:00.000Z",
"secret": "whsec_6b1d0f8e2a4c47b9a3e5d7f1c9b2a4e6"
}Retrieve a webhook endpoint
/webhooks/{webhook_id}Path parameters
webhook_idstring (uuid)requiredThe webhook endpoint id.
Returns · 200
The endpoint.
Show response fieldsHide response fields
objectstringrequiredAlways
"webhook_endpoint"idstring (uuid)requiredurlstring (uri)requiredeventsarray of EventTyperequiredOne of
call.startedcall.completedcall.failedcall.transferredstatusstringrequiredOne of
activepauseddisableddescriptionstring | nullrequiredsecretstring | nullThe signing secret. Returned only when the endpoint is created and when the secret is rotated. An
Idempotency-Keyreplay of the create answersnullhere: the secret is kept only in the vault, never with the stored answer. Rotate it if it was lost.created_atstring (date-time)requiredupdated_atstring (date-time)required
Errors
400The request is malformed: a missing field, a wrong type, an unknown parameter or an id that is not a UUID.401No API key, or the key is invalid, expired or revoked.403The key is valid but lacks the scope this operation needs (`missing_scope`), or — for adding, changing, testing or removing a webhook endpoint — was not made by a workspace owner or admin (`role_required`).404Nothing with that id exists in your workspace.
Every error has the same shape — see Errors.
curl "https://api.voximate.no/public/v1/webhooks/d1e2f3a4-b5c6-4d7e-8f90-a1b2c3d4e5f6" \
-H "Authorization: Bearer $VOXIMATE_API_KEY"{
"object": "webhook_endpoint",
"id": "d1e2f3a4-b5c6-4d7e-8f90-a1b2c3d4e5f6",
"url": "https://example.com/voximate/webhooks",
"events": [
"call.completed",
"call.failed"
],
"status": "active",
"description": "CRM sync",
"created_at": "2026-10-13T08:00:00.000Z",
"updated_at": "2026-10-13T08:00:00.000Z"
}Update a webhook endpoint
/webhooks/{webhook_id}Change the URL, the events, the description, or pause and resume deliveries.
Path parameters
webhook_idstring (uuid)requiredThe webhook endpoint id.
Request body · application/json
urlstring (uri)eventsarray of EventTypeOne of
call.startedcall.completedcall.failedcall.transferredat least 1 item · no duplicates
descriptionstring | nullmax 500 characters
statusstringOne of
activepaused
Returns · 200
The updated endpoint.
Show response fieldsHide response fields
objectstringrequiredAlways
"webhook_endpoint"idstring (uuid)requiredurlstring (uri)requiredeventsarray of EventTyperequiredOne of
call.startedcall.completedcall.failedcall.transferredstatusstringrequiredOne of
activepauseddisableddescriptionstring | nullrequiredsecretstring | nullThe signing secret. Returned only when the endpoint is created and when the secret is rotated. An
Idempotency-Keyreplay of the create answersnullhere: the secret is kept only in the vault, never with the stored answer. Rotate it if it was lost.created_atstring (date-time)requiredupdated_atstring (date-time)required
Errors
400The request is malformed: a missing field, a wrong type, an unknown parameter or an id that is not a UUID.401No API key, or the key is invalid, expired or revoked.403The key is valid but lacks the scope this operation needs (`missing_scope`), or — for adding, changing, testing or removing a webhook endpoint — was not made by a workspace owner or admin (`role_required`).404Nothing with that id exists in your workspace.422The request is well-formed but cannot be carried out in the current state.
Every error has the same shape — see Errors.
curl -X PATCH "https://api.voximate.no/public/v1/webhooks/d1e2f3a4-b5c6-4d7e-8f90-a1b2c3d4e5f6" \
-H "Authorization: Bearer $VOXIMATE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"status": "paused"
}'{
"object": "webhook_endpoint",
"id": "d1e2f3a4-b5c6-4d7e-8f90-a1b2c3d4e5f6",
"url": "https://example.com/voximate/webhooks",
"events": [
"call.completed",
"call.failed"
],
"status": "paused",
"description": "CRM sync",
"created_at": "2026-10-13T08:00:00.000Z",
"updated_at": "2026-10-13T08:00:00.000Z"
}Delete a webhook endpoint
/webhooks/{webhook_id}Stops all deliveries to the endpoint and deletes its signing secret.
Path parameters
webhook_idstring (uuid)requiredThe webhook endpoint id.
Returns · 200
The endpoint was deleted.
Show response fieldsHide response fields
objectstringrequiredidstring (uuid)requireddeletedbooleanrequiredAlways
true
Errors
400The request is malformed: a missing field, a wrong type, an unknown parameter or an id that is not a UUID.401No API key, or the key is invalid, expired or revoked.403The key is valid but lacks the scope this operation needs (`missing_scope`), or — for adding, changing, testing or removing a webhook endpoint — was not made by a workspace owner or admin (`role_required`).404Nothing with that id exists in your workspace.
Every error has the same shape — see Errors.
curl -X DELETE "https://api.voximate.no/public/v1/webhooks/d1e2f3a4-b5c6-4d7e-8f90-a1b2c3d4e5f6" \
-H "Authorization: Bearer $VOXIMATE_API_KEY"{
"object": "webhook_endpoint",
"id": "d1e2f3a4-b5c6-4d7e-8f90-a1b2c3d4e5f6",
"deleted": true
}Send a test event
/webhooks/{webhook_id}/testSends a signed webhook.test event to the endpoint right now and reports what your server answered. Use it to check your signature verification before real calls arrive.
Path parameters
webhook_idstring (uuid)requiredThe webhook endpoint id.
Returns · 200
What your endpoint answered.
Show response fieldsHide response fields
objectstringrequiredAlways
"webhook_test"deliveredbooleanrequiredTrue when your endpoint answered 2xx.
response_statusinteger | nullrequirederrorstring | nullrequiredduration_msintegerrequired
Errors
400The request is malformed: a missing field, a wrong type, an unknown parameter or an id that is not a UUID.401No API key, or the key is invalid, expired or revoked.403The key is valid but lacks the scope this operation needs (`missing_scope`), or — for adding, changing, testing or removing a webhook endpoint — was not made by a workspace owner or admin (`role_required`).404Nothing with that id exists in your workspace.
Every error has the same shape — see Errors.
curl -X POST "https://api.voximate.no/public/v1/webhooks/d1e2f3a4-b5c6-4d7e-8f90-a1b2c3d4e5f6/test" \
-H "Authorization: Bearer $VOXIMATE_API_KEY"{
"object": "webhook_test",
"delivered": true,
"response_status": 200,
"error": null,
"duration_ms": 184
}Rotate the signing secret
/webhooks/{webhook_id}/rotate-secretReplaces the signing secret and returns the new one once. Deliveries are signed with the new secret from the next event.
Path parameters
webhook_idstring (uuid)requiredThe webhook endpoint id.
Returns · 200
The endpoint with its new secret.
Show response fieldsHide response fields
objectstringrequiredAlways
"webhook_endpoint"idstring (uuid)requiredurlstring (uri)requiredeventsarray of EventTyperequiredOne of
call.startedcall.completedcall.failedcall.transferredstatusstringrequiredOne of
activepauseddisableddescriptionstring | nullrequiredsecretstring | nullThe signing secret. Returned only when the endpoint is created and when the secret is rotated. An
Idempotency-Keyreplay of the create answersnullhere: the secret is kept only in the vault, never with the stored answer. Rotate it if it was lost.created_atstring (date-time)requiredupdated_atstring (date-time)required
Errors
400The request is malformed: a missing field, a wrong type, an unknown parameter or an id that is not a UUID.401No API key, or the key is invalid, expired or revoked.403The key is valid but lacks the scope this operation needs (`missing_scope`), or — for adding, changing, testing or removing a webhook endpoint — was not made by a workspace owner or admin (`role_required`).404Nothing with that id exists in your workspace.
Every error has the same shape — see Errors.
curl -X POST "https://api.voximate.no/public/v1/webhooks/d1e2f3a4-b5c6-4d7e-8f90-a1b2c3d4e5f6/rotate-secret" \
-H "Authorization: Bearer $VOXIMATE_API_KEY"{
"object": "webhook_endpoint",
"id": "d1e2f3a4-b5c6-4d7e-8f90-a1b2c3d4e5f6",
"url": "https://example.com/voximate/webhooks",
"events": [
"call.completed",
"call.failed"
],
"status": "active",
"description": "CRM sync",
"created_at": "2026-10-13T08:00:00.000Z",
"updated_at": "2026-10-13T08:00:00.000Z",
"secret": "whsec_0e9d8c7b6a5f4e3d2c1b0a9f8e7d6c5b"
}List deliveries
/webhooks/{webhook_id}/deliveriesRecent delivery attempts to this endpoint, newest first, with the status code your server answered.
Path parameters
webhook_idstring (uuid)requiredThe webhook endpoint id.
Query parameters
limitintegerHow many items to return, 1 to 100.
Default 20
cursorstringThe
next_cursorfrom the previous page.
Returns · 200
A page of deliveries.
Show response fieldsHide response fields
objectstringrequiredAlways
"list"dataarray of WebhookDeliveryrequiredShow child attributesHide child attributes
objectstringrequiredAlways
"webhook_delivery"idstring (uuid)requiredevent_typestringrequiredstatusstringrequiredOne of
deliveredfailedpendingresponse_statusinteger | nullrequiredattemptsintegerrequirederrorstring | nullrequiredcreated_atstring (date-time)requireddelivered_atstring (date-time) | nullrequired
has_morebooleanrequiredTrue when another page follows this one.
next_cursorstring | nullrequiredPass as
cursorto fetch the next page.nullon the last page.
Errors
400The request is malformed: a missing field, a wrong type, an unknown parameter or an id that is not a UUID.401No API key, or the key is invalid, expired or revoked.403The key is valid but lacks the scope this operation needs (`missing_scope`), or — for adding, changing, testing or removing a webhook endpoint — was not made by a workspace owner or admin (`role_required`).404Nothing with that id exists in your workspace.
Every error has the same shape — see Errors.
curl "https://api.voximate.no/public/v1/webhooks/d1e2f3a4-b5c6-4d7e-8f90-a1b2c3d4e5f6/deliveries?limit=20" \
-H "Authorization: Bearer $VOXIMATE_API_KEY"{
"object": "list",
"data": [
{
"object": "webhook_delivery",
"id": "a9b8c7d6-e5f4-4a3b-9c2d-1e0f9a8b7c6d",
"event_type": "call.completed",
"status": "delivered",
"response_status": 200,
"attempts": 1,
"error": null,
"created_at": "2026-10-12T10:07:52.000Z",
"delivered_at": "2026-10-12T10:07:52.000Z"
}
],
"has_more": false,
"next_cursor": null
}Usage
Call counts and minutes for a period.
Retrieve usage
/usageCalls and minutes for a period. Defaults to the last 30 days.
Query parameters
startstring (date-time)Start of the period (ISO 8601). Default: 30 days ago.
endstring (date-time)End of the period (ISO 8601). Default: now.
Returns · 200
Usage for the period.
Show response fieldsHide response fields
objectstringrequiredAlways
"usage"periodobjectrequiredShow child attributesHide child attributes
startstring (date-time)requiredendstring (date-time)required
callsintegerrequiredminutesintegerrequiredCall minutes in the period, rounded.
average_duration_secondsintegerrequiredoutcomesmap of integerrequiredCalls per outcome from each call’s AI analysis (resolved, escalated, abandoned, transferred, unknown). Calls without an analysis yet are not counted, so the total can be below
calls.
Errors
400The request is malformed: a missing field, a wrong type, an unknown parameter or an id that is not a UUID.401No API key, or the key is invalid, expired or revoked.403The key is valid but lacks the scope this operation needs (`missing_scope`), or — for adding, changing, testing or removing a webhook endpoint — was not made by a workspace owner or admin (`role_required`).
Every error has the same shape — see Errors.
curl "https://api.voximate.no/public/v1/usage" \
-H "Authorization: Bearer $VOXIMATE_API_KEY"{
"object": "usage",
"period": {
"start": "2026-09-13T00:00:00.000Z",
"end": "2026-10-13T00:00:00.000Z"
},
"calls": 281,
"minutes": 577,
"average_duration_seconds": 126,
"outcomes": {
"resolved": 190,
"escalated": 12,
"abandoned": 21,
"transferred": 9,
"unknown": 49
}
}Events
What Voximate posts to your webhook endpoints. Each delivery is signed — see Verifying signatures.
call.started
A call was answered and the agent is on the line.
{
"id": "evt_5f0c2b9a7d3e4c1f8a6b2d9e0c4f7a13",
"object": "event",
"type": "call.started",
"api_version": "v1",
"created_at": "2026-10-12T10:07:51.000Z",
"data": {
"object": {
"object": "call",
"id": "3c27f11c-8a1e-4d55-9b0e-1f4c2a7d9e10",
"agent_id": "7c3f1e90-5a44-4b21-9c07-2ed5b8f41a66",
"direction": "outbound",
"channel": "phone",
"status": "in_progress",
"from": "+4721000000",
"to": "+4712345678",
"started_at": "2026-10-12T10:04:12.000Z",
"ended_at": null,
"duration_seconds": null,
"end_reason": null,
"metadata": {
"crm_contact_id": "48213"
},
"has_recording": false,
"analysis": null
}
}
}call.completed
A call has ended and its analysis is ready. data.object is the call, with analysis filled in.
{
"id": "evt_5f0c2b9a7d3e4c1f8a6b2d9e0c4f7a13",
"object": "event",
"type": "call.completed",
"api_version": "v1",
"created_at": "2026-10-12T10:07:51.000Z",
"data": {
"object": {
"object": "call",
"id": "3c27f11c-8a1e-4d55-9b0e-1f4c2a7d9e10",
"agent_id": "7c3f1e90-5a44-4b21-9c07-2ed5b8f41a66",
"direction": "outbound",
"channel": "phone",
"status": "completed",
"from": "+4721000000",
"to": "+4712345678",
"started_at": "2026-10-12T10:04:12.000Z",
"ended_at": "2026-10-12T10:07:33.000Z",
"duration_seconds": 201,
"end_reason": "caller_hangup",
"metadata": {
"crm_contact_id": "48213"
},
"has_recording": true,
"analysis": {
"summary": "The caller booked a check-up on Tuesday 14 October at 12:00.",
"outcome": "resolved",
"sentiment": "positive",
"action_items": [
"Send booking confirmation by SMS"
],
"created_at": "2026-10-12T10:07:51.000Z"
}
}
}
}call.failed
A call out was never connected. data.reason says why: no_answer (it rang out or was declined), busy, or not_connected (the number or the network refused it). Sent once per call.
{
"id": "evt_5f0c2b9a7d3e4c1f8a6b2d9e0c4f7a13",
"object": "event",
"type": "call.failed",
"api_version": "v1",
"created_at": "2026-10-12T10:07:51.000Z",
"data": {
"object": {
"object": "call",
"id": "3c27f11c-8a1e-4d55-9b0e-1f4c2a7d9e10",
"agent_id": "7c3f1e90-5a44-4b21-9c07-2ed5b8f41a66",
"direction": "outbound",
"channel": "phone",
"status": "failed",
"from": "+4721000000",
"to": "+4712345678",
"started_at": "2026-10-12T10:04:12.000Z",
"ended_at": "2026-10-12T10:07:33.000Z",
"duration_seconds": 0,
"end_reason": "caller_hangup",
"metadata": {
"crm_contact_id": "48213"
},
"has_recording": false,
"analysis": null
},
"reason": "no_answer"
}
}call.transferred
The agent transferred the caller to a person or another number.
{
"id": "evt_5f0c2b9a7d3e4c1f8a6b2d9e0c4f7a13",
"object": "event",
"type": "call.transferred",
"api_version": "v1",
"created_at": "2026-10-12T10:07:51.000Z",
"data": {
"object": {
"object": "call",
"id": "3c27f11c-8a1e-4d55-9b0e-1f4c2a7d9e10",
"agent_id": "7c3f1e90-5a44-4b21-9c07-2ed5b8f41a66",
"direction": "outbound",
"channel": "phone",
"status": "in_progress",
"from": "+4721000000",
"to": "+4712345678",
"started_at": "2026-10-12T10:04:12.000Z",
"ended_at": "2026-10-12T10:07:33.000Z",
"duration_seconds": 201,
"end_reason": "caller_hangup",
"metadata": {
"crm_contact_id": "48213"
},
"has_recording": true,
"analysis": null
},
"transferred_to": "+4712345670"
}
}webhook.test
Sent by "Send test event" in the dashboard and by POST /webhooks/{webhook_id}/test.
{
"id": "evt_0d1c2b3a4f5e6d7c8b9a0f1e2d3c4b5a",
"object": "event",
"type": "webhook.test",
"api_version": "v1",
"created_at": "2026-10-13T08:01:00.000Z",
"data": {
"message": "This is a test event from Voximate."
}
}Objects
The resources the API returns, field by field.
Agent
objectstringrequiredAlways
"agent"idstring (uuid)requirednamestringrequireddescriptionstring | nullrequiredstatusstringrequiredOnly a
publishedagent answers phone calls and can place outbound calls.One of
draftpublishedunpublishedarchivedlanguagestring | nullrequiredBCP 47 tag, for example
nb-NOoren-US.system_promptstring | nullrequiredThe instructions the agent follows on every call.
first_messagestring | nullrequiredWhat the agent says when it picks up.
outbound_first_messagestring | nullrequiredWhat the agent says first on calls it makes. When
null, those calls open withfirst_message. A call can set its own withfirst_messageonPOST /calls.voiceobjectrequiredShow child attributesHide child attributes
providerstring | nullrequiredvoice_idstring | nullrequired
llmobjectrequiredShow child attributesHide child attributes
providerstring | nullrequiredmodelstring | nullrequired
created_atstring (date-time)requiredupdated_atstring (date-time)required
Call
objectstringrequiredAlways
"call"idstring (uuid)requiredagent_idstring (uuid) | nullrequireddirectionstringrequiredOne of
inboundoutboundchannelstringrequiredphonefor calls over the phone network,webfor browser and widget calls.One of
phonewebstatusstringrequiredOne of
queuedringingin_progresscompletedfailedno_answerbusycanceledfromstring | nullrequiredThe calling number (E.164), when known.
tostring | nullrequiredThe called number (E.164), when known.
started_atstring (date-time)requiredended_atstring (date-time) | nullrequiredduration_secondsinteger | nullrequiredend_reasonstring | nullrequiredWhy the call ended, for example
caller_hangup.metadatamap of stringrequiredThe
metadatayou sent when you started the call.has_recordingboolean | nullrequiredWhether a recording exists.
nullin lists, where it is not looked up.analysisCallAnalysis | nullrequiredFilled in shortly after the call ends. Always
nullin lists.Show child attributesHide child attributes
summarystringrequiredoutcomestring | nullrequiredFor example
resolved,escalated,abandoned.sentimentstring | nullrequiredOne of
positiveneutralnegativeaction_itemsarray of stringrequiredcreated_atstring (date-time) | nullrequired
CallAnalysis
summarystringrequiredoutcomestring | nullrequiredFor example
resolved,escalated,abandoned.sentimentstring | nullrequiredOne of
positiveneutralnegativeaction_itemsarray of stringrequiredcreated_atstring (date-time) | nullrequired
TranscriptEntry
indexintegerrequiredrolestringrequiredOne of
agentcallertextstringrequired
PhoneNumber
objectstringrequiredAlways
"phone_number"idstring (uuid)requirednumberstringrequiredE.164.
labelstring | nullrequiredagent_idstring (uuid) | nullrequiredThe agent that answers it, or
null.statusstringrequiredcapabilitiesarray of stringrequiredcreated_atstring (date-time)required
WebhookEndpoint
objectstringrequiredAlways
"webhook_endpoint"idstring (uuid)requiredurlstring (uri)requiredeventsarray of EventTyperequiredOne of
call.startedcall.completedcall.failedcall.transferredstatusstringrequiredOne of
activepauseddisableddescriptionstring | nullrequiredsecretstring | nullThe signing secret. Returned only when the endpoint is created and when the secret is rotated. An
Idempotency-Keyreplay of the create answersnullhere: the secret is kept only in the vault, never with the stored answer. Rotate it if it was lost.created_atstring (date-time)requiredupdated_atstring (date-time)required
WebhookDelivery
objectstringrequiredAlways
"webhook_delivery"idstring (uuid)requiredevent_typestringrequiredstatusstringrequiredOne of
deliveredfailedpendingresponse_statusinteger | nullrequiredattemptsintegerrequirederrorstring | nullrequiredcreated_atstring (date-time)requireddelivered_atstring (date-time) | nullrequired
Usage
objectstringrequiredAlways
"usage"periodobjectrequiredShow child attributesHide child attributes
startstring (date-time)requiredendstring (date-time)required
callsintegerrequiredminutesintegerrequiredCall minutes in the period, rounded.
average_duration_secondsintegerrequiredoutcomesmap of integerrequiredCalls per outcome from each call’s AI analysis (resolved, escalated, abandoned, transferred, unknown). Calls without an analysis yet are not counted, so the total can be below
calls.
Event
idstringrequiredUnique per event. The same event retried keeps its id: use it to drop duplicates.
objectstringrequiredAlways
"event"typestringrequiredapi_versionstringrequiredAlways
"v1"created_atstring (date-time)requireddataobjectrequiredFor call events,
data.objectis the call.
Error
errorobjectrequiredShow child attributesHide child attributes
typestringrequiredThe broad category. Branch on this.
One of
invalid_request_errorauthentication_errorpermission_errornot_found_erroridempotency_errorrate_limit_errorapi_errorcodestringrequiredA stable, specific code, for example
missing_scope.messagestringrequiredA human-readable explanation. Wording may change.
paramstring | nullrequiredThe parameter the error is about, when there is one.
request_idstringrequiredSame as the
X-Request-Idheader.