Credentials are validated against the carrier first — a saved
integration always means “these credentials worked”. One account, one
integration, owning one SIP trunk; numbers are added to it over time.
The body is carrier-shaped: GET /v1/carriers names the required fields
per carrier. Twilio takes an API key pair or an account SID plus auth
token and is provisioned through its API; Exotel and Vobiz are
configured in the carrier’s portal and hand back a termination URI plus
credentials; pronto_connects is a messaging-only carrier with no trunk
and no numbers.
Credentials go to Secret Manager; only a reference and a non-reversible
fingerprint are kept here.
SIP gateway only. direct dials the gateway by IP. register has the
cell's SIP relay register to the system as a device or extension and
bridge calls both ways — for cloud UCaaS such as RingCentral and for a
PBX behind a vendor relay such as Yeastar's Remote Access Service.
registrar (the system registers to Vodex) is reserved and refused
until it ships. register needs Secret Manager behind the API.
register only, with the one-identity form: the calls that identity can carry at once (its extension's concurrent-call setting, a UCaaS device's fixed limit).
{"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/integrations/connect-a-carrier-account","slug":"/api-reference/integrations/connect-a-carrier-account","pageMetadata":{"title":"Connect a carrier account","description":"Credentials are **validated against the carrier first** — a saved\nintegration always means \"these credentials worked\". One account, one\nintegration, owning one SIP trunk; numbers are added to it over time.\n\nThe body is carrier-shaped: `GET /v1/carriers` names the required fields\nper carrier. Twilio takes an API key pair or an account SID plus auth\ntoken and is provisioned through its API; Exotel and Vobiz are\nconfigured in the carrier's portal and hand back a termination URI plus\ncredentials; `pronto_connects` is a messaging-only carrier with no trunk\nand no numbers.\n\nCredentials go to Secret Manager; only a reference and a non-reversible\nfingerprint are kept here.\n","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml post /integrations","href":"/api-reference/integrations/connect-a-carrier-account","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: [\"Credentials are \", _jsx(_components.strong, {\n children: \"validated against the carrier first\"\n }), \" — a saved\\nintegration always means “these credentials worked”. One account, one\\nintegration, owning one SIP trunk; numbers are added to it over time.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"The body is carrier-shaped: \", _jsx(_components.code, {\n children: \"GET /v1/carriers\"\n }), \" names the required fields\\nper carrier. Twilio takes an API key pair or an account SID plus auth\\ntoken and is provisioned through its API; Exotel and Vobiz are\\nconfigured in the carrier’s portal and hand back a termination URI plus\\ncredentials; \", _jsx(_components.code, {\n children: \"pronto_connects\"\n }), \" is a messaging-only carrier with no trunk\\nand no numbers.\"]\n }), \"\\n\", _jsx(_components.p, {\n children: \"Credentials go to Secret Manager; only a reference and a non-reversible\\nfingerprint are kept here.\"\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":"Connect a carrier account","description":"Credentials are **validated against the carrier first** — a saved\nintegration always means \"these credentials worked\". One account, one\nintegration, owning one SIP trunk; numbers are added to it over time.\n\nThe body is carrier-shaped: `GET /v1/carriers` names the required fields\nper carrier. Twilio takes an API key pair or an account SID plus auth\ntoken and is provisioned through its API; Exotel and Vobiz are\nconfigured in the carrier's portal and hand back a termination URI plus\ncredentials; `pronto_connects` is a messaging-only carrier with no trunk\nand no numbers.\n\nCredentials go to Secret Manager; only a reference and a non-reversible\nfingerprint are kept here.\n","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml post /integrations","href":"/api-reference/integrations/connect-a-carrier-account","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"operationId":"createIntegration","tags":["Integrations"],"summary":"Connect a carrier account","description":"Credentials are **validated against the carrier first** — a saved\nintegration always means \"these credentials worked\". One account, one\nintegration, owning one SIP trunk; numbers are added to it over time.\n\nThe body is carrier-shaped: `GET /v1/carriers` names the required fields\nper carrier. Twilio takes an API key pair or an account SID plus auth\ntoken and is provisioned through its API; Exotel and Vobiz are\nconfigured in the carrier's portal and hand back a termination URI plus\ncredentials; `pronto_connects` is a messaging-only carrier with no trunk\nand no numbers.\n\nCredentials go to Secret Manager; only a reference and a non-reversible\nfingerprint are kept here.\n","requestBody":"949e19f6-16bb-4f00-b424-e1266d7be3f5","responses":{"200":"69f1c607-e7bb-43fd-bacf-d82cf454351c","400":"a278478b-9245-480e-831b-35d7b08391ff","409":"f420f006-f6b8-4a32-87c1-ca147c195fff","502":"ea1f34fa-c336-46ff-a5f1-d5705a284dff"},"method":"post","type":"path","servers":["454f84ff-3690-4156-8c58-c64805db6548"],"security":["986b34dc-9d64-43d6-addf-8d27adc5ae4e"],"path":"/integrations","baseUrlOptions":["https://apiv2.vodex.ai/v1"],"title":"Connect a carrier account","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["carrier"],"properties":{"carrier":{"type":"string","enum":["twilio","vonage","exotel","vobiz","sip-gateway","pronto_connects"],"isRequired":true,"uniqueKey":"carrier","typeLabel":"enum\u003cstring>"},"name":{"type":"string","uniqueKey":"name","typeLabel":"string"},"accountSid":{"type":"string","description":"Twilio.","uniqueKey":"accountSid","typeLabel":"string"},"apiKeySid":{"type":"string","description":"Twilio.","uniqueKey":"apiKeySid","typeLabel":"string"},"apiKeySecret":{"type":"string","format":"password","description":"Twilio.","uniqueKey":"apiKeySecret","typeLabel":"string\u003cpassword>"},"authToken":{"type":"string","format":"password","description":"Twilio — alternative to the key pair.","uniqueKey":"authToken","typeLabel":"string\u003cpassword>"},"apiKey":{"type":"string","description":"Vonage / Pronto.","uniqueKey":"apiKey","typeLabel":"string"},"apiSecret":{"type":"string","format":"password","description":"Vonage.","uniqueKey":"apiSecret","typeLabel":"string\u003cpassword>"},"terminationUri":{"type":"string","description":"Manually provisioned carriers.","uniqueKey":"terminationUri","typeLabel":"string"},"authUsername":{"type":"string","uniqueKey":"authUsername","typeLabel":"string"},"authPassword":{"type":"string","format":"password","uniqueKey":"authPassword","typeLabel":"string\u003cpassword>"},"allowedIps":{"type":"array","items":{"type":"string","uniqueKey":"allowedIps.items.[INDEX]","typeLabel":"string"},"uniqueKey":"allowedIps","typeLabel":"string[]"},"port":{"type":"integer","minimum":1,"maximum":65535,"description":"SIP gateway — omit for the SIP default.","uniqueKey":"port","typeLabel":"integer"},"transport":{"type":"string","enum":["udp","tcp","tls"],"description":"SIP gateway — omit to let the media layer choose.","uniqueKey":"transport","typeLabel":"enum\u003cstring>"},"dialRules":{"type":"array","maxItems":10,"items":{"type":"object","description":"How a gateway wants a destination written. A leading `match` on the E.164\nnumber becomes `replace`; the longest match wins; an unmatched number is\ndialed as is. `+971 → 0` dials a UAE number nationally, `+ → 00` everything\nelse internationally. `replace` is digits, optionally ending in `+`: a PBX\nthat seizes a line with a digit and then takes E.164 is `+ → 6+`. Records\nstay E.164. A gateway's `callerIdRules` apply the same rewrite to our caller ID.\n","required":["match","replace"],"properties":{"match":{"type":"string","pattern":"^\\+[0-9]{0,15}$","example":"+971","isRequired":true,"uniqueKey":"dialRules.items.[INDEX].match","typeLabel":"string"},"replace":{"type":"string","pattern":"^[0-9]{0,10}\\+?$","example":"0","isRequired":true,"uniqueKey":"dialRules.items.[INDEX].replace","typeLabel":"string"}},"uniqueKey":"dialRules.items.[INDEX]","typeLabel":"object"},"description":"SIP gateway: how the destination is written for the gateway, as `POST /v1/integrations/{id}/gateway` takes them.","uniqueKey":"dialRules","typeLabel":"object[]"},"connection":{"type":"string","enum":["direct","register","registrar"],"default":"direct","description":"SIP gateway only. `direct` dials the gateway by IP. `register` has the\ncell's SIP relay register to the system as a device or extension and\nbridge calls both ways — for cloud UCaaS such as RingCentral and for a\nPBX behind a vendor relay such as Yeastar's Remote Access Service.\n`registrar` (the system registers to Vodex) is reserved and refused\nuntil it ships. `register` needs Secret Manager behind the API.\n","uniqueKey":"connection","typeLabel":"enum\u003cstring>"},"preset":{"type":"string","description":"register only: the vendor preset that fills `register` (yeastar-ras, ringcentral, generic-pbx, generic-carrier). `GET /v1/carriers` lists them.","uniqueKey":"preset","typeLabel":"string"},"authId":{"type":"string","description":"register only: the authorization id, where the vendor issues one distinct from the user name (RingCentral).","uniqueKey":"authId","typeLabel":"string"},"outboundProxy":{"type":"string","description":"register only: the vendor's regional proxy, where it routes through one (sip20.ringcentral.com:5096).","uniqueKey":"outboundProxy","typeLabel":"string"},"register":{"type":"object","description":"register only: overrides to the preset's values; omitted fields take the preset's.","properties":{"server":{"type":"string","description":"The registrar host; the gateway address.","uniqueKey":"register.server","typeLabel":"string"},"port":{"type":"integer","minimum":1,"maximum":65535,"uniqueKey":"register.port","typeLabel":"integer"},"transport":{"type":"string","enum":["udp","tcp","tls"],"uniqueKey":"register.transport","typeLabel":"enum\u003cstring>"},"outboundProxy":{"type":"string","description":"The vendor's regional proxy, where it routes through one.","uniqueKey":"register.outboundProxy","typeLabel":"string"},"srtp":{"type":"string","enum":["none","optional","required"],"uniqueKey":"register.srtp","typeLabel":"enum\u003cstring>"},"expiry":{"type":"integer","minimum":60,"maximum":300,"description":"Registration expiry in seconds — the shortest the vendor allows, since a dead relay keeps receiving inbound until it lapses.","uniqueKey":"register.expiry","typeLabel":"integer"},"qualify":{"type":"integer","enum":[0,60],"description":"OPTIONS keepalive interval; 0 for a vendor relay that refuses OPTIONS.","uniqueKey":"register.qualify","typeLabel":"enum\u003cinteger>"},"line":{"type":"boolean","description":"Add `;line=` to the Contact so inbound INVITEs match the registration.","uniqueKey":"register.line","typeLabel":"boolean"},"pinHost":{"type":"boolean","description":"Resolve the registrar once and pin it, so every INVITE rides the connection the REGISTER opened. Defeats SRV failover; off unless the vendor needs it.","uniqueKey":"register.pinHost","typeLabel":"boolean"},"tlsVerify":{"type":"object","properties":{"verify":{"type":"boolean","uniqueKey":"register.tlsVerify.verify","typeLabel":"boolean"},"wildcard":{"type":"boolean","uniqueKey":"register.tlsVerify.wildcard","typeLabel":"boolean"},"fingerprint":{"type":"string","description":"SHA-256 fingerprint of a self-signed certificate to accept instead of the CA bundle.","uniqueKey":"register.tlsVerify.fingerprint","typeLabel":"string"}},"uniqueKey":"register.tlsVerify","typeLabel":"object"}},"uniqueKey":"register","typeLabel":"object"},"identities":{"type":"array","maxItems":20,"items":{"type":"object","description":"One identity the relay registers as. The password is write-only and goes to Secret Manager.","required":["username"],"properties":{"username":{"type":"string","example":"1910","pattern":"^[A-Za-z0-9._+@-]{1,128}$","description":"Letters, digits and . _ + @ - only.","isRequired":true,"uniqueKey":"identities.items.[INDEX].username","typeLabel":"string"},"password":{"type":"string","format":"password","maxLength":256,"description":"Required for a new identity; optional when editing one that exists. No line breaks or control characters, and no leading or trailing space.","uniqueKey":"identities.items.[INDEX].password","typeLabel":"string\u003cpassword>"},"authUsername":{"type":"string","pattern":"^[A-Za-z0-9._+@-]{1,128}$","description":"The authorization id, where the vendor issues one distinct from the user name.","uniqueKey":"identities.items.[INDEX].authUsername","typeLabel":"string"},"fromUser":{"type":"string","pattern":"^[A-Za-z0-9._+@-]{0,128}$","description":"The From user on outbound INVITEs; defaults to `username`. Omit to keep the stored value; send an empty string to clear it.","uniqueKey":"identities.items.[INDEX].fromUser","typeLabel":"string"},"maxConcurrent":{"type":"integer","minimum":1,"maximum":100,"default":1,"description":"Calls this identity can carry at once, as the far side enforces it.","uniqueKey":"identities.items.[INDEX].maxConcurrent","typeLabel":"integer"}},"uniqueKey":"identities.items.[INDEX]","typeLabel":"object"},"description":"register only: the identities the relay registers. Omitted, `authUsername`/`authPassword` (and `authId`) are the one identity.","uniqueKey":"identities","typeLabel":"object[]"},"maxConcurrent":{"type":"integer","minimum":1,"maximum":100,"description":"register only, with the one-identity form: the calls that identity can carry at once (its extension's concurrent-call setting, a UCaaS device's fixed limit).","uniqueKey":"maxConcurrent","typeLabel":"integer"},"inboundNumber":{"type":"string","description":"register only: the Vodex number an inbound call through the identity is presented as. Defaults to the gateway's first number.","uniqueKey":"inboundNumber","typeLabel":"string"},"inboundRules":{"type":"array","maxItems":10,"items":{"type":"object","description":"How the caller a registered system delivers is normalized, applied with\nthe same longest-match rule as `DialRule` in the other direction: a\nleading `match` (digits) becomes `replace` (`+` and digits). `0 → +971`\nand `00 → +` turn 0586582538 into +971586582538. A caller already in\nE.164, and a caller no rule matches (a desk-phone extension dialling the\nassistant), pass through unchanged — so a call record's caller is not\nalways E.164 on a registered gateway.\n","required":["match","replace"],"properties":{"match":{"type":"string","pattern":"^[0-9]{1,15}$","example":"0","isRequired":true,"uniqueKey":"inboundRules.items.[INDEX].match","typeLabel":"string"},"replace":{"type":"string","pattern":"^\\+?[0-9]{0,15}$","example":"+971","isRequired":true,"uniqueKey":"inboundRules.items.[INDEX].replace","typeLabel":"string"}},"uniqueKey":"inboundRules.items.[INDEX]","typeLabel":"object"},"description":"register only: how the caller the system delivers is normalized.","uniqueKey":"inboundRules","typeLabel":"object[]"},"accountId":{"type":"string","description":"Pronto.","uniqueKey":"accountId","typeLabel":"string"},"campaignId":{"type":"string","description":"Pronto.","uniqueKey":"campaignId","typeLabel":"string"},"from":{"type":"string","description":"Pronto default sender (E.164).","uniqueKey":"from","typeLabel":"string"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"name":"\u003cstring>","accountSid":"\u003cstring>","apiKeySid":"\u003cstring>","apiKeySecret":"\u003cstring>","authToken":"\u003cstring>","apiKey":"\u003cstring>","apiSecret":"\u003cstring>","terminationUri":"\u003cstring>","authUsername":"\u003cstring>","authPassword":"\u003cstring>","allowedIps":["\u003cstring>"],"port":32768,"dialRules":[{"match":"+971","replace":"0"}],"connection":"direct","preset":"\u003cstring>","authId":"\u003cstring>","outboundProxy":"\u003cstring>","register":{"server":"\u003cstring>","port":32768,"outboundProxy":"\u003cstring>","expiry":180,"line":true,"pinHost":true,"tlsVerify":{"verify":true,"wildcard":true,"fingerprint":"\u003cstring>"}},"identities":[{"username":"1910","password":"\u003cstring>","authUsername":"\u003cstring>","fromUser":"\u003cstring>","maxConcurrent":1}],"maxConcurrent":50,"inboundNumber":"\u003cstring>","inboundRules":[{"match":"0","replace":"+971"}],"accountId":"\u003cstring>","campaignId":"\u003cstring>","from":"\u003cstring>"}}},"exampleType":"generated"}},"exampleType":"generated"},"responses":{"69f1c607-e7bb-43fd-bacf-d82cf454351c":{"description":"Connected.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","uniqueKey":"id","typeLabel":"string"},"carrier":{"type":"string","uniqueKey":"carrier","typeLabel":"string"},"name":{"type":"string","uniqueKey":"name","typeLabel":"string"},"accountRef":{"type":"string","description":"Twilio Account SID or carrier SIP host — safe to show.","uniqueKey":"accountRef","typeLabel":"string"},"accountName":{"type":"string","uniqueKey":"accountName","typeLabel":"string"},"status":{"type":"string","enum":["connected","error"],"uniqueKey":"status","typeLabel":"enum\u003cstring>"},"lastError":{"type":"string","uniqueKey":"lastError","typeLabel":"string"},"trunkId":{"type":"string","uniqueKey":"trunkId","typeLabel":"string"},"carrierTrunkSid":{"type":"string","description":"The trunk id inside the carrier's account (API-provisioned carriers).","uniqueKey":"carrierTrunkSid","typeLabel":"string"},"terminationUri":{"type":"string","uniqueKey":"terminationUri","typeLabel":"string"},"credentialFingerprint":{"type":"string","description":"Non-reversible; for display and audit only.","uniqueKey":"credentialFingerprint","typeLabel":"string"},"hasCredentials":{"type":"boolean","uniqueKey":"hasCredentials","typeLabel":"boolean"},"secretsBackend":{"type":"string","example":"secret-manager","uniqueKey":"secretsBackend","typeLabel":"string"},"provisioning":{"type":"string","enum":["api","manual"],"uniqueKey":"provisioning","typeLabel":"enum\u003cstring>"},"displayName":{"type":"string","uniqueKey":"displayName","typeLabel":"string"},"transferSupport":{"type":"string","enum":["supported","verify","unsupported"],"uniqueKey":"transferSupport","typeLabel":"enum\u003cstring>"},"channel":{"type":"string","enum":["voice","sms"],"description":"An `sms` integration has no trunk and no numbers.","uniqueKey":"channel","typeLabel":"enum\u003cstring>"},"sipUri":{"type":"string","uniqueKey":"sipUri","typeLabel":"string"},"gateway":{"type":"object","description":"How a manually connected gateway is dialed; port and transport are null where unset. The register fields are empty on a direct gateway.","properties":{"port":{"oneOf":[{"type":"integer","uniqueKey":"gateway.port.oneOf.0","typeLabel":"integer"},{"type":"null","uniqueKey":"gateway.port.oneOf.1","typeLabel":"null"}],"uniqueKey":"gateway.port","typeLabel":"integer | null"},"transport":{"oneOf":[{"type":"string","enum":["udp","tcp","tls",null],"uniqueKey":"gateway.transport.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["udp","tcp","tls",null],"uniqueKey":"gateway.transport.oneOf.1","typeLabel":"null"}],"uniqueKey":"gateway.transport","typeLabel":"enum\u003cstring> | null"},"dialRules":{"type":"array","items":{"type":"object","description":"How a gateway wants a destination written. A leading `match` on the E.164\nnumber becomes `replace`; the longest match wins; an unmatched number is\ndialed as is. `+971 → 0` dials a UAE number nationally, `+ → 00` everything\nelse internationally. `replace` is digits, optionally ending in `+`: a PBX\nthat seizes a line with a digit and then takes E.164 is `+ → 6+`. Records\nstay E.164. A gateway's `callerIdRules` apply the same rewrite to our caller ID.\n","required":["match","replace"],"properties":{"match":{"type":"string","pattern":"^\\+[0-9]{0,15}$","example":"+971","isRequired":true,"uniqueKey":"gateway.dialRules.items.[INDEX].match","typeLabel":"string"},"replace":{"type":"string","pattern":"^[0-9]{0,10}\\+?$","example":"0","isRequired":true,"uniqueKey":"gateway.dialRules.items.[INDEX].replace","typeLabel":"string"}},"uniqueKey":"gateway.dialRules.items.[INDEX]","typeLabel":"object"},"uniqueKey":"gateway.dialRules","typeLabel":"object[]"},"callerIdRules":{"type":"array","items":{"type":"object","description":"How a gateway wants a destination written. A leading `match` on the E.164\nnumber becomes `replace`; the longest match wins; an unmatched number is\ndialed as is. `+971 → 0` dials a UAE number nationally, `+ → 00` everything\nelse internationally. `replace` is digits, optionally ending in `+`: a PBX\nthat seizes a line with a digit and then takes E.164 is `+ → 6+`. Records\nstay E.164. A gateway's `callerIdRules` apply the same rewrite to our caller ID.\n","required":["match","replace"],"properties":{"match":{"type":"string","pattern":"^\\+[0-9]{0,15}$","example":"+971","isRequired":true,"uniqueKey":"gateway.callerIdRules.items.[INDEX].match","typeLabel":"string"},"replace":{"type":"string","pattern":"^[0-9]{0,10}\\+?$","example":"0","isRequired":true,"uniqueKey":"gateway.callerIdRules.items.[INDEX].replace","typeLabel":"string"}},"uniqueKey":"gateway.callerIdRules.items.[INDEX]","typeLabel":"object"},"description":"The same rules applied to our caller ID; empty means it is sent as E.164.","uniqueKey":"gateway.callerIdRules","typeLabel":"object[]"},"connection":{"type":"string","enum":["direct","register","registrar"],"uniqueKey":"gateway.connection","typeLabel":"enum\u003cstring>"},"preset":{"oneOf":[{"type":"string","uniqueKey":"gateway.preset.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"gateway.preset.oneOf.1","typeLabel":"null"}],"uniqueKey":"gateway.preset","typeLabel":"string | null"},"register":{"type":"object","description":"Null on a direct gateway.","properties":{"server":{"type":"string","description":"The registrar host; the gateway address.","uniqueKey":"gateway.register.server","typeLabel":"string"},"port":{"type":"integer","minimum":1,"maximum":65535,"uniqueKey":"gateway.register.port","typeLabel":"integer"},"transport":{"type":"string","enum":["udp","tcp","tls"],"uniqueKey":"gateway.register.transport","typeLabel":"enum\u003cstring>"},"outboundProxy":{"type":"string","description":"The vendor's regional proxy, where it routes through one.","uniqueKey":"gateway.register.outboundProxy","typeLabel":"string"},"srtp":{"type":"string","enum":["none","optional","required"],"uniqueKey":"gateway.register.srtp","typeLabel":"enum\u003cstring>"},"expiry":{"type":"integer","minimum":60,"maximum":300,"description":"Registration expiry in seconds — the shortest the vendor allows, since a dead relay keeps receiving inbound until it lapses.","uniqueKey":"gateway.register.expiry","typeLabel":"integer"},"qualify":{"type":"integer","enum":[0,60],"description":"OPTIONS keepalive interval; 0 for a vendor relay that refuses OPTIONS.","uniqueKey":"gateway.register.qualify","typeLabel":"enum\u003cinteger>"},"line":{"type":"boolean","description":"Add `;line=` to the Contact so inbound INVITEs match the registration.","uniqueKey":"gateway.register.line","typeLabel":"boolean"},"pinHost":{"type":"boolean","description":"Resolve the registrar once and pin it, so every INVITE rides the connection the REGISTER opened. Defeats SRV failover; off unless the vendor needs it.","uniqueKey":"gateway.register.pinHost","typeLabel":"boolean"},"tlsVerify":{"type":"object","properties":{"verify":{"type":"boolean","uniqueKey":"gateway.register.tlsVerify.verify","typeLabel":"boolean"},"wildcard":{"type":"boolean","uniqueKey":"gateway.register.tlsVerify.wildcard","typeLabel":"boolean"},"fingerprint":{"type":"string","description":"SHA-256 fingerprint of a self-signed certificate to accept instead of the CA bundle.","uniqueKey":"gateway.register.tlsVerify.fingerprint","typeLabel":"string"}},"uniqueKey":"gateway.register.tlsVerify","typeLabel":"object"}},"uniqueKey":"gateway.register","typeLabel":"object"},"identities":{"type":"array","items":{"type":"object","description":"An identity as the console reads it, with what the cell's relay last reported about its registration.","properties":{"username":{"type":"string","uniqueKey":"gateway.identities.items.[INDEX].username","typeLabel":"string"},"authUsername":{"oneOf":[{"type":"string","uniqueKey":"gateway.identities.items.[INDEX].authUsername.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"gateway.identities.items.[INDEX].authUsername.oneOf.1","typeLabel":"null"}],"uniqueKey":"gateway.identities.items.[INDEX].authUsername","typeLabel":"string | null"},"fromUser":{"oneOf":[{"type":"string","uniqueKey":"gateway.identities.items.[INDEX].fromUser.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"gateway.identities.items.[INDEX].fromUser.oneOf.1","typeLabel":"null"}],"uniqueKey":"gateway.identities.items.[INDEX].fromUser","typeLabel":"string | null"},"maxConcurrent":{"type":"integer","uniqueKey":"gateway.identities.items.[INDEX].maxConcurrent","typeLabel":"integer"},"registration":{"type":"object","properties":{"status":{"oneOf":[{"type":"string","description":"Asterisk's word: Registered, Rejected, Unregistered; null before the relay has reported.","uniqueKey":"gateway.identities.items.[INDEX].registration.status.oneOf.0","typeLabel":"string"},{"type":"null","description":"Asterisk's word: Registered, Rejected, Unregistered; null before the relay has reported.","uniqueKey":"gateway.identities.items.[INDEX].registration.status.oneOf.1","typeLabel":"null"}],"uniqueKey":"gateway.identities.items.[INDEX].registration.status","typeLabel":"string | null"},"nextRefreshS":{"oneOf":[{"type":"integer","uniqueKey":"gateway.identities.items.[INDEX].registration.nextRefreshS.oneOf.0","typeLabel":"integer"},{"type":"null","uniqueKey":"gateway.identities.items.[INDEX].registration.nextRefreshS.oneOf.1","typeLabel":"null"}],"uniqueKey":"gateway.identities.items.[INDEX].registration.nextRefreshS","typeLabel":"integer | null"},"summary":{"type":"string","example":"Registered, next refresh in 4 min","uniqueKey":"gateway.identities.items.[INDEX].registration.summary","typeLabel":"string"}},"uniqueKey":"gateway.identities.items.[INDEX].registration","typeLabel":"object"}},"uniqueKey":"gateway.identities.items.[INDEX]","typeLabel":"object"},"uniqueKey":"gateway.identities","typeLabel":"object[]"},"inboundNumber":{"oneOf":[{"type":"string","description":"The Vodex number an inbound call through the identity is presented as.","uniqueKey":"gateway.inboundNumber.oneOf.0","typeLabel":"string"},{"type":"null","description":"The Vodex number an inbound call through the identity is presented as.","uniqueKey":"gateway.inboundNumber.oneOf.1","typeLabel":"null"}],"uniqueKey":"gateway.inboundNumber","typeLabel":"string | null"},"inboundRules":{"type":"array","items":{"type":"object","description":"How the caller a registered system delivers is normalized, applied with\nthe same longest-match rule as `DialRule` in the other direction: a\nleading `match` (digits) becomes `replace` (`+` and digits). `0 → +971`\nand `00 → +` turn 0586582538 into +971586582538. A caller already in\nE.164, and a caller no rule matches (a desk-phone extension dialling the\nassistant), pass through unchanged — so a call record's caller is not\nalways E.164 on a registered gateway.\n","required":["match","replace"],"properties":{"match":{"type":"string","pattern":"^[0-9]{1,15}$","example":"0","isRequired":true,"uniqueKey":"gateway.inboundRules.items.[INDEX].match","typeLabel":"string"},"replace":{"type":"string","pattern":"^\\+?[0-9]{0,15}$","example":"+971","isRequired":true,"uniqueKey":"gateway.inboundRules.items.[INDEX].replace","typeLabel":"string"}},"uniqueKey":"gateway.inboundRules.items.[INDEX]","typeLabel":"object"},"uniqueKey":"gateway.inboundRules","typeLabel":"object[]"},"maxConcurrent":{"oneOf":[{"type":"integer","description":"The identities' caps summed — the batch runner's hard limit on in-flight calls through this gateway.","uniqueKey":"gateway.maxConcurrent.oneOf.0","typeLabel":"integer"},{"type":"null","description":"The identities' caps summed — the batch runner's hard limit on in-flight calls through this gateway.","uniqueKey":"gateway.maxConcurrent.oneOf.1","typeLabel":"null"}],"uniqueKey":"gateway.maxConcurrent","typeLabel":"integer | null"}},"uniqueKey":"gateway","typeLabel":"object"},"configPublished":{"type":"boolean","description":"Present after a change to a registered gateway; whether the cell's relay snapshot reached the config bucket.","uniqueKey":"configPublished","typeLabel":"boolean"},"connectedAt":{"type":"integer","format":"int64","uniqueKey":"connectedAt","typeLabel":"integer\u003cint64>"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"id":"\u003cstring>","carrier":"\u003cstring>","name":"\u003cstring>","accountRef":"\u003cstring>","accountName":"\u003cstring>","status":"connected","lastError":"\u003cstring>","trunkId":"\u003cstring>","carrierTrunkSid":"\u003cstring>","terminationUri":"\u003cstring>","credentialFingerprint":"\u003cstring>","hasCredentials":true,"secretsBackend":"secret-manager","provisioning":"api","displayName":"\u003cstring>","transferSupport":"supported","channel":"voice","sipUri":"\u003cstring>","gateway":{"port":123,"transport":"udp","dialRules":[{"match":"+971","replace":"0"}],"callerIdRules":[{"match":"+971","replace":"0"}],"connection":"direct","preset":"\u003cstring>","register":{"server":"\u003cstring>","port":32768,"transport":"udp","outboundProxy":"\u003cstring>","srtp":"none","expiry":180,"qualify":0,"line":true,"pinHost":true,"tlsVerify":{"verify":true,"wildcard":true,"fingerprint":"\u003cstring>"}},"identities":[{"username":"\u003cstring>","authUsername":"\u003cstring>","fromUser":"\u003cstring>","maxConcurrent":123,"registration":{"status":"\u003cstring>","nextRefreshS":123,"summary":"Registered, next refresh in 4 min"}}],"inboundNumber":"\u003cstring>","inboundRules":[{"match":"0","replace":"+971"}],"maxConcurrent":123},"configPublished":true,"connectedAt":123}}},"exampleType":"generated"}},"exampleType":"generated"},"a278478b-9245-480e-831b-35d7b08391ff":{"description":"Unknown carrier, missing fields, or the carrier rejected the credentials.","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"},"f420f006-f6b8-4a32-87c1-ca147c195fff":{"description":"This account is already connected.","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"},"ea1f34fa-c336-46ff-a5f1-d5705a284dff":{"description":"Carrier or SIP gateway provisioning failed.","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"}},"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":"Connect a carrier account - Vodex API","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-30T16:41:44.383Z","originalFileLocation":"api-reference/integrations/connect-a-carrier-account.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=\"Credentials are validated against the carrier first — a saved integration always means \u0026quot;these credentials worked\u0026quot;. One account, one integration, owning one SIP trunk; numbers are added to it over time. The body is carrier-shaped: GET /v1/carriers names the required fields per carrier. Twilio takes an API key pair or an account SID plus auth token and is provisioned through its API; Exotel and Vobiz are configured in the carrier\u0026#x27;s portal and hand back a termination URI plus credentials; pronto_connects is a messaging-only carrier with no trunk and no numbers. Credentials go to Secret Manager; only a reference and a non-reversible fingerprint are kept here.\">\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=\"Connect a carrier account - Vodex API\">\u003cmeta data-mint-head property=\"og:description\" content=\"Credentials are validated against the carrier first — a saved integration always means \u0026quot;these credentials worked\u0026quot;. One account, one integration, owning one SIP trunk; numbers are added to it over time. The body is carrier-shaped: GET /v1/carriers names the required fields per carrier. Twilio takes an API key pair or an account SID plus auth token and is provisioned through its API; Exotel and Vobiz are configured in the carrier\u0026#x27;s portal and hand back a termination URI plus credentials; pronto_connects is a messaging-only carrier with no trunk and no numbers. Credentials go to Secret Manager; only a reference and a non-reversible fingerprint are kept here.\">\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/integrations/connect-a-carrier-account\">\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=Integrations\u0026amp;title=Connect+a+carrier+account\u0026amp;description=Credentials+are+**validated+against+the+carrier+first**+%E2%80%94+a+saved%0Aintegration+always+means+%22these+credentials+worked%22.+One+account%2C+one%0Aintegration%2C+owning+one+\u0026amp;theme=6d89815cfe9107c7cb0143e4\u0026amp;signature=873b9aa04575bbb9f0767af30eb030c968c6d2fc7d9b9f6f8b578d3dbd0a2fa7\">\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=\"Connect a carrier account - Vodex API\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Credentials are validated against the carrier first — a saved integration always means \u0026quot;these credentials worked\u0026quot;. One account, one integration, owning one SIP trunk; numbers are added to it over time. The body is carrier-shaped: GET /v1/carriers names the required fields per carrier. Twilio takes an API key pair or an account SID plus auth token and is provisioned through its API; Exotel and Vobiz are configured in the carrier\u0026#x27;s portal and hand back a termination URI plus credentials; pronto_connects is a messaging-only carrier with no trunk and no numbers. Credentials go to Secret Manager; only a reference and a non-reversible fingerprint are kept here.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://vodex.mintlify.app/_mintlify/api/og/v2?division=Integrations\u0026amp;title=Connect+a+carrier+account\u0026amp;description=Credentials+are+**validated+against+the+carrier+first**+%E2%80%94+a+saved%0Aintegration+always+means+%22these+credentials+worked%22.+One+account%2C+one%0Aintegration%2C+owning+one+\u0026amp;theme=6d89815cfe9107c7cb0143e4\u0026amp;signature=873b9aa04575bbb9f0767af30eb030c968c6d2fc7d9b9f6f8b578d3dbd0a2fa7\">\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/integrations/connect-a-carrier-account\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/integrations/connect-a-carrier-account.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/integrations/connect-a-carrier-account#webpage\",\"url\":\"https://apidocs.vodex.ai/api-reference/integrations/connect-a-carrier-account\",\"name\":\"Connect a carrier account\",\"description\":\"Credentials are validated against the carrier first — a saved integration always means \\\"these credentials worked\\\". One account, one integration, owning one SIP trunk; numbers are added to it over time. The body is carrier-shaped: GET /v1/carriers names the required fields per carrier. Twilio takes an API key pair or an account SID plus auth token and is provisioned through its API; Exotel and Vobiz are configured in the carrier's portal and hand back a termination URI plus credentials; pronto_connects is a messaging-only carrier with no trunk and no numbers. Credentials go to Secret Manager; only a reference and a non-reversible fingerprint are kept here.\",\"dateModified\":\"2026-10-30T16:41:44.383Z\",\"isPartOf\":{\"@id\":\"https://apidocs.vodex.ai#website\"},\"breadcrumb\":{\"@id\":\"https://apidocs.vodex.ai/api-reference/integrations/connect-a-carrier-account#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://apidocs.vodex.ai/api-reference/integrations/connect-a-carrier-account#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Integrations\",\"item\":\"https://apidocs.vodex.ai/api-reference/integrations/list-connected-carrier-accounts\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Connect a carrier account\",\"item\":\"https://apidocs.vodex.ai/api-reference/integrations/connect-a-carrier-account\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://apidocs.vodex.ai/api-reference/integrations/connect-a-carrier-account#apireference\",\"headline\":\"Connect a carrier account\",\"name\":\"Connect a carrier account\",\"description\":\"Credentials are validated against the carrier first — a saved integration always means \\\"these credentials worked\\\". One account, one integration, owning one SIP trunk; numbers are added to it over time. The body is carrier-shaped: GET /v1/carriers names the required fields per carrier. Twilio takes an API key pair or an account SID plus auth token and is provisioned through its API; Exotel and Vobiz are configured in the carrier's portal and hand back a termination URI plus credentials; pronto_connects is a messaging-only carrier with no trunk and no numbers. Credentials go to Secret Manager; only a reference and a non-reversible fingerprint are kept here.\",\"url\":\"https://apidocs.vodex.ai/api-reference/integrations/connect-a-carrier-account\",\"mainEntityOfPage\":{\"@id\":\"https://apidocs.vodex.ai/api-reference/integrations/connect-a-carrier-account#webpage\"},\"dateModified\":\"2026-10-30T16:41:44.383Z\",\"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","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","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","description":null,"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","description":"Adds this account's numbers and — when the carrier can text — the SMS\ndelivery-receipt URL, which is where receipts land once a token has been\nminted (on the first send, or on an SMS settings save).\n","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":"Connect a carrier account - 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"]}