A campaign is not a second dialer. Execution is batches — same
runner, same number rotation, same calling-window logic. What a campaign
adds is who: an audience instead of a pasted list, and a row keyed to
a person instead of a bare number (0017 §4).
Creating one dials nobody. POST /contacts/campaigns/{id}/launch does.
Repeat. With repeat set, every launch also schedules the next
one: the campaign launches itself again at the same local time the next
day, week or month (nextRunAt), and each run resolves the audience
afresh, so it calls whoever matches on that day. A run that comes due
while the previous one is still dialing or paused is skipped, not
queued, and so is a run reached more than two hours after its time;
lastRepeat says which run was skipped and why. A startAt
set between runs makes the next run happen then. The repeat is
armed by a launch — or at once, when it is set on a campaign that is
already running — and turned off by repeat: null, by
POST /contacts/campaigns/{id}/stop, or by cancelling its run
(POST /batches/{id}/cancel). A campaign run in blocks cannot
repeat.
When this batch may dial — outside it, rows wait rather than fail. A row's own timezone (the timezoneField variable) wins over timezone; a row with neither fails with no_timezone.
Assistant variable -> where its value comes from: field:<column>, attr:<key>, stat:attemptsTotal / stat:attempts7d, or any other string as literal text. A variable named after a contact field (first_name) needs no entry.
Launch the campaign again on this schedule. Each run starts at the same local time as the run it repeats, in timezone, across daylight-saving changes; a monthly run on the 31st falls on the last day of a shorter month. null turns it off.
Launch the campaign again on this schedule. Each run starts at the same local time as the run it repeats, in timezone, across daylight-saving changes; a monthly run on the 31st falls on the last day of a shorter month. null turns it off.
What happened the last time a repeat came due. A skipped run says why — the previous run still dialing, an audience that matches nobody, a deleted agent.
What the conversations reached (design 0018), keyed by the customer's own name for each outcome. Scoped to batchId's current run — a ranged campaign's earlier blocks are not included.
Show child attributes
{"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/campaigns/create-a-campaign","slug":"/api-reference/campaigns/create-a-campaign","pageMetadata":{"title":"Create a campaign","description":"A campaign is **not** a second dialer. Execution is `batches` — same\nrunner, same number rotation, same calling-window logic. What a campaign\nadds is *who*: an audience instead of a pasted list, and a row keyed to\na person instead of a bare number (0017 §4).\n\nCreating one dials nobody. `POST /contacts/campaigns/{id}/launch` does.\n\n**Repeat.** With `repeat` set, every launch also schedules the next\none: the campaign launches itself again at the same local time the next\nday, week or month (`nextRunAt`), and each run resolves the audience\nafresh, so it calls whoever matches on that day. A run that comes due\nwhile the previous one is still dialing or paused is skipped, not\nqueued, and so is a run reached more than two hours after its time;\n`lastRepeat` says which run was skipped and why. A `startAt`\nset between runs makes the next run happen then. The repeat is\narmed by a launch — or at once, when it is set on a campaign that is\nalready running — and turned off by `repeat: null`, by\n`POST /contacts/campaigns/{id}/stop`, or by cancelling its run\n(`POST /batches/{id}/cancel`). A campaign run in blocks cannot\nrepeat.\n","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml post /contacts/campaigns","href":"/api-reference/campaigns/create-a-campaign","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 em: \"em\",\n p: \"p\",\n strong: \"strong\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsxs(_components.p, {\n children: [\"A campaign is \", _jsx(_components.strong, {\n children: \"not\"\n }), \" a second dialer. Execution is \", _jsx(_components.code, {\n children: \"batches\"\n }), \" — same\\nrunner, same number rotation, same calling-window logic. What a campaign\\nadds is \", _jsx(_components.em, {\n children: \"who\"\n }), \": an audience instead of a pasted list, and a row keyed to\\na person instead of a bare number (0017 §4).\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Creating one dials nobody. \", _jsx(_components.code, {\n children: \"POST /contacts/campaigns/{id}/launch\"\n }), \" does.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Repeat.\"\n }), \" With \", _jsx(_components.code, {\n children: \"repeat\"\n }), \" set, every launch also schedules the next\\none: the campaign launches itself again at the same local time the next\\nday, week or month (\", _jsx(_components.code, {\n children: \"nextRunAt\"\n }), \"), and each run resolves the audience\\nafresh, so it calls whoever matches on that day. A run that comes due\\nwhile the previous one is still dialing or paused is skipped, not\\nqueued, and so is a run reached more than two hours after its time;\\n\", _jsx(_components.code, {\n children: \"lastRepeat\"\n }), \" says which run was skipped and why. A \", _jsx(_components.code, {\n children: \"startAt\"\n }), \"\\nset between runs makes the next run happen then. The repeat is\\narmed by a launch — or at once, when it is set on a campaign that is\\nalready running — and turned off by \", _jsx(_components.code, {\n children: \"repeat: null\"\n }), \", by\\n\", _jsx(_components.code, {\n children: \"POST /contacts/campaigns/{id}/stop\"\n }), \", or by cancelling its run\\n(\", _jsx(_components.code, {\n children: \"POST /batches/{id}/cancel\"\n }), \"). A campaign run in blocks cannot\\nrepeat.\"]\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":"Create a campaign","description":"A campaign is **not** a second dialer. Execution is `batches` — same\nrunner, same number rotation, same calling-window logic. What a campaign\nadds is *who*: an audience instead of a pasted list, and a row keyed to\na person instead of a bare number (0017 §4).\n\nCreating one dials nobody. `POST /contacts/campaigns/{id}/launch` does.\n\n**Repeat.** With `repeat` set, every launch also schedules the next\none: the campaign launches itself again at the same local time the next\nday, week or month (`nextRunAt`), and each run resolves the audience\nafresh, so it calls whoever matches on that day. A run that comes due\nwhile the previous one is still dialing or paused is skipped, not\nqueued, and so is a run reached more than two hours after its time;\n`lastRepeat` says which run was skipped and why. A `startAt`\nset between runs makes the next run happen then. The repeat is\narmed by a launch — or at once, when it is set on a campaign that is\nalready running — and turned off by `repeat: null`, by\n`POST /contacts/campaigns/{id}/stop`, or by cancelling its run\n(`POST /batches/{id}/cancel`). A campaign run in blocks cannot\nrepeat.\n","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml post /contacts/campaigns","href":"/api-reference/campaigns/create-a-campaign","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"operationId":"createCampaign","tags":["Campaigns"],"summary":"Create a campaign","description":"A campaign is **not** a second dialer. Execution is `batches` — same\nrunner, same number rotation, same calling-window logic. What a campaign\nadds is *who*: an audience instead of a pasted list, and a row keyed to\na person instead of a bare number (0017 §4).\n\nCreating one dials nobody. `POST /contacts/campaigns/{id}/launch` does.\n\n**Repeat.** With `repeat` set, every launch also schedules the next\none: the campaign launches itself again at the same local time the next\nday, week or month (`nextRunAt`), and each run resolves the audience\nafresh, so it calls whoever matches on that day. A run that comes due\nwhile the previous one is still dialing or paused is skipped, not\nqueued, and so is a run reached more than two hours after its time;\n`lastRepeat` says which run was skipped and why. A `startAt`\nset between runs makes the next run happen then. The repeat is\narmed by a launch — or at once, when it is set on a campaign that is\nalready running — and turned off by `repeat: null`, by\n`POST /contacts/campaigns/{id}/stop`, or by cancelling its run\n(`POST /batches/{id}/cancel`). A campaign run in blocks cannot\nrepeat.\n","requestBody":"b7f2249d-7679-49d3-bda9-31faacee8f9a","responses":{"201":"f814b5cf-1c6b-4058-8b29-d1f8648790c2","400":"fb7f7f14-6dc4-42f3-946e-983610dfe1f0"},"method":"post","type":"path","servers":["454f84ff-3690-4156-8c58-c64805db6548"],"security":["986b34dc-9d64-43d6-addf-8d27adc5ae4e"],"path":"/contacts/campaigns","baseUrlOptions":["https://apiv2.vodex.ai/v1"],"title":"Create a campaign","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name","audienceId","assistantId"],"properties":{"name":{"type":"string","isRequired":true,"uniqueKey":"name","typeLabel":"string"},"audienceId":{"type":"string","format":"uuid","isRequired":true,"uniqueKey":"audienceId","typeLabel":"string\u003cuuid>"},"assistantId":{"type":"string","isRequired":true,"uniqueKey":"assistantId","typeLabel":"string"},"concurrency":{"type":"integer","uniqueKey":"concurrency","typeLabel":"integer"},"retry":{"type":"object","properties":{"on":{"type":"array","items":{"type":"string","uniqueKey":"retry.on.items.[INDEX]","typeLabel":"string"},"description":"End reasons worth retrying (e.g. `no_answer`, `busy`, `caller_ended`). `caller_ended` retries only a call the caller hung up on right after the greeting, before any back-and-forth. A row whose call booked a callback is not called again in that run.","uniqueKey":"retry.on","typeLabel":"string[]"},"schedule":{"type":"array","maxItems":10,"items":{"type":"object","required":["gapMinutes"],"properties":{"gapMinutes":{"type":"number","minimum":1,"maximum":10080,"description":"Minutes after the previous call ended.","isRequired":true,"uniqueKey":"retry.schedule.items.[INDEX].gapMinutes","typeLabel":"number"},"timeOfDay":{"type":"string","enum":["morning","afternoon"],"description":"Moves the retry to the next 09:00–12:00 (morning) or 12:00–18:00 (afternoon) at or after the gap, in the row's timezone — its `tz` variable, else the calling window's zone. With neither, the plain gap is used.","uniqueKey":"retry.schedule.items.[INDEX].timeOfDay","typeLabel":"enum\u003cstring>"},"leaveVoicemail":{"type":"boolean","description":"Overrides the agent's voicemail setting for this retry. Absent uses the agent's own setting. `true` only works if the agent has voicemail detection on and a voicemail message set.","uniqueKey":"retry.schedule.items.[INDEX].leaveVoicemail","typeLabel":"boolean"}},"uniqueKey":"retry.schedule.items.[INDEX]","typeLabel":"object"},"description":"One step per retry, in order: step 1 governs the first retry after the original call. Send this OR `attempts` + `backoffMinutes`, not both. Responses always carry it, alongside `attempts` and `backoffMinutes` mirrored from it.","uniqueKey":"retry.schedule","typeLabel":"object[]"},"attempts":{"type":"integer","minimum":0,"maximum":10,"description":"Retries after the first call, all with the same gap. Ignored when `schedule` is sent.","uniqueKey":"retry.attempts","typeLabel":"integer"},"backoffMinutes":{"type":"number","minimum":1,"maximum":10080,"description":"The gap for every retry. Ignored when `schedule` is sent.","uniqueKey":"retry.backoffMinutes","typeLabel":"number"},"surveyCutOff":{"type":"boolean","default":false,"description":"Call back a survey that stopped part-way: an answer the respondent gave was recorded, the survey never reached its end, and the call ended by the caller hanging up or dropping, the time limit or silence, not by the agent. Uses the same steps as the other retries, and a row whose call booked a callback is not called again. Only matters when the agent runs a survey.","uniqueKey":"retry.surveyCutOff","typeLabel":"boolean"}},"uniqueKey":"retry","typeLabel":"object"},"window":{"oneOf":[{"type":"object","description":"When this batch may dial — outside it, rows wait rather than fail. A row's own timezone (the `timezoneField` variable) wins over `timezone`; a row with neither fails with `no_timezone`.","required":["localStart","localEnd"],"properties":{"localStart":{"type":"string","example":"09:00","description":"HH:MM, local to the row.","isRequired":true,"uniqueKey":"window.oneOf.0.localStart","typeLabel":"string"},"localEnd":{"type":"string","example":"20:00","description":"HH:MM, local to the row. Earlier than localStart means the window wraps midnight.","isRequired":true,"uniqueKey":"window.oneOf.0.localEnd","typeLabel":"string"},"timezoneField":{"type":"string","default":"tz","description":"Row variable that carries the IANA zone.","uniqueKey":"window.oneOf.0.timezoneField","typeLabel":"string"},"timezone":{"type":"string","example":"America/New_York","description":"Zone for rows that carry none of their own.","uniqueKey":"window.oneOf.0.timezone","typeLabel":"string"},"days":{"oneOf":[{"type":"array","items":{"type":"integer","minimum":0,"maximum":6,"uniqueKey":"window.oneOf.0.days.oneOf.0.items.[INDEX]","typeLabel":"integer"},"example":[1,2,3,4,5],"description":"Days calls may go out, in the row's zone: 0 = Sunday to 6 = Saturday, each once. Omit or null for every day. A call or retry that falls on another day waits for the next allowed one, and a callback asked for on one is refused on the call with the next allowed time. An overnight window belongs to the day it opens on, and a daily campaign repeat skips the days left out.","uniqueKey":"window.oneOf.0.days.oneOf.0","typeLabel":"integer[]"},{"type":"null","items":{"type":"integer","minimum":0,"maximum":6},"example":[1,2,3,4,5],"description":"Days calls may go out, in the row's zone: 0 = Sunday to 6 = Saturday, each once. Omit or null for every day. A call or retry that falls on another day waits for the next allowed one, and a callback asked for on one is refused on the call with the next allowed time. An overnight window belongs to the day it opens on, and a daily campaign repeat skips the days left out.","uniqueKey":"window.oneOf.0.days.oneOf.1","typeLabel":"null"}],"uniqueKey":"window.oneOf.0.days","typeLabel":"integer[] | null"}},"uniqueKey":"window.oneOf.0","typeLabel":"object"},{"type":"null","description":"When this batch may dial — outside it, rows wait rather than fail. A row's own timezone (the `timezoneField` variable) wins over `timezone`; a row with neither fails with `no_timezone`.","required":["localStart","localEnd"],"properties":{"localStart":{"type":"string","example":"09:00","description":"HH:MM, local to the row."},"localEnd":{"type":"string","example":"20:00","description":"HH:MM, local to the row. Earlier than localStart means the window wraps midnight."},"timezoneField":{"type":"string","default":"tz","description":"Row variable that carries the IANA zone."},"timezone":{"type":"string","example":"America/New_York","description":"Zone for rows that carry none of their own."},"days":{"oneOf":[{"type":"array","items":{"type":"integer","minimum":0,"maximum":6},"example":[1,2,3,4,5],"description":"Days calls may go out, in the row's zone: 0 = Sunday to 6 = Saturday, each once. Omit or null for every day. A call or retry that falls on another day waits for the next allowed one, and a callback asked for on one is refused on the call with the next allowed time. An overnight window belongs to the day it opens on, and a daily campaign repeat skips the days left out."},{"type":"null","items":{"type":"integer","minimum":0,"maximum":6},"example":[1,2,3,4,5],"description":"Days calls may go out, in the row's zone: 0 = Sunday to 6 = Saturday, each once. Omit or null for every day. A call or retry that falls on another day waits for the next allowed one, and a callback asked for on one is refused on the call with the next allowed time. An overnight window belongs to the day it opens on, and a daily campaign repeat skips the days left out."}]}},"uniqueKey":"window.oneOf.1","typeLabel":"null"}],"uniqueKey":"window","typeLabel":"object | null"},"fromStrategy":{"type":"string","uniqueKey":"fromStrategy","typeLabel":"string"},"fromNumbers":{"type":"array","items":{"type":"string","uniqueKey":"fromNumbers.items.[INDEX]","typeLabel":"string"},"uniqueKey":"fromNumbers","typeLabel":"string[]"},"fromWeights":{"oneOf":[{"type":"object","additionalProperties":{"type":"number","uniqueKey":"fromWeights.oneOf.0.additionalProperties","typeLabel":"number"},"uniqueKey":"fromWeights.oneOf.0","typeLabel":"object"},{"type":"null","additionalProperties":{"type":"number","uniqueKey":"fromWeights.oneOf.1.additionalProperties","typeLabel":"number"},"uniqueKey":"fromWeights.oneOf.1","typeLabel":"null"}],"uniqueKey":"fromWeights","typeLabel":"object | null"},"variables":{"type":"object","additionalProperties":{"type":"string","uniqueKey":"variables.additionalProperties","typeLabel":"string"},"description":"Assistant variable -> where its value comes from: `field:\u003ccolumn>`, `attr:\u003ckey>`, `stat:attemptsTotal` / `stat:attempts7d`, or any other string as literal text. A variable named after a contact field (`first_name`) needs no entry.","example":{"first_name":"field:firstName","balance":"attr:balance"},"uniqueKey":"variables","typeLabel":"object"},"blockSize":{"oneOf":[{"type":"integer","description":"Dial the audience in blocks of this size, one at a time.","uniqueKey":"blockSize.oneOf.0","typeLabel":"integer"},{"type":"null","description":"Dial the audience in blocks of this size, one at a time.","uniqueKey":"blockSize.oneOf.1","typeLabel":"null"}],"uniqueKey":"blockSize","typeLabel":"integer | null"},"startAt":{"oneOf":[{"type":"string","format":"date-time","uniqueKey":"startAt.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","uniqueKey":"startAt.oneOf.1","typeLabel":"null"}],"uniqueKey":"startAt","typeLabel":"string\u003cdate-time> | null"},"repeat":{"oneOf":[{"type":"object","description":"Launch the campaign again on this schedule. Each run starts at the same local time as the run it repeats, in `timezone`, across daylight-saving changes; a monthly run on the 31st falls on the last day of a shorter month. `null` turns it off.","required":["every"],"properties":{"every":{"type":"string","enum":["daily","weekly","monthly"],"isRequired":true,"uniqueKey":"repeat.oneOf.0.every","typeLabel":"enum\u003cstring>"},"timezone":{"type":"string","description":"IANA zone the schedule is kept in. Omitted, it keeps the stored zone, else the calling window's, else UTC.","uniqueKey":"repeat.oneOf.0.timezone","typeLabel":"string"}},"uniqueKey":"repeat.oneOf.0","typeLabel":"object"},{"type":"null","description":"Launch the campaign again on this schedule. Each run starts at the same local time as the run it repeats, in `timezone`, across daylight-saving changes; a monthly run on the 31st falls on the last day of a shorter month. `null` turns it off.","required":["every"],"properties":{"every":{"type":"string","enum":["daily","weekly","monthly"]},"timezone":{"type":"string","description":"IANA zone the schedule is kept in. Omitted, it keeps the stored zone, else the calling window's, else UTC."}},"uniqueKey":"repeat.oneOf.1","typeLabel":"null"}],"uniqueKey":"repeat","typeLabel":"object | null"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"name":"\u003cstring>","audienceId":"3c90c3cc-0d44-4b50-8888-8dd25736052a","assistantId":"\u003cstring>","concurrency":123,"retry":{"on":["\u003cstring>"],"schedule":[{"gapMinutes":5040.5,"leaveVoicemail":true}],"attempts":5,"backoffMinutes":5040.5,"surveyCutOff":false},"window":{"localStart":"09:00","localEnd":"20:00","timezoneField":"tz","timezone":"America/New_York","days":[1,2,3,4,5]},"fromStrategy":"\u003cstring>","fromNumbers":["\u003cstring>"],"fromWeights":{},"variables":{"first_name":"field:firstName","balance":"attr:balance"},"blockSize":123,"startAt":"2023-11-07T05:31:56Z","repeat":{"timezone":"\u003cstring>"}}}},"exampleType":"generated"}},"exampleType":"generated"},"responses":{"f814b5cf-1c6b-4058-8b29-d1f8648790c2":{"description":"Created, not launched.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid","uniqueKey":"id","typeLabel":"string\u003cuuid>"},"name":{"type":"string","uniqueKey":"name","typeLabel":"string"},"audienceId":{"type":"string","format":"uuid","uniqueKey":"audienceId","typeLabel":"string\u003cuuid>"},"assistantId":{"type":"string","uniqueKey":"assistantId","typeLabel":"string"},"status":{"type":"string","description":"Derived from the underlying batch on every read, never stored — so the two can never disagree.","uniqueKey":"status","typeLabel":"string"},"batchId":{"oneOf":[{"type":"string","format":"uuid","uniqueKey":"batchId.oneOf.0","typeLabel":"string\u003cuuid>"},{"type":"null","format":"uuid","uniqueKey":"batchId.oneOf.1","typeLabel":"null"}],"uniqueKey":"batchId","typeLabel":"string\u003cuuid> | null"},"startAt":{"oneOf":[{"type":"string","format":"date-time","uniqueKey":"startAt.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","uniqueKey":"startAt.oneOf.1","typeLabel":"null"}],"uniqueKey":"startAt","typeLabel":"string\u003cdate-time> | null"},"repeat":{"oneOf":[{"type":"object","description":"Launch the campaign again on this schedule. Each run starts at the same local time as the run it repeats, in `timezone`, across daylight-saving changes; a monthly run on the 31st falls on the last day of a shorter month. `null` turns it off.","required":["every"],"properties":{"every":{"type":"string","enum":["daily","weekly","monthly"],"isRequired":true,"uniqueKey":"repeat.oneOf.0.every","typeLabel":"enum\u003cstring>"},"timezone":{"type":"string","description":"IANA zone the schedule is kept in. Omitted, it keeps the stored zone, else the calling window's, else UTC.","uniqueKey":"repeat.oneOf.0.timezone","typeLabel":"string"}},"uniqueKey":"repeat.oneOf.0","typeLabel":"object"},{"type":"null","description":"Launch the campaign again on this schedule. Each run starts at the same local time as the run it repeats, in `timezone`, across daylight-saving changes; a monthly run on the 31st falls on the last day of a shorter month. `null` turns it off.","required":["every"],"properties":{"every":{"type":"string","enum":["daily","weekly","monthly"]},"timezone":{"type":"string","description":"IANA zone the schedule is kept in. Omitted, it keeps the stored zone, else the calling window's, else UTC."}},"uniqueKey":"repeat.oneOf.1","typeLabel":"null"}],"uniqueKey":"repeat","typeLabel":"object | null"},"nextRunAt":{"oneOf":[{"type":"string","format":"date-time","description":"When the campaign launches itself next. Null when it does not repeat, has not been launched since the repeat was set, or was stopped.","uniqueKey":"nextRunAt.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"When the campaign launches itself next. Null when it does not repeat, has not been launched since the repeat was set, or was stopped.","uniqueKey":"nextRunAt.oneOf.1","typeLabel":"null"}],"uniqueKey":"nextRunAt","typeLabel":"string\u003cdate-time> | null"},"lastRepeat":{"oneOf":[{"type":"object","description":"What happened the last time a repeat came due. A skipped run says why — the previous run still dialing, an audience that matches nobody, a deleted agent.","properties":{"at":{"type":"string","format":"date-time","description":"When that run was due.","uniqueKey":"lastRepeat.oneOf.0.at","typeLabel":"string\u003cdate-time>"},"outcome":{"type":"string","enum":["launched","skipped"],"uniqueKey":"lastRepeat.oneOf.0.outcome","typeLabel":"enum\u003cstring>"},"reason":{"type":"string","uniqueKey":"lastRepeat.oneOf.0.reason","typeLabel":"string"},"runNo":{"type":"integer","uniqueKey":"lastRepeat.oneOf.0.runNo","typeLabel":"integer"}},"uniqueKey":"lastRepeat.oneOf.0","typeLabel":"object"},{"type":"null","description":"What happened the last time a repeat came due. A skipped run says why — the previous run still dialing, an audience that matches nobody, a deleted agent.","properties":{"at":{"type":"string","format":"date-time","description":"When that run was due."},"outcome":{"type":"string","enum":["launched","skipped"]},"reason":{"type":"string"},"runNo":{"type":"integer"}},"uniqueKey":"lastRepeat.oneOf.1","typeLabel":"null"}],"uniqueKey":"lastRepeat","typeLabel":"object | null"},"createdAt":{"type":"string","format":"date-time","uniqueKey":"createdAt","typeLabel":"string\u003cdate-time>"},"outcomes":{"type":"object","additionalProperties":{"type":"integer","uniqueKey":"outcomes.additionalProperties","typeLabel":"integer"},"description":"What the conversations reached (design 0018), keyed by the customer's own name for each outcome. Scoped to `batchId`'s current run — a ranged campaign's earlier blocks are not included.","uniqueKey":"outcomes","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","name":"\u003cstring>","audienceId":"3c90c3cc-0d44-4b50-8888-8dd25736052a","assistantId":"\u003cstring>","status":"\u003cstring>","batchId":"3c90c3cc-0d44-4b50-8888-8dd25736052a","startAt":"2023-11-07T05:31:56Z","repeat":{"every":"daily","timezone":"\u003cstring>"},"nextRunAt":"2023-11-07T05:31:56Z","lastRepeat":{"at":"2023-11-07T05:31:56Z","outcome":"launched","reason":"\u003cstring>","runNo":123},"createdAt":"2023-11-07T05:31:56Z","outcomes":{}}}},"exampleType":"generated"}},"exampleType":"generated"},"fb7f7f14-6dc4-42f3-946e-983610dfe1f0":{"description":"Validation 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":"Create a campaign - Vodex API","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-30T16:41:45.620Z","originalFileLocation":"api-reference/campaigns/create-a-campaign.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=\"A campaign is not a second dialer. Execution is batches — same runner, same number rotation, same calling-window logic. What a campaign adds is who: an audience instead of a pasted list, and a row keyed to a person instead of a bare number (0017 §4). Creating one dials nobody. POST /contacts/campaigns/{id}/launch does. Repeat. With repeat set, every launch also schedules the next one: the campaign launches itself again at the same local time the next day, week or month (nextRunAt), and each run resolves the audience afresh, so it calls whoever matches on that day. A run that comes due while the previous one is still dialing or paused is skipped, not queued, and so is a run reached more than two hours after its time; lastRepeat says which run was skipped and why. A startAt set between runs makes the next run happen then. The repeat is armed by a launch — or at once, when it is set on a campaign that is already running — and turned off by repeat: null, by POST /contacts/campaigns/{id}/stop, or by cancelling its run (POST /batches/{id}/cancel). A campaign run in blocks cannot repeat.\">\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=\"Create a campaign - Vodex API\">\u003cmeta data-mint-head property=\"og:description\" content=\"A campaign is not a second dialer. Execution is batches — same runner, same number rotation, same calling-window logic. What a campaign adds is who: an audience instead of a pasted list, and a row keyed to a person instead of a bare number (0017 §4). Creating one dials nobody. POST /contacts/campaigns/{id}/launch does. Repeat. With repeat set, every launch also schedules the next one: the campaign launches itself again at the same local time the next day, week or month (nextRunAt), and each run resolves the audience afresh, so it calls whoever matches on that day. A run that comes due while the previous one is still dialing or paused is skipped, not queued, and so is a run reached more than two hours after its time; lastRepeat says which run was skipped and why. A startAt set between runs makes the next run happen then. The repeat is armed by a launch — or at once, when it is set on a campaign that is already running — and turned off by repeat: null, by POST /contacts/campaigns/{id}/stop, or by cancelling its run (POST /batches/{id}/cancel). A campaign run in blocks cannot repeat.\">\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/campaigns/create-a-campaign\">\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=Campaigns\u0026amp;title=Create+a+campaign\u0026amp;description=A+campaign+is+**not**+a+second+dialer.+Execution+is+%60batches%60+%E2%80%94+same%0Arunner%2C+same+number+rotation%2C+same+calling-window+logic.+What+a+campaign%0Aadds+is+*who*%3A+an+\u0026amp;theme=6d89815cfe9107c7cb0143e4\u0026amp;signature=f0830c26bb2a717d51db7d983f49d5ea15bea32bccd0e0353f04df2760434b65\">\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=\"Create a campaign - Vodex API\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"A campaign is not a second dialer. Execution is batches — same runner, same number rotation, same calling-window logic. What a campaign adds is who: an audience instead of a pasted list, and a row keyed to a person instead of a bare number (0017 §4). Creating one dials nobody. POST /contacts/campaigns/{id}/launch does. Repeat. With repeat set, every launch also schedules the next one: the campaign launches itself again at the same local time the next day, week or month (nextRunAt), and each run resolves the audience afresh, so it calls whoever matches on that day. A run that comes due while the previous one is still dialing or paused is skipped, not queued, and so is a run reached more than two hours after its time; lastRepeat says which run was skipped and why. A startAt set between runs makes the next run happen then. The repeat is armed by a launch — or at once, when it is set on a campaign that is already running — and turned off by repeat: null, by POST /contacts/campaigns/{id}/stop, or by cancelling its run (POST /batches/{id}/cancel). A campaign run in blocks cannot repeat.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://vodex.mintlify.app/_mintlify/api/og/v2?division=Campaigns\u0026amp;title=Create+a+campaign\u0026amp;description=A+campaign+is+**not**+a+second+dialer.+Execution+is+%60batches%60+%E2%80%94+same%0Arunner%2C+same+number+rotation%2C+same+calling-window+logic.+What+a+campaign%0Aadds+is+*who*%3A+an+\u0026amp;theme=6d89815cfe9107c7cb0143e4\u0026amp;signature=f0830c26bb2a717d51db7d983f49d5ea15bea32bccd0e0353f04df2760434b65\">\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/campaigns/create-a-campaign\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/campaigns/create-a-campaign.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/campaigns/create-a-campaign#webpage\",\"url\":\"https://apidocs.vodex.ai/api-reference/campaigns/create-a-campaign\",\"name\":\"Create a campaign\",\"description\":\"A campaign is not a second dialer. Execution is batches — same runner, same number rotation, same calling-window logic. What a campaign adds is who: an audience instead of a pasted list, and a row keyed to a person instead of a bare number (0017 §4). Creating one dials nobody. POST /contacts/campaigns/{id}/launch does. Repeat. With repeat set, every launch also schedules the next one: the campaign launches itself again at the same local time the next day, week or month (nextRunAt), and each run resolves the audience afresh, so it calls whoever matches on that day. A run that comes due while the previous one is still dialing or paused is skipped, not queued, and so is a run reached more than two hours after its time; lastRepeat says which run was skipped and why. A startAt set between runs makes the next run happen then. The repeat is armed by a launch — or at once, when it is set on a campaign that is already running — and turned off by repeat: null, by POST /contacts/campaigns/{id}/stop, or by cancelling its run (POST /batches/{id}/cancel). A campaign run in blocks cannot repeat.\",\"dateModified\":\"2026-10-30T16:41:45.620Z\",\"isPartOf\":{\"@id\":\"https://apidocs.vodex.ai#website\"},\"breadcrumb\":{\"@id\":\"https://apidocs.vodex.ai/api-reference/campaigns/create-a-campaign#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://apidocs.vodex.ai/api-reference/campaigns/create-a-campaign#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Campaigns\",\"item\":\"https://apidocs.vodex.ai/api-reference/campaigns/list-campaigns\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Create a campaign\",\"item\":\"https://apidocs.vodex.ai/api-reference/campaigns/create-a-campaign\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://apidocs.vodex.ai/api-reference/campaigns/create-a-campaign#apireference\",\"headline\":\"Create a campaign\",\"name\":\"Create a campaign\",\"description\":\"A campaign is not a second dialer. Execution is batches — same runner, same number rotation, same calling-window logic. What a campaign adds is who: an audience instead of a pasted list, and a row keyed to a person instead of a bare number (0017 §4). Creating one dials nobody. POST /contacts/campaigns/{id}/launch does. Repeat. With repeat set, every launch also schedules the next one: the campaign launches itself again at the same local time the next day, week or month (nextRunAt), and each run resolves the audience afresh, so it calls whoever matches on that day. A run that comes due while the previous one is still dialing or paused is skipped, not queued, and so is a run reached more than two hours after its time; lastRepeat says which run was skipped and why. A startAt set between runs makes the next run happen then. The repeat is armed by a launch — or at once, when it is set on a campaign that is already running — and turned off by repeat: null, by POST /contacts/campaigns/{id}/stop, or by cancelling its run (POST /batches/{id}/cancel). A campaign run in blocks cannot repeat.\",\"url\":\"https://apidocs.vodex.ai/api-reference/campaigns/create-a-campaign\",\"mainEntityOfPage\":{\"@id\":\"https://apidocs.vodex.ai/api-reference/campaigns/create-a-campaign#webpage\"},\"dateModified\":\"2026-10-30T16:41:45.620Z\",\"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","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","description":"Status is **derived from the underlying batch on every read**, never\nstored — so a paused batch makes its campaign read paused by itself,\nand the two can never disagree.\n","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","description":"The contact fields, call counts and custom attributes a campaign may map\ninto assistant variables, and the `tokens` a contact fills with no\nmapping at all (`{{first_name}}`, `{{postal_code}}`, …). A variable with\nno value for a contact makes that contact a `rejected` enrollment at\nlaunch rather than a call with a blank in the prompt.\n","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":"Create a campaign - 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"]}