{
"error": "call minutes exhausted — 30 of 30 minutes used this month",
"code": "quota_exhausted",
"plan": "<string>",
"period": "2026-08",
"usedMinutes": 123,
"limitMinutes": 123
}
{
"error": "not found"
}
{
"error": "not found"
}
Calls
Place an outbound call
Returns as soon as the room exists and the INVITE is on its way — it
does not wait for an answer, which takes seconds. The call is
recorded in the calls list from this moment, so a carrier rejection
(which produces no trace at all, because no agent ever joins) is visible
rather than a call that simply never rings; the outcome lands on the row.
contactRef is an opaque reference of yours, echoed back on the webhook
— put your own account or record id there, and the end-of-call report
joins to your data without matching on a phone number. When it is the
id of one of your Vodex contacts, any {{var}} the request leaves blank
is filled from that contact: from a custom field with that key when it
has a value, otherwise from their own field ({{first_name}},
{{postal_code}} and the rest).
variables are per-call {{var}} values merged over the assistant’s own,
substituted into every line the assistant says — systemPrompt and
firstMessage, and equally endCallMessage, silencePromptMessage,
voicemail.message, the built-in tools’ spoken lines and each
disclosure’s text.
The payload Vodex POSTs to your endpoint — not something this API
serves. Documented here because it is the contract configured through
PUT /v1/webhook-config.
interaction.completed, not call.completed: one stream for every
channel, so a consumer writes one handler and switches on channel
rather than integrating a new webhook when SMS or WhatsApp ships.
It is deliberately complete — a consumer that receives this needs no
follow-up GET. analysis is an open envelope: summary and sentiment
land there as additive keys, so a handler written today keeps parsing
tomorrow's payloads.
Headers
Header
Meaning
x-vodex-signature
t=<unix>,v1=<hex> where v1 = HMAC-SHA256(secret, "<t>.<raw body>")
x-vodex-event
The event type
x-vodex-delivery
Delivery id — the same event retried keeps its id, so use that for idempotency
The timestamp is inside the signed string, not merely alongside it:
signing the body alone leaves a captured delivery replayable forever,
because nothing in what was signed says when it was sent. Reject
anything more than 300 seconds off in either direction. During a
rotation both secrets sign, as repeated v1= values, so consumers can
move without a coordinated deploy.
Retries
8 attempts at 10s, 30s, 2m, 10m, 30m, 2h, 6h, each with full jitter
(a random point in [0, delay], so a consumer coming back from an
outage is not hit by every queued delivery at the same instant). 408,
429, 5xx and transport failures retry; every other 4xx does not —
repeating a request the consumer called wrong just burns the budget a
real outage needs. A delivery that exhausts its attempts is the dead
letter — status: failed with no nextAttemptAt — and stays visible at
GET /v1/webhook-deliveries.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Vodex API","description":"The public Vodex /v1 REST API — assistants, telephony, calls, batches, SMS and webhooks.","colors":{"primary":"#FF4D00","light":"#FF4D00","dark":"#FF4D00"},"logo":{"light":"https://mintcdn.com/vodex/78No6_lqTF_DicwD/logo/vodex-full.svg?fit=max\u0026auto=format\u0026n=78No6_lqTF_DicwD\u0026q=85\u0026s=abc36083e47f9332141ac1141d1cbe4a","dark":"https://mintcdn.com/vodex/78No6_lqTF_DicwD/logo/vodex-full.svg?fit=max\u0026auto=format\u0026n=78No6_lqTF_DicwD\u0026q=85\u0026s=abc36083e47f9332141ac1141d1cbe4a"},"favicon":"https://mintcdn.com/vodex/78No6_lqTF_DicwD/favicon.png?fit=max\u0026auto=format\u0026n=78No6_lqTF_DicwD\u0026q=85\u0026s=a3598c2265371fff3cd08244e8e6cf66","appearance":{"default":"system"},"navbar":{"links":[{"href":"mailto:support@vodex.ai","label":"Support"},{"href":"https://vodex.ai","label":"vodex.ai"}],"primary":{"type":"button","label":"Console","href":"https://console.vodex.ai"}},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"vodex","hasAudioNarration":false,"actualSubdomain":"vodex","customDomains":["apidocs.vodex.ai"],"gitSource":{"type":"github","owner":"lilchirpio","repo":"vodex","deployBranch":"main","contentDirectory":"docs-site","isPrivate":true,"mountPath":"","label":""},"chroma":{"latestBuiltDeploymentHistoryId":"6ae4c8c238fcbf2314c7045c","collectionId":"d3294b7d-8c93-44c2-95a0-17739dc4bfb2","liveDeploymentHistoryId":"6ae4c8c238fcbf2314c7045c","schemaVersion":"v3"},"entitlements":{},"buildId":"6ae4c8c238fcbf2314c7045c","clientVersion":"0.0.4044","searchFilterCounts":[{"language":"default","tag":"API Reference","count":155},{"language":"default","tag":"Contacts","count":27},{"language":"default","tag":"Batches","count":16},{"language":"default","tag":"Campaigns","count":14},{"language":"default","tag":"Assistants","count":12},{"language":"default","tag":"SMS","count":12},{"language":"default","tag":"Audiences","count":8},{"language":"default","tag":"Do Not Contact","count":8},{"language":"default","tag":"Integrations","count":8},{"language":"default","tag":"Payments","count":8}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"api-reference/calls/place-an-outbound-call","slug":"/api-reference/calls/place-an-outbound-call","pageMetadata":{"title":"Place an outbound call","description":"Returns as soon as the room exists and the INVITE is on its way — it\ndoes **not** wait for an answer, which takes seconds. The call is\nrecorded in the calls list from this moment, so a carrier rejection\n(which produces no trace at all, because no agent ever joins) is visible\nrather than a call that simply never rings; the outcome lands on the row.\n\n`contactRef` is an opaque reference of yours, echoed back on the webhook\n— put your own account or record id there, and the end-of-call report\njoins to your data without matching on a phone number. When it is the\nid of one of your Vodex contacts, any `{{var}}` the request leaves blank\nis filled from that contact: from a custom field with that key when it\nhas a value, otherwise from their own field (`{{first_name}}`,\n`{{postal_code}}` and the rest).\n`variables` are per-call `{{var}}` values merged over the assistant's own,\nsubstituted into every line the assistant says — `systemPrompt` and\n`firstMessage`, and equally `endCallMessage`, `silencePromptMessage`,\n`voicemail.message`, the built-in tools' spoken lines and each\ndisclosure's `text`.\n","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml post /calls","href":"/api-reference/calls/place-an-outbound-call","autogeneratedByOpenApi":true},"description":{"compiledSource":"\"use strict\";\nconst {Fragment: _Fragment, jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n p: \"p\",\n strong: \"strong\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsxs(_components.p, {\n children: [\"Returns as soon as the room exists and the INVITE is on its way — it\\ndoes \", _jsx(_components.strong, {\n children: \"not\"\n }), \" wait for an answer, which takes seconds. The call is\\nrecorded in the calls list from this moment, so a carrier rejection\\n(which produces no trace at all, because no agent ever joins) is visible\\nrather than a call that simply never rings; the outcome lands on the row.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.code, {\n children: \"contactRef\"\n }), \" is an opaque reference of yours, echoed back on the webhook\\n— put your own account or record id there, and the end-of-call report\\njoins to your data without matching on a phone number. When it is the\\nid of one of your Vodex contacts, any \", _jsx(_components.code, {\n children: \"{{var}}\"\n }), \" the request leaves blank\\nis filled from that contact: from a custom field with that key when it\\nhas a value, otherwise from their own field (\", _jsx(_components.code, {\n children: \"{{first_name}}\"\n }), \",\\n\", _jsx(_components.code, {\n children: \"{{postal_code}}\"\n }), \" and the rest).\\n\", _jsx(_components.code, {\n children: \"variables\"\n }), \" are per-call \", _jsx(_components.code, {\n children: \"{{var}}\"\n }), \" values merged over the assistant’s own,\\nsubstituted into every line the assistant says — \", _jsx(_components.code, {\n children: \"systemPrompt\"\n }), \" and\\n\", _jsx(_components.code, {\n children: \"firstMessage\"\n }), \", and equally \", _jsx(_components.code, {\n children: \"endCallMessage\"\n }), \", \", _jsx(_components.code, {\n children: \"silencePromptMessage\"\n }), \",\\n\", _jsx(_components.code, {\n children: \"voicemail.message\"\n }), \", the built-in tools’ spoken lines and each\\ndisclosure’s \", _jsx(_components.code, {\n children: \"text\"\n }), \".\"]\n })]\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Place an outbound call","description":"Returns as soon as the room exists and the INVITE is on its way — it\ndoes **not** wait for an answer, which takes seconds. The call is\nrecorded in the calls list from this moment, so a carrier rejection\n(which produces no trace at all, because no agent ever joins) is visible\nrather than a call that simply never rings; the outcome lands on the row.\n\n`contactRef` is an opaque reference of yours, echoed back on the webhook\n— put your own account or record id there, and the end-of-call report\njoins to your data without matching on a phone number. When it is the\nid of one of your Vodex contacts, any `{{var}}` the request leaves blank\nis filled from that contact: from a custom field with that key when it\nhas a value, otherwise from their own field (`{{first_name}}`,\n`{{postal_code}}` and the rest).\n`variables` are per-call `{{var}}` values merged over the assistant's own,\nsubstituted into every line the assistant says — `systemPrompt` and\n`firstMessage`, and equally `endCallMessage`, `silencePromptMessage`,\n`voicemail.message`, the built-in tools' spoken lines and each\ndisclosure's `text`.\n","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml post /calls","href":"/api-reference/calls/place-an-outbound-call","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"operationId":"createCall","tags":["Calls"],"summary":"Place an outbound call","description":"Returns as soon as the room exists and the INVITE is on its way — it\ndoes **not** wait for an answer, which takes seconds. The call is\nrecorded in the calls list from this moment, so a carrier rejection\n(which produces no trace at all, because no agent ever joins) is visible\nrather than a call that simply never rings; the outcome lands on the row.\n\n`contactRef` is an opaque reference of yours, echoed back on the webhook\n— put your own account or record id there, and the end-of-call report\njoins to your data without matching on a phone number. When it is the\nid of one of your Vodex contacts, any `{{var}}` the request leaves blank\nis filled from that contact: from a custom field with that key when it\nhas a value, otherwise from their own field (`{{first_name}}`,\n`{{postal_code}}` and the rest).\n`variables` are per-call `{{var}}` values merged over the assistant's own,\nsubstituted into every line the assistant says — `systemPrompt` and\n`firstMessage`, and equally `endCallMessage`, `silencePromptMessage`,\n`voicemail.message`, the built-in tools' spoken lines and each\ndisclosure's `text`.\n","requestBody":"729074bd-93d9-40e7-a914-c91e1ae45df1","responses":{"200":"5d4fbb26-fb46-4790-80fb-0a1e7f329ad0","400":"e2e4d5b2-c88e-40ae-98fa-c3104ef34bbd","402":"6201ccd6-201d-419d-b1b0-d3069edd8776","404":"4a5273b0-4c0f-4bf0-b7ab-b7563d3304c2","409":"024b90e6-6d57-4240-b064-12a48bad2b77"},"callbacks":{"interactionCompleted":"d3dabdbe-c09a-405d-89d1-57ec84dabc94"},"method":"post","type":"path","servers":["454f84ff-3690-4156-8c58-c64805db6548"],"security":["986b34dc-9d64-43d6-addf-8d27adc5ae4e"],"path":"/calls","baseUrlOptions":["https://apiv2.vodex.ai/v1"],"title":"Place an outbound call","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["assistantId","toNumber","fromNumberId"],"properties":{"assistantId":{"type":"string","format":"uuid","description":"The assistant's uuid, shown on its configure page in the console. Names and slugs are not accepted.","isRequired":true,"uniqueKey":"assistantId","typeLabel":"string\u003cuuid>"},"toNumber":{"type":"string","example":"+919876543210","isRequired":true,"uniqueKey":"toNumber","typeLabel":"string"},"fromNumberId":{"type":"string","description":"A phone-number id (`num-…`) or its E.164 value.","isRequired":true,"uniqueKey":"fromNumberId","typeLabel":"string"},"contactRef":{"type":"string","maxLength":256,"uniqueKey":"contactRef","typeLabel":"string"},"variables":{"type":"object","additionalProperties":{"type":"string","uniqueKey":"variables.additionalProperties","typeLabel":"string"},"description":"At most 16 kB serialized.","uniqueKey":"variables","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"assistantId":"3c90c3cc-0d44-4b50-8888-8dd25736052a","toNumber":"+919876543210","fromNumberId":"\u003cstring>","contactRef":"\u003cstring>","variables":{}}}},"exampleType":"generated"}},"exampleType":"generated"},"responses":{"5d4fbb26-fb46-4790-80fb-0a1e7f329ad0":{"description":"Dialing.","content":{"application/json":{"schema":{"type":"object","properties":{"callId":{"type":"string","example":"call-…","uniqueKey":"callId","typeLabel":"string"},"room":{"type":"string","uniqueKey":"room","typeLabel":"string"},"to":{"type":"string","uniqueKey":"to","typeLabel":"string"},"from":{"type":"string","uniqueKey":"from","typeLabel":"string"},"cell":{"type":"string","example":"us-central1","uniqueKey":"cell","typeLabel":"string"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"callId":"call-…","room":"\u003cstring>","to":"\u003cstring>","from":"\u003cstring>","cell":"us-central1"}}},"exampleType":"generated"}},"exampleType":"generated"},"e2e4d5b2-c88e-40ae-98fa-c3104ef34bbd":{"description":"Missing fields, a non-E.164 `toNumber`, oversized `variables` or\n`contactRef`, outbound disabled on the number, or a trunk with no\noutbound configuration.\n","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"not found","uniqueKey":"error","typeLabel":"string"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"not found"}}},"exampleType":"generated"}},"exampleType":"generated"},"6201ccd6-201d-419d-b1b0-d3069edd8776":{"description":"The tenant's included minutes are spent.","content":{"application/json":{"schema":{"type":"object","description":"The one error carrying a machine-readable code.","properties":{"error":{"type":"string","example":"call minutes exhausted — 30 of 30 minutes used this month","uniqueKey":"error","typeLabel":"string"},"code":{"type":"string","enum":["quota_exhausted"],"uniqueKey":"code","typeLabel":"enum\u003cstring>"},"plan":{"type":"string","uniqueKey":"plan","typeLabel":"string"},"period":{"type":"string","example":"2026-08","uniqueKey":"period","typeLabel":"string"},"usedMinutes":{"type":"integer","uniqueKey":"usedMinutes","typeLabel":"integer"},"limitMinutes":{"type":"integer","uniqueKey":"limitMinutes","typeLabel":"integer"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"call minutes exhausted — 30 of 30 minutes used this month","code":"quota_exhausted","plan":"\u003cstring>","period":"2026-08","usedMinutes":123,"limitMinutes":123}}},"exampleType":"generated"}},"exampleType":"generated"},"4a5273b0-4c0f-4bf0-b7ab-b7563d3304c2":{"description":"Unknown assistant, or `fromNumber` not found.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"not found","uniqueKey":"error","typeLabel":"string"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"not found"}}},"exampleType":"generated"}},"exampleType":"generated"},"024b90e6-6d57-4240-b064-12a48bad2b77":{"description":"`toNumber` is on the tenant's DNC list. A distinct status from\n`403`, which this API reserves for permission failures.\n","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"not found","uniqueKey":"error","typeLabel":"string"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"not found"}}},"exampleType":"generated"}},"exampleType":"generated"}},"callbacks":[{"callbackName":"interactionCompleted","expression":"{$request.body#/webhookUrl}","method":"post","resolved":{"operation":{"summary":"interaction.completed","description":"When the call ends, Vodex POSTs the full report to the endpoint configured at `PUT /v1/webhook-config` — signed, retried, and complete enough that no follow-up GET is needed.","requestBody":"36a57ca7-a8d2-4ec4-a0e6-f351c504677c","responses":{"408":"b174c7df-572a-45f4-8ef3-6473cc748cdb","429":"fde7123f-3a0c-46b8-afe2-173cf78f6bb6","2XX":"f8007903-7cc9-49aa-ad2c-0ee8e77996e8","5XX":"90ecac28-4f94-4356-8da1-74d736c5fb18","4XX":"a2890cb6-17ed-43ca-a79c-2e3ccf41acab"},"method":"post","type":"path"},"dependencies":{"parameters":{},"requestBody":{"content":{"application/json":{"schema":{"type":"object","description":"**The payload Vodex POSTs to your endpoint** — not something this API\nserves. Documented here because it is the contract configured through\n`PUT /v1/webhook-config`.\n\n`interaction.completed`, not `call.completed`: one stream for every\nchannel, so a consumer writes one handler and switches on `channel`\nrather than integrating a new webhook when SMS or WhatsApp ships.\n\nIt is deliberately **complete** — a consumer that receives this needs no\nfollow-up GET. `analysis` is an open envelope: summary and sentiment\nland there as additive keys, so a handler written today keeps parsing\ntomorrow's payloads.\n\n### Headers\n\n| Header | Meaning |\n|---|---|\n| `x-vodex-signature` | `t=\u003cunix>,v1=\u003chex>` where `v1 = HMAC-SHA256(secret, \"\u003ct>.\u003craw body>\")` |\n| `x-vodex-event` | The event type |\n| `x-vodex-delivery` | Delivery id — the same event retried keeps its `id`, so use that for idempotency |\n\nThe timestamp is **inside** the signed string, not merely alongside it:\nsigning the body alone leaves a captured delivery replayable forever,\nbecause nothing in what was signed says when it was sent. Reject\nanything more than **300 seconds** off in either direction. During a\nrotation both secrets sign, as repeated `v1=` values, so consumers can\nmove without a coordinated deploy.\n\n### Retries\n\n8 attempts at 10s, 30s, 2m, 10m, 30m, 2h, 6h, each with **full jitter**\n(a random point in `[0, delay]`, so a consumer coming back from an\noutage is not hit by every queued delivery at the same instant). 408,\n429, 5xx and transport failures retry; every other 4xx does not —\nrepeating a request the consumer called wrong just burns the budget a\nreal outage needs. A delivery that exhausts its attempts is the dead\nletter — `status: failed` with no `nextAttemptAt` — and stays visible at\n`GET /v1/webhook-deliveries`.\n","properties":{"type":{"type":"string","enum":["interaction.completed"],"uniqueKey":"type","typeLabel":"enum\u003cstring>"},"id":{"type":"string","description":"Idempotency key — stable across retries.","uniqueKey":"id","typeLabel":"string"},"tenantId":{"type":"string","format":"uuid","uniqueKey":"tenantId","typeLabel":"string\u003cuuid>"},"channel":{"type":"string","enum":["voice-ai","sms"],"uniqueKey":"channel","typeLabel":"enum\u003cstring>"},"contactRef":{"oneOf":[{"type":"string","description":"Echoed from the dial request, never interpreted.","uniqueKey":"contactRef.oneOf.0","typeLabel":"string"},{"type":"null","description":"Echoed from the dial request, never interpreted.","uniqueKey":"contactRef.oneOf.1","typeLabel":"null"}],"uniqueKey":"contactRef","typeLabel":"string | null"},"rawAddress":{"oneOf":[{"type":"string","description":"The counterparty address, for when no `contactRef` was passed.","uniqueKey":"rawAddress.oneOf.0","typeLabel":"string"},{"type":"null","description":"The counterparty address, for when no `contactRef` was passed.","uniqueKey":"rawAddress.oneOf.1","typeLabel":"null"}],"uniqueKey":"rawAddress","typeLabel":"string | null"},"direction":{"type":"string","uniqueKey":"direction","typeLabel":"string"},"from":{"oneOf":[{"type":"string","uniqueKey":"from.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"from.oneOf.1","typeLabel":"null"}],"uniqueKey":"from","typeLabel":"string | null"},"to":{"oneOf":[{"type":"string","uniqueKey":"to.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"to.oneOf.1","typeLabel":"null"}],"uniqueKey":"to","typeLabel":"string | null"},"assistantId":{"oneOf":[{"type":"string","uniqueKey":"assistantId.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"assistantId.oneOf.1","typeLabel":"null"}],"uniqueKey":"assistantId","typeLabel":"string | null"},"engine":{"oneOf":[{"type":"string","uniqueKey":"engine.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"engine.oneOf.1","typeLabel":"null"}],"uniqueKey":"engine","typeLabel":"string | null"},"startedAt":{"oneOf":[{"type":"string","format":"date-time","uniqueKey":"startedAt.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","uniqueKey":"startedAt.oneOf.1","typeLabel":"null"}],"uniqueKey":"startedAt","typeLabel":"string\u003cdate-time> | null"},"endedAt":{"oneOf":[{"type":"string","format":"date-time","uniqueKey":"endedAt.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","uniqueKey":"endedAt.oneOf.1","typeLabel":"null"}],"uniqueKey":"endedAt","typeLabel":"string\u003cdate-time> | null"},"outcome":{"type":"object","description":"Orthogonal facts, never a prose string — a consumer should never have to sniff a string for what happened.","properties":{"answered":{"type":"boolean","uniqueKey":"outcome.answered","typeLabel":"boolean"},"connectedMs":{"type":"integer","uniqueKey":"outcome.connectedMs","typeLabel":"integer"},"endedBy":{"oneOf":[{"type":"string","enum":["caller","agent","system",null],"description":"`system` is one of our own limits firing (max duration, silence timeout). Null when the call was never answered and nothing in the trace said why.","uniqueKey":"outcome.endedBy.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["caller","agent","system",null],"description":"`system` is one of our own limits firing (max duration, silence timeout). Null when the call was never answered and nothing in the trace said why.","uniqueKey":"outcome.endedBy.oneOf.1","typeLabel":"null"}],"uniqueKey":"outcome.endedBy","typeLabel":"enum\u003cstring> | null"},"endReason":{"oneOf":[{"type":"string","enum":["agent_ended","caller_hangup","carrier_dropped","transferred","voicemail_left","no_answer","busy","rejected","invalid_number","blocked_dnd","carrier_failed","max_duration","silence_timeout","pipeline_error",null],"description":"A fixed wire vocabulary, deliberately separate from the internal enum so a consumer's histogram does not shift when the internals are tidied. Two things that might be expected here are not: whether anyone picked up is `outcome.answered`, and a voicemail *detection* rides in `outcome.voicemail` — the call still ended for one of the reasons above. Null when nothing said why.","uniqueKey":"outcome.endReason.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["agent_ended","caller_hangup","carrier_dropped","transferred","voicemail_left","no_answer","busy","rejected","invalid_number","blocked_dnd","carrier_failed","max_duration","silence_timeout","pipeline_error",null],"description":"A fixed wire vocabulary, deliberately separate from the internal enum so a consumer's histogram does not shift when the internals are tidied. Two things that might be expected here are not: whether anyone picked up is `outcome.answered`, and a voicemail *detection* rides in `outcome.voicemail` — the call still ended for one of the reasons above. Null when nothing said why.","uniqueKey":"outcome.endReason.oneOf.1","typeLabel":"null"}],"uniqueKey":"outcome.endReason","typeLabel":"enum\u003cstring> | null"},"error":{"oneOf":[{"type":"string","uniqueKey":"outcome.error.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"outcome.error.oneOf.1","typeLabel":"null"}],"uniqueKey":"outcome.error","typeLabel":"string | null"},"voicemail":{"type":"object","description":"What the detector decided, not what one signal saw: the acoustic vote alone fires on humans too (a chatty callee's opening monologue trips it), so `detected` means the votes reached a decision.","properties":{"detected":{"type":"boolean","uniqueKey":"outcome.voicemail.detected","typeLabel":"boolean"},"confidence":{"type":"number","example":0.67,"description":"**Not a probability.** The detector votes, and this is how many of its signals agreed over the three it takes to be unanimous, capped at `1.0`: `0.67` is the ordinary two-vote decision, `1.0` is three or more, and `0.33` a confident LLM verdict deciding alone. `0` when nothing was detected.","uniqueKey":"outcome.voicemail.confidence","typeLabel":"number"},"signals":{"type":"array","items":{"type":"string","uniqueKey":"outcome.voicemail.signals.items.[INDEX]","typeLabel":"string"},"example":["acoustic","keyword"],"description":"Which independent signals agreed — the words behind `confidence`. Today one or more of `acoustic` (the far end monologued), `beep` (a record tone), `keyword` (greeting phrasing in the transcript) and `llm`. Deliberately not an enum: the detector has gained a signal before and will again, so match on the ones you care about rather than exhaustively.","uniqueKey":"outcome.voicemail.signals","typeLabel":"string[]"},"action":{"oneOf":[{"type":"string","enum":["hangup","leaveMessage",null],"description":"What the assistant was configured to do about a machine. Null when nothing was detected. `leaveMessage` here says the action ran; whether the message actually played is what separates `endReason: voicemail_left` from `agent_ended`.","uniqueKey":"outcome.voicemail.action.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["hangup","leaveMessage",null],"description":"What the assistant was configured to do about a machine. Null when nothing was detected. `leaveMessage` here says the action ran; whether the message actually played is what separates `endReason: voicemail_left` from `agent_ended`.","uniqueKey":"outcome.voicemail.action.oneOf.1","typeLabel":"null"}],"uniqueKey":"outcome.voicemail.action","typeLabel":"enum\u003cstring> | null"}},"uniqueKey":"outcome.voicemail","typeLabel":"object"},"transfer":{"oneOf":[{"type":"object","description":"The transfer that actually happened, or null if none was attempted. A transfer is a sequence — requested, then resolved — and this reports the last one, so a warm attempt that failed and fell back to a cold one that completed reports the cold one.","properties":{"kind":{"type":"string","enum":["cold","warm"],"description":"Cold (a SIP REFER) unless the warm path ran.","uniqueKey":"outcome.transfer.oneOf.0.kind","typeLabel":"enum\u003cstring>"},"destination":{"oneOf":[{"type":"string","uniqueKey":"outcome.transfer.oneOf.0.destination.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"outcome.transfer.oneOf.0.destination.oneOf.1","typeLabel":"null"}],"uniqueKey":"outcome.transfer.oneOf.0.destination","typeLabel":"string | null"},"result":{"oneOf":[{"type":"string","enum":["requested","completed","failed",null],"description":"`requested` means the attempt never resolved.","uniqueKey":"outcome.transfer.oneOf.0.result.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["requested","completed","failed",null],"description":"`requested` means the attempt never resolved.","uniqueKey":"outcome.transfer.oneOf.0.result.oneOf.1","typeLabel":"null"}],"uniqueKey":"outcome.transfer.oneOf.0.result","typeLabel":"enum\u003cstring> | null"}},"uniqueKey":"outcome.transfer.oneOf.0","typeLabel":"object"},{"type":"null","description":"The transfer that actually happened, or null if none was attempted. A transfer is a sequence — requested, then resolved — and this reports the last one, so a warm attempt that failed and fell back to a cold one that completed reports the cold one.","properties":{"kind":{"type":"string","enum":["cold","warm"],"description":"Cold (a SIP REFER) unless the warm path ran."},"destination":{"oneOf":[{"type":"string"},{"type":"null"}]},"result":{"oneOf":[{"type":"string","enum":["requested","completed","failed",null],"description":"`requested` means the attempt never resolved."},{"type":"null","enum":["requested","completed","failed",null],"description":"`requested` means the attempt never resolved."}]}},"uniqueKey":"outcome.transfer.oneOf.1","typeLabel":"null"}],"uniqueKey":"outcome.transfer","typeLabel":"object | null"},"callback":{"oneOf":[{"type":"object","description":"The callback the assistant promised on this call, or `null` if it promised none — branch on presence, not on a boolean. Already booked in Vodex when this fires, so no follow-up GET is needed.","properties":{"id":{"oneOf":[{"type":"string","format":"uuid","description":"The `scheduled_callbacks` row, for `GET /v1/callbacks/{id}`.","uniqueKey":"outcome.callback.oneOf.0.id.oneOf.0","typeLabel":"string\u003cuuid>"},{"type":"null","format":"uuid","description":"The `scheduled_callbacks` row, for `GET /v1/callbacks/{id}`.","uniqueKey":"outcome.callback.oneOf.0.id.oneOf.1","typeLabel":"null"}],"uniqueKey":"outcome.callback.oneOf.0.id","typeLabel":"string\u003cuuid> | null"},"at":{"type":"string","format":"date-time","description":"When the callback is due, as an instant.","uniqueKey":"outcome.callback.oneOf.0.at","typeLabel":"string\u003cdate-time>"},"timezone":{"oneOf":[{"type":"string","description":"IANA zone the caller was speaking in, when one was known.","uniqueKey":"outcome.callback.oneOf.0.timezone.oneOf.0","typeLabel":"string"},{"type":"null","description":"IANA zone the caller was speaking in, when one was known.","uniqueKey":"outcome.callback.oneOf.0.timezone.oneOf.1","typeLabel":"null"}],"uniqueKey":"outcome.callback.oneOf.0.timezone","typeLabel":"string | null"},"note":{"oneOf":[{"type":"string","description":"What the caller asked to be called about.","uniqueKey":"outcome.callback.oneOf.0.note.oneOf.0","typeLabel":"string"},{"type":"null","description":"What the caller asked to be called about.","uniqueKey":"outcome.callback.oneOf.0.note.oneOf.1","typeLabel":"null"}],"uniqueKey":"outcome.callback.oneOf.0.note","typeLabel":"string | null"},"assistantId":{"oneOf":[{"type":"string","description":"Assistant that will make the callback.","uniqueKey":"outcome.callback.oneOf.0.assistantId.oneOf.0","typeLabel":"string"},{"type":"null","description":"Assistant that will make the callback.","uniqueKey":"outcome.callback.oneOf.0.assistantId.oneOf.1","typeLabel":"null"}],"uniqueKey":"outcome.callback.oneOf.0.assistantId","typeLabel":"string | null"},"rescheduled":{"type":"boolean","description":"True when this moved an existing promise rather than making a new one.","uniqueKey":"outcome.callback.oneOf.0.rescheduled","typeLabel":"boolean"}},"uniqueKey":"outcome.callback.oneOf.0","typeLabel":"object"},{"type":"null","description":"The callback the assistant promised on this call, or `null` if it promised none — branch on presence, not on a boolean. Already booked in Vodex when this fires, so no follow-up GET is needed.","properties":{"id":{"oneOf":[{"type":"string","format":"uuid","description":"The `scheduled_callbacks` row, for `GET /v1/callbacks/{id}`."},{"type":"null","format":"uuid","description":"The `scheduled_callbacks` row, for `GET /v1/callbacks/{id}`."}]},"at":{"type":"string","format":"date-time","description":"When the callback is due, as an instant."},"timezone":{"oneOf":[{"type":"string","description":"IANA zone the caller was speaking in, when one was known."},{"type":"null","description":"IANA zone the caller was speaking in, when one was known."}]},"note":{"oneOf":[{"type":"string","description":"What the caller asked to be called about."},{"type":"null","description":"What the caller asked to be called about."}]},"assistantId":{"oneOf":[{"type":"string","description":"Assistant that will make the callback."},{"type":"null","description":"Assistant that will make the callback."}]},"rescheduled":{"type":"boolean","description":"True when this moved an existing promise rather than making a new one."}},"uniqueKey":"outcome.callback.oneOf.1","typeLabel":"null"}],"uniqueKey":"outcome.callback","typeLabel":"object | null"},"direction":{"type":"string","uniqueKey":"outcome.direction","typeLabel":"string"}},"uniqueKey":"outcome","typeLabel":"object"},"transcript":{"type":"array","description":"Turn-level, with offsets in seconds from the first traced event.","items":{"type":"object","properties":{"role":{"type":"string","enum":["user","agent"],"uniqueKey":"transcript.items.[INDEX].role","typeLabel":"enum\u003cstring>"},"text":{"type":"string","uniqueKey":"transcript.items.[INDEX].text","typeLabel":"string"},"at":{"type":"number","uniqueKey":"transcript.items.[INDEX].at","typeLabel":"number"},"interrupted":{"type":"boolean","uniqueKey":"transcript.items.[INDEX].interrupted","typeLabel":"boolean"}},"uniqueKey":"transcript.items.[INDEX]","typeLabel":"object"},"uniqueKey":"transcript","typeLabel":"object[]"},"analysis":{"type":"object","description":"Open envelope — additive keys only. A handler written today keeps parsing tomorrow's payloads.","properties":{"summary":{"type":"string","uniqueKey":"analysis.summary","typeLabel":"string"},"sentiment":{"type":"object","uniqueKey":"analysis.sentiment","typeLabel":"object"},"structured":{"type":"object","description":"Per-assistant extraction (design 0018).","properties":{"outcome":{"type":"object","description":"Which of the assistant's own outcomes this conversation reached. Absent when the assistant defines none, when nobody answered, and on calls that predate the feature — all ordinary, none an error.\nDistinct from the top-level `outcome` above, which is the mechanical record of how the call ended. This one is about the conversation.","properties":{"key":{"type":"string","description":"Stable across renames — group reporting on this.","uniqueKey":"analysis.structured.outcome.key","typeLabel":"string"},"name":{"type":"string","description":"The wording in force when this call was classified.","uniqueKey":"analysis.structured.outcome.name","typeLabel":"string"},"rationale":{"type":"string","description":"One sentence on what decided it.","uniqueKey":"analysis.structured.outcome.rationale","typeLabel":"string"}},"uniqueKey":"analysis.structured.outcome","typeLabel":"object"}},"uniqueKey":"analysis.structured","typeLabel":"object"}},"uniqueKey":"analysis","typeLabel":"object"},"quality":{"type":"object","properties":{"turns":{"type":"integer","uniqueKey":"quality.turns","typeLabel":"integer"},"ttfaP50Ms":{"oneOf":[{"type":"number","uniqueKey":"quality.ttfaP50Ms.oneOf.0","typeLabel":"number"},{"type":"null","uniqueKey":"quality.ttfaP50Ms.oneOf.1","typeLabel":"null"}],"uniqueKey":"quality.ttfaP50Ms","typeLabel":"number | null"},"ttfaMaxMs":{"oneOf":[{"type":"number","uniqueKey":"quality.ttfaMaxMs.oneOf.0","typeLabel":"number"},{"type":"null","uniqueKey":"quality.ttfaMaxMs.oneOf.1","typeLabel":"null"}],"uniqueKey":"quality.ttfaMaxMs","typeLabel":"number | null"},"interruptions":{"type":"integer","uniqueKey":"quality.interruptions","typeLabel":"integer"},"fallbacks":{"type":"integer","uniqueKey":"quality.fallbacks","typeLabel":"integer"}},"uniqueKey":"quality","typeLabel":"object"},"cost":{"type":"object","properties":{"totalUsd":{"oneOf":[{"type":"number","uniqueKey":"cost.totalUsd.oneOf.0","typeLabel":"number"},{"type":"null","uniqueKey":"cost.totalUsd.oneOf.1","typeLabel":"null"}],"uniqueKey":"cost.totalUsd","typeLabel":"number | null"},"breakdown":{"oneOf":[{"type":"object","description":"Absent rather than zeroed — a consumer must be able to tell \"not computed\" from \"cost nothing\".","uniqueKey":"cost.breakdown.oneOf.0","typeLabel":"object"},{"type":"null","description":"Absent rather than zeroed — a consumer must be able to tell \"not computed\" from \"cost nothing\".","uniqueKey":"cost.breakdown.oneOf.1","typeLabel":"null"}],"uniqueKey":"cost.breakdown","typeLabel":"object | null"}},"uniqueKey":"cost","typeLabel":"object"},"artifacts":{"type":"object","description":"References, never bytes — audio is resolved through the authed API when a user presses play, so it never leaves its region unbidden.","properties":{"recording":{"oneOf":[{"type":"string","example":"vodex://recordings/call-…","uniqueKey":"artifacts.recording.oneOf.0","typeLabel":"string"},{"type":"null","example":"vodex://recordings/call-…","uniqueKey":"artifacts.recording.oneOf.1","typeLabel":"null"}],"uniqueKey":"artifacts.recording","typeLabel":"string | null"},"trace":{"type":"string","example":"vodex://traces/call-…","uniqueKey":"artifacts.trace","typeLabel":"string"},"region":{"oneOf":[{"type":"string","uniqueKey":"artifacts.region.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"artifacts.region.oneOf.1","typeLabel":"null"}],"uniqueKey":"artifacts.region","typeLabel":"string | null"}},"uniqueKey":"artifacts","typeLabel":"object"},"variables":{"type":"object","additionalProperties":{"type":"string","uniqueKey":"variables.additionalProperties","typeLabel":"string"},"description":"Exactly what the agent knew, frozen at call time — the assistant's config may have changed since.","uniqueKey":"variables","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"type":"interaction.completed","id":"\u003cstring>","tenantId":"3c90c3cc-0d44-4b50-8888-8dd25736052a","contactRef":"\u003cstring>","rawAddress":"\u003cstring>","direction":"\u003cstring>","from":"\u003cstring>","to":"\u003cstring>","assistantId":"\u003cstring>","engine":"\u003cstring>","startedAt":"2023-11-07T05:31:56Z","endedAt":"2023-11-07T05:31:56Z","outcome":{"answered":true,"connectedMs":123,"error":"\u003cstring>","voicemail":{"detected":true,"confidence":0.67,"signals":["acoustic","keyword"]},"transfer":{"destination":"\u003cstring>"},"callback":{"id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","at":"2023-11-07T05:31:56Z","timezone":"\u003cstring>","note":"\u003cstring>","assistantId":"\u003cstring>","rescheduled":true},"direction":"\u003cstring>"},"transcript":[{"text":"\u003cstring>","at":123,"interrupted":true}],"analysis":{"summary":"\u003cstring>","sentiment":{},"structured":{"outcome":{"key":"\u003cstring>","name":"\u003cstring>","rationale":"\u003cstring>"}}},"quality":{"turns":123,"ttfaP50Ms":123,"ttfaMaxMs":123,"interruptions":123,"fallbacks":123},"cost":{"totalUsd":123,"breakdown":{}},"artifacts":{"recording":"vodex://recordings/call-…","trace":"vodex://traces/call-…","region":"\u003cstring>"},"variables":{}}}},"exampleType":"generated"}},"exampleType":"generated"},"responses":{"b174c7df-572a-45f4-8ef3-6473cc748cdb":{"description":"Retried — a timeout is transient.","content":{"_mintlify/placeholder":{"schema":{"type":"object","description":""}}}},"fde7123f-3a0c-46b8-afe2-173cf78f6bb6":{"description":"Retried, with the backoff below.","content":{"_mintlify/placeholder":{"schema":{"type":"object","description":""}}}},"f8007903-7cc9-49aa-ad2c-0ee8e77996e8":{"description":"Acknowledged — the delivery is settled.","content":{"_mintlify/placeholder":{"schema":{"type":"object","description":""}}}},"90ecac28-4f94-4356-8da1-74d736c5fb18":{"description":"Retried, with the backoff below.","content":{"_mintlify/placeholder":{"schema":{"type":"object","description":""}}}},"a2890cb6-17ed-43ca-a79c-2e3ccf41acab":{"description":"NOT retried. Any other 4xx is the consumer saying the request itself is wrong, and repeating it only burns the attempt budget a real outage needs.","content":{"_mintlify/placeholder":{"schema":{"type":"object","description":""}}}}},"security":{}}}}],"security":{"986b34dc-9d64-43d6-addf-8d27adc5ae4e":{"ApiKeyBearer":{"type":"http","scheme":"bearer","description":"Tenant API key (`vdx_live_…`) as `Authorization: Bearer`.","scopes":[],"schemeName":"ApiKeyBearer"}}},"servers":{"454f84ff-3690-4156-8c58-c64805db6548":{"url":"https://apiv2.vodex.ai/v1","description":"Production"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"http","scheme":"bearer","description":"Tenant API key (`vdx_live_…`) as `Authorization: Bearer`.","scopes":[],"schemeName":"ApiKeyBearer"},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"Tenant API key (`vdx_live_…`) as `Authorization: Bearer`.","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"ApiKeyBearer","name":"Authorization"}],"title":"ApiKeyBearer"}]},"originalFileLocation":"openapi/api-public-v1.yaml"},"subdomain":"vodex","siteName":"Vodex API","title":"Place an outbound call - Vodex API","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-30T16:41:44.227Z","originalFileLocation":"api-reference/calls/place-an-outbound-call.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Returns as soon as the room exists and the INVITE is on its way — it does not wait for an answer, which takes seconds. The call is recorded in the calls list from this moment, so a carrier rejection (which produces no trace at all, because no agent ever joins) is visible rather than a call that simply never rings; the outcome lands on the row. contactRef is an opaque reference of yours, echoed back on the webhook — put your own account or record id there, and the end-of-call report joins to your data without matching on a phone number. When it is the id of one of your Vodex contacts, any {{var}} the request leaves blank is filled from that contact: from a custom field with that key when it has a value, otherwise from their own field ({{first_name}}, {{postal_code}} and the rest). variables are per-call {{var}} values merged over the assistant\u0026#x27;s own, substituted into every line the assistant says — systemPrompt and firstMessage, and equally endCallMessage, silencePromptMessage, voicemail.message, the built-in tools\u0026#x27; spoken lines and each disclosure\u0026#x27;s text.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Vodex API\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/vodex/lIjSc2yqSN3yLkge/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/vodex/lIjSc2yqSN3yLkge/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/vodex/lIjSc2yqSN3yLkge/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/vodex/lIjSc2yqSN3yLkge/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/vodex/lIjSc2yqSN3yLkge/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/vodex/lIjSc2yqSN3yLkge/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/vodex/lIjSc2yqSN3yLkge/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/vodex/lIjSc2yqSN3yLkge/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/vodex/lIjSc2yqSN3yLkge/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Place an outbound call - Vodex API\">\u003cmeta data-mint-head property=\"og:description\" content=\"Returns as soon as the room exists and the INVITE is on its way — it does not wait for an answer, which takes seconds. The call is recorded in the calls list from this moment, so a carrier rejection (which produces no trace at all, because no agent ever joins) is visible rather than a call that simply never rings; the outcome lands on the row. contactRef is an opaque reference of yours, echoed back on the webhook — put your own account or record id there, and the end-of-call report joins to your data without matching on a phone number. When it is the id of one of your Vodex contacts, any {{var}} the request leaves blank is filled from that contact: from a custom field with that key when it has a value, otherwise from their own field ({{first_name}}, {{postal_code}} and the rest). variables are per-call {{var}} values merged over the assistant\u0026#x27;s own, substituted into every line the assistant says — systemPrompt and firstMessage, and equally endCallMessage, silencePromptMessage, voicemail.message, the built-in tools\u0026#x27; spoken lines and each disclosure\u0026#x27;s text.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Vodex API\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://apidocs.vodex.ai/api-reference/calls/place-an-outbound-call\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://vodex.mintlify.app/_mintlify/api/og/v2?division=Calls\u0026amp;title=Place+an+outbound+call\u0026amp;description=Returns+as+soon+as+the+room+exists+and+the+INVITE+is+on+its+way+%E2%80%94+it%0Adoes+**not**+wait+for+an+answer%2C+which+takes+seconds.+The+call+is%0Arecorded+in+the+calls+lis\u0026amp;theme=6d89815cfe9107c7cb0143e4\u0026amp;signature=dc2f5f0997752f34690207b6cc6f21ba225b38a72e3d40ef400d618b425f44aa\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Place an outbound call - Vodex API\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Returns as soon as the room exists and the INVITE is on its way — it does not wait for an answer, which takes seconds. The call is recorded in the calls list from this moment, so a carrier rejection (which produces no trace at all, because no agent ever joins) is visible rather than a call that simply never rings; the outcome lands on the row. contactRef is an opaque reference of yours, echoed back on the webhook — put your own account or record id there, and the end-of-call report joins to your data without matching on a phone number. When it is the id of one of your Vodex contacts, any {{var}} the request leaves blank is filled from that contact: from a custom field with that key when it has a value, otherwise from their own field ({{first_name}}, {{postal_code}} and the rest). variables are per-call {{var}} values merged over the assistant\u0026#x27;s own, substituted into every line the assistant says — systemPrompt and firstMessage, and equally endCallMessage, silencePromptMessage, voicemail.message, the built-in tools\u0026#x27; spoken lines and each disclosure\u0026#x27;s text.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://vodex.mintlify.app/_mintlify/api/og/v2?division=Calls\u0026amp;title=Place+an+outbound+call\u0026amp;description=Returns+as+soon+as+the+room+exists+and+the+INVITE+is+on+its+way+%E2%80%94+it%0Adoes+**not**+wait+for+an+answer%2C+which+takes+seconds.+The+call+is%0Arecorded+in+the+calls+lis\u0026amp;theme=6d89815cfe9107c7cb0143e4\u0026amp;signature=dc2f5f0997752f34690207b6cc6f21ba225b38a72e3d40ef400d618b425f44aa\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/vodex/lIjSc2yqSN3yLkge/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Vodex API\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#FF4D00\">\u003clink data-mint-head rel=\"canonical\" href=\"https://apidocs.vodex.ai/api-reference/calls/place-an-outbound-call\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/calls/place-an-outbound-call.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://apidocs.vodex.ai/#organization\",\"name\":\"Vodex API\",\"url\":\"https://apidocs.vodex.ai\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/vodex/78No6_lqTF_DicwD/logo/vodex-full.svg?fit=max\u0026auto=format\u0026n=78No6_lqTF_DicwD\u0026q=85\u0026s=abc36083e47f9332141ac1141d1cbe4a\"}},{\"@type\":\"WebSite\",\"@id\":\"https://apidocs.vodex.ai#website\",\"name\":\"Vodex API\",\"url\":\"https://apidocs.vodex.ai\",\"publisher\":{\"@id\":\"https://apidocs.vodex.ai/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://apidocs.vodex.ai/api-reference/calls/place-an-outbound-call#webpage\",\"url\":\"https://apidocs.vodex.ai/api-reference/calls/place-an-outbound-call\",\"name\":\"Place an outbound call\",\"description\":\"Returns as soon as the room exists and the INVITE is on its way — it does not wait for an answer, which takes seconds. The call is recorded in the calls list from this moment, so a carrier rejection (which produces no trace at all, because no agent ever joins) is visible rather than a call that simply never rings; the outcome lands on the row. contactRef is an opaque reference of yours, echoed back on the webhook — put your own account or record id there, and the end-of-call report joins to your data without matching on a phone number. When it is the id of one of your Vodex contacts, any {{var}} the request leaves blank is filled from that contact: from a custom field with that key when it has a value, otherwise from their own field ({{first_name}}, {{postal_code}} and the rest). variables are per-call {{var}} values merged over the assistant's own, substituted into every line the assistant says — systemPrompt and firstMessage, and equally endCallMessage, silencePromptMessage, voicemail.message, the built-in tools' spoken lines and each disclosure's text.\",\"dateModified\":\"2026-10-30T16:41:44.227Z\",\"isPartOf\":{\"@id\":\"https://apidocs.vodex.ai#website\"},\"breadcrumb\":{\"@id\":\"https://apidocs.vodex.ai/api-reference/calls/place-an-outbound-call#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://apidocs.vodex.ai/api-reference/calls/place-an-outbound-call#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Calls\",\"item\":\"https://apidocs.vodex.ai/api-reference/calls/list-calls\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Place an outbound call\",\"item\":\"https://apidocs.vodex.ai/api-reference/calls/place-an-outbound-call\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://apidocs.vodex.ai/api-reference/calls/place-an-outbound-call#apireference\",\"headline\":\"Place an outbound call\",\"name\":\"Place an outbound call\",\"description\":\"Returns as soon as the room exists and the INVITE is on its way — it does not wait for an answer, which takes seconds. The call is recorded in the calls list from this moment, so a carrier rejection (which produces no trace at all, because no agent ever joins) is visible rather than a call that simply never rings; the outcome lands on the row. contactRef is an opaque reference of yours, echoed back on the webhook — put your own account or record id there, and the end-of-call report joins to your data without matching on a phone number. When it is the id of one of your Vodex contacts, any {{var}} the request leaves blank is filled from that contact: from a custom field with that key when it has a value, otherwise from their own field ({{first_name}}, {{postal_code}} and the rest). variables are per-call {{var}} values merged over the assistant's own, substituted into every line the assistant says — systemPrompt and firstMessage, and equally endCallMessage, silencePromptMessage, voicemail.message, the built-in tools' spoken lines and each disclosure's text.\",\"url\":\"https://apidocs.vodex.ai/api-reference/calls/place-an-outbound-call\",\"mainEntityOfPage\":{\"@id\":\"https://apidocs.vodex.ai/api-reference/calls/place-an-outbound-call#webpage\"},\"dateModified\":\"2026-10-30T16:41:44.227Z\",\"publisher\":{\"@id\":\"https://apidocs.vodex.ai/#organization\"},\"isPartOf\":{\"@id\":\"https://apidocs.vodex.ai#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Vodex API\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Vodex API","nav":{"global":null,"tabs":[{"tab":"Documentation","pages":[{"title":"Documentation","href":"/introduction"}]},{"tab":"API Reference","groups":[{"group":"Assistants","pages":[{"title":"List assistants","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml get /console/assistants","href":"/api-reference/assistants/list-assistants"},{"title":"Create or replace an assistant","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml post /console/assistants","href":"/api-reference/assistants/create-or-replace-an-assistant"},{"title":"Fetch one assistant's full config","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml get /console/assistants/{id}","href":"/api-reference/assistants/fetch-one-assistants-full-config"},{"title":"Delete an assistant","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml delete /console/assistants/{id}","href":"/api-reference/assistants/delete-an-assistant"},{"title":"List this assistant's outcomes","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml get /console/assistants/{id}/outcomes","href":"/api-reference/assistants/list-this-assistants-outcomes"},{"title":"Add an outcome","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml post /console/assistants/{id}/outcomes","href":"/api-reference/assistants/add-an-outcome"},{"title":"Remove an outcome","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml delete /console/assistants/{id}/outcomes/{key}","href":"/api-reference/assistants/remove-an-outcome"},{"title":"Rename an outcome, or reword when it applies","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml patch /console/assistants/{id}/outcomes/{key}","href":"/api-reference/assistants/rename-an-outcome-or-reword-when-it-applies"},{"title":"A CSV template for the survey importer","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml get /surveys/template.csv","href":"/api-reference/assistants/a-csv-template-for-the-survey-importer"},{"title":"Parse a survey CSV without saving it","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml post /console/assistants/{id}/survey.csv/preview","href":"/api-reference/assistants/parse-a-survey-csv-without-saving-it"},{"title":"Replace the assistant's questionnaire from a CSV","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml post /console/assistants/{id}/survey.csv","href":"/api-reference/assistants/replace-the-assistants-questionnaire-from-a-csv"},{"title":"Test a custom tool","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml post /console/tools/test","href":"/api-reference/assistants/test-a-custom-tool"}]},{"group":"Console","pages":[{"title":"The model catalog","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml get /console/catalog","href":"/api-reference/console/the-model-catalog"},{"title":"List voices","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml get /console/voices","href":"/api-reference/console/list-voices"},{"title":"Mint a LiveKit token for a web call","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml post /console/token","href":"/api-reference/console/mint-a-livekit-token-for-a-web-call"}]},{"group":"Usage","pages":[{"title":"Minute usage this period","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml get /usage","href":"/api-reference/usage/minute-usage-this-period"}]},{"group":"Calls","pages":[{"title":"List calls","description":"Newest first. In DB mode the `calls` table is the index — one query, no\ntrace parsing — and trace ingest happens off the request path, except\nfor rows **on this page** that are still missing a trace, which are\nfetched inline so a call that just ended shows its turns now rather than\non whichever refresh lands after the next tick.\n\n`number` is always the **counterparty** (for callers predating the\nfrom/to split). `durationMs` is answer-to-hangup. `error` carries\nthe carrier's own words — \"503 Payment Required\" is the difference\nbetween a fixable problem and a silent one.\n\nEvery filter narrows the list and they combine. List filters take a\ncomma-separated value (`status=no_answer,busy`) or a repeated key\n(`status=no_answer\u0026status=busy`). A value the route does\nnot recognise is dropped rather than refused, so a stale link shows a\nwider list instead of an error. Without a database the list is read\nfrom trace files, and only `q`, `from`, `to` and `direction` apply.\n","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml get /calls","href":"/api-reference/calls/list-calls"},{"title":"Place an outbound call","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml post /calls","href":"/api-reference/calls/place-an-outbound-call"},{"title":"Fetch a call with its trace","description":"The row facts plus the call's full event trace, in one response.\n\nThe trace is fetched for **this** call if it has not synced yet, rather\nthan waiting on the throttled bulk poll.\n\nA call with no trace is not a `404`: a call that failed before an agent\njoined never wrote one, and that is exactly the row that needs\nexplaining — it returns the row fields with `events: []`.\n\nOwnership is checked after ingest, and always answers `404`: another\ntenant's call id must be indistinguishable from one that does not exist.\n","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml get /calls/{id}","href":"/api-reference/calls/fetch-a-call-with-its-trace"},{"title":"Stream a call recording","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml get /recordings/{id}","href":"/api-reference/calls/stream-a-call-recording"}]},{"group":"Phone Numbers","pages":[{"title":"List numbers","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml get /phone-numbers","href":"/api-reference/phone-numbers/list-numbers"},{"title":"Add a number","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml post /phone-numbers","href":"/api-reference/phone-numbers/add-a-number"},{"title":"Remove a number","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml delete /phone-numbers/{id}","href":"/api-reference/phone-numbers/remove-a-number"},{"title":"Reassign or relabel a number","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml patch /phone-numbers/{id}","href":"/api-reference/phone-numbers/reassign-or-relabel-a-number"}]},{"group":"SIP Trunks","pages":[{"title":"List BYO SIP trunks","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml get /sip-trunks","href":"/api-reference/sip-trunks/list-byo-sip-trunks"},{"title":"Create a BYO SIP trunk","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml post /sip-trunks","href":"/api-reference/sip-trunks/create-a-byo-sip-trunk"},{"title":"Delete a trunk","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml delete /sip-trunks/{id}","href":"/api-reference/sip-trunks/delete-a-trunk"},{"title":"Update a SIP trunk","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml patch /sip-trunks/{id}","href":"/api-reference/sip-trunks/update-a-sip-trunk"},{"title":"Rotate trunk credentials","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml post /sip-trunks/{id}/rotate","href":"/api-reference/sip-trunks/rotate-trunk-credentials"}]},{"group":"Carriers","pages":[{"title":"The carrier registry","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml get /carriers","href":"/api-reference/carriers/the-carrier-registry"}]},{"group":"Integrations","pages":[{"title":"List connected carrier accounts","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml get /integrations","href":"/api-reference/integrations/list-connected-carrier-accounts"},{"title":"Connect a carrier account","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml post /integrations","href":"/api-reference/integrations/connect-a-carrier-account"},{"title":"One integration, with its numbers","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml get /integrations/{id}","href":"/api-reference/integrations/one-integration-with-its-numbers"},{"title":"Disconnect","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml delete /integrations/{id}","href":"/api-reference/integrations/disconnect"},{"title":"Replace integration credentials","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml post /integrations/{id}/credentials","href":"/api-reference/integrations/replace-integration-credentials"},{"title":"Change how a gateway is dialed","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml post /integrations/{id}/gateway","href":"/api-reference/integrations/change-how-a-gateway-is-dialed"},{"title":"List available numbers","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml get /integrations/{id}/available-numbers","href":"/api-reference/integrations/list-available-numbers"},{"title":"Add numbers to an integration","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml post /integrations/{id}/numbers","href":"/api-reference/integrations/add-numbers-to-an-integration"}]},{"group":"Batches","pages":[{"title":"List batches","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml get /batches","href":"/api-reference/batches/list-batches"},{"title":"Create a batch","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml post /batches","href":"/api-reference/batches/create-a-batch"},{"title":"Fetch a batch","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml get /batches/{id}","href":"/api-reference/batches/fetch-a-batch"},{"title":"List rows","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml get /batches/{id}/rows","href":"/api-reference/batches/list-rows"},{"title":"Append rows","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml post /batches/{id}/rows","href":"/api-reference/batches/append-rows"},{"title":"Check a CSV before creating anything","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml post /batches/rows.csv/preview","href":"/api-reference/batches/check-a-csv-before-creating-anything"},{"title":"Append rows from a CSV","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml post /batches/{id}/rows.csv","href":"/api-reference/batches/append-rows-from-a-csv"},{"title":"Cancel one row","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml delete /batches/{id}/rows/{rowId}","href":"/api-reference/batches/cancel-one-row"},{"title":"Pause a running batch","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml post /batches/{id}/pause","href":"/api-reference/batches/pause-a-running-batch"},{"title":"Resume a paused batch","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml post /batches/{id}/resume","href":"/api-reference/batches/resume-a-paused-batch"},{"title":"Cancel a batch","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml post /batches/{id}/cancel","href":"/api-reference/batches/cancel-a-batch"},{"title":"Requeue rows as a new run","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml post /batches/{id}/restart","href":"/api-reference/batches/requeue-rows-as-a-new-run"},{"title":"The block plan","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml get /batches/{id}/blocks","href":"/api-reference/batches/the-block-plan"},{"title":"Resize a block","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml patch /batches/{id}/blocks/{blockNo}","href":"/api-reference/batches/resize-a-block"},{"title":"Dial the next block","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml post /batches/{id}/blocks/next","href":"/api-reference/batches/dial-the-next-block"},{"title":"List dial attempts","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml get /batches/{id}/attempts","href":"/api-reference/batches/list-dial-attempts"}]},{"group":"Callbacks","pages":[{"title":"List callbacks","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml get /callbacks","href":"/api-reference/callbacks/list-callbacks"},{"title":"One callback","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml get /callbacks/{id}","href":"/api-reference/callbacks/one-callback"},{"title":"Update a callback","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml patch /callbacks/{id}","href":"/api-reference/callbacks/update-a-callback"},{"title":"Let campaigns call a number again","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml post /callbacks/{id}/release","href":"/api-reference/callbacks/let-campaigns-call-a-number-again"}]},{"group":"Reports","pages":[{"title":"List reports","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml get /reports","href":"/api-reference/reports/list-reports"},{"title":"Create a report","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml post /reports","href":"/api-reference/reports/create-a-report"},{"title":"One report","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml get /reports/{id}","href":"/api-reference/reports/one-report"},{"title":"Delete a report","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml delete /reports/{id}","href":"/api-reference/reports/delete-a-report"},{"title":"Update a report","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml patch /reports/{id}","href":"/api-reference/reports/update-a-report"}]},{"group":"Number Rotation","pages":[{"title":"Per-number spacing, caps, and cooldown","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml get /number-rotation","href":"/api-reference/number-rotation/per-number-spacing-caps-and-cooldown"},{"title":"Set rotation for one number","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml put /number-rotation/{e164}","href":"/api-reference/number-rotation/set-rotation-for-one-number"}]},{"group":"Payments","pages":[{"title":"List payment attempts","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml get /payments","href":"/api-reference/payments/list-payment-attempts"},{"title":"Get a payment attempt","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml get /payments/{id}","href":"/api-reference/payments/get-a-payment-attempt"},{"title":"The workspace's payment carrier","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml get /payment-carriers/twilio-stripe","href":"/api-reference/payments/the-workspaces-payment-carrier"},{"title":"Set up or change the payment carrier","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml put /payment-carriers/twilio-stripe","href":"/api-reference/payments/set-up-or-change-the-payment-carrier"},{"title":"Remove the payment carrier","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml delete /payment-carriers/twilio-stripe","href":"/api-reference/payments/remove-the-payment-carrier"},{"title":"Numbers in the Twilio account that could be Pay numbers","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml get /payment-carriers/twilio-stripe/available-numbers","href":"/api-reference/payments/numbers-in-the-twilio-account-that-could-be-pay-numbers"},{"title":"Choose the workspace's Pay numbers","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml put /payment-carriers/twilio-stripe/numbers","href":"/api-reference/payments/choose-the-workspaces-pay-numbers"},{"title":"Point a Pay number at the payment webhook","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml post /payment-carriers/twilio-stripe/numbers/{e164}/webhook","href":"/api-reference/payments/point-a-pay-number-at-the-payment-webhook"}]},{"group":"SMS","pages":[{"title":"SMS provider capabilities","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml get /sms/capabilities","href":"/api-reference/sms/sms-provider-capabilities"},{"title":"Store provider credentials","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml put /sms/providers/{provider}","href":"/api-reference/sms/store-provider-credentials"},{"title":"Remove provider credentials","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml delete /sms/providers/{provider}","href":"/api-reference/sms/remove-provider-credentials"},{"title":"List SMS configurations","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml get /sms/configurations","href":"/api-reference/sms/list-sms-configurations"},{"title":"Create an SMS configuration","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml post /sms/configurations","href":"/api-reference/sms/create-an-sms-configuration"},{"title":"Delete an SMS configuration","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml delete /sms/configurations/{id}","href":"/api-reference/sms/delete-an-sms-configuration"},{"title":"Update an SMS configuration","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml patch /sms/configurations/{id}","href":"/api-reference/sms/update-an-sms-configuration"},{"title":"List SMS senders","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml get /sms/senders","href":"/api-reference/sms/list-sms-senders"},{"title":"Provider content templates","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml get /sms/templates","href":"/api-reference/sms/provider-content-templates"},{"title":"Render exactly what a send would produce","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml post /sms/preview","href":"/api-reference/sms/render-exactly-what-a-send-would-produce"},{"title":"Send an SMS","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml post /sms","href":"/api-reference/sms/send-an-sms"},{"title":"Message log","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml get /sms/messages","href":"/api-reference/sms/message-log"}]},{"group":"Webhooks","pages":[{"title":"Read the tenant's webhook endpoint","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml get /webhook-config","href":"/api-reference/webhooks/read-the-tenants-webhook-endpoint"},{"title":"Set the webhook endpoint","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml put /webhook-config","href":"/api-reference/webhooks/set-the-webhook-endpoint"},{"title":"Stop deliveries","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml delete /webhook-config","href":"/api-reference/webhooks/stop-deliveries"},{"title":"Rotate the signing secret","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml post /signing-secret/rotate","href":"/api-reference/webhooks/rotate-the-signing-secret"},{"title":"Rotate the signing secret (alias)","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml post /webhook-config/rotate-secret","href":"/api-reference/webhooks/rotate-the-signing-secret-alias"},{"title":"Delivery records","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml get /webhook-deliveries","href":"/api-reference/webhooks/delivery-records"},{"title":"Fetch a delivery","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml get /webhook-deliveries/{id}","href":"/api-reference/webhooks/fetch-a-delivery"},{"title":"Resend a delivery","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml post /webhook-deliveries/{id}/resend","href":"/api-reference/webhooks/resend-a-delivery"}]},{"group":"Tenants","pages":[{"title":"Read this customer's retention period","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml get /retention","href":"/api-reference/tenants/read-this-customers-retention-period"},{"title":"Set this customer's retention period","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml put /retention","href":"/api-reference/tenants/set-this-customers-retention-period"},{"title":"Read recording retention","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml get /tenants/retention","href":"/api-reference/tenants/read-recording-retention"},{"title":"Set this tenant's recording retention","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml put /tenants/{id}/retention","href":"/api-reference/tenants/set-this-tenants-recording-retention"},{"title":"Fall back to the bucket default","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml delete /tenants/{id}/retention","href":"/api-reference/tenants/fall-back-to-the-bucket-default"}]},{"group":"Contacts","pages":[{"title":"List contacts","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml get /contacts/accounts","href":"/api-reference/contacts/list-contacts"},{"title":"Create a contact","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml post /contacts/accounts","href":"/api-reference/contacts/create-a-contact"},{"title":"Fetch one contact","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml get /contacts/accounts/{id}","href":"/api-reference/contacts/fetch-one-contact"},{"title":"Delete a contact","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml delete /contacts/accounts/{id}","href":"/api-reference/contacts/delete-a-contact"},{"title":"Update a contact","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml patch /contacts/accounts/{id}","href":"/api-reference/contacts/update-a-contact"},{"title":"Delete many contacts at once","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml post /contacts/accounts/bulk-delete","href":"/api-reference/contacts/delete-many-contacts-at-once"},{"title":"Add a phone number or email to a contact","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml post /contacts/accounts/{id}/channels","href":"/api-reference/contacts/add-a-phone-number-or-email-to-a-contact"},{"title":"Remove a channel","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml delete /contacts/accounts/{id}/channels/{channelId}","href":"/api-reference/contacts/remove-a-channel"},{"title":"Update a channel","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml patch /contacts/accounts/{id}/channels/{channelId}","href":"/api-reference/contacts/update-a-channel"},{"title":"Everything that has happened to this contact","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml get /contacts/accounts/{id}/timeline","href":"/api-reference/contacts/everything-that-has-happened-to-this-contact"},{"title":"Consent, local time, and attempt counts","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml get /contacts/accounts/{id}/compliance","href":"/api-reference/contacts/consent-local-time-and-attempt-counts"},{"title":"Record the consent basis","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml put /contacts/accounts/{id}/compliance","href":"/api-reference/contacts/record-the-consent-basis"},{"title":"List custom attribute definitions","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml get /contacts/attributes","href":"/api-reference/contacts/list-custom-attribute-definitions"},{"title":"Define a custom attribute","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml post /contacts/attributes","href":"/api-reference/contacts/define-a-custom-attribute"},{"title":"Delete an attribute definition","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml delete /contacts/attributes/{id}","href":"/api-reference/contacts/delete-an-attribute-definition"},{"title":"Rename, re-option, or archive an attribute","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml patch /contacts/attributes/{id}","href":"/api-reference/contacts/rename-re-option-or-archive-an-attribute"},{"title":"List a contact's files","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml get /contacts/accounts/{id}/files","href":"/api-reference/contacts/list-a-contacts-files"},{"title":"Attach a file to a contact","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml post /contacts/accounts/{id}/files","href":"/api-reference/contacts/attach-a-file-to-a-contact"},{"title":"Download a file","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml get /contacts/files/{fileId}","href":"/api-reference/contacts/download-a-file"},{"title":"Delete a file","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml delete /contacts/files/{fileId}","href":"/api-reference/contacts/delete-a-file"},{"title":"Past imports","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml get /contacts/imports","href":"/api-reference/contacts/past-imports"},{"title":"Import contacts from a CSV","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml post /contacts/imports","href":"/api-reference/contacts/import-contacts-from-a-csv"},{"title":"A CSV template with the recognised headers","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml get /contacts/imports/template","href":"/api-reference/contacts/a-csv-template-with-the-recognised-headers"},{"title":"One import's receipt","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml get /contacts/imports/{id}","href":"/api-reference/contacts/one-imports-receipt"},{"title":"Tenant contact settings","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml get /contacts/settings","href":"/api-reference/contacts/tenant-contact-settings"},{"title":"Choose which detail tabs to show, and in what order","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml put /contacts/settings","href":"/api-reference/contacts/choose-which-detail-tabs-to-show-and-in-what-order"},{"title":"The tab registry, and which are enabled","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml get /contacts/tabs","href":"/api-reference/contacts/the-tab-registry-and-which-are-enabled"}]},{"group":"Do Not Contact","pages":[{"title":"The suppression list","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml get /contacts/dnc","href":"/api-reference/do-not-contact/the-suppression-list"},{"title":"Suppress one address","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml post /contacts/dnc","href":"/api-reference/do-not-contact/suppress-one-address"},{"title":"Ask whether addresses are suppressed","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml post /contacts/dnc/check","href":"/api-reference/do-not-contact/ask-whether-addresses-are-suppressed"},{"title":"Upload a suppression list","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml post /contacts/dnc/import","href":"/api-reference/do-not-contact/upload-a-suppression-list"},{"title":"Lift a suppression","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml delete /contacts/dnc/{id}","href":"/api-reference/do-not-contact/lift-a-suppression"},{"title":"Correct an entry's value or reason","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml patch /contacts/dnc/{id}","href":"/api-reference/do-not-contact/correct-an-entrys-value-or-reason"},{"title":"The person-level decision, and which of their addresses are suppressed","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml get /contacts/accounts/{id}/dnc","href":"/api-reference/do-not-contact/the-person-level-decision-and-which-of-their-addresses-are-suppressed"},{"title":"Mark a person do-not-contact, or clear it","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml put /contacts/accounts/{id}/dnc","href":"/api-reference/do-not-contact/mark-a-person-do-not-contact-or-clear-it"}]},{"group":"Audiences","pages":[{"title":"List audiences","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml get /contacts/audiences","href":"/api-reference/audiences/list-audiences"},{"title":"Save a filter as an audience","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml post /contacts/audiences","href":"/api-reference/audiences/save-a-filter-as-an-audience"},{"title":"The fields a filter may reach, and their comparators","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml get /contacts/audiences/fields","href":"/api-reference/audiences/the-fields-a-filter-may-reach-and-their-comparators"},{"title":"Count and sample who a filter matches","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml post /contacts/audiences/preview","href":"/api-reference/audiences/count-and-sample-who-a-filter-matches"},{"title":"Fetch one audience","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml get /contacts/audiences/{id}","href":"/api-reference/audiences/fetch-one-audience"},{"title":"Delete an audience","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml delete /contacts/audiences/{id}","href":"/api-reference/audiences/delete-an-audience"},{"title":"Rename an audience or change its filter","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml patch /contacts/audiences/{id}","href":"/api-reference/audiences/rename-an-audience-or-change-its-filter"},{"title":"Who is in an audience right now","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml get /contacts/audiences/{id}/members","href":"/api-reference/audiences/who-is-in-an-audience-right-now"}]},{"group":"Campaigns","pages":[{"title":"List campaigns","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml get /contacts/campaigns","href":"/api-reference/campaigns/list-campaigns"},{"title":"Create a campaign","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml post /contacts/campaigns","href":"/api-reference/campaigns/create-a-campaign"},{"title":"What a prompt variable can be filled from","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml get /contacts/campaigns/variable-sources","href":"/api-reference/campaigns/what-a-prompt-variable-can-be-filled-from"},{"title":"The source each prompt variable name-matches to","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml post /contacts/campaigns/resolve-variables","href":"/api-reference/campaigns/the-source-each-prompt-variable-name-matches-to"},{"title":"Delete many campaigns at once","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml post /contacts/campaigns/bulk-delete","href":"/api-reference/campaigns/delete-many-campaigns-at-once"},{"title":"Fetch one campaign","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml get /contacts/campaigns/{id}","href":"/api-reference/campaigns/fetch-one-campaign"},{"title":"Delete a campaign","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml delete /contacts/campaigns/{id}","href":"/api-reference/campaigns/delete-a-campaign"},{"title":"Edit a campaign that has not launched","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml patch /contacts/campaigns/{id}","href":"/api-reference/campaigns/edit-a-campaign-that-has-not-launched"},{"title":"Change a running campaign, safely","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml patch /contacts/campaigns/{id}/live","href":"/api-reference/campaigns/change-a-running-campaign-safely"},{"title":"Turn the audience into calls","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml post /contacts/campaigns/{id}/launch","href":"/api-reference/campaigns/turn-the-audience-into-calls"},{"title":"Dial the next block","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml post /contacts/campaigns/{id}/runs/next","href":"/api-reference/campaigns/dial-the-next-block"},{"title":"Pause a running campaign","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml post /contacts/campaigns/{id}/pause","href":"/api-reference/campaigns/pause-a-running-campaign"},{"title":"Resume a paused campaign","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml post /contacts/campaigns/{id}/resume","href":"/api-reference/campaigns/resume-a-paused-campaign"},{"title":"Stop a campaign for good","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml post /contacts/campaigns/{id}/stop","href":"/api-reference/campaigns/stop-a-campaign-for-good"}]}]}]},"basePath":"","title":"Place an outbound call - Vodex API","buildId":"dpl_DeHjVRGfFnhYQwHnfC2pjeXXv8h9","deploymentId":"dpl_DeHjVRGfFnhYQwHnfC2pjeXXv8h9","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-CS552b7R.js","utils-DDTCYAF2.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-De8ttokP.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-DrwRDvAh.js","snippetPresets-DtAN0nWx.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","ApiExamples-D5rWArI6.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-O2i12wsz.js","shallow-DV8xABTt.js","getApiPlaygroundDisplay-DBZ0B5Jx.js","CodeSnippet-BVi0tPUX.js","CodeSnippets-CqASbIwY.js","Page-m07pfKpT.js","getPastedJson-DG9vsMS8.js","icon-CXzRSCr8.js","MethodPill-BdKVtEuX.js","DuplicateIcon-CZlmBrJI.js","createIcon-biFEUKPL.js","DynamicMarkdown-B54_zNBF.js","SectionHeading-DwwHK3Pt.js","axios-vUo_bRtp.js","Markdown-DfhCTwyA.js","clsx-xpJZXxdP.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-BTZUMDnx.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-DqdKa2R4.js"]}