Counts, the number pool, every run, and why the batch is pacing the way
it is.
pacing.limitedBy answers “why is my batch slow” without a human:
tenant_cap, concurrency, number_pool, window, or none. A
customer whose batch says concurrency 20 and is somehow running six at a
time is usually looking at five other batches using the rest.
estimate answers the other half of it — when this will be done. The
arithmetic people do by hand (rows x talk time / concurrency) is wrong
by about half, because an unanswered call holds a concurrency slot for
the whole ring window rather than the length of a conversation.
?run= scopes the outcome histogram only. It cannot scope counts:
rows hold current state, so after a restart their statuses describe the
newest run and nothing can make them describe an older one — which is
what countsScope says out loud.
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.
The campaign that launched this batch, recovered from its idempotency key. Null for a batch created directly against this API rather than through a campaign.
When the batch will be finished. Null once it has stopped, and
for a batch with nothing left to dial.
An under-estimate on purpose: retries are extra dials it does
not count, because counting them means predicting the connect
rate, and a confident wrong date is worse than a floor.
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/batches/fetch-a-batch","slug":"/api-reference/batches/fetch-a-batch","pageMetadata":{"title":"Fetch a batch","description":"Counts, the number pool, every run, and why the batch is pacing the way\nit is.\n\n`pacing.limitedBy` answers \"why is my batch slow\" without a human:\n`tenant_cap`, `concurrency`, `number_pool`, `window`, or `none`. A\ncustomer whose batch says concurrency 20 and is somehow running six at a\ntime is usually looking at five other batches using the rest.\n\n`estimate` answers the other half of it — when this will be done. The\narithmetic people do by hand (rows x talk time / concurrency) is wrong\nby about half, because an unanswered call holds a concurrency slot for\nthe whole ring window rather than the length of a conversation.\n\n`?run=` scopes the **outcome histogram** only. It cannot scope `counts`:\nrows hold current state, so after a restart their statuses describe the\nnewest run and nothing can make them describe an older one — which is\nwhat `countsScope` says out loud.\n","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml get /batches/{id}","href":"/api-reference/batches/fetch-a-batch","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: [_jsx(_components.p, {\n children: \"Counts, the number pool, every run, and why the batch is pacing the way\\nit is.\"\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.code, {\n children: \"pacing.limitedBy\"\n }), \" answers “why is my batch slow” without a human:\\n\", _jsx(_components.code, {\n children: \"tenant_cap\"\n }), \", \", _jsx(_components.code, {\n children: \"concurrency\"\n }), \", \", _jsx(_components.code, {\n children: \"number_pool\"\n }), \", \", _jsx(_components.code, {\n children: \"window\"\n }), \", or \", _jsx(_components.code, {\n children: \"none\"\n }), \". A\\ncustomer whose batch says concurrency 20 and is somehow running six at a\\ntime is usually looking at five other batches using the rest.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.code, {\n children: \"estimate\"\n }), \" answers the other half of it — when this will be done. The\\narithmetic people do by hand (rows x talk time / concurrency) is wrong\\nby about half, because an unanswered call holds a concurrency slot for\\nthe whole ring window rather than the length of a conversation.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.code, {\n children: \"?run=\"\n }), \" scopes the \", _jsx(_components.strong, {\n children: \"outcome histogram\"\n }), \" only. It cannot scope \", _jsx(_components.code, {\n children: \"counts\"\n }), \":\\nrows hold current state, so after a restart their statuses describe the\\nnewest run and nothing can make them describe an older one — which is\\nwhat \", _jsx(_components.code, {\n children: \"countsScope\"\n }), \" says out loud.\"]\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":"Fetch a batch","description":"Counts, the number pool, every run, and why the batch is pacing the way\nit is.\n\n`pacing.limitedBy` answers \"why is my batch slow\" without a human:\n`tenant_cap`, `concurrency`, `number_pool`, `window`, or `none`. A\ncustomer whose batch says concurrency 20 and is somehow running six at a\ntime is usually looking at five other batches using the rest.\n\n`estimate` answers the other half of it — when this will be done. The\narithmetic people do by hand (rows x talk time / concurrency) is wrong\nby about half, because an unanswered call holds a concurrency slot for\nthe whole ring window rather than the length of a conversation.\n\n`?run=` scopes the **outcome histogram** only. It cannot scope `counts`:\nrows hold current state, so after a restart their statuses describe the\nnewest run and nothing can make them describe an older one — which is\nwhat `countsScope` says out loud.\n","deprecated":null,"version":null,"openapi":"/openapi/api-public-v1.yaml get /batches/{id}","href":"/api-reference/batches/fetch-a-batch","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"operationId":"getBatch","tags":["Batches"],"summary":"Fetch a batch","description":"Counts, the number pool, every run, and why the batch is pacing the way\nit is.\n\n`pacing.limitedBy` answers \"why is my batch slow\" without a human:\n`tenant_cap`, `concurrency`, `number_pool`, `window`, or `none`. A\ncustomer whose batch says concurrency 20 and is somehow running six at a\ntime is usually looking at five other batches using the rest.\n\n`estimate` answers the other half of it — when this will be done. The\narithmetic people do by hand (rows x talk time / concurrency) is wrong\nby about half, because an unanswered call holds a concurrency slot for\nthe whole ring window rather than the length of a conversation.\n\n`?run=` scopes the **outcome histogram** only. It cannot scope `counts`:\nrows hold current state, so after a restart their statuses describe the\nnewest run and nothing can make them describe an older one — which is\nwhat `countsScope` says out loud.\n","parameters":["c866ea59-6af8-424a-8323-ee9a6d54575e","d0157d97-5394-40e5-869f-ef4a19870927"],"responses":{"200":"a1df3582-a7b6-4a7e-96bd-a84a6428c8a8","401":"bfc56b83-1c01-4747-9ee2-168e313a0af5","404":"db5d61e4-9c7b-4239-b9c7-4ab125a157f3"},"method":"get","type":"path","servers":["454f84ff-3690-4156-8c58-c64805db6548"],"security":["986b34dc-9d64-43d6-addf-8d27adc5ae4e"],"path":"/batches/{id}","baseUrlOptions":["https://apiv2.vodex.ai/v1"],"title":"Fetch a batch","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"c866ea59-6af8-424a-8323-ee9a6d54575e":{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","isRequired":true,"uniqueKey":"","typeLabel":"string\u003cuuid>"}},"d0157d97-5394-40e5-869f-ef4a19870927":{"name":"run","in":"query","schema":{"type":"integer","description":"Historic run number for `endReasons`.","uniqueKey":"","typeLabel":"integer"},"description":"Historic run number for `endReasons`."}},"responses":{"a1df3582-a7b6-4a7e-96bd-a84a6428c8a8":{"description":"The batch.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid","uniqueKey":"id","typeLabel":"string\u003cuuid>"},"name":{"type":"string","uniqueKey":"name","typeLabel":"string"},"status":{"type":"string","enum":["running","paused","completed","cancelled","failed"],"uniqueKey":"status","typeLabel":"enum\u003cstring>"},"runNo":{"type":"integer","uniqueKey":"runNo","typeLabel":"integer"},"assistantId":{"type":"string","format":"uuid","description":"The assistant's uuid, shown on its configure page in the console. Names and slugs are not accepted.","uniqueKey":"assistantId","typeLabel":"string\u003cuuid>"},"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"},"suppress":{"type":"array","items":{"type":"string","uniqueKey":"suppress.items.[INDEX]","typeLabel":"string"},"uniqueKey":"suppress","typeLabel":"string[]"},"blockSize":{"oneOf":[{"type":"integer","description":"Rows per block, or null to dial the whole list at once. Set at create.","uniqueKey":"blockSize.oneOf.0","typeLabel":"integer"},{"type":"null","description":"Rows per block, or null to dial the whole list at once. Set at create.","uniqueKey":"blockSize.oneOf.1","typeLabel":"null"}],"uniqueKey":"blockSize","typeLabel":"integer | null"},"activeBlock":{"type":"integer","description":"The highest block cleared to dial (1-based); only meaningful with a blockSize.","uniqueKey":"activeBlock","typeLabel":"integer"},"createdAt":{"oneOf":[{"type":"string","format":"date-time","uniqueKey":"createdAt.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","uniqueKey":"createdAt.oneOf.1","typeLabel":"null"}],"uniqueKey":"createdAt","typeLabel":"string\u003cdate-time> | null"},"startedAt":{"oneOf":[{"type":"string","format":"date-time","uniqueKey":"startedAt.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","uniqueKey":"startedAt.oneOf.1","typeLabel":"null"}],"uniqueKey":"startedAt","typeLabel":"string\u003cdate-time> | null"},"completedAt":{"oneOf":[{"type":"string","format":"date-time","uniqueKey":"completedAt.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","uniqueKey":"completedAt.oneOf.1","typeLabel":"null"}],"uniqueKey":"completedAt","typeLabel":"string\u003cdate-time> | null"},"counts":{"type":"object","additionalProperties":{"type":"integer","uniqueKey":"counts.additionalProperties","typeLabel":"integer"},"description":"Row counts by status, plus `total`.","uniqueKey":"counts","typeLabel":"object"},"campaign":{"oneOf":[{"type":"object","description":"The campaign that launched this batch, recovered from its idempotency key. Null for a batch created directly against this API rather than through a campaign.","properties":{"id":{"type":"string","format":"uuid","uniqueKey":"campaign.oneOf.0.id","typeLabel":"string\u003cuuid>"},"name":{"type":"string","uniqueKey":"campaign.oneOf.0.name","typeLabel":"string"}},"uniqueKey":"campaign.oneOf.0","typeLabel":"object"},{"type":"null","description":"The campaign that launched this batch, recovered from its idempotency key. Null for a batch created directly against this API rather than through a campaign.","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"}},"uniqueKey":"campaign.oneOf.1","typeLabel":"null"}],"uniqueKey":"campaign","typeLabel":"object | null"},"blocks":{"type":"array","description":"Present (possibly empty) only for a ranged batch.","items":{"type":"object","description":"One block of a ranged batch — a slice of its rows by upload position.","properties":{"blockNo":{"type":"integer","description":"1-based position of this block.","uniqueKey":"blocks.items.[INDEX].blockNo","typeLabel":"integer"},"rangeStart":{"type":"integer","description":"First row position in the block (1-based, inclusive).","uniqueKey":"blocks.items.[INDEX].rangeStart","typeLabel":"integer"},"rangeEnd":{"type":"integer","description":"Last row position in the block (inclusive).","uniqueKey":"blocks.items.[INDEX].rangeEnd","typeLabel":"integer"},"contacts":{"type":"integer","description":"Rows in this block.","uniqueKey":"blocks.items.[INDEX].contacts","typeLabel":"integer"},"status":{"type":"string","enum":["pending","running","completed"],"uniqueKey":"blocks.items.[INDEX].status","typeLabel":"enum\u003cstring>"},"counts":{"type":"object","additionalProperties":{"type":"integer","uniqueKey":"blocks.items.[INDEX].counts.additionalProperties","typeLabel":"integer"},"description":"Row counts by status within the block, plus `total`.","uniqueKey":"blocks.items.[INDEX].counts","typeLabel":"object"}},"uniqueKey":"blocks.items.[INDEX]","typeLabel":"object"},"uniqueKey":"blocks","typeLabel":"object[]"},"countsScope":{"type":"integer","description":"The run `counts` describes — always the current one.","uniqueKey":"countsScope","typeLabel":"integer"},"run":{"type":"integer","description":"The run `endReasons` describes.","uniqueKey":"run","typeLabel":"integer"},"endReasons":{"type":"object","additionalProperties":{"type":"integer","uniqueKey":"endReasons.additionalProperties","typeLabel":"integer"},"uniqueKey":"endReasons","typeLabel":"object"},"runRows":{"type":"integer","description":"Present only for a historic `?run=`.","uniqueKey":"runRows","typeLabel":"integer"},"runAttempts":{"type":"integer","description":"Present only for a historic `?run=`.","uniqueKey":"runAttempts","typeLabel":"integer"},"from":{"type":"object","properties":{"strategy":{"type":"string","enum":["fixed","round_robin","weighted","sticky"],"uniqueKey":"from.strategy","typeLabel":"enum\u003cstring>"},"numbers":{"type":"array","items":{"type":"object","properties":{"e164":{"type":"string","uniqueKey":"from.numbers.items.[INDEX].e164","typeLabel":"string"},"weight":{"type":"integer","uniqueKey":"from.numbers.items.[INDEX].weight","typeLabel":"integer"},"callsPlaced":{"type":"integer","uniqueKey":"from.numbers.items.[INDEX].callsPlaced","typeLabel":"integer"},"nextAvailableAt":{"oneOf":[{"type":"string","format":"date-time","uniqueKey":"from.numbers.items.[INDEX].nextAvailableAt.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","uniqueKey":"from.numbers.items.[INDEX].nextAvailableAt.oneOf.1","typeLabel":"null"}],"uniqueKey":"from.numbers.items.[INDEX].nextAvailableAt","typeLabel":"string\u003cdate-time> | null"},"eligible":{"type":"boolean","uniqueKey":"from.numbers.items.[INDEX].eligible","typeLabel":"boolean"},"cooldownUntil":{"oneOf":[{"type":"string","format":"date-time","uniqueKey":"from.numbers.items.[INDEX].cooldownUntil.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","uniqueKey":"from.numbers.items.[INDEX].cooldownUntil.oneOf.1","typeLabel":"null"}],"uniqueKey":"from.numbers.items.[INDEX].cooldownUntil","typeLabel":"string\u003cdate-time> | null"},"cooldownReason":{"oneOf":[{"type":"string","uniqueKey":"from.numbers.items.[INDEX].cooldownReason.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"from.numbers.items.[INDEX].cooldownReason.oneOf.1","typeLabel":"null"}],"uniqueKey":"from.numbers.items.[INDEX].cooldownReason","typeLabel":"string | null"}},"uniqueKey":"from.numbers.items.[INDEX]","typeLabel":"object"},"uniqueKey":"from.numbers","typeLabel":"object[]"}},"uniqueKey":"from","typeLabel":"object"},"runs":{"type":"array","items":{"type":"object","properties":{"runNo":{"type":"integer","uniqueKey":"runs.items.[INDEX].runNo","typeLabel":"integer"},"attempts":{"type":"integer","uniqueKey":"runs.items.[INDEX].attempts","typeLabel":"integer"},"startedAt":{"type":"string","format":"date-time","uniqueKey":"runs.items.[INDEX].startedAt","typeLabel":"string\u003cdate-time>"},"completedAt":{"oneOf":[{"type":"string","format":"date-time","uniqueKey":"runs.items.[INDEX].completedAt.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","uniqueKey":"runs.items.[INDEX].completedAt.oneOf.1","typeLabel":"null"}],"uniqueKey":"runs.items.[INDEX].completedAt","typeLabel":"string\u003cdate-time> | null"}},"uniqueKey":"runs.items.[INDEX]","typeLabel":"object"},"uniqueKey":"runs","typeLabel":"object[]"},"pacing":{"type":"object","description":"Why the batch is going as fast (or as slowly) as it is.","properties":{"inflight":{"type":"integer","uniqueKey":"pacing.inflight","typeLabel":"integer"},"maxDialsPerMinute":{"oneOf":[{"type":"number","description":"Ceiling implied by the number pool's spacing.","uniqueKey":"pacing.maxDialsPerMinute.oneOf.0","typeLabel":"number"},{"type":"null","description":"Ceiling implied by the number pool's spacing.","uniqueKey":"pacing.maxDialsPerMinute.oneOf.1","typeLabel":"null"}],"uniqueKey":"pacing.maxDialsPerMinute","typeLabel":"number | null"},"limitedBy":{"type":"string","enum":["none","tenant_cap","concurrency","number_pool","window"],"uniqueKey":"pacing.limitedBy","typeLabel":"enum\u003cstring>"},"tenantCap":{"oneOf":[{"type":"integer","uniqueKey":"pacing.tenantCap.oneOf.0","typeLabel":"integer"},{"type":"null","uniqueKey":"pacing.tenantCap.oneOf.1","typeLabel":"null"}],"uniqueKey":"pacing.tenantCap","typeLabel":"integer | null"},"tenantInflight":{"type":"integer","description":"Calls dialing across every batch this tenant is running.","uniqueKey":"pacing.tenantInflight","typeLabel":"integer"}},"uniqueKey":"pacing","typeLabel":"object"},"estimate":{"oneOf":[{"type":"object","description":"When the batch will be finished. Null once it has stopped, and\nfor a batch with nothing left to dial.\n\nAn under-estimate on purpose: retries are extra dials it does\nnot count, because counting them means predicting the connect\nrate, and a confident wrong date is worse than a floor.\n","properties":{"remaining":{"type":"integer","description":"Rows still to dial — pending plus in flight.","uniqueKey":"estimate.oneOf.0.remaining","typeLabel":"integer"},"dialsPerMinute":{"type":"number","description":"The smaller of the concurrency and number-pool ceilings.","uniqueKey":"estimate.oneOf.0.dialsPerMinute","typeLabel":"number"},"dialSeconds":{"type":"integer","description":"Seconds of open-window dialing, which is not elapsed time.","uniqueKey":"estimate.oneOf.0.dialSeconds","typeLabel":"integer"},"finishesAt":{"oneOf":[{"type":"string","format":"date-time","description":"The closed hours of the calling window walked through, so\n83 hours of dialing reads as ten days of an 8-hour window.\nNull when only the ROWS carry a timezone: a mixed-zone\nbatch has no single clock to project against.\n","uniqueKey":"estimate.oneOf.0.finishesAt.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"The closed hours of the calling window walked through, so\n83 hours of dialing reads as ten days of an 8-hour window.\nNull when only the ROWS carry a timezone: a mixed-zone\nbatch has no single clock to project against.\n","uniqueKey":"estimate.oneOf.0.finishesAt.oneOf.1","typeLabel":"null"}],"uniqueKey":"estimate.oneOf.0.finishesAt","typeLabel":"string\u003cdate-time> | null"},"windowDays":{"oneOf":[{"type":"number","description":"Open-window days the work spans. Null without a window.","uniqueKey":"estimate.oneOf.0.windowDays.oneOf.0","typeLabel":"number"},{"type":"null","description":"Open-window days the work spans. Null without a window.","uniqueKey":"estimate.oneOf.0.windowDays.oneOf.1","typeLabel":"null"}],"uniqueKey":"estimate.oneOf.0.windowDays","typeLabel":"number | null"},"windowLabel":{"oneOf":[{"type":"string","description":"The calling window in words, e.g. \"Monday to Friday, 09:00–17:00\". Null without a window.","uniqueKey":"estimate.oneOf.0.windowLabel.oneOf.0","typeLabel":"string"},{"type":"null","description":"The calling window in words, e.g. \"Monday to Friday, 09:00–17:00\". Null without a window.","uniqueKey":"estimate.oneOf.0.windowLabel.oneOf.1","typeLabel":"null"}],"uniqueKey":"estimate.oneOf.0.windowLabel","typeLabel":"string | null"},"slotSeconds":{"type":"integer","description":"Seconds a call was assumed to hold a slot (60): an unanswered call holds one for the full ring window, not the talk time.","uniqueKey":"estimate.oneOf.0.slotSeconds","typeLabel":"integer"}},"uniqueKey":"estimate.oneOf.0","typeLabel":"object"},{"type":"null","description":"When the batch will be finished. Null once it has stopped, and\nfor a batch with nothing left to dial.\n\nAn under-estimate on purpose: retries are extra dials it does\nnot count, because counting them means predicting the connect\nrate, and a confident wrong date is worse than a floor.\n","properties":{"remaining":{"type":"integer","description":"Rows still to dial — pending plus in flight."},"dialsPerMinute":{"type":"number","description":"The smaller of the concurrency and number-pool ceilings."},"dialSeconds":{"type":"integer","description":"Seconds of open-window dialing, which is not elapsed time."},"finishesAt":{"oneOf":[{"type":"string","format":"date-time","description":"The closed hours of the calling window walked through, so\n83 hours of dialing reads as ten days of an 8-hour window.\nNull when only the ROWS carry a timezone: a mixed-zone\nbatch has no single clock to project against.\n"},{"type":"null","format":"date-time","description":"The closed hours of the calling window walked through, so\n83 hours of dialing reads as ten days of an 8-hour window.\nNull when only the ROWS carry a timezone: a mixed-zone\nbatch has no single clock to project against.\n"}]},"windowDays":{"oneOf":[{"type":"number","description":"Open-window days the work spans. Null without a window."},{"type":"null","description":"Open-window days the work spans. Null without a window."}]},"windowLabel":{"oneOf":[{"type":"string","description":"The calling window in words, e.g. \"Monday to Friday, 09:00–17:00\". Null without a window."},{"type":"null","description":"The calling window in words, e.g. \"Monday to Friday, 09:00–17:00\". Null without a window."}]},"slotSeconds":{"type":"integer","description":"Seconds a call was assumed to hold a slot (60): an unanswered call holds one for the full ring window, not the talk time."}},"uniqueKey":"estimate.oneOf.1","typeLabel":"null"}],"uniqueKey":"estimate","typeLabel":"object | null"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","name":"\u003cstring>","status":"running","runNo":123,"assistantId":"3c90c3cc-0d44-4b50-8888-8dd25736052a","concurrency":123,"retry":{"on":["\u003cstring>"],"schedule":[{"gapMinutes":5040.5,"timeOfDay":"morning","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]},"suppress":["\u003cstring>"],"blockSize":123,"activeBlock":123,"createdAt":"2023-11-07T05:31:56Z","startedAt":"2023-11-07T05:31:56Z","completedAt":"2023-11-07T05:31:56Z","counts":{},"campaign":{"id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","name":"\u003cstring>"},"blocks":[{"blockNo":123,"rangeStart":123,"rangeEnd":123,"contacts":123,"status":"pending","counts":{}}],"countsScope":123,"run":123,"endReasons":{},"runRows":123,"runAttempts":123,"from":{"strategy":"fixed","numbers":[{"e164":"\u003cstring>","weight":123,"callsPlaced":123,"nextAvailableAt":"2023-11-07T05:31:56Z","eligible":true,"cooldownUntil":"2023-11-07T05:31:56Z","cooldownReason":"\u003cstring>"}]},"runs":[{"runNo":123,"attempts":123,"startedAt":"2023-11-07T05:31:56Z","completedAt":"2023-11-07T05:31:56Z"}],"pacing":{"inflight":123,"maxDialsPerMinute":123,"limitedBy":"none","tenantCap":123,"tenantInflight":123},"estimate":{"remaining":123,"dialsPerMinute":123,"dialSeconds":123,"finishesAt":"2023-11-07T05:31:56Z","windowDays":123,"windowLabel":"\u003cstring>","slotSeconds":123}}}},"exampleType":"generated"}},"exampleType":"generated"},"bfc56b83-1c01-4747-9ee2-168e313a0af5":{"description":"No usable credential.","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"},"db5d61e4-9c7b-4239-b9c7-4ab125a157f3":{"description":"No such resource — or it belongs to another tenant, which looks the same.","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":"Fetch a batch - Vodex API","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-30T16:41:44.487Z","originalFileLocation":"api-reference/batches/fetch-a-batch.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=\"Counts, the number pool, every run, and why the batch is pacing the way it is. pacing.limitedBy answers \u0026quot;why is my batch slow\u0026quot; without a human: tenant_cap, concurrency, number_pool, window, or none. A customer whose batch says concurrency 20 and is somehow running six at a time is usually looking at five other batches using the rest. estimate answers the other half of it — when this will be done. The arithmetic people do by hand (rows x talk time / concurrency) is wrong by about half, because an unanswered call holds a concurrency slot for the whole ring window rather than the length of a conversation. ?run= scopes the outcome histogram only. It cannot scope counts: rows hold current state, so after a restart their statuses describe the newest run and nothing can make them describe an older one — which is what countsScope says out loud.\">\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=\"Fetch a batch - Vodex API\">\u003cmeta data-mint-head property=\"og:description\" content=\"Counts, the number pool, every run, and why the batch is pacing the way it is. pacing.limitedBy answers \u0026quot;why is my batch slow\u0026quot; without a human: tenant_cap, concurrency, number_pool, window, or none. A customer whose batch says concurrency 20 and is somehow running six at a time is usually looking at five other batches using the rest. estimate answers the other half of it — when this will be done. The arithmetic people do by hand (rows x talk time / concurrency) is wrong by about half, because an unanswered call holds a concurrency slot for the whole ring window rather than the length of a conversation. ?run= scopes the outcome histogram only. It cannot scope counts: rows hold current state, so after a restart their statuses describe the newest run and nothing can make them describe an older one — which is what countsScope says out loud.\">\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/batches/fetch-a-batch\">\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=Batches\u0026amp;title=Fetch+a+batch\u0026amp;description=Counts%2C+the+number+pool%2C+every+run%2C+and+why+the+batch+is+pacing+the+way%0Ait+is.%0A%0A%60pacing.limitedBy%60+answers+%22why+is+my+batch+slow%22+without+a+human%3A%0A%60tenant_cap%60%2C\u0026amp;theme=6d89815cfe9107c7cb0143e4\u0026amp;signature=4bb7bfe071ba6f61e256d86a58335f770b67364e800db61cc12cdba5b6fb1bef\">\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=\"Fetch a batch - Vodex API\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Counts, the number pool, every run, and why the batch is pacing the way it is. pacing.limitedBy answers \u0026quot;why is my batch slow\u0026quot; without a human: tenant_cap, concurrency, number_pool, window, or none. A customer whose batch says concurrency 20 and is somehow running six at a time is usually looking at five other batches using the rest. estimate answers the other half of it — when this will be done. The arithmetic people do by hand (rows x talk time / concurrency) is wrong by about half, because an unanswered call holds a concurrency slot for the whole ring window rather than the length of a conversation. ?run= scopes the outcome histogram only. It cannot scope counts: rows hold current state, so after a restart their statuses describe the newest run and nothing can make them describe an older one — which is what countsScope says out loud.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://vodex.mintlify.app/_mintlify/api/og/v2?division=Batches\u0026amp;title=Fetch+a+batch\u0026amp;description=Counts%2C+the+number+pool%2C+every+run%2C+and+why+the+batch+is+pacing+the+way%0Ait+is.%0A%0A%60pacing.limitedBy%60+answers+%22why+is+my+batch+slow%22+without+a+human%3A%0A%60tenant_cap%60%2C\u0026amp;theme=6d89815cfe9107c7cb0143e4\u0026amp;signature=4bb7bfe071ba6f61e256d86a58335f770b67364e800db61cc12cdba5b6fb1bef\">\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/batches/fetch-a-batch\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/batches/fetch-a-batch.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/batches/fetch-a-batch#webpage\",\"url\":\"https://apidocs.vodex.ai/api-reference/batches/fetch-a-batch\",\"name\":\"Fetch a batch\",\"description\":\"Counts, the number pool, every run, and why the batch is pacing the way it is. pacing.limitedBy answers \\\"why is my batch slow\\\" without a human: tenant_cap, concurrency, number_pool, window, or none. A customer whose batch says concurrency 20 and is somehow running six at a time is usually looking at five other batches using the rest. estimate answers the other half of it — when this will be done. The arithmetic people do by hand (rows x talk time / concurrency) is wrong by about half, because an unanswered call holds a concurrency slot for the whole ring window rather than the length of a conversation. ?run= scopes the outcome histogram only. It cannot scope counts: rows hold current state, so after a restart their statuses describe the newest run and nothing can make them describe an older one — which is what countsScope says out loud.\",\"dateModified\":\"2026-10-30T16:41:44.487Z\",\"isPartOf\":{\"@id\":\"https://apidocs.vodex.ai#website\"},\"breadcrumb\":{\"@id\":\"https://apidocs.vodex.ai/api-reference/batches/fetch-a-batch#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://apidocs.vodex.ai/api-reference/batches/fetch-a-batch#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Batches\",\"item\":\"https://apidocs.vodex.ai/api-reference/batches/list-batches\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Fetch a batch\",\"item\":\"https://apidocs.vodex.ai/api-reference/batches/fetch-a-batch\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://apidocs.vodex.ai/api-reference/batches/fetch-a-batch#apireference\",\"headline\":\"Fetch a batch\",\"name\":\"Fetch a batch\",\"description\":\"Counts, the number pool, every run, and why the batch is pacing the way it is. pacing.limitedBy answers \\\"why is my batch slow\\\" without a human: tenant_cap, concurrency, number_pool, window, or none. A customer whose batch says concurrency 20 and is somehow running six at a time is usually looking at five other batches using the rest. estimate answers the other half of it — when this will be done. The arithmetic people do by hand (rows x talk time / concurrency) is wrong by about half, because an unanswered call holds a concurrency slot for the whole ring window rather than the length of a conversation. ?run= scopes the outcome histogram only. It cannot scope counts: rows hold current state, so after a restart their statuses describe the newest run and nothing can make them describe an older one — which is what countsScope says out loud.\",\"url\":\"https://apidocs.vodex.ai/api-reference/batches/fetch-a-batch\",\"mainEntityOfPage\":{\"@id\":\"https://apidocs.vodex.ai/api-reference/batches/fetch-a-batch#webpage\"},\"dateModified\":\"2026-10-30T16:41:44.487Z\",\"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","description":"`Idempotency-Key` is **mandatory**: async producers retry, and a replay\nmust return the same batch rather than dial the list twice. A replay\nanswers `202` with `Idempotent-Replay: true`; the same key with a\ndifferent body is `409`.\n\nRows are **admitted or reported, never silently dropped**. A row whose\nprompt says \"your balance is {{balance}}\" with no `balance` is refused\nhere, where the caller can fix it, rather than dialed and reported as a\nnormal call. At most 10,000 rows per request — append the rest, or\nupload a CSV.\n\nQuota is checked at submission rather than 4,000 dials later.\n","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","description":null,"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":"Fetch a batch - 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"]}