{
"error": {
"code": "bad_request",
"message": "The request is malformed."
}
}
{
"error": {
"code": "unauthorized",
"message": "Authentication is required. Send a valid Bearer token in the Authorization header."
}
}
{
"error": {
"code": "forbidden",
"message": "You do not have permission to perform this action."
}
}
{
"error": {
"code": "not_found",
"message": "Resource could not be found."
}
}
{
"error": {
"code": "conflict",
"message": "The request payload is invalid.",
"details": [
{
"field": "confirm_recipients",
"code": "mismatch",
"message": "You confirmed 800 recipients but this audience currently reaches 1187. Preview the recipients again and resend with the current number."
}
]
}
}
{
"error": {
"code": "validation_failed",
"message": "The request payload is invalid.",
"details": [
{
"field": "message",
"code": "template_not_found",
"message": "Template \"reactivation\" is not approved for this inbox. Approved templates: reactivation_september, welcome_back."
}
]
}
}
{
"error": {
"code": "rate_limited",
"message": "Too many requests. Try again in a moment."
}
}
Creating a campaign sends it. There is no separate step that starts the send, and no way to call it back: whatever you create here goes out. confirm_recipients has to equal the reachable the preview returned for the same audience in the same channel; if it does not, the answer is 409 with both numbers and nothing is created.
Do not repeat this call after a timeout. A repeat creates a second campaign and sends a second time, and every WhatsApp message is billed. Reading the campaign back only helps if you already hold its id: there is no listing and no idempotency key, so a lost response cannot be resolved through this API — open the campaign dashboard in Cloud Chat to see whether it was created before you send again.
The channel follows from what you send. A campaign carrying email_campaign_sender_id is an e-mail campaign; otherwise the channel comes from the channel_type of the inbox behind inbox_id: Channel::Whatsapp sends a WhatsApp template, Channel::WebWidget sends a widget message. Check channel_type first, because nothing cross-checks your intent: a website inbox chosen while you meant to send WhatsApp delivers the template name to your contacts as the literal text of the message.
This response is not a delivery confirmation. Sending happens after it returns and can still fail; what actually reached your contacts is in the Cloud Chat campaign dashboard. Every WhatsApp message is billed and reaches a real person, so do not send one merely to rehearse. To check an audience without sending, use the preview endpoint.
{
"error": {
"code": "bad_request",
"message": "The request is malformed."
}
}
{
"error": {
"code": "unauthorized",
"message": "Authentication is required. Send a valid Bearer token in the Authorization header."
}
}
{
"error": {
"code": "forbidden",
"message": "You do not have permission to perform this action."
}
}
{
"error": {
"code": "not_found",
"message": "Resource could not be found."
}
}
{
"error": {
"code": "conflict",
"message": "The request payload is invalid.",
"details": [
{
"field": "confirm_recipients",
"code": "mismatch",
"message": "You confirmed 800 recipients but this audience currently reaches 1187. Preview the recipients again and resend with the current number."
}
]
}
}
{
"error": {
"code": "validation_failed",
"message": "The request payload is invalid.",
"details": [
{
"field": "message",
"code": "template_not_found",
"message": "Template \"reactivation\" is not approved for this inbox. Approved templates: reactivation_september, welcome_back."
}
]
}
}
{
"error": {
"code": "rate_limited",
"message": "Too many requests. Try again in a moment."
}
}
The id_token from POST /auth/v1/signin, sent as Authorization: Bearer <id_token>. Not the access_token — that one does not carry the identity Cloud Chat authorizes on.
Your Cloud Chat instance ID — an integer, fixed for your company, told at onboarding. The API overview explains how instances work, how to find yours, and the errors a wrong or missing value produces.
Your Cloud Chat account. It has to be an account your token grants membership on, and it has to live on the instance in the cloudchat-instance header — the two travel together. Account numbers are only unique within an instance, so the same number is a different company on another instance. Usually a mismatched pair fails closed with a 401, because your user does not exist on the other instance — but if your identity happens to exist on both, the call succeeds against the other company's data, silently. Read it and you are looking at the wrong help center; write it and you have stored into the wrong account. Send the two values that were given to you together, and never try a number to see what answers.
Example:
1
Body
application/json
A campaign to create and send, together with the reach you are confirming.
The campaign itself. Which fields apply depends on the channel, and the channel is never passed directly: it follows from email_campaign_sender_id, or from the type of the inbox.
The reachable count you are confirming. It has to equal the reachable the preview returned for this exact audience and channel; any other value answers 409 with both numbers and creates nothing. Leaving it out is a 409 too, not a default.
Values for a WhatsApp template placeholders, keyed by the exact token between the braces: "1", "2" and so on for a positional template, the variable name for a named one. Send exactly as many keys as the template parameters count. A value wrapped in double braces, such as {{contact.name}}, is resolved per recipient at send time; anything else is sent literally to everyone.
Where the campaign is in its lifecycle — not a delivery report. completed means a worker took it over, not that anything arrived: on WhatsApp it is set before the audience is even resolved. failed means a precondition stopped the dispatch and it will not be retried. What actually reached your contacts is in the Cloud Chat campaign dashboard.
The values in use are active, completed, running, draft, partially_completed and failed. The set is open and grows as new states are added, so read an unfamiliar value as a state you do not know yet rather than as an error.
The reach the campaign was confirmed against. Returned only when the campaign is created: reach is computed, never stored, so reading a campaign back omits the field entirely.
The user the campaign is attributed to. Through the API this is always the identity of the token that created it — authorship cannot be set in the payload.
The raw audience size recorded on the campaign, before the reachability check. It is not what was delivered, and it is not what confirm_recipients is compared against.
When dispatch began. Always null on a WhatsApp campaign — only the e-mail path fills it — so its absence tells you nothing about whether the campaign ran.
When the campaign reached a terminal status; null while it is still open.
Example:
"2026-09-19T17:34:15.002Z"
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Cloud Chat","colors":{"primary":"#EF7221","light":"#FF9D5C","dark":"#D65E10"},"logo":{"light":"https://mintcdn.com/cloud-humans/GHbxWTY81Qa4762I/logo/light.svg?fit=max\u0026auto=format\u0026n=GHbxWTY81Qa4762I\u0026q=85\u0026s=2899d32cd5c5f8adff5bb4390125f626","dark":"https://mintcdn.com/cloud-humans/GHbxWTY81Qa4762I/logo/dark.svg?fit=max\u0026auto=format\u0026n=GHbxWTY81Qa4762I\u0026q=85\u0026s=95d8350f3dade95801b6c310d5ba597f"},"favicon":"https://mintcdn.com/cloud-humans/T7XxBi09ex74abIC/favicon.svg?fit=max\u0026auto=format\u0026n=T7XxBi09ex74abIC\u0026q=85\u0026s=6b1379d1ea0f266d6ca12eb1f8ccbf77","fonts":{"family":"Inter"},"contextual":{"options":["copy","view","chatgpt","claude","perplexity","mcp","cursor","vscode"],"display":"header"},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"cloud-humans","hasAudioNarration":false,"actualSubdomain":"cloud-humans","customDomains":["docs.cloudhumans.com"],"gitSource":{"type":"github","owner":"cloudhumans","repo":"dev-docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6aeb98e7c89be31069aa9e0d","clientVersion":"0.0.4087","searchFilterCounts":[{"language":"default","tag":"API Reference","count":122},{"language":"default","tag":"Cloud Chat","count":80},{"language":"default","tag":"Claudia","count":61},{"language":"default","tag":"Guides","count":31},{"language":"default","tag":"Data Export","count":27},{"language":"default","tag":"Table Catalog","count":19},{"language":"default","tag":"Agents","count":18},{"language":"default","tag":"Help Center","count":15},{"language":"default","tag":"Knowledge Base Content","count":9},{"language":"default","tag":"Conversations","count":6}]},"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":"editor-metadata","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":false},"customCss":[],"page":{"pagePath":"api-reference/cloudchat/endpoints/create-a-campaign","slug":"/api-reference/cloudchat/endpoints/create-a-campaign","pageMetadata":{"title":"Create a campaign","openapi":"api-reference/specs/cloudchat/v1.json POST /v1/accounts/{accountId}/campaigns","description":"**Creating a campaign sends it.** There is no separate step that starts the send, and no way to call it back: whatever you create here goes out. `confirm_recipients` has to equal the `reachable` the preview returned for the same audience in the same channel; if it does not, the answer is 409 with both numbers and nothing is created.\n\n**Do not repeat this call after a timeout.** A repeat creates a second campaign and sends a second time, and every WhatsApp message is billed. Reading the campaign back only helps if you already hold its `id`: there is no listing and no idempotency key, so a lost response cannot be resolved through this API — open the campaign dashboard in Cloud Chat to see whether it was created before you send again.\n\nThe channel follows from what you send. A campaign carrying `email_campaign_sender_id` is an e-mail campaign; otherwise the channel comes from the `channel_type` of the inbox behind `inbox_id`: `Channel::Whatsapp` sends a WhatsApp template, `Channel::WebWidget` sends a widget message. **Check `channel_type` first**, because nothing cross-checks your intent: a website inbox chosen while you meant to send WhatsApp delivers the template name to your contacts as the literal text of the message.\n\n**This response is not a delivery confirmation.** Sending happens after it returns and can still fail; what actually reached your contacts is in the Cloud Chat campaign dashboard. Every WhatsApp message is billed and reaches a real person, so do not send one merely to rehearse. To check an audience without sending, use the preview endpoint.","href":"/api-reference/cloudchat/endpoints/create-a-campaign"},"description":{"compiledSource":"\"use strict\";\nconst {Fragment: _Fragment, jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n p: \"p\",\n strong: \"strong\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Creating a campaign sends it.\"\n }), \" There is no separate step that starts the send, and no way to call it back: whatever you create here goes out. \", _jsx(_components.code, {\n children: \"confirm_recipients\"\n }), \" has to equal the \", _jsx(_components.code, {\n children: \"reachable\"\n }), \" the preview returned for the same audience in the same channel; if it does not, the answer is 409 with both numbers and nothing is created.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Do not repeat this call after a timeout.\"\n }), \" A repeat creates a second campaign and sends a second time, and every WhatsApp message is billed. Reading the campaign back only helps if you already hold its \", _jsx(_components.code, {\n children: \"id\"\n }), \": there is no listing and no idempotency key, so a lost response cannot be resolved through this API — open the campaign dashboard in Cloud Chat to see whether it was created before you send again.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"The channel follows from what you send. A campaign carrying \", _jsx(_components.code, {\n children: \"email_campaign_sender_id\"\n }), \" is an e-mail campaign; otherwise the channel comes from the \", _jsx(_components.code, {\n children: \"channel_type\"\n }), \" of the inbox behind \", _jsx(_components.code, {\n children: \"inbox_id\"\n }), \": \", _jsx(_components.code, {\n children: \"Channel::Whatsapp\"\n }), \" sends a WhatsApp template, \", _jsx(_components.code, {\n children: \"Channel::WebWidget\"\n }), \" sends a widget message. \", _jsxs(_components.strong, {\n children: [\"Check \", _jsx(_components.code, {\n children: \"channel_type\"\n }), \" first\"]\n }), \", because nothing cross-checks your intent: a website inbox chosen while you meant to send WhatsApp delivers the template name to your contacts as the literal text of the message.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"This response is not a delivery confirmation.\"\n }), \" Sending happens after it returns and can still fail; what actually reached your contacts is in the Cloud Chat campaign dashboard. Every WhatsApp message is billed and reaches a real person, so do not send one merely to rehearse. To check an audience without sending, use the preview endpoint.\"]\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{jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];const CloudChatYourValues=()=>{const _components={a:`a`,..._provideComponents()};const STORAGE_KEY=`cloudchat-api-selected-account`;const CREDENTIALS_HREF=`/api-reference/cloudchat/credentials`;const[saved,setSaved]=useState(null);const[ready,setReady]=useState(false);useEffect(()=>{let value=null;try{const raw=window.localStorage.getItem(STORAGE_KEY);if(raw){const parsed=JSON.parse(raw);if(parsed\u0026\u0026parsed.instance\u0026\u0026parsed.account){value={instance:String(parsed.instance),account:String(parsed.account),name:typeof parsed.name===`string`\u0026\u0026parsed.name?parsed.name:null}}}}catch(error){value=null}setSaved(value);setReady(true)},[]);const shell=`not-prose rounded-xl border border-gray-200 dark:border-white/10 bg-gray-50 dark:bg-white/5 px-4 py-3 mb-6`;if(!ready||!saved){return _jsx(`div`,{className:`not-prose mint-rounded-xl mint-border mint-border-gray-200 dark:mint-border-white/10 mint-bg-gray-50 dark:mint-bg-white/5 mint-px-4 mint-py-3 mint-mb-6`,children:_jsxs(`p`,{className:`mint-text-sm mint-text-gray-600 dark:mint-text-gray-400`,children:[`Every request below needs your `,_jsx(`code`,{children:`cloudchat-instance`}),` header and your account id.`,` `,_jsx(_components.a,{href:CREDENTIALS_HREF,className:`mint-underline mint-underline-offset-2`,children:`Paste your token`}),` `,`and they will show up here, ready to copy.`]})})}return _jsx(`div`,{className:`not-prose mint-rounded-xl mint-border mint-border-gray-200 dark:mint-border-white/10 mint-bg-gray-50 dark:mint-bg-white/5 mint-px-4 mint-py-3 mint-mb-6`,children:_jsxs(`div`,{className:`mint-flex mint-flex-wrap mint-items-baseline mint-gap-x-6 mint-gap-y-2`,children:[_jsxs(`div`,{children:[_jsx(`span`,{className:`mint-text-xs mint-uppercase mint-tracking-wide mint-text-gray-500 dark:mint-text-gray-400`,children:`cloudchat-instance`}),_jsx(`span`,{className:`mint-ml-2 mint-font-mono mint-text-sm mint-text-gray-900 dark:mint-text-gray-100`,children:saved.instance})]}),_jsxs(`div`,{children:[_jsx(`span`,{className:`mint-text-xs mint-uppercase mint-tracking-wide mint-text-gray-500 dark:mint-text-gray-400`,children:`accountId`}),_jsx(`span`,{className:`mint-ml-2 mint-font-mono mint-text-sm mint-text-gray-900 dark:mint-text-gray-100`,children:saved.account})]}),saved.name\u0026\u0026_jsx(`span`,{className:`mint-text-sm mint-text-gray-600 dark:mint-text-gray-400`,children:saved.name}),_jsx(_components.a,{href:CREDENTIALS_HREF,className:`mint-text-sm mint-text-gray-500 dark:mint-text-gray-400 mint-underline mint-underline-offset-2`,children:`Change`})]})})};function _createMdxContent(props){const{_MdxComponentBoundary}={..._provideComponents(),...props.components};if(!_MdxComponentBoundary)_missingMdxReference(`_MdxComponentBoundary`,true);return _jsx(_MdxComponentBoundary,{name:`CloudChatYourValues`,children:_jsx(CloudChatYourValues,{})})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{CloudChatYourValues,default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Create a campaign","openapi":"api-reference/specs/cloudchat/v1.json POST /v1/accounts/{accountId}/campaigns","description":"**Creating a campaign sends it.** There is no separate step that starts the send, and no way to call it back: whatever you create here goes out. `confirm_recipients` has to equal the `reachable` the preview returned for the same audience in the same channel; if it does not, the answer is 409 with both numbers and nothing is created.\n\n**Do not repeat this call after a timeout.** A repeat creates a second campaign and sends a second time, and every WhatsApp message is billed. Reading the campaign back only helps if you already hold its `id`: there is no listing and no idempotency key, so a lost response cannot be resolved through this API — open the campaign dashboard in Cloud Chat to see whether it was created before you send again.\n\nThe channel follows from what you send. A campaign carrying `email_campaign_sender_id` is an e-mail campaign; otherwise the channel comes from the `channel_type` of the inbox behind `inbox_id`: `Channel::Whatsapp` sends a WhatsApp template, `Channel::WebWidget` sends a widget message. **Check `channel_type` first**, because nothing cross-checks your intent: a website inbox chosen while you meant to send WhatsApp delivers the template name to your contacts as the literal text of the message.\n\n**This response is not a delivery confirmation.** Sending happens after it returns and can still fail; what actually reached your contacts is in the Cloud Chat campaign dashboard. Every WhatsApp message is billed and reaches a real person, so do not send one merely to rehearse. To check an audience without sending, use the preview endpoint.","href":"/api-reference/cloudchat/endpoints/create-a-campaign"}}},"mdxSourceWithNoJs":null,"noJsSplices":[[27,38,""],[139,2658,"null;function _creat"]]},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"dynamicCss":".mint-mb-6 {\n margin-bottom: 1.5rem\n}\n.mint-ml-2 {\n margin-left: 0.5rem\n}\n.mint-flex {\n display: flex\n}\n.mint-flex-wrap {\n flex-wrap: wrap\n}\n.mint-items-baseline {\n align-items: baseline\n}\n.mint-gap-x-6 {\n column-gap: 1.5rem\n}\n.mint-gap-y-2 {\n row-gap: 0.5rem\n}\n.mint-rounded-xl {\n border-radius: 0.75rem\n}\n.mint-border {\n border-width: 1px\n}\n.mint-border-gray-200 {\n --tw-border-opacity: 1;\n border-color: rgb(229 231 235 / var(--tw-border-opacity, 1))\n}\n.mint-bg-gray-50 {\n --tw-bg-opacity: 1;\n background-color: rgb(249 250 251 / var(--tw-bg-opacity, 1))\n}\n.mint-px-4 {\n padding-left: 1rem;\n padding-right: 1rem\n}\n.mint-py-3 {\n padding-top: 0.75rem;\n padding-bottom: 0.75rem\n}\n.mint-font-mono {\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace\n}\n.mint-text-sm {\n font-size: 0.875rem;\n line-height: 1.25rem\n}\n.mint-text-xs {\n font-size: 0.75rem;\n line-height: 1rem\n}\n.mint-uppercase {\n text-transform: uppercase\n}\n.mint-tracking-wide {\n letter-spacing: 0.025em\n}\n.mint-text-gray-500 {\n --tw-text-opacity: 1;\n color: rgb(107 114 128 / var(--tw-text-opacity, 1))\n}\n.mint-text-gray-600 {\n --tw-text-opacity: 1;\n color: rgb(75 85 99 / var(--tw-text-opacity, 1))\n}\n.mint-text-gray-900 {\n --tw-text-opacity: 1;\n color: rgb(17 24 39 / var(--tw-text-opacity, 1))\n}\n.mint-underline {\n text-decoration-line: underline\n}\n.mint-underline-offset-2 {\n text-underline-offset: 2px\n}\n.dark\\:mint-border-white\\/10:is(.dark *) {\n border-color: rgb(255 255 255 / 0.1)\n}\n.dark\\:mint-bg-white\\/5:is(.dark *) {\n background-color: rgb(255 255 255 / 0.05)\n}\n.dark\\:mint-text-gray-100:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(243 244 246 / var(--tw-text-opacity, 1))\n}\n.dark\\:mint-text-gray-400:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(156 163 175 / var(--tw-text-opacity, 1))\n}","openApiReferenceData":{"operation":{"operationId":"createCampaign","summary":"Create a campaign","description":"**Creating a campaign sends it.** There is no separate step that starts the send, and no way to call it back: whatever you create here goes out. `confirm_recipients` has to equal the `reachable` the preview returned for the same audience in the same channel; if it does not, the answer is 409 with both numbers and nothing is created.\n\n**Do not repeat this call after a timeout.** A repeat creates a second campaign and sends a second time, and every WhatsApp message is billed. Reading the campaign back only helps if you already hold its `id`: there is no listing and no idempotency key, so a lost response cannot be resolved through this API — open the campaign dashboard in Cloud Chat to see whether it was created before you send again.\n\nThe channel follows from what you send. A campaign carrying `email_campaign_sender_id` is an e-mail campaign; otherwise the channel comes from the `channel_type` of the inbox behind `inbox_id`: `Channel::Whatsapp` sends a WhatsApp template, `Channel::WebWidget` sends a widget message. **Check `channel_type` first**, because nothing cross-checks your intent: a website inbox chosen while you meant to send WhatsApp delivers the template name to your contacts as the literal text of the message.\n\n**This response is not a delivery confirmation.** Sending happens after it returns and can still fail; what actually reached your contacts is in the Cloud Chat campaign dashboard. Every WhatsApp message is billed and reaches a real person, so do not send one merely to rehearse. To check an audience without sending, use the preview endpoint.","tags":["Campaigns"],"requestBody":"7a91bea4-6047-4ddf-8bd4-7753582077ef","responses":{"201":"d26e0e1c-8569-4772-8e84-95f4afb5976f","400":"4918195e-715d-455a-a91e-924059430ea8","401":"b31ad34b-94eb-4327-8635-25cd1c979a1c","403":"9ff1c574-c994-4869-8939-f8aac7b30c59","404":"ead38120-d3fc-4876-8909-c4b0b688f830","409":"0821c88b-0682-4c79-8910-cbe1fb38cf03","422":"d896c598-67c1-44f8-a88c-f9bb9300f695","429":"f2d106dd-03fd-4f35-a7c9-37bc6671a04a","500":"d1728b76-ef00-4f72-83a8-73b209068f59"},"method":"post","type":"path","servers":["873b436c-1531-4b93-b3df-9b8938360170"],"security":["1c4c2329-b49c-4ce1-8886-2bd7695cef55"],"path":"/v1/accounts/{accountId}/campaigns","baseUrlOptions":["https://api.cloudhumans.com/cloudchat"],"title":"Create a campaign","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"f03d5846-9aad-46a7-908a-9bee63df7c2d":{"name":"cloudchat-instance","in":"header","required":true,"description":"Your Cloud Chat instance ID — an integer, fixed for your company, told at onboarding. [The API overview](/api-reference/cloudchat/overview#two-headers-every-call) explains how instances work, how to find yours, and the errors a wrong or missing value produces.","schema":{"type":"integer","example":1,"isRequired":true,"description":"Your Cloud Chat instance ID — an integer, fixed for your company, told at onboarding. [The API overview](/api-reference/cloudchat/overview#two-headers-every-call) explains how instances work, how to find yours, and the errors a wrong or missing value produces.","uniqueKey":"","typeLabel":"integer"}},"0677033e-ca64-4af6-afb7-55087d4df1d7":{"name":"accountId","in":"path","required":true,"description":"Your Cloud Chat account. It has to be an account your token grants membership on, and it has to live on the instance in the `cloudchat-instance` header — the two travel together. Account numbers are only unique **within** an instance, so the same number is a different company on another instance. Usually a mismatched pair fails closed with a 401, because your user does not exist on the other instance — but if your identity happens to exist on both, the call succeeds against the other company's data, silently. Read it and you are looking at the wrong help center; write it and you have stored into the wrong account. Send the two values that were given to you together, and never try a number to see what answers.","schema":{"type":"integer","example":1,"isRequired":true,"description":"Your Cloud Chat account. It has to be an account your token grants membership on, and it has to live on the instance in the `cloudchat-instance` header — the two travel together. Account numbers are only unique **within** an instance, so the same number is a different company on another instance. Usually a mismatched pair fails closed with a 401, because your user does not exist on the other instance — but if your identity happens to exist on both, the call succeeds against the other company's data, silently. Read it and you are looking at the wrong help center; write it and you have stored into the wrong account. Send the two values that were given to you together, and never try a number to see what answers.","uniqueKey":"","typeLabel":"integer"}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"A campaign to create and send, together with the reach you are confirming.","required":["campaign","confirm_recipients"],"properties":{"campaign":{"type":"object","description":"The campaign itself. Which fields apply depends on the channel, and the channel is never passed directly: it follows from `email_campaign_sender_id`, or from the type of the inbox.","required":["title","message","audience"],"properties":{"title":{"type":"string","description":"Internal name, shown in the Cloud Chat campaign list. Your contacts never see it.","example":"September reactivation","isRequired":true,"uniqueKey":"campaign.title","typeLabel":"string"},"message":{"type":"string","description":"What is sent, and it means two different things by channel. On WhatsApp it is **the name of an approved template**, spelled exactly as the template listing returns it — not the text you want to send. On e-mail and widget it is the message body. Required in every channel.","example":"reactivation_september","isRequired":true,"uniqueKey":"campaign.message","typeLabel":"string"},"audience":{"type":"array","description":"Who receives it. At most 50 entries, each a label. Check the resulting reach with the preview endpoint first.","items":{"type":"object","description":"One entry of a campaign audience. Entries add up: the campaign targets the union of their contacts, each counted once.","required":["type","id"],"properties":{"type":{"type":"string","enum":["Label"],"description":"Only `Label` is accepted. Cloud Chat also builds audiences from saved filters and from uploaded files; neither is available through the API yet, and sending either is refused as `validation_failed` naming the type.","example":"Label","isRequired":true,"uniqueKey":"campaign.audience.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"id":{"type":"integer","description":"The label whose contacts join the audience. Take the `id` from the label listing — the title is not accepted here.","example":20010,"isRequired":true,"uniqueKey":"campaign.audience.items.[INDEX].id","typeLabel":"integer"}},"uniqueKey":"campaign.audience.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"campaign.audience","typeLabel":"object[]"},"inbox_id":{"type":"integer","description":"The inbox that sends, required for WhatsApp and widget campaigns. **It is what decides the channel**: `channel_type` `Channel::Whatsapp` sends a WhatsApp template, `Channel::WebWidget` sends a widget message, and any other channel is refused. Check `channel_type` before you send — nothing cross-checks your intent, so a website inbox chosen by mistake delivers your template name to contacts as plain text. Leave it out on an e-mail campaign.","example":60,"uniqueKey":"campaign.inbox_id","typeLabel":"integer"},"email_campaign_sender_id":{"type":"integer","description":"The verified sender an e-mail campaign goes out from. Sending it is what makes the campaign an e-mail campaign, and the inbox follows from it. Cannot be combined with `inbox_id`. **No endpoint lists senders** — the id is configured in Cloud Chat, under the account e-mail campaign settings, so take it from whoever set the sender up. One belonging to another account is refused.","example":4,"uniqueKey":"campaign.email_campaign_sender_id","typeLabel":"integer"},"subject":{"type":"string","description":"Subject line, and **required on an e-mail campaign**: a campaign carrying `email_campaign_sender_id` without it is refused. The other channels carry no subject.","example":"We miss you","uniqueKey":"campaign.subject","typeLabel":"string"},"scheduled_at":{"type":"string","format":"date-time","description":"When to send, and it has to be in the future. **Leave it out to send immediately.** A timestamp in the past, or one that cannot be parsed, is refused rather than quietly treated as now.","example":"2026-10-01T14:00:00Z","uniqueKey":"campaign.scheduled_at","typeLabel":"string\u003cdate-time>"}},"isRequired":true,"uniqueKey":"campaign","typeLabel":"object"},"confirm_recipients":{"type":"integer","description":"The reachable count you are confirming. It has to equal the `reachable` the preview returned for this exact audience and channel; any other value answers 409 with both numbers and creates nothing. Leaving it out is a 409 too, not a default.","example":1187,"isRequired":true,"uniqueKey":"confirm_recipients","typeLabel":"integer"},"template_params":{"type":"object","description":"Values for a WhatsApp template placeholders, keyed by the exact token between the braces: `\"1\"`, `\"2\"` and so on for a positional template, the variable name for a named one. Send exactly as many keys as the template `parameters` count. A value wrapped in double braces, such as `{{contact.name}}`, is resolved per recipient at send time; anything else is sent literally to everyone.","additionalProperties":{"type":"string","uniqueKey":"template_params.additionalProperties","typeLabel":"string"},"example":{"1":"{{contact.name}}","2":"15%"},"uniqueKey":"template_params","typeLabel":"object"},"payload_params":{"type":"object","description":"Values for placeholders inside the template buttons, keyed the same way. Only templates whose buttons carry a placeholder need this.","additionalProperties":{"type":"string","uniqueKey":"payload_params.additionalProperties","typeLabel":"string"},"uniqueKey":"payload_params","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"campaign":{"title":"September reactivation","message":"reactivation_september","audience":[{"type":"Label","id":20010}],"inbox_id":60,"email_campaign_sender_id":4,"subject":"We miss you","scheduled_at":"2026-10-01T14:00:00Z"},"confirm_recipients":1187,"template_params":{"1":"{{contact.name}}","2":"15%"},"payload_params":{}}}},"exampleType":"generated"}},"exampleType":"generated"},"responses":{"d26e0e1c-8569-4772-8e84-95f4afb5976f":{"description":"Created, and already on its way. This is the only response that carries `reachable_count`.","content":{"application/json":{"schema":{"type":"object","description":"A one-off campaign as stored. `reachable_count` is present only in the create response.","required":["id","title","message","campaign_status","campaign_type","created_at","updated_at"],"properties":{"id":{"type":"integer","description":"The display id, sequential within the account. **Keep it** — no endpoint lists campaigns, so this is the only way back to it.","example":176,"isRequired":true,"uniqueKey":"id","typeLabel":"integer"},"title":{"type":"string","description":"Internal name of the campaign.","example":"September reactivation","isRequired":true,"uniqueKey":"title","typeLabel":"string"},"message":{"type":"string","description":"The template name on a WhatsApp campaign, the message body on e-mail and widget.","example":"reactivation_september","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"campaign_status":{"type":"string","description":"Where the campaign is in its lifecycle — **not a delivery report**. `completed` means a worker took it over, not that anything arrived: on WhatsApp it is set before the audience is even resolved. `failed` means a precondition stopped the dispatch and it will not be retried. What actually reached your contacts is in the Cloud Chat campaign dashboard.\n\nThe values in use are `active`, `completed`, `running`, `draft`, `partially_completed` and `failed`. The set is open and grows as new states are added, so read an unfamiliar value as a state you do not know yet rather than as an error.","example":"completed","isRequired":true,"uniqueKey":"campaign_status","typeLabel":"string"},"campaign_type":{"type":"string","enum":["ongoing","one_off"],"description":"Campaigns created through the API are always `one_off`. A campaign built in Cloud Chat can be `ongoing` and fire on a trigger instead.","example":"one_off","isRequired":true,"uniqueKey":"campaign_type","typeLabel":"enum\u003cstring>"},"created_at":{"type":"string","format":"date-time","description":"When the campaign was created.","example":"2026-09-19T17:34:12.881Z","isRequired":true,"uniqueKey":"created_at","typeLabel":"string\u003cdate-time>"},"updated_at":{"type":"string","format":"date-time","description":"When it last changed.","example":"2026-09-19T17:34:15.002Z","isRequired":true,"uniqueKey":"updated_at","typeLabel":"string\u003cdate-time>"},"reachable_count":{"type":"integer","description":"The reach the campaign was confirmed against. Returned only when the campaign is created: reach is computed, never stored, so reading a campaign back omits the field entirely.","example":1187,"uniqueKey":"reachable_count","typeLabel":"integer"},"subject":{"oneOf":[{"type":"string","description":"Subject line of an e-mail campaign; null on the other channels.","uniqueKey":"subject.oneOf.0","typeLabel":"string"},{"type":"null","description":"Subject line of an e-mail campaign; null on the other channels.","uniqueKey":"subject.oneOf.1","typeLabel":"null"}],"uniqueKey":"subject","typeLabel":"string | null"},"inbox_id":{"oneOf":[{"type":"integer","description":"The inbox that sends. On an e-mail campaign it follows from the sender.","example":60,"uniqueKey":"inbox_id.oneOf.0","typeLabel":"integer"},{"type":"null","description":"The inbox that sends. On an e-mail campaign it follows from the sender.","example":60,"uniqueKey":"inbox_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"inbox_id","typeLabel":"integer | null"},"email_campaign_sender_id":{"oneOf":[{"type":"integer","description":"The verified sender of an e-mail campaign; null on WhatsApp and widget.","uniqueKey":"email_campaign_sender_id.oneOf.0","typeLabel":"integer"},{"type":"null","description":"The verified sender of an e-mail campaign; null on WhatsApp and widget.","uniqueKey":"email_campaign_sender_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"email_campaign_sender_id","typeLabel":"integer | null"},"sender_id":{"oneOf":[{"type":"integer","description":"The user the campaign is attributed to. Through the API this is always the identity of the token that created it — authorship cannot be set in the payload.","example":895,"uniqueKey":"sender_id.oneOf.0","typeLabel":"integer"},{"type":"null","description":"The user the campaign is attributed to. Through the API this is always the identity of the token that created it — authorship cannot be set in the payload.","example":895,"uniqueKey":"sender_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"sender_id","typeLabel":"integer | null"},"conversation_label_id":{"oneOf":[{"type":"integer","description":"Label applied to the conversations the campaign opens, when one was configured.","uniqueKey":"conversation_label_id.oneOf.0","typeLabel":"integer"},{"type":"null","description":"Label applied to the conversations the campaign opens, when one was configured.","uniqueKey":"conversation_label_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"conversation_label_id","typeLabel":"integer | null"},"team_id":{"oneOf":[{"type":"integer","description":"Team the resulting conversations are assigned to, when one was configured.","uniqueKey":"team_id.oneOf.0","typeLabel":"integer"},{"type":"null","description":"Team the resulting conversations are assigned to, when one was configured.","uniqueKey":"team_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"team_id","typeLabel":"integer | null"},"recipients_count":{"oneOf":[{"type":"integer","description":"The **raw** audience size recorded on the campaign, before the reachability check. It is not what was delivered, and it is not what `confirm_recipients` is compared against.","example":1240,"uniqueKey":"recipients_count.oneOf.0","typeLabel":"integer"},{"type":"null","description":"The **raw** audience size recorded on the campaign, before the reachability check. It is not what was delivered, and it is not what `confirm_recipients` is compared against.","example":1240,"uniqueKey":"recipients_count.oneOf.1","typeLabel":"null"}],"uniqueKey":"recipients_count","typeLabel":"integer | null"},"scheduled_at":{"oneOf":[{"type":"string","format":"date-time","description":"When the campaign is due out. A campaign created without one carries the moment it was created.","example":"2026-09-19T17:34:12.881Z","uniqueKey":"scheduled_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"When the campaign is due out. A campaign created without one carries the moment it was created.","example":"2026-09-19T17:34:12.881Z","uniqueKey":"scheduled_at.oneOf.1","typeLabel":"null"}],"uniqueKey":"scheduled_at","typeLabel":"string\u003cdate-time> | null"},"started_at":{"oneOf":[{"type":"string","format":"date-time","description":"When dispatch began. **Always null on a WhatsApp campaign** — only the e-mail path fills it — so its absence tells you nothing about whether the campaign ran.","uniqueKey":"started_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"When dispatch began. **Always null on a WhatsApp campaign** — only the e-mail path fills it — so its absence tells you nothing about whether the campaign ran.","uniqueKey":"started_at.oneOf.1","typeLabel":"null"}],"uniqueKey":"started_at","typeLabel":"string\u003cdate-time> | null"},"completed_at":{"oneOf":[{"type":"string","format":"date-time","description":"When the campaign reached a terminal status; null while it is still open.","example":"2026-09-19T17:34:15.002Z","uniqueKey":"completed_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"When the campaign reached a terminal status; null while it is still open.","example":"2026-09-19T17:34:15.002Z","uniqueKey":"completed_at.oneOf.1","typeLabel":"null"}],"uniqueKey":"completed_at","typeLabel":"string\u003cdate-time> | null"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"id":176,"title":"September reactivation","message":"reactivation_september","campaign_status":"completed","campaign_type":"one_off","created_at":"2026-09-19T17:34:12.881Z","updated_at":"2026-09-19T17:34:15.002Z","reachable_count":1187,"subject":"\u003cstring>","inbox_id":60,"email_campaign_sender_id":123,"sender_id":895,"conversation_label_id":123,"team_id":123,"recipients_count":1240,"scheduled_at":"2026-09-19T17:34:12.881Z","started_at":"2023-11-07T05:31:56Z","completed_at":"2026-09-19T17:34:15.002Z"}}},"exampleType":"generated"}},"exampleType":"generated"},"4918195e-715d-455a-a91e-924059430ea8":{"description":"The request itself is malformed, before any value is validated:\n\n- a body that isn't valid JSON, or one with no `canned_response` wrapper,\n- a `canned_response` that isn't an object (`{\"canned_response\": \"text\"}`),\n- `page`, `per_page`, `search` or `sort` sent as an array or a nested object (`?page[]=1`, `?sort[x]=y`) instead of a plain value,\n- **the `cloudchat-instance` header missing or holding a value we don't route,**\n- an `accountId` that is not a number — including the literal `{accountId}` that some API clients send when the argument is left unset. This one answers with the normal envelope and `error.details` naming `accountId`, and it is deliberately **not** a 404: a 404 would mean the account cannot be reached, while this means the value was never an account id at all, so re-read the argument instead of trying other numbers.\n\n**Two different shapes answer with 400, and the difference will bite you on day one.** That last case is rejected before the request reaches the API, so `error` is a plain **string** instead of the usual object:\n\n```json\n{ \"error\": \"\u003chuman-readable message>\" }\n```\n\nEvery other 400 uses the normal envelope, where `error` is an object with `code` and `message`. Reading `error.code` without checking the type first throws on the missing-header case — which is the most likely 400 of your first integration. Check `typeof error === \"string\"` first, or read `error?.code` defensively.\n\nA 400 always means fix the request shape; it never means a value was rejected. Rejected values are 422.","content":{"application/json":{"schema":{"type":"object","description":"The error envelope every Cloud Chat API response uses.","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"The stable, machine-readable reason. Branch on this, never on `message`.","enum":["unauthorized","forbidden","not_found","validation_failed","bad_request","internal_error","rate_limited","service_unavailable"],"example":"not_found","isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","description":"The reason in words, localized to your account's language (English, Spanish or Brazilian Portuguese; English when the account is set to anything else). Wording changes with the account and between releases, so never match on it.\n\nTwo cases stay in English whatever the account is set to: `unauthorized`, decided before any account is known, and the account-level `not_found`, which must not reveal the account's language.","example":"Resource could not be found.","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"details":{"type":"array","description":"Present on some rejections — a 400 for a refused query parameter or upload mode, for example. One entry per offending field, localized to the account's language like `message` — match on `code` and `field`, never on the text.","items":{"type":"object","required":["field","code","message"],"properties":{"field":{"type":"string","description":"Which request field the rule was about.","isRequired":true,"uniqueKey":"error.details.items.[INDEX].field","typeLabel":"string"},"code":{"type":"string","description":"Stable, machine-readable reason.","isRequired":true,"uniqueKey":"error.details.items.[INDEX].code","typeLabel":"string"},"message":{"type":"string","description":"The rule in words.","isRequired":true,"uniqueKey":"error.details.items.[INDEX].message","typeLabel":"string"}},"uniqueKey":"error.details.items.[INDEX]","typeLabel":"object"},"uniqueKey":"error.details","typeLabel":"object[]"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"example":{"error":{"code":"bad_request","message":"The request is malformed."}},"examples":{"Example":{"title":"Example","value":{"error":{"code":"bad_request","message":"The request is malformed."}}}},"exampleType":"examples"}},"exampleType":"examples"},"b31ad34b-94eb-4327-8635-25cd1c979a1c":{"description":"No Bearer token, or one that is expired, malformed, or not a Cognito token. Sign in again for a fresh `id_token`.","content":{"application/json":{"schema":{"type":"object","description":"The error envelope every Cloud Chat API response uses.","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"The stable, machine-readable reason. Branch on this, never on `message`.","enum":["unauthorized","forbidden","not_found","validation_failed","bad_request","internal_error","rate_limited","service_unavailable"],"example":"not_found","isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","description":"The reason in words, localized to your account's language (English, Spanish or Brazilian Portuguese; English when the account is set to anything else). Wording changes with the account and between releases, so never match on it.\n\nTwo cases stay in English whatever the account is set to: `unauthorized`, decided before any account is known, and the account-level `not_found`, which must not reveal the account's language.","example":"Resource could not be found.","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"details":{"type":"array","description":"Present on some rejections — a 400 for a refused query parameter or upload mode, for example. One entry per offending field, localized to the account's language like `message` — match on `code` and `field`, never on the text.","items":{"type":"object","required":["field","code","message"],"properties":{"field":{"type":"string","description":"Which request field the rule was about.","isRequired":true,"uniqueKey":"error.details.items.[INDEX].field","typeLabel":"string"},"code":{"type":"string","description":"Stable, machine-readable reason.","isRequired":true,"uniqueKey":"error.details.items.[INDEX].code","typeLabel":"string"},"message":{"type":"string","description":"The rule in words.","isRequired":true,"uniqueKey":"error.details.items.[INDEX].message","typeLabel":"string"}},"uniqueKey":"error.details.items.[INDEX]","typeLabel":"object"},"uniqueKey":"error.details","typeLabel":"object[]"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"example":{"error":{"code":"unauthorized","message":"Authentication is required. Send a valid Bearer token in the Authorization header."}},"examples":{"Example":{"title":"Example","value":{"error":{"code":"unauthorized","message":"Authentication is required. Send a valid Bearer token in the Authorization header."}}}},"exampleType":"examples"}},"exampleType":"examples"},"9ff1c574-c994-4869-8939-f8aac7b30c59":{"description":"Refused. Either the identity lacks the role these operations need — creating a campaign, reading one back and both discovery listings all require an administrator, a supervisor or a CX engineer, and an agent is refused — or the account is suspended, which closes it even to its own members until it is reactivated.","content":{"application/json":{"schema":{"type":"object","description":"The error envelope every Cloud Chat API response uses.","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"The stable, machine-readable reason. Branch on this, never on `message`.","enum":["unauthorized","forbidden","not_found","validation_failed","bad_request","internal_error","rate_limited","service_unavailable"],"example":"not_found","isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","description":"The reason in words, localized to your account's language (English, Spanish or Brazilian Portuguese; English when the account is set to anything else). Wording changes with the account and between releases, so never match on it.\n\nTwo cases stay in English whatever the account is set to: `unauthorized`, decided before any account is known, and the account-level `not_found`, which must not reveal the account's language.","example":"Resource could not be found.","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"details":{"type":"array","description":"Present on some rejections — a 400 for a refused query parameter or upload mode, for example. One entry per offending field, localized to the account's language like `message` — match on `code` and `field`, never on the text.","items":{"type":"object","required":["field","code","message"],"properties":{"field":{"type":"string","description":"Which request field the rule was about.","isRequired":true,"uniqueKey":"error.details.items.[INDEX].field","typeLabel":"string"},"code":{"type":"string","description":"Stable, machine-readable reason.","isRequired":true,"uniqueKey":"error.details.items.[INDEX].code","typeLabel":"string"},"message":{"type":"string","description":"The rule in words.","isRequired":true,"uniqueKey":"error.details.items.[INDEX].message","typeLabel":"string"}},"uniqueKey":"error.details.items.[INDEX]","typeLabel":"object"},"uniqueKey":"error.details","typeLabel":"object[]"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"example":{"error":{"code":"forbidden","message":"You do not have permission to perform this action."}},"examples":{"Example":{"title":"Example","value":{"error":{"code":"forbidden","message":"You do not have permission to perform this action."}}}},"exampleType":"examples"}},"exampleType":"examples"},"ead38120-d3fc-4876-8909-c4b0b688f830":{"description":"The resource is not there for you. Three situations answer with this code, and the first two apply to **every** endpoint — the account is resolved before anything else runs, so a list or a create fails this way too:\n\n- the account does not exist on this instance,\n- the account exists but your token has no membership on it,\n- on an endpoint that names one, the resource it names (a canned response, a portal, an article) does not exist where the path says it does.\n\nThe first two are deliberately indistinguishable — same status, same body, and the message stays in English in both, since translating it would reveal the account's configured language. So you cannot use this endpoint to find out which account ids exist. The third case is localized like every other error, which is safe because you only reach it once membership is established.\n\nEither way a 404 is not worth retrying. Check the `accountId`, the `cloudchat-instance` value, and that your user is a member of the account.","content":{"application/json":{"schema":{"type":"object","description":"The error envelope every Cloud Chat API response uses.","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"The stable, machine-readable reason. Branch on this, never on `message`.","enum":["unauthorized","forbidden","not_found","validation_failed","bad_request","internal_error","rate_limited","service_unavailable"],"example":"not_found","isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","description":"The reason in words, localized to your account's language (English, Spanish or Brazilian Portuguese; English when the account is set to anything else). Wording changes with the account and between releases, so never match on it.\n\nTwo cases stay in English whatever the account is set to: `unauthorized`, decided before any account is known, and the account-level `not_found`, which must not reveal the account's language.","example":"Resource could not be found.","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"details":{"type":"array","description":"Present on some rejections — a 400 for a refused query parameter or upload mode, for example. One entry per offending field, localized to the account's language like `message` — match on `code` and `field`, never on the text.","items":{"type":"object","required":["field","code","message"],"properties":{"field":{"type":"string","description":"Which request field the rule was about.","isRequired":true,"uniqueKey":"error.details.items.[INDEX].field","typeLabel":"string"},"code":{"type":"string","description":"Stable, machine-readable reason.","isRequired":true,"uniqueKey":"error.details.items.[INDEX].code","typeLabel":"string"},"message":{"type":"string","description":"The rule in words.","isRequired":true,"uniqueKey":"error.details.items.[INDEX].message","typeLabel":"string"}},"uniqueKey":"error.details.items.[INDEX]","typeLabel":"object"},"uniqueKey":"error.details","typeLabel":"object[]"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"example":{"error":{"code":"not_found","message":"Resource could not be found."}},"examples":{"Example":{"title":"Example","value":{"error":{"code":"not_found","message":"Resource could not be found."}}}},"exampleType":"examples"}},"exampleType":"examples"},"0821c88b-0682-4c79-8910-cbe1fb38cf03":{"description":"`confirm_recipients` does not match the reachable count, and **nothing was created**. The message carries both numbers. Preview the same audience and channel again, then repeat the call with the number it returns.","content":{"application/json":{"schema":{"type":"object","description":"A `validation_failed` error, which carries `details`.","required":["error"],"properties":{"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","enum":["validation_failed"],"example":"validation_failed","isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","description":"Localized to the account's language, like every other envelope message.","example":"The request payload is invalid.","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"details":{"type":"array","description":"One entry per rejected field. Unlike the envelope message above, the texts come from the model layer and are in English in practice (the model layer ships no translations) — match on code and field, never on the text.","items":{"type":"object","required":["field","code","message"],"properties":{"field":{"type":"string","description":"Which request field the rule was about — `short_code` or `content`. A rule that is not tied to either is reported as `base`, so treat `base` as \"the payload as a whole\" rather than a field you can highlight.","enum":["short_code","content","base"],"example":"short_code","isRequired":true,"uniqueKey":"error.details.items.[INDEX].field","typeLabel":"enum\u003cstring>"},"code":{"type":"string","description":"Which rule it broke — `blank` for a missing or empty value, `taken` for a `short_code` already used on the account.","example":"taken","isRequired":true,"uniqueKey":"error.details.items.[INDEX].code","typeLabel":"string"},"message":{"type":"string","example":"has already been taken","isRequired":true,"uniqueKey":"error.details.items.[INDEX].message","typeLabel":"string"}},"uniqueKey":"error.details.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"error.details","typeLabel":"object[]"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"example":{"error":{"code":"conflict","message":"The request payload is invalid.","details":[{"field":"confirm_recipients","code":"mismatch","message":"You confirmed 800 recipients but this audience currently reaches 1187. Preview the recipients again and resend with the current number."}]}},"examples":{"Example":{"title":"Example","value":{"error":{"code":"conflict","message":"The request payload is invalid.","details":[{"field":"confirm_recipients","code":"mismatch","message":"You confirmed 800 recipients but this audience currently reaches 1187. Preview the recipients again and resend with the current number."}]}}}},"exampleType":"examples"}},"exampleType":"examples"},"d896c598-67c1-44f8-a88c-f9bb9300f695":{"description":"The campaign was refused and **nothing was created**. `details[].code` says why: `template_not_found` when `message` is not an approved template for the inbox (the message lists the valid names), `template_name_as_message` for the mirror case — `message` *is* the name of an approved WhatsApp template on one of your inboxes, but this campaign is not on a WhatsApp channel, so that text would reach your contacts verbatim, `unreachable` when the audience reaches nobody, `unsupported_type` or `too_many_entries` for the audience, `cap_exceeded` when it is larger than your account may put in one campaign, `invalid` for a `scheduled_at` that is not in the future, `conflicting_channel_fields` when `inbox_id` and `email_campaign_sender_id` travel together and `invalid` when the sender is not one of yours, `missing_channel` when neither is sent, `unsupported_channel` or `inbox_not_assigned` for an inbox that cannot run a campaign or is not yours, and `invalid_template_param` for a placeholder your account does not define.","content":{"application/json":{"schema":{"type":"object","description":"A `validation_failed` error, which carries `details`.","required":["error"],"properties":{"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","enum":["validation_failed"],"example":"validation_failed","isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","description":"Localized to the account's language, like every other envelope message.","example":"The request payload is invalid.","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"details":{"type":"array","description":"One entry per rejected field. Unlike the envelope message above, the texts come from the model layer and are in English in practice (the model layer ships no translations) — match on code and field, never on the text.","items":{"type":"object","required":["field","code","message"],"properties":{"field":{"type":"string","description":"Which request field the rule was about — `short_code` or `content`. A rule that is not tied to either is reported as `base`, so treat `base` as \"the payload as a whole\" rather than a field you can highlight.","enum":["short_code","content","base"],"example":"short_code","isRequired":true,"uniqueKey":"error.details.items.[INDEX].field","typeLabel":"enum\u003cstring>"},"code":{"type":"string","description":"Which rule it broke — `blank` for a missing or empty value, `taken` for a `short_code` already used on the account.","example":"taken","isRequired":true,"uniqueKey":"error.details.items.[INDEX].code","typeLabel":"string"},"message":{"type":"string","example":"has already been taken","isRequired":true,"uniqueKey":"error.details.items.[INDEX].message","typeLabel":"string"}},"uniqueKey":"error.details.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"error.details","typeLabel":"object[]"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"example":{"error":{"code":"validation_failed","message":"The request payload is invalid.","details":[{"field":"message","code":"template_not_found","message":"Template \"reactivation\" is not approved for this inbox. Approved templates: reactivation_september, welcome_back."}]}},"examples":{"Example":{"title":"Example","value":{"error":{"code":"validation_failed","message":"The request payload is invalid.","details":[{"field":"message","code":"template_not_found","message":"Template \"reactivation\" is not approved for this inbox. Approved templates: reactivation_september, welcome_back."}]}}}},"exampleType":"examples"}},"exampleType":"examples"},"f2d106dd-03fd-4f35-a7c9-37bc6671a04a":{"description":"Rate limited, and nothing was created. Two ceilings apply and they answer differently: the gateway stops the request before it reaches the API and answers `{ \"message\": ... }`, while Cloud Chat applies its own ceiling to campaign previews and campaign creation per account and answers the usual `{ \"error\": ... }` envelope with code `rate_limited`.\n\nDon't hardcode either limit — read it from the response. `Retry-After` says how many seconds to wait, and `ratelimit-limit`, `ratelimit-remaining` and `ratelimit-reset` carry the current values.","content":{"application/json":{"schema":{"oneOf":[{"type":"object","description":"Rejected by the gateway before Cloud Chat saw it, so it does not use the `error` envelope.","required":["message"],"properties":{"message":{"type":"string","example":"API rate limit exceeded","isRequired":true,"uniqueKey":"oneOf.0.message","typeLabel":"string"},"request_id":{"type":"string","description":"Gateway request id. Quote it when reporting a problem.","example":"f3f7567638d4b65a8003057d0c77d275","uniqueKey":"oneOf.0.request_id","typeLabel":"string"}},"uniqueKey":"oneOf.0","typeLabel":"object"},{"type":"object","description":"The error envelope every Cloud Chat API response uses.","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"The stable, machine-readable reason. Branch on this, never on `message`.","enum":["unauthorized","forbidden","not_found","validation_failed","bad_request","internal_error","rate_limited","service_unavailable"],"example":"not_found","isRequired":true,"uniqueKey":"oneOf.1.error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","description":"The reason in words, localized to your account's language (English, Spanish or Brazilian Portuguese; English when the account is set to anything else). Wording changes with the account and between releases, so never match on it.\n\nTwo cases stay in English whatever the account is set to: `unauthorized`, decided before any account is known, and the account-level `not_found`, which must not reveal the account's language.","example":"Resource could not be found.","isRequired":true,"uniqueKey":"oneOf.1.error.message","typeLabel":"string"},"details":{"type":"array","description":"Present on some rejections — a 400 for a refused query parameter or upload mode, for example. One entry per offending field, localized to the account's language like `message` — match on `code` and `field`, never on the text.","items":{"type":"object","required":["field","code","message"],"properties":{"field":{"type":"string","description":"Which request field the rule was about.","isRequired":true,"uniqueKey":"oneOf.1.error.details.items.[INDEX].field","typeLabel":"string"},"code":{"type":"string","description":"Stable, machine-readable reason.","isRequired":true,"uniqueKey":"oneOf.1.error.details.items.[INDEX].code","typeLabel":"string"},"message":{"type":"string","description":"The rule in words.","isRequired":true,"uniqueKey":"oneOf.1.error.details.items.[INDEX].message","typeLabel":"string"}},"uniqueKey":"oneOf.1.error.details.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.1.error.details","typeLabel":"object[]"}},"isRequired":true,"uniqueKey":"oneOf.1.error","typeLabel":"object"}},"uniqueKey":"oneOf.1","typeLabel":"object"}],"uniqueKey":"","typeLabel":"object"},"example":{"error":{"code":"rate_limited","message":"Too many requests. Try again in a moment."}},"examples":{"Example":{"title":"Example","value":{"error":{"code":"rate_limited","message":"Too many requests. Try again in a moment."}}}},"exampleType":"examples"}},"exampleType":"examples"},"d1728b76-ef00-4f72-83a8-73b209068f59":{"description":"Something failed on our side. The response never carries the underlying error, but it is reported to our monitoring automatically — no need to file anything for a one-off.\n\nRetrying is reasonable, with one caveat on `POST`: a 500 does not prove the write did not happen, so a retry can come back `422` with `short_code` already taken. That 422 means the first attempt succeeded — list the account and confirm before treating it as a failure.","content":{"application/json":{"schema":{"type":"object","description":"The error envelope every Cloud Chat API response uses.","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"The stable, machine-readable reason. Branch on this, never on `message`.","enum":["unauthorized","forbidden","not_found","validation_failed","bad_request","internal_error","rate_limited","service_unavailable"],"example":"not_found","isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","description":"The reason in words, localized to your account's language (English, Spanish or Brazilian Portuguese; English when the account is set to anything else). Wording changes with the account and between releases, so never match on it.\n\nTwo cases stay in English whatever the account is set to: `unauthorized`, decided before any account is known, and the account-level `not_found`, which must not reveal the account's language.","example":"Resource could not be found.","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"details":{"type":"array","description":"Present on some rejections — a 400 for a refused query parameter or upload mode, for example. One entry per offending field, localized to the account's language like `message` — match on `code` and `field`, never on the text.","items":{"type":"object","required":["field","code","message"],"properties":{"field":{"type":"string","description":"Which request field the rule was about.","isRequired":true,"uniqueKey":"error.details.items.[INDEX].field","typeLabel":"string"},"code":{"type":"string","description":"Stable, machine-readable reason.","isRequired":true,"uniqueKey":"error.details.items.[INDEX].code","typeLabel":"string"},"message":{"type":"string","description":"The rule in words.","isRequired":true,"uniqueKey":"error.details.items.[INDEX].message","typeLabel":"string"}},"uniqueKey":"error.details.items.[INDEX]","typeLabel":"object"},"uniqueKey":"error.details","typeLabel":"object[]"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"example":{"error":{"code":"internal_error","message":"An unexpected error occurred. Please try again later."}},"examples":{"Example":{"title":"Example","value":{"error":{"code":"internal_error","message":"An unexpected error occurred. Please try again later."}}}},"exampleType":"examples"}},"exampleType":"examples"}},"security":{"1c4c2329-b49c-4ce1-8886-2bd7695cef55":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"The `id_token` from `POST /auth/v1/signin`, sent as `Authorization: Bearer \u003cid_token>`. Not the `access_token` — that one does not carry the identity Cloud Chat authorizes on.","scopes":[],"schemeName":"bearerAuth"}}},"servers":{"873b436c-1531-4b93-b3df-9b8938360170":{"url":"https://api.cloudhumans.com/cloudchat","description":"Production"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"The `id_token` from `POST /auth/v1/signin`, sent as `Authorization: Bearer \u003cid_token>`. Not the `access_token` — that one does not carry the identity Cloud Chat authorizes on.","scopes":[],"schemeName":"bearerAuth"},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"The `id_token` from `POST /auth/v1/signin`, sent as `Authorization: Bearer \u003cid_token>`. Not the `access_token` — that one does not carry the identity Cloud Chat authorizes on.","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"bearerAuth","name":"Authorization"}],"title":"bearerAuth"}]},"originalFileLocation":"api-reference/specs/cloudchat/v1.json"},"subdomain":"cloud-humans","siteName":"Cloud Chat","title":"Create a campaign - Cloud Chat","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-09-22T16:41:21.126Z","originalFileLocation":"api-reference/cloudchat/endpoints/create-a-campaign.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Creating a campaign sends it. There is no separate step that starts the send, and no way to call it back: whatever you create here goes out. confirm_recipients has to equal the reachable the preview returned for the same audience in the same channel; if it does not, the answer is 409 with both numbers and nothing is created. Do not repeat this call after a timeout. A repeat creates a second campaign and sends a second time, and every WhatsApp message is billed. Reading the campaign back only helps if you already hold its id: there is no listing and no idempotency key, so a lost response cannot be resolved through this API — open the campaign dashboard in Cloud Chat to see whether it was created before you send again. The channel follows from what you send. A campaign carrying email_campaign_sender_id is an e-mail campaign; otherwise the channel comes from the channel_type of the inbox behind inbox_id: Channel::Whatsapp sends a WhatsApp template, Channel::WebWidget sends a widget message. Check channel_type first, because nothing cross-checks your intent: a website inbox chosen while you meant to send WhatsApp delivers the template name to your contacts as the literal text of the message. This response is not a delivery confirmation. Sending happens after it returns and can still fail; what actually reached your contacts is in the Cloud Chat campaign dashboard. Every WhatsApp message is billed and reaches a real person, so do not send one merely to rehearse. To check an audience without sending, use the preview endpoint.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Cloud Chat\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/cloud-humans/Tjh_1uQRibuZjdTW/_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/cloud-humans/Tjh_1uQRibuZjdTW/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/cloud-humans/Tjh_1uQRibuZjdTW/_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/cloud-humans/Tjh_1uQRibuZjdTW/_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/cloud-humans/Tjh_1uQRibuZjdTW/_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/cloud-humans/Tjh_1uQRibuZjdTW/_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/cloud-humans/Tjh_1uQRibuZjdTW/_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/cloud-humans/Tjh_1uQRibuZjdTW/_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/cloud-humans/Tjh_1uQRibuZjdTW/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Create a campaign - Cloud Chat\">\u003cmeta data-mint-head property=\"og:description\" content=\"Creating a campaign sends it. There is no separate step that starts the send, and no way to call it back: whatever you create here goes out. confirm_recipients has to equal the reachable the preview returned for the same audience in the same channel; if it does not, the answer is 409 with both numbers and nothing is created. Do not repeat this call after a timeout. A repeat creates a second campaign and sends a second time, and every WhatsApp message is billed. Reading the campaign back only helps if you already hold its id: there is no listing and no idempotency key, so a lost response cannot be resolved through this API — open the campaign dashboard in Cloud Chat to see whether it was created before you send again. The channel follows from what you send. A campaign carrying email_campaign_sender_id is an e-mail campaign; otherwise the channel comes from the channel_type of the inbox behind inbox_id: Channel::Whatsapp sends a WhatsApp template, Channel::WebWidget sends a widget message. Check channel_type first, because nothing cross-checks your intent: a website inbox chosen while you meant to send WhatsApp delivers the template name to your contacts as the literal text of the message. This response is not a delivery confirmation. Sending happens after it returns and can still fail; what actually reached your contacts is in the Cloud Chat campaign dashboard. Every WhatsApp message is billed and reaches a real person, so do not send one merely to rehearse. To check an audience without sending, use the preview endpoint.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Cloud Chat\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.cloudhumans.com/api-reference/cloudchat/endpoints/create-a-campaign\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://cloud-humans.mintlify.site/_mintlify/api/og/v2?division=Campaigns\u0026amp;title=Create+a+campaign\u0026amp;description=**Creating+a+campaign+sends+it.**+There+is+no+separate+step+that+starts+the+send%2C+and+no+way+to+call+it+back%3A+whatever+you+create+here+goes+out.+%60confirm_recipi\u0026amp;theme=392b44accc8c2ed667834476\u0026amp;signature=6b465304cdf0993cb50ba68832f483849396226980bb384822003e2ac40851c7\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Create a campaign - Cloud Chat\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Creating a campaign sends it. There is no separate step that starts the send, and no way to call it back: whatever you create here goes out. confirm_recipients has to equal the reachable the preview returned for the same audience in the same channel; if it does not, the answer is 409 with both numbers and nothing is created. Do not repeat this call after a timeout. A repeat creates a second campaign and sends a second time, and every WhatsApp message is billed. Reading the campaign back only helps if you already hold its id: there is no listing and no idempotency key, so a lost response cannot be resolved through this API — open the campaign dashboard in Cloud Chat to see whether it was created before you send again. The channel follows from what you send. A campaign carrying email_campaign_sender_id is an e-mail campaign; otherwise the channel comes from the channel_type of the inbox behind inbox_id: Channel::Whatsapp sends a WhatsApp template, Channel::WebWidget sends a widget message. Check channel_type first, because nothing cross-checks your intent: a website inbox chosen while you meant to send WhatsApp delivers the template name to your contacts as the literal text of the message. This response is not a delivery confirmation. Sending happens after it returns and can still fail; what actually reached your contacts is in the Cloud Chat campaign dashboard. Every WhatsApp message is billed and reaches a real person, so do not send one merely to rehearse. To check an audience without sending, use the preview endpoint.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://cloud-humans.mintlify.site/_mintlify/api/og/v2?division=Campaigns\u0026amp;title=Create+a+campaign\u0026amp;description=**Creating+a+campaign+sends+it.**+There+is+no+separate+step+that+starts+the+send%2C+and+no+way+to+call+it+back%3A+whatever+you+create+here+goes+out.+%60confirm_recipi\u0026amp;theme=392b44accc8c2ed667834476\u0026amp;signature=6b465304cdf0993cb50ba68832f483849396226980bb384822003e2ac40851c7\">\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/cloud-humans/Tjh_1uQRibuZjdTW/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Cloud Chat\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#EF7221\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.cloudhumans.com/api-reference/cloudchat/endpoints/create-a-campaign\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/cloudchat/endpoints/create-a-campaign.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.cloudhumans.com/#organization\",\"name\":\"Cloud Chat\",\"url\":\"https://docs.cloudhumans.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/cloud-humans/GHbxWTY81Qa4762I/logo/light.svg?fit=max\u0026auto=format\u0026n=GHbxWTY81Qa4762I\u0026q=85\u0026s=2899d32cd5c5f8adff5bb4390125f626\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.cloudhumans.com#website\",\"name\":\"Cloud Chat\",\"url\":\"https://docs.cloudhumans.com\",\"publisher\":{\"@id\":\"https://docs.cloudhumans.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.cloudhumans.com/api-reference/cloudchat/endpoints/create-a-campaign#webpage\",\"url\":\"https://docs.cloudhumans.com/api-reference/cloudchat/endpoints/create-a-campaign\",\"name\":\"Create a campaign\",\"description\":\"Creating a campaign sends it. There is no separate step that starts the send, and no way to call it back: whatever you create here goes out. confirm_recipients has to equal the reachable the preview returned for the same audience in the same channel; if it does not, the answer is 409 with both numbers and nothing is created. Do not repeat this call after a timeout. A repeat creates a second campaign and sends a second time, and every WhatsApp message is billed. Reading the campaign back only helps if you already hold its id: there is no listing and no idempotency key, so a lost response cannot be resolved through this API — open the campaign dashboard in Cloud Chat to see whether it was created before you send again. The channel follows from what you send. A campaign carrying email_campaign_sender_id is an e-mail campaign; otherwise the channel comes from the channel_type of the inbox behind inbox_id: Channel::Whatsapp sends a WhatsApp template, Channel::WebWidget sends a widget message. Check channel_type first, because nothing cross-checks your intent: a website inbox chosen while you meant to send WhatsApp delivers the template name to your contacts as the literal text of the message. This response is not a delivery confirmation. Sending happens after it returns and can still fail; what actually reached your contacts is in the Cloud Chat campaign dashboard. Every WhatsApp message is billed and reaches a real person, so do not send one merely to rehearse. To check an audience without sending, use the preview endpoint.\",\"dateModified\":\"2026-09-22T16:41:21.126Z\",\"isPartOf\":{\"@id\":\"https://docs.cloudhumans.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.cloudhumans.com/api-reference/cloudchat/endpoints/create-a-campaign#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.cloudhumans.com/api-reference/cloudchat/endpoints/create-a-campaign#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Campaigns\",\"item\":\"https://docs.cloudhumans.com/api-reference/cloudchat/endpoints/preview-campaign-recipients\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Create a campaign\",\"item\":\"https://docs.cloudhumans.com/api-reference/cloudchat/endpoints/create-a-campaign\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.cloudhumans.com/api-reference/cloudchat/endpoints/create-a-campaign#apireference\",\"headline\":\"Create a campaign\",\"name\":\"Create a campaign\",\"description\":\"Creating a campaign sends it. There is no separate step that starts the send, and no way to call it back: whatever you create here goes out. confirm_recipients has to equal the reachable the preview returned for the same audience in the same channel; if it does not, the answer is 409 with both numbers and nothing is created. Do not repeat this call after a timeout. A repeat creates a second campaign and sends a second time, and every WhatsApp message is billed. Reading the campaign back only helps if you already hold its id: there is no listing and no idempotency key, so a lost response cannot be resolved through this API — open the campaign dashboard in Cloud Chat to see whether it was created before you send again. The channel follows from what you send. A campaign carrying email_campaign_sender_id is an e-mail campaign; otherwise the channel comes from the channel_type of the inbox behind inbox_id: Channel::Whatsapp sends a WhatsApp template, Channel::WebWidget sends a widget message. Check channel_type first, because nothing cross-checks your intent: a website inbox chosen while you meant to send WhatsApp delivers the template name to your contacts as the literal text of the message. This response is not a delivery confirmation. Sending happens after it returns and can still fail; what actually reached your contacts is in the Cloud Chat campaign dashboard. Every WhatsApp message is billed and reaches a real person, so do not send one merely to rehearse. To check an audience without sending, use the preview endpoint.\",\"url\":\"https://docs.cloudhumans.com/api-reference/cloudchat/endpoints/create-a-campaign\",\"mainEntityOfPage\":{\"@id\":\"https://docs.cloudhumans.com/api-reference/cloudchat/endpoints/create-a-campaign#webpage\"},\"dateModified\":\"2026-09-22T16:41:21.126Z\",\"publisher\":{\"@id\":\"https://docs.cloudhumans.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.cloudhumans.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Cloud Chat\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Cloud Chat","nav":{"global":null,"tabs":[{"tab":"Guides","pages":[{"title":"Guides","href":""}]},{"tab":"API Reference","products":[{"product":"Cloud Chat","icon":"messages","groups":[{"group":"Getting Started","pages":[{"title":"Cloud Chat API","href":"/api-reference/cloudchat/overview"},{"title":"Find your credentials","href":"/api-reference/cloudchat/credentials"}]},{"group":"Authentication","pages":[{"title":"Sign in and get a token","deprecated":null,"version":null,"openapi":"/api-reference/specs/auth/v1.json post /v1/signin","href":"/api-reference/cloudchat/v1/auth/authentication/sign-in-and-get-a-token"},{"title":"Answer a sign-in challenge","deprecated":null,"version":null,"openapi":"/api-reference/specs/auth/v1.json post /v1/signin/challenge","href":"/api-reference/cloudchat/v1/auth/authentication/answer-a-sign-in-challenge"}]},{"group":"Canned Responses","pages":[{"title":"List canned responses","openapi":"api-reference/specs/cloudchat/v1.json GET /v1/accounts/{accountId}/canned-responses","href":"/api-reference/cloudchat/endpoints/list-canned-responses"},{"title":"Get a canned response","openapi":"api-reference/specs/cloudchat/v1.json GET /v1/accounts/{accountId}/canned-responses/{cannedResponseId}","href":"/api-reference/cloudchat/endpoints/get-a-canned-response"},{"title":"Create a canned response","openapi":"api-reference/specs/cloudchat/v1.json POST /v1/accounts/{accountId}/canned-responses","href":"/api-reference/cloudchat/endpoints/create-a-canned-response"},{"title":"Update a canned response","openapi":"api-reference/specs/cloudchat/v1.json PATCH /v1/accounts/{accountId}/canned-responses/{cannedResponseId}","href":"/api-reference/cloudchat/endpoints/update-a-canned-response"},{"title":"Delete a canned response","openapi":"api-reference/specs/cloudchat/v1.json DELETE /v1/accounts/{accountId}/canned-responses/{cannedResponseId}","href":"/api-reference/cloudchat/endpoints/delete-a-canned-response"}]},{"group":"Conversations","pages":[{"title":"List conversations","openapi":"api-reference/specs/cloudchat/v1.json GET /v1/accounts/{accountId}/conversations","href":"/api-reference/cloudchat/endpoints/list-conversations"},{"title":"Find a conversation by any identifier","openapi":"api-reference/specs/cloudchat/v1.json GET /v1/accounts/{accountId}/conversations/find","href":"/api-reference/cloudchat/endpoints/find-a-conversation"},{"title":"Get a conversation","openapi":"api-reference/specs/cloudchat/v1.json GET /v1/accounts/{accountId}/conversations/{conversationId}","href":"/api-reference/cloudchat/endpoints/get-a-conversation"},{"title":"List conversation messages","openapi":"api-reference/specs/cloudchat/v1.json GET /v1/accounts/{accountId}/conversations/{conversationId}/messages","href":"/api-reference/cloudchat/endpoints/list-conversation-messages"}]},{"group":"Contacts","pages":[{"title":"List contacts","openapi":"api-reference/specs/cloudchat/v1.json GET /v1/accounts/{accountId}/contacts","href":"/api-reference/cloudchat/endpoints/list-contacts"},{"title":"Get a contact","openapi":"api-reference/specs/cloudchat/v1.json GET /v1/accounts/{accountId}/contacts/{contactId}","href":"/api-reference/cloudchat/endpoints/get-a-contact"}]},{"group":"Labels","pages":[{"title":"List labels","openapi":"api-reference/specs/cloudchat/v1.json GET /v1/accounts/{accountId}/labels","href":"/api-reference/cloudchat/endpoints/list-labels"}]},{"group":"Inboxes","pages":[{"title":"List inboxes","openapi":"api-reference/specs/cloudchat/v1.json GET /v1/accounts/{accountId}/inboxes","href":"/api-reference/cloudchat/endpoints/list-inboxes"},{"title":"Get an inbox","openapi":"api-reference/specs/cloudchat/v1.json GET /v1/accounts/{accountId}/inboxes/{inboxId}","href":"/api-reference/cloudchat/endpoints/get-an-inbox"}]},{"group":"Campaigns","pages":[{"title":"Preview campaign recipients","openapi":"api-reference/specs/cloudchat/v1.json POST /v1/accounts/{accountId}/campaigns/preview-recipients","description":"Resolve an audience and count it, without creating anything. Run this before creating a campaign: the `reachable` it returns is what the create endpoint expects in `confirm_recipients`, and any other value is refused with 409.\n\nMeasure the channel the campaign will really use. The create endpoint takes no channel — it follows from the inbox, or from the e-mail sender — so previewing one channel and creating in another gives two different numbers.\n\nOn `whatsapp` only contacts with a phone number count: a contact you can otherwise message through a Meta business-scoped id does not receive campaigns. On `email` the figure is an estimate rather than a promise, because the dispatcher still drops addresses that fail its format check or sit on your suppression list.","href":"/api-reference/cloudchat/endpoints/preview-campaign-recipients"},{"title":"Create a campaign","openapi":"api-reference/specs/cloudchat/v1.json POST /v1/accounts/{accountId}/campaigns","href":"/api-reference/cloudchat/endpoints/create-a-campaign"},{"title":"Get a campaign","openapi":"api-reference/specs/cloudchat/v1.json GET /v1/accounts/{accountId}/campaigns/{campaignId}","description":"Read one campaign back by the id you were given when it was created. **No endpoint lists campaigns**, so an id you did not keep cannot be recovered.\n\n**`campaign_status` is not a delivery report.** `completed` means a worker took the campaign over, not that anything arrived: on WhatsApp the status is set before the audience is even resolved, and `started_at` stays null for the whole life of a WhatsApp campaign. For what was actually delivered, open the campaign dashboard in Cloud Chat.\n\n`reachable_count` is not part of this response: reach is computed when the campaign is created and never stored.","href":"/api-reference/cloudchat/endpoints/get-a-campaign"},{"title":"List campaign variables","openapi":"api-reference/specs/cloudchat/v1.json GET /v1/accounts/{accountId}/campaigns/variables","href":"/api-reference/cloudchat/endpoints/list-campaign-variables"},{"title":"List message templates","openapi":"api-reference/specs/cloudchat/v1.json GET /v1/accounts/{accountId}/inboxes/{inboxId}/message-templates","href":"/api-reference/cloudchat/endpoints/list-message-templates"}]},{"group":"Reports","pages":[{"title":"List reports","openapi":"api-reference/specs/cloudchat/v1.json GET /v1/accounts/{accountId}/reports","href":"/api-reference/cloudchat/endpoints/list-reports"},{"title":"Get a report","openapi":"api-reference/specs/cloudchat/v1.json GET /v1/accounts/{accountId}/reports/{reportKey}","href":"/api-reference/cloudchat/endpoints/get-a-report"},{"title":"List report query fields","openapi":"api-reference/specs/cloudchat/v1.json GET /v1/accounts/{accountId}/report-queries/fields","href":"/api-reference/cloudchat/endpoints/list-report-query-fields"},{"title":"Run a report query","openapi":"api-reference/specs/cloudchat/v1.json POST /v1/accounts/{accountId}/report-queries","href":"/api-reference/cloudchat/endpoints/run-a-report-query"}]},{"group":"Agents","pages":[{"title":"List agents","openapi":"api-reference/specs/cloudchat/v1.json GET /v1/accounts/{accountId}/agents","href":"/api-reference/cloudchat/endpoints/list-agents"},{"title":"Get an agent","openapi":"api-reference/specs/cloudchat/v1.json GET /v1/accounts/{accountId}/agents/{agentId}","href":"/api-reference/cloudchat/endpoints/get-an-agent"},{"title":"Create an agent","openapi":"api-reference/specs/cloudchat/v1.json POST /v1/accounts/{accountId}/agents","href":"/api-reference/cloudchat/endpoints/create-an-agent"},{"title":"Update an agent","openapi":"api-reference/specs/cloudchat/v1.json PATCH /v1/accounts/{accountId}/agents/{agentId}","href":"/api-reference/cloudchat/endpoints/update-an-agent"},{"title":"Get agent access","openapi":"api-reference/specs/cloudchat/v1.json GET /v1/accounts/{accountId}/agents/{agentId}/access","href":"/api-reference/cloudchat/endpoints/get-agent-access"},{"title":"Set agent access","openapi":"api-reference/specs/cloudchat/v1.json PUT /v1/accounts/{accountId}/agents/{agentId}/access","href":"/api-reference/cloudchat/endpoints/set-agent-access"}]},{"group":"Teams","pages":[{"title":"List teams","openapi":"api-reference/specs/cloudchat/v1.json GET /v1/accounts/{accountId}/teams","href":"/api-reference/cloudchat/endpoints/list-teams"},{"title":"Get a team","openapi":"api-reference/specs/cloudchat/v1.json GET /v1/accounts/{accountId}/teams/{teamId}","href":"/api-reference/cloudchat/endpoints/get-a-team"},{"title":"Create a team","openapi":"api-reference/specs/cloudchat/v1.json POST /v1/accounts/{accountId}/teams","href":"/api-reference/cloudchat/endpoints/create-a-team"},{"title":"Update a team","openapi":"api-reference/specs/cloudchat/v1.json PATCH /v1/accounts/{accountId}/teams/{teamId}","href":"/api-reference/cloudchat/endpoints/update-a-team"},{"title":"List team members","openapi":"api-reference/specs/cloudchat/v1.json GET /v1/accounts/{accountId}/teams/{teamId}/members","href":"/api-reference/cloudchat/endpoints/list-team-members"},{"title":"Add team members","openapi":"api-reference/specs/cloudchat/v1.json POST /v1/accounts/{accountId}/teams/{teamId}/members","href":"/api-reference/cloudchat/endpoints/add-team-members"}]},{"group":"Macros","pages":[{"title":"List macros","openapi":"api-reference/specs/cloudchat/v1.json GET /v1/accounts/{accountId}/macros","href":"/api-reference/cloudchat/endpoints/list-macros"},{"title":"Get a macro","openapi":"api-reference/specs/cloudchat/v1.json GET /v1/accounts/{accountId}/macros/{macroId}","href":"/api-reference/cloudchat/endpoints/get-a-macro"},{"title":"Create a macro","openapi":"api-reference/specs/cloudchat/v1.json POST /v1/accounts/{accountId}/macros","href":"/api-reference/cloudchat/endpoints/create-a-macro"},{"title":"Update a macro","openapi":"api-reference/specs/cloudchat/v1.json PATCH /v1/accounts/{accountId}/macros/{macroId}","href":"/api-reference/cloudchat/endpoints/update-a-macro"}]},{"group":"Automation Rules","pages":[{"title":"List automation rules","openapi":"api-reference/specs/cloudchat/v1.json GET /v1/accounts/{accountId}/automation-rules","href":"/api-reference/cloudchat/endpoints/list-automation-rules"},{"title":"Get an automation rule","openapi":"api-reference/specs/cloudchat/v1.json GET /v1/accounts/{accountId}/automation-rules/{automationRuleId}","href":"/api-reference/cloudchat/endpoints/get-an-automation-rule"}]},{"group":"Availability Reasons","pages":[{"title":"List availability reasons","openapi":"api-reference/specs/cloudchat/v1.json GET /v1/accounts/{accountId}/availability-reasons","href":"/api-reference/cloudchat/endpoints/list-availability-reasons"},{"title":"Create an availability reason","openapi":"api-reference/specs/cloudchat/v1.json POST /v1/accounts/{accountId}/availability-reasons","href":"/api-reference/cloudchat/endpoints/create-an-availability-reason"},{"title":"Update an availability reason","openapi":"api-reference/specs/cloudchat/v1.json PATCH /v1/accounts/{accountId}/availability-reasons/{availabilityReasonId}","href":"/api-reference/cloudchat/endpoints/update-an-availability-reason"},{"title":"Delete an availability reason","openapi":"api-reference/specs/cloudchat/v1.json DELETE /v1/accounts/{accountId}/availability-reasons/{availabilityReasonId}","href":"/api-reference/cloudchat/endpoints/delete-an-availability-reason"}]},{"group":"Native Attribute Requirements","pages":[{"title":"List native attribute requirements","openapi":"api-reference/specs/cloudchat/v1.json GET /v1/accounts/{accountId}/native-attribute-requirements","href":"/api-reference/cloudchat/endpoints/list-native-attribute-requirements"},{"title":"Require a native attribute","openapi":"api-reference/specs/cloudchat/v1.json POST /v1/accounts/{accountId}/native-attribute-requirements","href":"/api-reference/cloudchat/endpoints/create-a-native-attribute-requirement"},{"title":"Stop requiring a native attribute","openapi":"api-reference/specs/cloudchat/v1.json DELETE /v1/accounts/{accountId}/native-attribute-requirements/{nativeAttributeRequirementId}","href":"/api-reference/cloudchat/endpoints/delete-a-native-attribute-requirement"}]},{"group":"Help Center","pages":[{"title":"List portals","openapi":"api-reference/specs/cloudchat/v1.json GET /v1/accounts/{accountId}/portals","href":"/api-reference/cloudchat/endpoints/list-portals"},{"title":"Get a portal","openapi":"api-reference/specs/cloudchat/v1.json GET /v1/accounts/{accountId}/portals/{portalSlug}","href":"/api-reference/cloudchat/endpoints/get-a-portal"},{"title":"Create a portal","openapi":"api-reference/specs/cloudchat/v1.json POST /v1/accounts/{accountId}/portals","href":"/api-reference/cloudchat/endpoints/create-a-portal"},{"title":"Update a portal","openapi":"api-reference/specs/cloudchat/v1.json PATCH /v1/accounts/{accountId}/portals/{portalSlug}","href":"/api-reference/cloudchat/endpoints/update-a-portal"},{"title":"List categories","openapi":"api-reference/specs/cloudchat/v1.json GET /v1/accounts/{accountId}/portals/{portalSlug}/categories","href":"/api-reference/cloudchat/endpoints/list-categories"},{"title":"Get a category","openapi":"api-reference/specs/cloudchat/v1.json GET /v1/accounts/{accountId}/portals/{portalSlug}/categories/{categoryId}","href":"/api-reference/cloudchat/endpoints/get-a-category"},{"title":"Create a category","openapi":"api-reference/specs/cloudchat/v1.json POST /v1/accounts/{accountId}/portals/{portalSlug}/categories","href":"/api-reference/cloudchat/endpoints/create-a-category"},{"title":"Update a category","openapi":"api-reference/specs/cloudchat/v1.json PATCH /v1/accounts/{accountId}/portals/{portalSlug}/categories/{categoryId}","href":"/api-reference/cloudchat/endpoints/update-a-category"},{"title":"Delete a category","openapi":"api-reference/specs/cloudchat/v1.json DELETE /v1/accounts/{accountId}/portals/{portalSlug}/categories/{categoryId}","href":"/api-reference/cloudchat/endpoints/delete-a-category"},{"title":"List articles","openapi":"api-reference/specs/cloudchat/v1.json GET /v1/accounts/{accountId}/portals/{portalSlug}/articles","href":"/api-reference/cloudchat/endpoints/list-articles"},{"title":"Get an article","openapi":"api-reference/specs/cloudchat/v1.json GET /v1/accounts/{accountId}/portals/{portalSlug}/articles/{articleId}","href":"/api-reference/cloudchat/endpoints/get-an-article"},{"title":"Create an article","openapi":"api-reference/specs/cloudchat/v1.json POST /v1/accounts/{accountId}/portals/{portalSlug}/articles","href":"/api-reference/cloudchat/endpoints/create-an-article"},{"title":"Update an article","openapi":"api-reference/specs/cloudchat/v1.json PATCH /v1/accounts/{accountId}/portals/{portalSlug}/articles/{articleId}","href":"/api-reference/cloudchat/endpoints/update-an-article"},{"title":"Translate an article","openapi":"api-reference/specs/cloudchat/v1.json POST /v1/accounts/{accountId}/portals/{portalSlug}/articles/{articleId}/translate","href":"/api-reference/cloudchat/endpoints/translate-an-article"},{"title":"Delete an article","openapi":"api-reference/specs/cloudchat/v1.json DELETE /v1/accounts/{accountId}/portals/{portalSlug}/articles/{articleId}","href":"/api-reference/cloudchat/endpoints/delete-an-article"}]},{"group":"Uploads","pages":[{"title":"Upload an image","openapi":"api-reference/specs/cloudchat/v1.json POST /v1/accounts/{accountId}/uploads","href":"/api-reference/cloudchat/endpoints/upload-an-image"}]}]},{"product":"Claudia","icon":"robot","pages":[{"title":"Claudia","href":"/api-reference/claudia/sign-in"}]}]}]},"basePath":"","title":"Create a campaign - Cloud Chat","buildId":"dpl_FWZhTb2vab28gFGFH4ojka6qEznQ","deploymentId":"dpl_FWZhTb2vab28gFGFH4ojka6qEznQ","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-CBsVopKK.js","utils-DZAk68jJ.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-D32AYZrP.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-D_A5_cny.js","snippetPresets-xNRfS9th.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","conditional-requirements-CFM0id0Q.js","ApiExamples-BIB25-tq.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-CydJ4w4j.js","shallow-CYPBeQSG.js","getApiPlaygroundDisplay-A5xJVBOu.js","CodeSnippet-BVRTgi3m.js","CodeSnippets-DjD6BSlt.js","Page-Dr40SSJq.js","getPastedJson-D4V4JyrR.js","icon-uhcnG22T.js","MethodPill-CM-ZQdGH.js","DuplicateIcon-B_WnOiNf.js","createIcon-CJsb8utt.js","DynamicMarkdown-D-2HDKEp.js","SectionHeading-KP5xmMgQ.js","axios-vUo_bRtp.js","Markdown-D_k0dg6k.js","clsx-DK3K4Z1S.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-DE3EVdvd.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-fN9H9n9g.js"]}