Schedule up to 1,000 contacts in a single request — the API equivalent of CSV import.
Validation is per-contact: valid contacts are queued, and invalid contacts are returned in rejected[] with their original zero-based index. total always equals accepted + rejected.length on a 202. Invalid JSON, invalid field types, invalid request options, agent configuration errors, no valid contacts, or insufficient credits reject the whole request.
Examples: the request examples assume the agent requires account_id. Replace that field with every custom input variable required by your agent, directly on each contact. Use List agent input variables to discover them. The default example omits scheduledAt so 11x chooses times using the agent’s schedule. Provide toEmailAddress for agents with email steps.
Asynchronous results:202 confirms that accepted contacts passed upfront checks and were queued. Sequence creation happens in the background and can still fail. batchId identifies the request; sequence IDs are not returned here, and there is no public batch-status endpoint. Inspect background scheduling failures in the agent’s scheduling logs. Receive completed-call results through the Call Results webhook, or retrieve available conversation results using Search conversations.
Duplicate detection: phone numbers are normalized first, so +12125550123 and +1 (212) 555-0123 collide. By default only the first occurrence in the batch is accepted. Contacts are also rejected if a sequence for the same phone number on this agent is still in progress or started within the past 30 days. allowDuplicates: true bypasses both duplicate checks. Opt-outs and California calling restrictions still apply.
Contact chaining (groupByField): contacts are grouped by the value of the named custom variable. Only the first valid contact in each group is scheduled immediately; the rest activate automatically when an earlier call in the same group does not reach a successful outcome.
Rate limiting: this endpoint allows 600 requests per minute per agent by default, shared across API keys for the same organization. The agent may have a different configured limit. On 429, wait for Retry-After seconds before retrying.
Idempotency: send an Idempotency-Key to make retries safe. Retrying a request that returned 202 with the same key and the same body returns the original response with Idempotent-Replayed: true and schedules nothing again. See the Idempotency-Key header for the other cases.
Request signing: agents with signing enabled also require X-HMAC-Timestamp and X-HMAC-Signature. See Authentication for the signature format.
Optional, max 255 characters after trimming. When supplied, its value is returned as batchId; otherwise 11x generates a UUID. Only a 202 records the key, for 24 hours. Within that time, a request with the same key and a byte-for-byte identical body returns the stored 202 response with the Idempotent-Replayed: true header and schedules nothing again; the same key with a different body returns 422 IDEMPOTENCY_KEY_REUSED. While the first request with a key is still being processed, another request with that key returns 409 IDEMPOTENCY_KEY_IN_PROGRESS. If the first request with a key does not return 202, nothing is recorded and the key can be reused for a corrected request. Use a new key for each new batch.
Required when request signing is enabled for this agent. Base64-encoded HMAC-SHA256 of POST + newline + timestamp + newline + the exact JSON body, using the agent's signing secret. The x-api-key header is also required.
Group contacts by the value of a custom variable for contact chaining. Only the first valid contact per group is scheduled immediately. Cannot be combined with allowDuplicates.
Bypass duplicate checks within the batch and against sequences on this agent that are still in progress or started within the past 30 days. Opt-outs and California calling restrictions still apply. Cannot be combined with groupByField.
Response
Accepted contacts were queued for asynchronous processing. Both full and partial acceptance return 202. Inspect rejected[] and do not assume sequence creation has completed.
Per-contact validation failures (empty when all passed).
Show child attributes
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"11x Docs","description":"Guides, integrations and API reference for 11x AI agents on phone calls and website chat.","colors":{"primary":"#B8441F","light":"#EF7B42","dark":"#9E3A1C"},"logo":{"light":"https://mintcdn.com/11x-60396687/WQ5DVIR6fahl90CM/logo/light.svg?fit=max\u0026auto=format\u0026n=WQ5DVIR6fahl90CM\u0026q=85\u0026s=927c445258f1014a7d7cf43109ee835b","dark":"https://mintcdn.com/11x-60396687/WQ5DVIR6fahl90CM/logo/dark.svg?fit=max\u0026auto=format\u0026n=WQ5DVIR6fahl90CM\u0026q=85\u0026s=933b33761c527ce9f25b141b4a4bb730"},"favicon":"https://mintcdn.com/11x-60396687/WQ5DVIR6fahl90CM/favicon.ico?fit=max\u0026auto=format\u0026n=WQ5DVIR6fahl90CM\u0026q=85\u0026s=b9853654433a92f29d604dadf2398d51","api":{"playground":{"display":"interactive","proxy":true},"examples":{"defaults":"required","languages":["curl","python","javascript"]}},"background":{"color":{"light":"#F9F8F4","dark":"#141010"}},"footer":{"socials":{"website":"https://www.11x.ai"}},"fonts":{"heading":{"family":"Geist Mono","weight":500},"body":{"family":"Inter"}},"styling":{"eyebrows":"section","codeblocks":{},"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"11x-60396687","hasAudioNarration":false,"actualSubdomain":"11x-60396687","customDomains":["docs.julian.11x.ai"],"gitSource":{"type":"github","owner":"11x-ai","repo":"voice-calling-ai","deployBranch":"main","contentDirectory":"platform/public-docs","isPrivate":true,"mountPath":"","label":""},"chroma":{"collectionId":"29558137-6fc1-4031-bbb2-8819b808d7f8","liveDeploymentHistoryId":"6aeb59c5119a07d709ebadd5","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6aeb59c5119a07d709ebadd5"},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6aeb59c5119a07d709ebadd5","clientVersion":"0.0.4076","searchFilterCounts":[{"language":"default","tag":"API Reference","count":19},{"language":"default","tag":"Chat Widget","count":11},{"language":"default","tag":"Integrations","count":6},{"language":"default","tag":"Documentation","count":4},{"language":"default","tag":"Engage Visitors","count":4},{"language":"default","tag":"Scheduling","count":4},{"language":"default","tag":"Agents","count":4},{"language":"default","tag":"In-Chat Actions","count":3},{"language":"default","tag":"CRM","count":3},{"language":"default","tag":"Conversation Meetings","count":3}]},"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":"rbac-expansion","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":"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":"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},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"comment-mode","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":true},"customCss":[{"filePath":"style.css","content":":root{--brand-cream: #f9f8f4;--brand-ink: #1d1a1c;--brand-coral: #b8441f;--brand-orange: #ef7b42;--brand-line: #e9e4dc;--brand-surface: #f3efe8;--brand-mono: \"Geist Mono\", ui-monospace, SFMono-Regular, Menlo, monospace}html.dark{--brand-line: #2e2420;--brand-surface: #1c1613}.eyebrow,.sidebar-group-header,.sidebar-title{font-family:var(--brand-mono);text-transform:uppercase;letter-spacing:0.08em;font-size:0.75rem}.nav-tabs-item{font-family:var(--brand-mono);text-transform:uppercase;letter-spacing:0.06em;font-size:0.8125rem}#page-title{letter-spacing:-0.02em}#navbar,#sidebar,#table-of-contents,footer{border-color:var(--brand-line)}.card,.code-block,.code-group,.accordion,.expandable,.frame{border-color:var(--brand-line)!important}.card:hover{border-color:var(--brand-coral)!important}html.dark .card:hover{border-color:var(--brand-orange)!important}.callout:is([data-callout-type=\"note\"],[data-callout-type=\"info\"]){background-color:var(--brand-surface)!important;border-color:var(--brand-line)!important}.callout:is([data-callout-type=\"note\"],[data-callout-type=\"info\"])>[data-component-part=\"callout-icon\"] svg{color:var(--brand-coral)!important}.callout:is([data-callout-type=\"note\"],[data-callout-type=\"info\"])>[data-component-part=\"callout-content\"]{color:var(--brand-ink)!important}html.dark .callout:is([data-callout-type=\"note\"],[data-callout-type=\"info\"])>[data-component-part=\"callout-icon\"] svg{color:var(--brand-orange)!important}html.dark .callout:is([data-callout-type=\"note\"],[data-callout-type=\"info\"])>[data-component-part=\"callout-content\"]{color:#e9e2d8!important}.tryit-button{background-color:var(--brand-coral)!important;color:#ffffff!important}.mdx-content table th,.mdx-content table td{padding:0.625rem 0.875rem;vertical-align:top}.mdx-content table th{background-color:var(--brand-surface);text-align:left}.mdx-content table th:first-child{border-top-left-radius:0.5rem}.mdx-content table th:last-child{border-top-right-radius:0.5rem}.chat-figure{margin:1.5rem 0}.chat-figure img{margin:0;width:100%;border-radius:0.75rem}.mdx-content :not(pre)>code{background-color:var(--brand-surface);border-color:var(--brand-line)}.brand-hero{border-radius:1rem;overflow:hidden;margin-bottom:2rem}.brand-hero img{margin:0;width:100%;aspect-ratio:3 / 1;object-fit:cover}"}],"page":{"pagePath":"api-reference/scheduling/enroll-multiple-contacts","slug":"/api-reference/scheduling/enroll-multiple-contacts","pageMetadata":{"title":"Enroll multiple contacts","description":"Schedule up to 1,000 contacts in a single request — the API equivalent of CSV import.\n\nValidation is **per-contact**: valid contacts are queued, and invalid contacts are returned in `rejected[]` with their original zero-based index. `total` always equals `accepted + rejected.length` on a `202`. Invalid JSON, invalid field types, invalid request options, agent configuration errors, no valid contacts, or insufficient credits reject the whole request.\n\n**Examples:** the request examples assume the agent requires `account_id`. Replace that field with every custom input variable required by your agent, directly on each contact. Use [List agent input variables](/api-reference/agents/list-agent-input-variables) to discover them. The default example omits `scheduledAt` so 11x chooses times using the agent's schedule. Provide `toEmailAddress` for agents with email steps.\n\n**Asynchronous results:** `202` confirms that accepted contacts passed upfront checks and were queued. Sequence creation happens in the background and can still fail. `batchId` identifies the request; sequence IDs are not returned here, and there is no public batch-status endpoint. Inspect background scheduling failures in the agent's scheduling logs. Receive completed-call results through the [Call Results webhook](/webhooks), or retrieve available conversation results using [Search conversations](/api-reference/conversation-metadata/search-conversations).\n\n**Duplicate detection:** phone numbers are normalized first, so `+12125550123` and `+1 (212) 555-0123` collide. By default only the first occurrence in the batch is accepted. Contacts are also rejected if a sequence for the same phone number on this agent is still in progress or started within the past 30 days. `allowDuplicates: true` bypasses both duplicate checks. Opt-outs and California calling restrictions still apply.\n\n**Contact chaining** (`groupByField`): contacts are grouped by the value of the named custom variable. Only the first valid contact in each group is scheduled immediately; the rest activate automatically when an earlier call in the same group does not reach a successful outcome.\n\n**Rate limiting:** this endpoint allows 600 requests per minute per agent by default, shared across API keys for the same organization. The agent may have a different configured limit. On `429`, wait for `Retry-After` seconds before retrying.\n\n**Idempotency:** send an `Idempotency-Key` to make retries safe. Retrying a request that returned `202` with the same key and the same body returns the original response with `Idempotent-Replayed: true` and schedules nothing again. See the `Idempotency-Key` header for the other cases.\n\n**Request signing:** agents with signing enabled also require `X-HMAC-Timestamp` and `X-HMAC-Signature`. See [Authentication](/authentication#request-signing) for the signature format.","deprecated":null,"version":null,"openapi":"/openapi.json post /agents/{agentId}/schedule/sequences","href":"/api-reference/scheduling/enroll-multiple-contacts","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 a: \"a\",\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: \"Schedule up to 1,000 contacts in a single request — the API equivalent of CSV import.\"\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Validation is \", _jsx(_components.strong, {\n children: \"per-contact\"\n }), \": valid contacts are queued, and invalid contacts are returned in \", _jsx(_components.code, {\n children: \"rejected[]\"\n }), \" with their original zero-based index. \", _jsx(_components.code, {\n children: \"total\"\n }), \" always equals \", _jsx(_components.code, {\n children: \"accepted + rejected.length\"\n }), \" on a \", _jsx(_components.code, {\n children: \"202\"\n }), \". Invalid JSON, invalid field types, invalid request options, agent configuration errors, no valid contacts, or insufficient credits reject the whole request.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Examples:\"\n }), \" the request examples assume the agent requires \", _jsx(_components.code, {\n children: \"account_id\"\n }), \". Replace that field with every custom input variable required by your agent, directly on each contact. Use \", _jsx(_components.a, {\n href: \"/api-reference/agents/list-agent-input-variables\",\n children: \"List agent input variables\"\n }), \" to discover them. The default example omits \", _jsx(_components.code, {\n children: \"scheduledAt\"\n }), \" so 11x chooses times using the agent’s schedule. Provide \", _jsx(_components.code, {\n children: \"toEmailAddress\"\n }), \" for agents with email steps.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Asynchronous results:\"\n }), \" \", _jsx(_components.code, {\n children: \"202\"\n }), \" confirms that accepted contacts passed upfront checks and were queued. Sequence creation happens in the background and can still fail. \", _jsx(_components.code, {\n children: \"batchId\"\n }), \" identifies the request; sequence IDs are not returned here, and there is no public batch-status endpoint. Inspect background scheduling failures in the agent’s scheduling logs. Receive completed-call results through the \", _jsx(_components.a, {\n href: \"/webhooks\",\n children: \"Call Results webhook\"\n }), \", or retrieve available conversation results using \", _jsx(_components.a, {\n href: \"/api-reference/conversation-metadata/search-conversations\",\n children: \"Search conversations\"\n }), \".\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Duplicate detection:\"\n }), \" phone numbers are normalized first, so \", _jsx(_components.code, {\n children: \"+12125550123\"\n }), \" and \", _jsx(_components.code, {\n children: \"+1 (212) 555-0123\"\n }), \" collide. By default only the first occurrence in the batch is accepted. Contacts are also rejected if a sequence for the same phone number on this agent is still in progress or started within the past 30 days. \", _jsx(_components.code, {\n children: \"allowDuplicates: true\"\n }), \" bypasses both duplicate checks. Opt-outs and California calling restrictions still apply.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Contact chaining\"\n }), \" (\", _jsx(_components.code, {\n children: \"groupByField\"\n }), \"): contacts are grouped by the value of the named custom variable. Only the first valid contact in each group is scheduled immediately; the rest activate automatically when an earlier call in the same group does not reach a successful outcome.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Rate limiting:\"\n }), \" this endpoint allows 600 requests per minute per agent by default, shared across API keys for the same organization. The agent may have a different configured limit. On \", _jsx(_components.code, {\n children: \"429\"\n }), \", wait for \", _jsx(_components.code, {\n children: \"Retry-After\"\n }), \" seconds before retrying.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Idempotency:\"\n }), \" send an \", _jsx(_components.code, {\n children: \"Idempotency-Key\"\n }), \" to make retries safe. Retrying a request that returned \", _jsx(_components.code, {\n children: \"202\"\n }), \" with the same key and the same body returns the original response with \", _jsx(_components.code, {\n children: \"Idempotent-Replayed: true\"\n }), \" and schedules nothing again. See the \", _jsx(_components.code, {\n children: \"Idempotency-Key\"\n }), \" header for the other cases.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Request signing:\"\n }), \" agents with signing enabled also require \", _jsx(_components.code, {\n children: \"X-HMAC-Timestamp\"\n }), \" and \", _jsx(_components.code, {\n children: \"X-HMAC-Signature\"\n }), \". See \", _jsx(_components.a, {\n href: \"/authentication#request-signing\",\n children: \"Authentication\"\n }), \" for the signature format.\"]\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":{"codeStyling":{},"config":{},"pageMetadata":{"title":"Enroll multiple contacts","description":"Schedule up to 1,000 contacts in a single request — the API equivalent of CSV import.\n\nValidation is **per-contact**: valid contacts are queued, and invalid contacts are returned in `rejected[]` with their original zero-based index. `total` always equals `accepted + rejected.length` on a `202`. Invalid JSON, invalid field types, invalid request options, agent configuration errors, no valid contacts, or insufficient credits reject the whole request.\n\n**Examples:** the request examples assume the agent requires `account_id`. Replace that field with every custom input variable required by your agent, directly on each contact. Use [List agent input variables](/api-reference/agents/list-agent-input-variables) to discover them. The default example omits `scheduledAt` so 11x chooses times using the agent's schedule. Provide `toEmailAddress` for agents with email steps.\n\n**Asynchronous results:** `202` confirms that accepted contacts passed upfront checks and were queued. Sequence creation happens in the background and can still fail. `batchId` identifies the request; sequence IDs are not returned here, and there is no public batch-status endpoint. Inspect background scheduling failures in the agent's scheduling logs. Receive completed-call results through the [Call Results webhook](/webhooks), or retrieve available conversation results using [Search conversations](/api-reference/conversation-metadata/search-conversations).\n\n**Duplicate detection:** phone numbers are normalized first, so `+12125550123` and `+1 (212) 555-0123` collide. By default only the first occurrence in the batch is accepted. Contacts are also rejected if a sequence for the same phone number on this agent is still in progress or started within the past 30 days. `allowDuplicates: true` bypasses both duplicate checks. Opt-outs and California calling restrictions still apply.\n\n**Contact chaining** (`groupByField`): contacts are grouped by the value of the named custom variable. Only the first valid contact in each group is scheduled immediately; the rest activate automatically when an earlier call in the same group does not reach a successful outcome.\n\n**Rate limiting:** this endpoint allows 600 requests per minute per agent by default, shared across API keys for the same organization. The agent may have a different configured limit. On `429`, wait for `Retry-After` seconds before retrying.\n\n**Idempotency:** send an `Idempotency-Key` to make retries safe. Retrying a request that returned `202` with the same key and the same body returns the original response with `Idempotent-Replayed: true` and schedules nothing again. See the `Idempotency-Key` header for the other cases.\n\n**Request signing:** agents with signing enabled also require `X-HMAC-Timestamp` and `X-HMAC-Signature`. See [Authentication](/authentication#request-signing) for the signature format.","deprecated":null,"version":null,"openapi":"/openapi.json post /agents/{agentId}/schedule/sequences","href":"/api-reference/scheduling/enroll-multiple-contacts","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"tags":["Scheduling"],"operationId":"scheduleSequencesBulk","summary":"Enroll multiple contacts","description":"Schedule up to 1,000 contacts in a single request — the API equivalent of CSV import.\n\nValidation is **per-contact**: valid contacts are queued, and invalid contacts are returned in `rejected[]` with their original zero-based index. `total` always equals `accepted + rejected.length` on a `202`. Invalid JSON, invalid field types, invalid request options, agent configuration errors, no valid contacts, or insufficient credits reject the whole request.\n\n**Examples:** the request examples assume the agent requires `account_id`. Replace that field with every custom input variable required by your agent, directly on each contact. Use [List agent input variables](/api-reference/agents/list-agent-input-variables) to discover them. The default example omits `scheduledAt` so 11x chooses times using the agent's schedule. Provide `toEmailAddress` for agents with email steps.\n\n**Asynchronous results:** `202` confirms that accepted contacts passed upfront checks and were queued. Sequence creation happens in the background and can still fail. `batchId` identifies the request; sequence IDs are not returned here, and there is no public batch-status endpoint. Inspect background scheduling failures in the agent's scheduling logs. Receive completed-call results through the [Call Results webhook](/webhooks), or retrieve available conversation results using [Search conversations](/api-reference/conversation-metadata/search-conversations).\n\n**Duplicate detection:** phone numbers are normalized first, so `+12125550123` and `+1 (212) 555-0123` collide. By default only the first occurrence in the batch is accepted. Contacts are also rejected if a sequence for the same phone number on this agent is still in progress or started within the past 30 days. `allowDuplicates: true` bypasses both duplicate checks. Opt-outs and California calling restrictions still apply.\n\n**Contact chaining** (`groupByField`): contacts are grouped by the value of the named custom variable. Only the first valid contact in each group is scheduled immediately; the rest activate automatically when an earlier call in the same group does not reach a successful outcome.\n\n**Rate limiting:** this endpoint allows 600 requests per minute per agent by default, shared across API keys for the same organization. The agent may have a different configured limit. On `429`, wait for `Retry-After` seconds before retrying.\n\n**Idempotency:** send an `Idempotency-Key` to make retries safe. Retrying a request that returned `202` with the same key and the same body returns the original response with `Idempotent-Replayed: true` and schedules nothing again. See the `Idempotency-Key` header for the other cases.\n\n**Request signing:** agents with signing enabled also require `X-HMAC-Timestamp` and `X-HMAC-Signature`. See [Authentication](/authentication#request-signing) for the signature format.","parameters":["6175034c-2dd0-4a16-8631-ed30c439ff6e","b31af9c2-2d64-4a00-9df6-ec80a3ffb220","4dc74bb3-acff-42f3-9577-7508b916082c","be92b447-3aae-4ae8-b501-867eda42a850"],"requestBody":"2df3b533-8506-471c-965f-f74c72fd7473","responses":{"202":"b080d33d-ee4f-497b-af38-853b2433f836","400":"ceaf6c1d-2ca3-4a03-abfd-2d80a8924f22","401":"5e48eac8-bca2-461b-a75a-168eec2afa56","404":"188b8f0a-eeae-4410-8116-012d9e310529","409":"5b418b7e-fe3c-4144-b11e-9f033bf2f8b7","415":"e08e7861-9d1e-40c6-9e44-a1c981e9b0ec","422":"bff9b603-1123-4890-8347-a51f65f8d352","429":"e32170a7-55f5-4504-b92c-8c3d067bd4e3","500":"72ee0436-9d8c-4871-9cf7-9bfe50f6440c"},"method":"post","type":"path","servers":["55b5b6a1-f4e6-4766-85af-f5989293e1b6"],"security":["cae36bfb-99a4-4801-8ed9-d1461b2b123e"],"path":"/agents/{agentId}/schedule/sequences","baseUrlOptions":["https://julian.11x.ai/api/v1"],"title":"Enroll multiple contacts","codeSamples":[],"requestExampleLanguages":["bash","python","javascript"],"requiredOnlyExamples":true,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"6175034c-2dd0-4a16-8631-ed30c439ff6e":{"name":"agentId","in":"path","required":true,"description":"ID of the agent, e.g. `agent.abc123`.","schema":{"type":"string","isRequired":true,"description":"ID of the agent, e.g. `agent.abc123`.","uniqueKey":"","typeLabel":"string"}},"b31af9c2-2d64-4a00-9df6-ec80a3ffb220":{"name":"Idempotency-Key","in":"header","required":false,"description":"Optional, max 255 characters after trimming. When supplied, its value is returned as `batchId`; otherwise 11x generates a UUID. Only a `202` records the key, for 24 hours. Within that time, a request with the same key and a byte-for-byte identical body returns the stored `202` response with the `Idempotent-Replayed: true` header and schedules nothing again; the same key with a different body returns `422 IDEMPOTENCY_KEY_REUSED`. While the first request with a key is still being processed, another request with that key returns `409 IDEMPOTENCY_KEY_IN_PROGRESS`. If the first request with a key does not return `202`, nothing is recorded and the key can be reused for a corrected request. Use a new key for each new batch.","schema":{"type":"string","isRequired":false,"description":"Optional, max 255 characters after trimming. When supplied, its value is returned as `batchId`; otherwise 11x generates a UUID. Only a `202` records the key, for 24 hours. Within that time, a request with the same key and a byte-for-byte identical body returns the stored `202` response with the `Idempotent-Replayed: true` header and schedules nothing again; the same key with a different body returns `422 IDEMPOTENCY_KEY_REUSED`. While the first request with a key is still being processed, another request with that key returns `409 IDEMPOTENCY_KEY_IN_PROGRESS`. If the first request with a key does not return `202`, nothing is recorded and the key can be reused for a corrected request. Use a new key for each new batch.","uniqueKey":"","typeLabel":"string"}},"4dc74bb3-acff-42f3-9577-7508b916082c":{"name":"X-HMAC-Timestamp","in":"header","required":false,"description":"Required when request signing is enabled for this agent. Current Unix time in seconds, within the agent's configured tolerance (default ±300 seconds).","schema":{"type":"string","pattern":"^\\d{1,10}$","isRequired":false,"description":"Required when request signing is enabled for this agent. Current Unix time in seconds, within the agent's configured tolerance (default ±300 seconds).","uniqueKey":"","typeLabel":"string"}},"be92b447-3aae-4ae8-b501-867eda42a850":{"name":"X-HMAC-Signature","in":"header","required":false,"description":"Required when request signing is enabled for this agent. Base64-encoded HMAC-SHA256 of POST + newline + timestamp + newline + the exact JSON body, using the agent's signing secret. The x-api-key header is also required.","schema":{"type":"string","isRequired":false,"description":"Required when request signing is enabled for this agent. Base64-encoded HMAC-SHA256 of POST + newline + timestamp + newline + the exact JSON body, using the agent's signing secret. The x-api-key header is also required.","uniqueKey":"","typeLabel":"string"}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["contacts"],"properties":{"contacts":{"type":"array","minItems":1,"maxItems":1000,"description":"Contacts to enroll (1–1,000).","items":{"type":"object","required":["name","phoneNumber"],"description":"In addition to the fields below, include every custom input variable required by the agent as a top-level string property.","properties":{"name":{"type":"string","example":"John Doe","isRequired":true,"uniqueKey":"contacts.items.[INDEX].name","typeLabel":"string"},"phoneNumber":{"type":"string","description":"Phone number in E.164 format.","example":"+12125550123","isRequired":true,"uniqueKey":"contacts.items.[INDEX].phoneNumber","typeLabel":"string"},"phoneNumberExt":{"type":"string","description":"DTMF extension dialed after the call connects.","uniqueKey":"contacts.items.[INDEX].phoneNumberExt","typeLabel":"string"},"timezone":{"type":"string","description":"Per-contact IANA timezone. Used for explicit scheduledAt validation and for automatic scheduling when the agent is configured to use contact timezones. Otherwise automatic scheduling uses the request's timezone or the agent's first configured timezone.","uniqueKey":"contacts.items.[INDEX].timezone","typeLabel":"string"},"scheduledAt":{"type":"string","format":"date-time","description":"Per-contact scheduled time (ISO 8601), at least five seconds in the future. Omit to use the agent's schedule.","uniqueKey":"contacts.items.[INDEX].scheduledAt","typeLabel":"string\u003cdate-time>"},"toEmailAddress":{"type":"string","format":"email","description":"Required when the agent's sequence contains email steps.","uniqueKey":"contacts.items.[INDEX].toEmailAddress","typeLabel":"string\u003cemail>"}},"additionalProperties":{"oneOf":[{"type":"string","description":"Custom input variables defined on the agent. Numbers and booleans are converted to strings.","uniqueKey":"contacts.items.[INDEX].additionalProperties.oneOf.0","typeLabel":"string"},{"type":"number","description":"Custom input variables defined on the agent. Numbers and booleans are converted to strings.","uniqueKey":"contacts.items.[INDEX].additionalProperties.oneOf.1","typeLabel":"number"},{"type":"boolean","description":"Custom input variables defined on the agent. Numbers and booleans are converted to strings.","uniqueKey":"contacts.items.[INDEX].additionalProperties.oneOf.2","typeLabel":"boolean"}],"uniqueKey":"contacts.items.[INDEX].additionalProperties","typeLabel":"string | number | boolean"},"uniqueKey":"contacts.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"contacts","typeLabel":"object[]"},"timezone":{"type":"string","description":"Default IANA timezone applied to contacts that don't supply their own. If omitted, falls back to the agent's first configured timezone.","example":"America/New_York","uniqueKey":"timezone","typeLabel":"string"},"groupByField":{"type":"string","description":"Group contacts by the value of a custom variable for contact chaining. Only the first valid contact per group is scheduled immediately. Cannot be combined with `allowDuplicates`.","example":"account_id","uniqueKey":"groupByField","typeLabel":"string"},"normalizeFields":{"type":"array","items":{"type":"string","uniqueKey":"normalizeFields.items.[INDEX]","typeLabel":"string"},"description":"Custom variable names to title-case before scheduling (e.g. `\"JOHN\"` → `\"John\"`). Only applied for organizations in the normalization allowlist.","uniqueKey":"normalizeFields","typeLabel":"string[]"},"allowDuplicates":{"type":"boolean","default":false,"description":"Bypass duplicate checks within the batch and against sequences on this agent that are still in progress or started within the past 30 days. Opt-outs and California calling restrictions still apply. Cannot be combined with groupByField.","uniqueKey":"allowDuplicates","typeLabel":"boolean"}},"example":{"contacts":[{"name":"John Doe","phoneNumber":"+12125550123","account_id":"account_123"},{"name":"Jane Smith","phoneNumber":"+12125550124","account_id":"account_456"}],"timezone":"America/New_York"},"uniqueKey":"","typeLabel":"object"},"examples":{"allAccepted":{"title":"allAccepted","description":"Assumes this agent requires account_id. Times are chosen using the agent's schedule.","value":{"contacts":[{"name":"John Doe","phoneNumber":"+12125550123","account_id":"account_123"},{"name":"Jane Smith","phoneNumber":"+12125550124","account_id":"account_456"}],"timezone":"America/New_York"}},"partialAcceptance":{"title":"partialAcceptance","description":"Assumes this agent requires account_id. Only the first contact is accepted.","value":{"contacts":[{"name":"John Doe","phoneNumber":"+12125550123","account_id":"account_123"},{"name":"Jane Smith","phoneNumber":"+12125550124"}],"timezone":"America/New_York"}}},"exampleType":"examples"}},"exampleType":"examples"},"responses":{"b080d33d-ee4f-497b-af38-853b2433f836":{"description":"Accepted contacts were queued for asynchronous processing. Both full and partial acceptance return 202. Inspect rejected[] and do not assume sequence creation has completed.","headers":{"Idempotent-Replayed":{"description":"Present and `true` when this is the stored response to an earlier request with the same Idempotency-Key and body; nothing new was scheduled.","schema":{"type":"string","enum":["true"]}}},"content":{"application/json":{"schema":{"type":"object","required":["batchId","total","accepted","rejected"],"properties":{"batchId":{"type":"string","example":"550e8400-e29b-41d4-a716-446655440000","description":"Request correlation identifier: the trimmed Idempotency-Key when supplied, otherwise a generated UUID. This identifier is not a sequence ID.","isRequired":true,"uniqueKey":"batchId","typeLabel":"string"},"total":{"type":"integer","description":"Total contacts submitted.","example":2,"minimum":1,"maximum":1000,"isRequired":true,"uniqueKey":"total","typeLabel":"integer"},"accepted":{"type":"integer","description":"Contacts that passed upfront checks and were queued for background scheduling. Background creation can still fail.","example":2,"minimum":1,"maximum":1000,"isRequired":true,"uniqueKey":"accepted","typeLabel":"integer"},"rejected":{"type":"array","description":"Per-contact validation failures (empty when all passed).","items":{"type":"object","properties":{"index":{"type":"integer","description":"Zero-based index of the contact in the submitted `contacts` array.","example":1,"minimum":0,"isRequired":true,"uniqueKey":"rejected.items.[INDEX].index","typeLabel":"integer"},"reason":{"type":"string","description":"Rejection reason code.","enum":["MISSING_NAME","MISSING_PHONE_NUMBER","INVALID_PHONE_NUMBER","INVALID_EMAIL","INVALID_TIMEZONE","INVALID_SCHEDULED_AT","MISSING_CUSTOM_VARIABLES","DUPLICATE_PHONE_NUMBER","DUPLICATE_ACTIVE_SEQUENCE","DO_NOT_CALL","CALIFORNIA_RESTRICTION"],"example":"MISSING_CUSTOM_VARIABLES","isRequired":true,"uniqueKey":"rejected.items.[INDEX].reason","typeLabel":"enum\u003cstring>"},"error":{"type":"string","description":"Human-readable explanation.","example":"Missing custom input variables: account_id.","isRequired":true,"uniqueKey":"rejected.items.[INDEX].error","typeLabel":"string"},"retryable":{"type":"boolean","description":"Always false. Do not immediately retry the same contact unchanged. Correct invalid data, resolve a block, or wait until duplicate eligibility changes, then resubmit with a new Idempotency-Key.","const":false,"example":false,"isRequired":true,"uniqueKey":"rejected.items.[INDEX].retryable","typeLabel":"boolean"},"phoneNumber":{"type":"string","example":"+12125550124","description":"Present when a phone number is available. Invalid numbers may be returned as submitted; valid numbers are normalized to E.164.","uniqueKey":"rejected.items.[INDEX].phoneNumber","typeLabel":"string"},"retryAfter":{"type":"string","format":"date-time","description":"For `DUPLICATE_ACTIVE_SEQUENCE`: the earliest time the contact can be accepted. Absent while an earlier sequence is still running.","uniqueKey":"rejected.items.[INDEX].retryAfter","typeLabel":"string\u003cdate-time>"}},"required":["index","reason","error","retryable"],"uniqueKey":"rejected.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"rejected","typeLabel":"object[]"}},"example":{"batchId":"550e8400-e29b-41d4-a716-446655440000","total":2,"accepted":2,"rejected":[]},"uniqueKey":"","typeLabel":"object"},"examples":{"allAccepted":{"title":"allAccepted","value":{"batchId":"550e8400-e29b-41d4-a716-446655440000","total":2,"accepted":2,"rejected":[]}},"partialAcceptance":{"title":"partialAcceptance","value":{"batchId":"550e8400-e29b-41d4-a716-446655440000","total":2,"accepted":1,"rejected":[{"index":1,"phoneNumber":"+12125550124","reason":"MISSING_CUSTOM_VARIABLES","error":"Missing custom input variables: account_id.","retryable":false}]}}},"exampleType":"examples"}},"exampleType":"examples"},"ceaf6c1d-2ca3-4a03-abfd-2d80a8924f22":{"description":"Request rejected. `error` is one of: `INVALID_REQUEST_BODY` (body is not valid JSON), `INVALID_REQUEST` (schema violation — empty `contacts`, more than 1000 contacts, or `allowDuplicates` combined with `groupByField`), `INVALID_TIMEZONE` (top-level timezone invalid), `MISSING_TIMEZONE` (agent has no configured timezones), `AGENT_NOT_ACTIVE` (agent is paused, deleted or archived), `AGENT_SCHEDULE_NOT_CONFIGURED` (agent has no schedule days), `INVALID_IDEMPOTENCY_KEY` (header exceeds 255 characters), `ALL_CONTACTS_REJECTED` (every contact failed validation — see `rejected[]`), `INSUFFICIENT_CREDITS` (not enough credits for the accepted contacts — top up and retry).","content":{"application/json":{"schema":{"oneOf":[{"type":"object","required":["error","message","retryable"],"properties":{"error":{"type":"string","enum":["INVALID_REQUEST_BODY","INVALID_REQUEST","INVALID_TIMEZONE","MISSING_TIMEZONE","AGENT_NOT_ACTIVE","AGENT_SCHEDULE_NOT_CONFIGURED","INVALID_IDEMPOTENCY_KEY"],"isRequired":true,"uniqueKey":"oneOf.0.error","typeLabel":"enum\u003cstring>"},"message":{"type":"string","isRequired":true,"uniqueKey":"oneOf.0.message","typeLabel":"string"},"retryable":{"type":"boolean","const":false,"isRequired":true,"uniqueKey":"oneOf.0.retryable","typeLabel":"boolean"}},"uniqueKey":"oneOf.0","typeLabel":"object"},{"type":"object","required":["error","message","retryable","batchId","total","accepted","rejected"],"properties":{"error":{"type":"string","const":"ALL_CONTACTS_REJECTED","isRequired":true,"uniqueKey":"oneOf.1.error","typeLabel":"string"},"message":{"type":"string","isRequired":true,"uniqueKey":"oneOf.1.message","typeLabel":"string"},"retryable":{"type":"boolean","const":false,"isRequired":true,"uniqueKey":"oneOf.1.retryable","typeLabel":"boolean"},"batchId":{"type":"string","example":"550e8400-e29b-41d4-a716-446655440000","description":"Request correlation identifier: the trimmed Idempotency-Key when supplied, otherwise a generated UUID. This identifier is not a sequence ID.","isRequired":true,"uniqueKey":"oneOf.1.batchId","typeLabel":"string"},"total":{"type":"integer","minimum":1,"maximum":1000,"isRequired":true,"uniqueKey":"oneOf.1.total","typeLabel":"integer"},"accepted":{"type":"integer","const":0,"isRequired":true,"uniqueKey":"oneOf.1.accepted","typeLabel":"integer"},"rejected":{"type":"array","minItems":1,"items":{"type":"object","properties":{"index":{"type":"integer","description":"Zero-based index of the contact in the submitted `contacts` array.","example":1,"minimum":0,"isRequired":true,"uniqueKey":"oneOf.1.rejected.items.[INDEX].index","typeLabel":"integer"},"reason":{"type":"string","description":"Rejection reason code.","enum":["MISSING_NAME","MISSING_PHONE_NUMBER","INVALID_PHONE_NUMBER","INVALID_EMAIL","INVALID_TIMEZONE","INVALID_SCHEDULED_AT","MISSING_CUSTOM_VARIABLES","DUPLICATE_PHONE_NUMBER","DUPLICATE_ACTIVE_SEQUENCE","DO_NOT_CALL","CALIFORNIA_RESTRICTION"],"example":"MISSING_CUSTOM_VARIABLES","isRequired":true,"uniqueKey":"oneOf.1.rejected.items.[INDEX].reason","typeLabel":"enum\u003cstring>"},"error":{"type":"string","description":"Human-readable explanation.","example":"Missing custom input variables: account_id.","isRequired":true,"uniqueKey":"oneOf.1.rejected.items.[INDEX].error","typeLabel":"string"},"retryable":{"type":"boolean","description":"Always false. Do not immediately retry the same contact unchanged. Correct invalid data, resolve a block, or wait until duplicate eligibility changes, then resubmit with a new Idempotency-Key.","const":false,"example":false,"isRequired":true,"uniqueKey":"oneOf.1.rejected.items.[INDEX].retryable","typeLabel":"boolean"},"phoneNumber":{"type":"string","example":"+12125550124","description":"Present when a phone number is available. Invalid numbers may be returned as submitted; valid numbers are normalized to E.164.","uniqueKey":"oneOf.1.rejected.items.[INDEX].phoneNumber","typeLabel":"string"},"retryAfter":{"type":"string","format":"date-time","description":"For `DUPLICATE_ACTIVE_SEQUENCE`: the earliest time the contact can be accepted. Absent while an earlier sequence is still running.","uniqueKey":"oneOf.1.rejected.items.[INDEX].retryAfter","typeLabel":"string\u003cdate-time>"}},"required":["index","reason","error","retryable"],"uniqueKey":"oneOf.1.rejected.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.1.rejected","typeLabel":"object[]"}},"uniqueKey":"oneOf.1","typeLabel":"object"},{"type":"object","required":["error","message","retryable","result"],"properties":{"error":{"type":"string","const":"INSUFFICIENT_CREDITS","isRequired":true,"uniqueKey":"oneOf.2.error","typeLabel":"string"},"message":{"type":"string","isRequired":true,"uniqueKey":"oneOf.2.message","typeLabel":"string"},"retryable":{"type":"boolean","const":true,"description":"Retry after enough organization credits become available.","isRequired":true,"uniqueKey":"oneOf.2.retryable","typeLabel":"boolean"},"result":{"type":"object","required":["contacts_requested","credits_available"],"properties":{"contacts_requested":{"type":"integer","minimum":1,"description":"Contacts that passed upfront checks.","isRequired":true,"uniqueKey":"oneOf.2.result.contacts_requested","typeLabel":"integer"},"credits_available":{"type":"number","description":"Available organization credits at the time of the request.","isRequired":true,"uniqueKey":"oneOf.2.result.credits_available","typeLabel":"number"}},"isRequired":true,"uniqueKey":"oneOf.2.result","typeLabel":"object"}},"uniqueKey":"oneOf.2","typeLabel":"object"}],"uniqueKey":"","typeLabel":"object"},"examples":{"invalidRequest":{"title":"invalidRequest","value":{"error":"INVALID_REQUEST","message":"The 'contacts' array must contain at least one contact.","retryable":false}},"allContactsRejected":{"title":"allContactsRejected","value":{"error":"ALL_CONTACTS_REJECTED","message":"All 1 contacts failed validation. No contacts were scheduled.","retryable":false,"batchId":"550e8400-e29b-41d4-a716-446655440000","total":1,"accepted":0,"rejected":[{"index":0,"phoneNumber":"+12125550124","reason":"MISSING_CUSTOM_VARIABLES","error":"Missing custom input variables: account_id.","retryable":false}]}},"insufficientCredits":{"title":"insufficientCredits","value":{"error":"INSUFFICIENT_CREDITS","message":"Insufficient credits: 2 contacts requested, 1 available.","retryable":true,"result":{"contacts_requested":2,"credits_available":1}}}},"exampleType":"examples"}},"exampleType":"examples"},"5e48eac8-bca2-461b-a75a-168eec2afa56":{"description":"API key missing, invalid, disabled or expired; agent belongs to another organization; or request signing failed. HMAC errors apply only when signing is enabled. Authenticate or correct the signature before retrying.","content":{"application/json":{"schema":{"type":"object","required":["error","message"],"properties":{"error":{"type":"string","enum":["UNAUTHORIZED","INVALID_API_KEY","HMAC_HEADERS_MISSING","HMAC_TIMESTAMP_INVALID","INVALID_HMAC_SIGNATURE"],"isRequired":true,"uniqueKey":"error","typeLabel":"enum\u003cstring>"},"message":{"type":"string","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"retryable":{"type":"boolean","const":false,"description":"Present on wrong-organization and request-signing failures; omitted on API-key authentication failures.","uniqueKey":"retryable","typeLabel":"boolean"}},"uniqueKey":"","typeLabel":"object"},"examples":{"missingApiKey":{"title":"missingApiKey","value":{"error":"UNAUTHORIZED","message":"API key is required. Please provide your API key in the x-api-key header."}},"invalidApiKey":{"title":"invalidApiKey","value":{"error":"INVALID_API_KEY","message":"The provided API key is invalid."}},"disabledApiKey":{"title":"disabledApiKey","value":{"error":"INVALID_API_KEY","message":"The provided API key is not active."}},"expiredApiKey":{"title":"expiredApiKey","value":{"error":"INVALID_API_KEY","message":"The provided API key has expired."}},"wrongOrganization":{"title":"wrongOrganization","value":{"error":"UNAUTHORIZED","message":"Invalid API key.","retryable":false}},"missingSignature":{"title":"missingSignature","value":{"error":"HMAC_HEADERS_MISSING","message":"The X-HMAC-Timestamp and X-HMAC-Signature headers are required.","retryable":false}},"invalidTimestamp":{"title":"invalidTimestamp","value":{"error":"HMAC_TIMESTAMP_INVALID","message":"The HMAC timestamp is invalid or expired.","retryable":false}},"invalidSignature":{"title":"invalidSignature","value":{"error":"INVALID_HMAC_SIGNATURE","message":"The HMAC signature is invalid.","retryable":false}}},"exampleType":"examples"}},"exampleType":"examples"},"188b8f0a-eeae-4410-8116-012d9e310529":{"description":"Agent could not be loaded. A successfully loaded agent belonging to another organization returns 401 UNAUTHORIZED.","content":{"application/json":{"schema":{"type":"object","required":["error","message","retryable"],"properties":{"error":{"type":"string","const":"AGENT_NOT_FOUND","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"message":{"type":"string","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"retryable":{"type":"boolean","const":false,"isRequired":true,"uniqueKey":"retryable","typeLabel":"boolean"}},"uniqueKey":"","typeLabel":"object"},"examples":{"agentNotFound":{"title":"agentNotFound","value":{"error":"AGENT_NOT_FOUND","message":"Agent not found.","retryable":false}}},"exampleType":"examples"}},"exampleType":"examples"},"5b418b7e-fe3c-4144-b11e-9f033bf2f8b7":{"description":"Another request with this Idempotency-Key is still being processed. Retry shortly with the same key and body.","content":{"application/json":{"schema":{"type":"object","required":["error","message","retryable"],"properties":{"error":{"type":"string","const":"IDEMPOTENCY_KEY_IN_PROGRESS","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"message":{"type":"string","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"retryable":{"type":"boolean","const":true,"isRequired":true,"uniqueKey":"retryable","typeLabel":"boolean"}},"uniqueKey":"","typeLabel":"object"},"examples":{"idempotencyKeyInProgress":{"title":"idempotencyKeyInProgress","value":{"error":"IDEMPOTENCY_KEY_IN_PROGRESS","message":"A request with this Idempotency-Key is still being processed. Retry shortly.","retryable":true}}},"exampleType":"examples"}},"exampleType":"examples"},"e08e7861-9d1e-40c6-9e44-a1c981e9b0ec":{"description":"The `Content-Type` header is missing or is not `application/json`.","content":{"application/json":{"schema":{"type":"object","required":["error","message","retryable"],"properties":{"error":{"type":"string","const":"UNSUPPORTED_MEDIA_TYPE","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"message":{"type":"string","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"retryable":{"type":"boolean","const":false,"isRequired":true,"uniqueKey":"retryable","typeLabel":"boolean"}},"uniqueKey":"","typeLabel":"object"},"examples":{"unsupportedMediaType":{"title":"unsupportedMediaType","value":{"error":"UNSUPPORTED_MEDIA_TYPE","message":"Content-Type must be application/json.","retryable":false}}},"exampleType":"examples"}},"exampleType":"examples"},"bff9b603-1123-4890-8347-a51f65f8d352":{"description":"This Idempotency-Key already recorded a `202` for a different request body. Send the new request with a new key.","content":{"application/json":{"schema":{"type":"object","required":["error","message","retryable"],"properties":{"error":{"type":"string","const":"IDEMPOTENCY_KEY_REUSED","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"message":{"type":"string","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"retryable":{"type":"boolean","const":false,"isRequired":true,"uniqueKey":"retryable","typeLabel":"boolean"}},"uniqueKey":"","typeLabel":"object"},"examples":{"idempotencyKeyReused":{"title":"idempotencyKeyReused","value":{"error":"IDEMPOTENCY_KEY_REUSED","message":"This Idempotency-Key was already used with a different request body. Send a new key.","retryable":false}}},"exampleType":"examples"}},"exampleType":"examples"},"e32170a7-55f5-4504-b92c-8c3d067bd4e3":{"description":"Per-agent request limit exceeded. Defaults to 600 requests per minute, shared across API keys for the same organization; the agent may have a different configured limit. Wait Retry-After seconds before retrying.","content":{"application/json":{"schema":{"type":"object","required":["error","message","retryable"],"properties":{"error":{"type":"string","const":"RATE_LIMITED","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"message":{"type":"string","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"retryable":{"type":"boolean","const":true,"isRequired":true,"uniqueKey":"retryable","typeLabel":"boolean"}},"uniqueKey":"","typeLabel":"object"},"examples":{"rateLimited":{"title":"rateLimited","value":{"error":"RATE_LIMITED","message":"Rate limit of 600 requests per minute exceeded for this agent. Retry after 30 seconds.","retryable":true}}},"exampleType":"examples"}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1,"example":30}},"X-RateLimit-Limit":{"description":"Configured request limit per minute.","schema":{"type":"integer","example":600}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer","example":0}},"X-RateLimit-Reset":{"description":"Rate-limit reset time as Unix seconds.","schema":{"type":"integer"}}},"exampleType":"examples"},"72ee0436-9d8c-4871-9cf7-9bfe50f6440c":{"description":"Unexpected server failure. API-key lookup failures return JSON with error INVALID_API_KEY and message \"An internal server error occurred while validating the API key.\" Other server failures may return an unstructured body, so clients must handle non-JSON responses. Retry with backoff and reuse the same Idempotency-Key for an unchanged request.","content":{"_mintlify/placeholder":{"schema":{"type":"object","description":""}}}}},"security":{"cae36bfb-99a4-4801-8ed9-d1461b2b123e":{"apiKeyAuth":{"type":"apiKey","in":"header","name":"x-api-key","description":"Organization API key. Get it from the 11x team or from the platform.","scopes":[],"schemeName":"apiKeyAuth"}}},"servers":{"55b5b6a1-f4e6-4766-85af-f5989293e1b6":{"url":"https://julian.11x.ai/api/v1"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"apiKey","in":"header","name":"x-api-key","description":"Organization API key. Get it from the 11x team or from the platform.","scopes":[],"schemeName":"apiKeyAuth"},"schema":{"title":"x-api-key","type":"string","description":"Organization API key. Get it from the 11x team or from the platform.","isRequired":true,"typeLabel":"string","deprecated":false},"schemeName":"apiKeyAuth","name":"x-api-key"}],"title":"apiKeyAuth"}]},"originalFileLocation":"openapi.json"},"subdomain":"11x-60396687","siteName":"11x Docs","title":"Enroll multiple contacts - 11x Docs","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-11-04T16:14:03.945Z","originalFileLocation":"api-reference/scheduling/enroll-multiple-contacts.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=\"Schedule up to 1,000 contacts in a single request — the API equivalent of CSV import. Validation is per-contact: valid contacts are queued, and invalid contacts are returned in rejected[] with their original zero-based index. total always equals accepted + rejected.length on a 202. Invalid JSON, invalid field types, invalid request options, agent configuration errors, no valid contacts, or insufficient credits reject the whole request. Examples: the request examples assume the agent requires account_id. Replace that field with every custom input variable required by your agent, directly on each contact. Use List agent input variables to discover them. The default example omits scheduledAt so 11x chooses times using the agent\u0026#x27;s schedule. Provide toEmailAddress for agents with email steps. Asynchronous results: 202 confirms that accepted contacts passed upfront checks and were queued. Sequence creation happens in the background and can still fail. batchId identifies the request; sequence IDs are not returned here, and there is no public batch-status endpoint. Inspect background scheduling failures in the agent\u0026#x27;s scheduling logs. Receive completed-call results through the Call Results webhook, or retrieve available conversation results using Search conversations. Duplicate detection: phone numbers are normalized first, so +12125550123 and +1 (212) 555-0123 collide. By default only the first occurrence in the batch is accepted. Contacts are also rejected if a sequence for the same phone number on this agent is still in progress or started within the past 30 days. allowDuplicates: true bypasses both duplicate checks. Opt-outs and California calling restrictions still apply. Contact chaining (groupByField): contacts are grouped by the value of the named custom variable. Only the first valid contact in each group is scheduled immediately; the rest activate automatically when an earlier call in the same group does not reach a successful outcome. Rate limiting: this endpoint allows 600 requests per minute per agent by default, shared across API keys for the same organization. The agent may have a different configured limit. On 429, wait for Retry-After seconds before retrying. Idempotency: send an Idempotency-Key to make retries safe. Retrying a request that returned 202 with the same key and the same body returns the original response with Idempotent-Replayed: true and schedules nothing again. See the Idempotency-Key header for the other cases. Request signing: agents with signing enabled also require X-HMAC-Timestamp and X-HMAC-Signature. See Authentication for the signature format.\">\u003cmeta data-mint-head name=\"application-name\" content=\"11x Docs\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/11x-60396687/kPociBcyaWGj5IZW/_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/11x-60396687/kPociBcyaWGj5IZW/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/11x-60396687/kPociBcyaWGj5IZW/_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/11x-60396687/kPociBcyaWGj5IZW/_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/11x-60396687/kPociBcyaWGj5IZW/_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/11x-60396687/kPociBcyaWGj5IZW/_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/11x-60396687/kPociBcyaWGj5IZW/_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/11x-60396687/kPociBcyaWGj5IZW/_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/11x-60396687/kPociBcyaWGj5IZW/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Enroll multiple contacts - 11x Docs\">\u003cmeta data-mint-head property=\"og:description\" content=\"Schedule up to 1,000 contacts in a single request — the API equivalent of CSV import. Validation is per-contact: valid contacts are queued, and invalid contacts are returned in rejected[] with their original zero-based index. total always equals accepted + rejected.length on a 202. Invalid JSON, invalid field types, invalid request options, agent configuration errors, no valid contacts, or insufficient credits reject the whole request. Examples: the request examples assume the agent requires account_id. Replace that field with every custom input variable required by your agent, directly on each contact. Use List agent input variables to discover them. The default example omits scheduledAt so 11x chooses times using the agent\u0026#x27;s schedule. Provide toEmailAddress for agents with email steps. Asynchronous results: 202 confirms that accepted contacts passed upfront checks and were queued. Sequence creation happens in the background and can still fail. batchId identifies the request; sequence IDs are not returned here, and there is no public batch-status endpoint. Inspect background scheduling failures in the agent\u0026#x27;s scheduling logs. Receive completed-call results through the Call Results webhook, or retrieve available conversation results using Search conversations. Duplicate detection: phone numbers are normalized first, so +12125550123 and +1 (212) 555-0123 collide. By default only the first occurrence in the batch is accepted. Contacts are also rejected if a sequence for the same phone number on this agent is still in progress or started within the past 30 days. allowDuplicates: true bypasses both duplicate checks. Opt-outs and California calling restrictions still apply. Contact chaining (groupByField): contacts are grouped by the value of the named custom variable. Only the first valid contact in each group is scheduled immediately; the rest activate automatically when an earlier call in the same group does not reach a successful outcome. Rate limiting: this endpoint allows 600 requests per minute per agent by default, shared across API keys for the same organization. The agent may have a different configured limit. On 429, wait for Retry-After seconds before retrying. Idempotency: send an Idempotency-Key to make retries safe. Retrying a request that returned 202 with the same key and the same body returns the original response with Idempotent-Replayed: true and schedules nothing again. See the Idempotency-Key header for the other cases. Request signing: agents with signing enabled also require X-HMAC-Timestamp and X-HMAC-Signature. See Authentication for the signature format.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"11x Docs\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.julian.11x.ai/api-reference/scheduling/enroll-multiple-contacts\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://11x-60396687.mintlify.site/_mintlify/api/og/v2?division=Scheduling\u0026amp;title=Enroll+multiple+contacts\u0026amp;description=Schedule+up+to+1%2C000+contacts+in+a+single+request+%E2%80%94+the+API+equivalent+of+CSV+import.%0A%0AValidation+is+**per-contact**%3A+valid+contacts+are+queued%2C+and+invalid+con\u0026amp;theme=6ac836ff8ffff2229882b2f5\u0026amp;signature=9642df6126c1872511c6d517f788f0692ac5bf0e56988a0f0c9c1f41984e0921\">\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=\"Enroll multiple contacts - 11x Docs\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Schedule up to 1,000 contacts in a single request — the API equivalent of CSV import. Validation is per-contact: valid contacts are queued, and invalid contacts are returned in rejected[] with their original zero-based index. total always equals accepted + rejected.length on a 202. Invalid JSON, invalid field types, invalid request options, agent configuration errors, no valid contacts, or insufficient credits reject the whole request. Examples: the request examples assume the agent requires account_id. Replace that field with every custom input variable required by your agent, directly on each contact. Use List agent input variables to discover them. The default example omits scheduledAt so 11x chooses times using the agent\u0026#x27;s schedule. Provide toEmailAddress for agents with email steps. Asynchronous results: 202 confirms that accepted contacts passed upfront checks and were queued. Sequence creation happens in the background and can still fail. batchId identifies the request; sequence IDs are not returned here, and there is no public batch-status endpoint. Inspect background scheduling failures in the agent\u0026#x27;s scheduling logs. Receive completed-call results through the Call Results webhook, or retrieve available conversation results using Search conversations. Duplicate detection: phone numbers are normalized first, so +12125550123 and +1 (212) 555-0123 collide. By default only the first occurrence in the batch is accepted. Contacts are also rejected if a sequence for the same phone number on this agent is still in progress or started within the past 30 days. allowDuplicates: true bypasses both duplicate checks. Opt-outs and California calling restrictions still apply. Contact chaining (groupByField): contacts are grouped by the value of the named custom variable. Only the first valid contact in each group is scheduled immediately; the rest activate automatically when an earlier call in the same group does not reach a successful outcome. Rate limiting: this endpoint allows 600 requests per minute per agent by default, shared across API keys for the same organization. The agent may have a different configured limit. On 429, wait for Retry-After seconds before retrying. Idempotency: send an Idempotency-Key to make retries safe. Retrying a request that returned 202 with the same key and the same body returns the original response with Idempotent-Replayed: true and schedules nothing again. See the Idempotency-Key header for the other cases. Request signing: agents with signing enabled also require X-HMAC-Timestamp and X-HMAC-Signature. See Authentication for the signature format.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://11x-60396687.mintlify.site/_mintlify/api/og/v2?division=Scheduling\u0026amp;title=Enroll+multiple+contacts\u0026amp;description=Schedule+up+to+1%2C000+contacts+in+a+single+request+%E2%80%94+the+API+equivalent+of+CSV+import.%0A%0AValidation+is+**per-contact**%3A+valid+contacts+are+queued%2C+and+invalid+con\u0026amp;theme=6ac836ff8ffff2229882b2f5\u0026amp;signature=9642df6126c1872511c6d517f788f0692ac5bf0e56988a0f0c9c1f41984e0921\">\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/11x-60396687/kPociBcyaWGj5IZW/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"11x Docs\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#B8441F\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.julian.11x.ai/api-reference/scheduling/enroll-multiple-contacts\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/scheduling/enroll-multiple-contacts.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.julian.11x.ai/#organization\",\"name\":\"11x Docs\",\"url\":\"https://docs.julian.11x.ai\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/11x-60396687/WQ5DVIR6fahl90CM/logo/light.svg?fit=max\u0026auto=format\u0026n=WQ5DVIR6fahl90CM\u0026q=85\u0026s=927c445258f1014a7d7cf43109ee835b\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.julian.11x.ai#website\",\"name\":\"11x Docs\",\"url\":\"https://docs.julian.11x.ai\",\"publisher\":{\"@id\":\"https://docs.julian.11x.ai/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.julian.11x.ai/api-reference/scheduling/enroll-multiple-contacts#webpage\",\"url\":\"https://docs.julian.11x.ai/api-reference/scheduling/enroll-multiple-contacts\",\"name\":\"Enroll multiple contacts\",\"description\":\"Schedule up to 1,000 contacts in a single request — the API equivalent of CSV import. Validation is per-contact: valid contacts are queued, and invalid contacts are returned in rejected[] with their original zero-based index. total always equals accepted + rejected.length on a 202. Invalid JSON, invalid field types, invalid request options, agent configuration errors, no valid contacts, or insufficient credits reject the whole request. Examples: the request examples assume the agent requires account_id. Replace that field with every custom input variable required by your agent, directly on each contact. Use List agent input variables to discover them. The default example omits scheduledAt so 11x chooses times using the agent's schedule. Provide toEmailAddress for agents with email steps. Asynchronous results: 202 confirms that accepted contacts passed upfront checks and were queued. Sequence creation happens in the background and can still fail. batchId identifies the request; sequence IDs are not returned here, and there is no public batch-status endpoint. Inspect background scheduling failures in the agent's scheduling logs. Receive completed-call results through the Call Results webhook, or retrieve available conversation results using Search conversations. Duplicate detection: phone numbers are normalized first, so +12125550123 and +1 (212) 555-0123 collide. By default only the first occurrence in the batch is accepted. Contacts are also rejected if a sequence for the same phone number on this agent is still in progress or started within the past 30 days. allowDuplicates: true bypasses both duplicate checks. Opt-outs and California calling restrictions still apply. Contact chaining (groupByField): contacts are grouped by the value of the named custom variable. Only the first valid contact in each group is scheduled immediately; the rest activate automatically when an earlier call in the same group does not reach a successful outcome. Rate limiting: this endpoint allows 600 requests per minute per agent by default, shared across API keys for the same organization. The agent may have a different configured limit. On 429, wait for Retry-After seconds before retrying. Idempotency: send an Idempotency-Key to make retries safe. Retrying a request that returned 202 with the same key and the same body returns the original response with Idempotent-Replayed: true and schedules nothing again. See the Idempotency-Key header for the other cases. Request signing: agents with signing enabled also require X-HMAC-Timestamp and X-HMAC-Signature. See Authentication for the signature format.\",\"dateModified\":\"2026-11-04T16:14:03.945Z\",\"isPartOf\":{\"@id\":\"https://docs.julian.11x.ai#website\"},\"breadcrumb\":{\"@id\":\"https://docs.julian.11x.ai/api-reference/scheduling/enroll-multiple-contacts#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.julian.11x.ai/api-reference/scheduling/enroll-multiple-contacts#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Scheduling\",\"item\":\"https://docs.julian.11x.ai/api-reference/scheduling/enroll-a-single-contact\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Enroll multiple contacts\",\"item\":\"https://docs.julian.11x.ai/api-reference/scheduling/enroll-multiple-contacts\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.julian.11x.ai/api-reference/scheduling/enroll-multiple-contacts#apireference\",\"headline\":\"Enroll multiple contacts\",\"name\":\"Enroll multiple contacts\",\"description\":\"Schedule up to 1,000 contacts in a single request — the API equivalent of CSV import. Validation is per-contact: valid contacts are queued, and invalid contacts are returned in rejected[] with their original zero-based index. total always equals accepted + rejected.length on a 202. Invalid JSON, invalid field types, invalid request options, agent configuration errors, no valid contacts, or insufficient credits reject the whole request. Examples: the request examples assume the agent requires account_id. Replace that field with every custom input variable required by your agent, directly on each contact. Use List agent input variables to discover them. The default example omits scheduledAt so 11x chooses times using the agent's schedule. Provide toEmailAddress for agents with email steps. Asynchronous results: 202 confirms that accepted contacts passed upfront checks and were queued. Sequence creation happens in the background and can still fail. batchId identifies the request; sequence IDs are not returned here, and there is no public batch-status endpoint. Inspect background scheduling failures in the agent's scheduling logs. Receive completed-call results through the Call Results webhook, or retrieve available conversation results using Search conversations. Duplicate detection: phone numbers are normalized first, so +12125550123 and +1 (212) 555-0123 collide. By default only the first occurrence in the batch is accepted. Contacts are also rejected if a sequence for the same phone number on this agent is still in progress or started within the past 30 days. allowDuplicates: true bypasses both duplicate checks. Opt-outs and California calling restrictions still apply. Contact chaining (groupByField): contacts are grouped by the value of the named custom variable. Only the first valid contact in each group is scheduled immediately; the rest activate automatically when an earlier call in the same group does not reach a successful outcome. Rate limiting: this endpoint allows 600 requests per minute per agent by default, shared across API keys for the same organization. The agent may have a different configured limit. On 429, wait for Retry-After seconds before retrying. Idempotency: send an Idempotency-Key to make retries safe. Retrying a request that returned 202 with the same key and the same body returns the original response with Idempotent-Replayed: true and schedules nothing again. See the Idempotency-Key header for the other cases. Request signing: agents with signing enabled also require X-HMAC-Timestamp and X-HMAC-Signature. See Authentication for the signature format.\",\"url\":\"https://docs.julian.11x.ai/api-reference/scheduling/enroll-multiple-contacts\",\"mainEntityOfPage\":{\"@id\":\"https://docs.julian.11x.ai/api-reference/scheduling/enroll-multiple-contacts#webpage\"},\"dateModified\":\"2026-11-04T16:14:03.945Z\",\"publisher\":{\"@id\":\"https://docs.julian.11x.ai/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.julian.11x.ai#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"11x Docs\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"11x Docs","nav":{"global":null,"tabs":[{"tab":"Documentation","pages":[{"title":"Documentation","href":"/introduction"}]},{"tab":"Chat Widget","pages":[{"title":"Chat Widget","href":"/chat/overview"}]},{"tab":"Integrations","pages":[{"title":"Integrations","href":"/crm-integrations"}]},{"tab":"API Reference","groups":[{"group":"Workflows","pages":[{"title":"Inspect one workflow run","deprecated":null,"version":null,"openapi":"/openapi.json get /workflows/{agentId}/run","href":"/api-reference/workflows/inspect-one-workflow-run"},{"title":"Start one workflow run","deprecated":null,"version":null,"openapi":"/openapi.json post /workflows/{agentId}/run","href":"/api-reference/workflows/start-one-workflow-run"},{"title":"List workflow run history","deprecated":null,"version":null,"openapi":"/openapi.json get /workflows/{agentId}/runs","href":"/api-reference/workflows/list-workflow-run-history"}]},{"group":"Scheduling","pages":[{"title":"Enroll a single contact","description":"Schedule one outbound sequence per request. This is the recommended endpoint for real-time, per-contact integrations (CRM webhooks, lead capture forms, etc.). For batch imports, use the bulk endpoint.\n\nYou can also send a `HEAD` request to this URL to verify your API key and agent ID without scheduling anything (returns 200 if reachable).","deprecated":null,"version":null,"openapi":"/openapi.json post /agents/{agentId}/schedule/sequence","href":"/api-reference/scheduling/enroll-a-single-contact"},{"title":"Enroll multiple contacts","deprecated":null,"version":null,"openapi":"/openapi.json post /agents/{agentId}/schedule/sequences","href":"/api-reference/scheduling/enroll-multiple-contacts"}]},{"group":"Agents","pages":[{"title":"List organization agents","description":"Returns active, paused, and archived agents belonging to an organization in fixed pages of up to 100 agents. The required `orgId` is the Stytch organization ID and must match the organization associated with the API key.","deprecated":null,"version":null,"openapi":"/openapi.json get /agents","href":"/api-reference/agents/list-organization-agents"},{"title":"List agent input variables","deprecated":null,"version":null,"openapi":"/openapi.json get /agents/{agentId}/input-variables","href":"/api-reference/agents/list-agent-input-variables"},{"title":"List agent extracted variables","deprecated":null,"version":null,"openapi":"/openapi.json get /agents/{agentId}/extracted-variables","href":"/api-reference/agents/list-agent-extracted-variables"},{"title":"List agent outcomes","deprecated":null,"version":null,"openapi":"/openapi.json get /agents/{agentId}/outcomes","href":"/api-reference/agents/list-agent-outcomes"}]},{"group":"Sequences","pages":[{"title":"Cancel sequences","deprecated":null,"version":null,"openapi":"/openapi.json post /sequences/cancel","href":"/api-reference/sequences/cancel-sequences"}]},{"group":"Credits","pages":[{"title":"Get credit usage","deprecated":null,"version":null,"openapi":"/openapi.json get /credits/usage","href":"/api-reference/credits/get-credit-usage"}]},{"group":"Conversation Meetings","pages":[{"title":"List meeting attendees","deprecated":null,"version":null,"openapi":"/openapi.json get /conversations/meetings/{entityId}/attendees","href":"/api-reference/conversation-meetings/list-meeting-attendees"},{"title":"Add meeting attendees","deprecated":null,"version":null,"openapi":"/openapi.json post /conversations/meetings/{entityId}/attendees","href":"/api-reference/conversation-meetings/add-meeting-attendees"},{"title":"Cancel meeting","deprecated":null,"version":null,"openapi":"/openapi.json post /conversations/meetings/{entityId}/cancel","href":"/api-reference/conversation-meetings/cancel-meeting"}]},{"group":"Conversation Metadata","pages":[{"title":"Search conversations","deprecated":null,"version":null,"openapi":"/openapi.json get /conversations/search/{agentId}","href":"/api-reference/conversation-metadata/search-conversations"},{"title":"Retrieve conversation metadata","deprecated":null,"version":null,"openapi":"/openapi.json get /conversations/metadata/{sequenceId}","href":"/api-reference/conversation-metadata/retrieve-conversation-metadata"}]},{"group":"Recordings","pages":[{"title":"Retrieve recordings for conversations","deprecated":null,"version":null,"openapi":"/openapi.json post /recordings","href":"/api-reference/recordings/retrieve-recordings-for-conversations"},{"title":"Retrieve a call recording","deprecated":null,"version":null,"openapi":"/openapi.json get /recordings/{callId}","href":"/api-reference/recordings/retrieve-a-call-recording"}]},{"group":"Webhooks","pages":[{"title":"Call results","version":null,"deprecated":null,"openapi":"/openapi.json webhook callResults","href":"/api-reference/webhooks/call-results"}]}]}]},"basePath":"","title":"Enroll multiple contacts - 11x Docs","buildId":"dpl_2grHJBti9hgwf9Do67jupa8J7v8e","deploymentId":"dpl_2grHJBti9hgwf9Do67jupa8J7v8e","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-DaTqz-AH.js","utils-CsUUUct_.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-CnvaPNoU.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-BwagxZKX.js","snippetPresets-C-VdbFNr.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","ApiExamples-CG9P2cMm.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-BtDqnZBr.js","shallow-54FVT67S.js","getApiPlaygroundDisplay-B8tP2NQv.js","CodeSnippet-DtbQv-QL.js","CodeSnippets-_1OCGqVx.js","Page-Fjj9VUMC.js","getPastedJson-C08d7iH7.js","icon-DPd42gnk.js","MethodPill-Z1Ejh5lk.js","DuplicateIcon-bGe0ab6n.js","createIcon-o_Wc2Raf.js","DynamicMarkdown-CVjP4U6p.js","SectionHeading-CXfki1-u.js","axios-vUo_bRtp.js","Markdown-Vx6tk1CN.js","clsx-DA-ub-wq.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-6J38nsph.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-DAS7CDBS.js"]}