Chatwoot Campaigns API
Create, schedule, and manage campaigns. Requires an account administrator and API access enabled for the account.
Create, schedule, and manage campaigns. Requires an account administrator and API access enabled for the account.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/chatwoot:chatwoot-campaigns-api"
curl "https://apis.io/api/v1/apis?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: Chatwoot Campaigns API
description: This is the API documentation for Chatwoot server.
version: 1.1.0
termsOfService: https://www.chatwoot.com/terms-of-service/
contact:
email: hello@chatwoot.com
license:
name: MIT License
url: https://opensource.org/licenses/MIT
servers:
- url: https://app.chatwoot.com/
tags:
- name: Campaigns
description: Create, schedule, and manage campaigns. Requires an account administrator and API access enabled for the account.
paths:
/api/v1/accounts/{account_id}/campaigns:
parameters:
- $ref: '#/components/parameters/account_id'
get:
tags:
- Campaigns
operationId: list-campaigns
summary: List campaigns
security:
- userBearerAuth: []
- userApiKey: []
description: List all campaigns in the account. The response is an unpaginated array. Requires an account administrator and API access enabled for the account.
responses:
'200':
description: Success
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/campaign'
'401':
description: Authentication failed or the user is not an account administrator
'403':
description: API access is disabled for the account
post:
tags:
- Campaigns
operationId: create-campaign
summary: Create a campaign
security:
- userBearerAuth: []
- userApiKey: []
description: Create a campaign. For a supported messaging inbox, provide scheduled_at to schedule a one-off campaign; omitting it makes the campaign eligible for the next scheduler run. Website campaigns use trigger_rules instead. Channel-specific campaign availability and requirements still apply. One-off campaigns require at least one audience label for delivery. WhatsApp campaigns also require template_params with the selected template name, language, and any variable values. A successful creation response does not confirm delivery. Requires an account administrator and API access enabled for the account.
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/campaign_create_payload'
examples:
sms:
summary: Schedule an SMS campaign
value:
campaign:
title: January announcement
inbox_id: 12
message: Our January offers are here!
scheduled_at: '2027-01-15T10:00:00Z'
audience:
- type: Label
id: 5
whatsapp:
summary: Schedule a WhatsApp campaign using a template with one body variable
value:
campaign:
title: Order update
inbox_id: 15
message: Hello {{ contact.name }}, your order has shipped.
scheduled_at: '2027-01-15T10:00:00Z'
audience:
- type: Label
id: 5
template_params:
name: order_shipped
language: en
processed_params:
body:
'1': '{{ contact.name }}'
website:
summary: Create an ongoing website campaign
value:
campaign:
title: Pricing help
inbox_id: 8
sender_id: 3
message: Can we help you choose a plan?
trigger_rules:
url: https://example.com/pricing
time_on_page: 10
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/campaign'
'401':
description: Authentication failed or the user is not an account administrator
'403':
description: API access is disabled for the account
'422':
description: Campaign validation failed
/api/v1/accounts/{account_id}/campaigns/{id}:
parameters:
- $ref: '#/components/parameters/account_id'
- name: id
in: path
required: true
schema:
type: integer
description: Account-scoped campaign ID returned by the campaign API.
get:
tags:
- Campaigns
operationId: get-campaign
summary: Get a campaign
security:
- userBearerAuth: []
- userApiKey: []
description: Retrieve a campaign using its account-scoped ID. Requires an account administrator and API access enabled for the account.
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/campaign'
'401':
description: Authentication failed or the user is not an account administrator
'403':
description: API access is disabled for the account
patch:
tags:
- Campaigns
operationId: update-campaign
summary: Update a campaign
security:
- userBearerAuth: []
- userApiKey: []
description: Update campaign fields, including scheduled_at to reschedule an active one-off campaign. Completed campaigns cannot be updated. Requires an account administrator and API access enabled for the account.
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/campaign_update_payload'
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/campaign'
'401':
description: Authentication failed or the user is not an account administrator
'403':
description: API access is disabled for the account
'422':
description: Campaign validation failed
delete:
tags:
- Campaigns
operationId: delete-campaign
summary: Delete a campaign
security:
- userBearerAuth: []
- userApiKey: []
description: Delete a campaign from the account. Requires an account administrator and API access enabled for the account.
responses:
'200':
description: Success
'401':
description: Authentication failed or the user is not an account administrator
'403':
description: API access is disabled for the account
components:
schemas:
campaign_create_payload:
type: object
required:
- campaign
properties:
campaign:
description: Choose the variant matching the inbox referenced by inbox_id. The channel type is stored on the inbox and cannot be inferred from this request by a schema validator. These variants describe the inputs needed for delivery; creation can accept incomplete inputs without guaranteeing that the campaign will send.
allOf:
- $ref: '#/components/schemas/campaign_fields'
- type: object
required:
- title
- inbox_id
- message
- anyOf:
- title: Website campaign
description: For a Website inbox, supply URL trigger rules. An audience is not required.
type: object
required:
- trigger_rules
properties:
trigger_rules:
type: object
required:
- url
properties:
url:
type: string
format: uri
- title: SMS campaign
description: For an SMS or Twilio SMS inbox, supply at least one audience label.
type: object
required:
- audience
- title: WhatsApp campaign
description: For a WhatsApp Cloud inbox with campaigns enabled, supply audience labels and template parameters.
type: object
required:
- audience
- template_params
campaign_fields:
type: object
properties:
title:
type: string
description: Campaign title.
description:
type:
- string
- 'null'
description: Internal description of the campaign.
inbox_id:
type: integer
description: ID of an inbox in this account. Supported inbox types are Website, Twilio SMS, SMS, and WhatsApp.
sender_id:
type:
- integer
- 'null'
description: ID of a user in this account to use as the campaign sender.
message:
type: string
description: Campaign message content.
enabled:
type: boolean
description: Whether an ongoing website campaign is enabled. This does not cancel a scheduled one-off campaign.
scheduled_at:
type: string
format: date-time
description: Scheduled time for a one-off campaign, as an ISO 8601 timestamp with timezone. Defaults to the current time when omitted; website campaigns ignore this field. Responses return Unix seconds instead.
example: '2027-01-15T10:00:00Z'
audience:
type: array
minItems: 1
description: Required when creating a one-off SMS or WhatsApp campaign. Provide at least one label from this account. Contacts matching any selected label are included. When updating, omit this field to retain the existing audience.
items:
type: object
required:
- type
- id
properties:
type:
type: string
enum:
- Label
id:
type: integer
description: ID of a label in this account.
trigger_rules:
type: object
additionalProperties: true
description: Website campaign trigger rules. Defaults to an empty object and can be omitted for a one-off campaign.
example:
url: https://example.com/pricing
time_on_page: 10
trigger_only_during_business_hours:
type: boolean
description: Restrict an ongoing website campaign to inbox business hours.
template_params:
$ref: '#/components/schemas/campaign_whatsapp_template_params'
campaign_whatsapp_template_params:
type: object
required:
- name
- language
properties:
name:
type: string
minLength: 1
description: Name of the approved template in the selected inbox's message_templates.
language:
type: string
minLength: 1
description: Language code matching that template in the selected inbox.
example: en
namespace:
type: string
description: Template namespace, when present in the selected template.
category:
type: string
description: Category of the selected template.
processed_params:
type: object
description: Values for the selected template's variables, grouped by component. Supply all parameters needed by that template. May be omitted for a template without variables. Body keys use positional numbers or the template's named parameters. Liquid expressions such as {{ contact.name }} are rendered separately for each recipient.
properties:
body:
type: object
additionalProperties:
type: string
header:
type: object
additionalProperties: true
description: Text parameter values or media_url, media_type, and optional media_name for a media header.
footer:
type: object
additionalProperties:
type: string
buttons:
type: array
items:
type: object
additionalProperties: true
example:
body:
'1': '{{ contact.name }}'
campaign:
type: object
properties:
id:
type: integer
description: Account-scoped campaign ID. Use this value in campaign API paths.
title:
type: string
description:
type:
- string
- 'null'
account_id:
type: integer
inbox:
$ref: '#/components/schemas/inbox'
sender:
type: object
description: Sender details, or an empty object when no sender is assigned.
additionalProperties: true
message:
type: string
template_params:
type:
- object
- 'null'
additionalProperties: true
campaign_status:
type: string
enum:
- active
- processing
- completed
campaign_type:
type: string
enum:
- ongoing
- one_off
description: Derived from the inbox type; website campaigns are ongoing and supported messaging campaigns are one-off.
enabled:
type: boolean
scheduled_at:
type: integer
description: Scheduled time in Unix seconds. Only present for one-off campaigns.
started_at:
type:
- integer
- 'null'
description: Start time in Unix seconds. Only present for one-off campaigns.
completed_at:
type:
- integer
- 'null'
description: Completion time in Unix seconds. Only present for one-off campaigns.
audience:
type:
- array
- 'null'
description: Audience for a one-off campaign. Only present for one-off campaigns.
items:
type: object
properties:
type:
type: string
id:
type: integer
trigger_rules:
type: object
additionalProperties: true
trigger_only_during_business_hours:
type: boolean
created_at:
type: string
format: date-time
updated_at:
type: string
format: date-time
inbox:
type: object
properties:
id:
type: number
description: ID of the inbox
name:
type: string
description: The name of the inbox
website_url:
type:
- string
- 'null'
description: Website URL
page_id:
type:
- string
- 'null'
description: Facebook Page ID associated with the inbox
instagram_id:
type:
- string
- 'null'
description: Instagram account ID associated with the inbox
business_id:
type:
- string
- 'null'
description: TikTok business ID associated with the inbox
provider_name:
type:
- string
- 'null'
description: Provider username or page name associated with the social inbox
profile_id:
type:
- string
- 'null'
description: X profile ID associated with the inbox
line_channel_id:
type:
- string
- 'null'
description: LINE channel ID associated with the inbox
email:
type:
- string
- 'null'
description: Email address associated with the inbox
bot_name:
type:
- string
- 'null'
description: Telegram bot name associated with the inbox
inbox_identifier:
type:
- string
- 'null'
description: Public identifier associated with an API inbox
channel_type:
type: string
description: The type of the inbox
avatar_url:
type: string
description: The avatar image of the inbox
widget_color:
type:
- string
- 'null'
description: Widget Color used for customization of the widget
website_token:
type:
- string
- 'null'
description: Website Token
enable_auto_assignment:
type: boolean
description: The flag which shows whether Auto Assignment is enabled or not
web_widget_script:
type:
- string
- 'null'
description: Script used to load the website widget
welcome_title:
type:
- string
- 'null'
description: Welcome title to be displayed on the widget
welcome_tagline:
type:
- string
- 'null'
description: Welcome tagline to be displayed on the widget
greeting_enabled:
type: boolean
description: The flag which shows whether greeting is enabled
greeting_message:
type:
- string
- 'null'
description: A greeting message when the user starts the conversation
channel_id:
type: number
description: ID of the channel this inbox belongs to
working_hours_enabled:
type: boolean
description: The flag which shows whether working hours feature is enabled
enable_email_collect:
type: boolean
description: The flag to enable collecting email from contacts
csat_survey_enabled:
type: boolean
description: The flag to enable CSAT survey
auto_assignment_config:
type: object
description: Configuration settings for auto assignment
out_of_office_message:
type:
- string
- 'null'
description: Message to show when agents are out of office
working_hours:
type: array
description: Configuration for working hours of the inbox
items:
type: object
properties:
day_of_week:
type: number
description: Day of the week (0-6, where 0 is Sunday)
closed_all_day:
type: boolean
description: Whether the inbox is closed for the entire day
open_hour:
type:
- number
- 'null'
description: Hour when inbox opens (0-23)
open_minutes:
type:
- number
- 'null'
description: Minutes of the hour when inbox opens (0-59)
close_hour:
type:
- number
- 'null'
description: Hour when inbox closes (0-23)
close_minutes:
type:
- number
- 'null'
description: Minutes of the hour when inbox closes (0-59)
open_all_day:
type: boolean
description: Whether the inbox is open for the entire day
timezone:
type: string
description: Timezone configuration for the inbox
callback_webhook_url:
type:
- string
- 'null'
description: Webhook URL for callbacks
allow_messages_after_resolved:
type: boolean
description: Whether to allow messages after a conversation is resolved
lock_to_single_conversation:
type: boolean
description: Whether to lock a contact to a single conversation
sender_name_type:
type: string
description: Type of sender name to display (e.g., friendly)
business_name:
type:
- string
- 'null'
description: Business name associated with the inbox
branded_email_layout:
type:
- string
- 'null'
description: Liquid HTML layout for branded email replies. Available to administrators for Email inbox show/update responses.
hmac_mandatory:
type:
- boolean
- 'null'
description: Whether HMAC verification is mandatory
selected_feature_flags:
type:
- array
- 'null'
description: Selected feature flags for the inbox
items:
type: string
reply_time:
type:
- string
- 'null'
description: Expected reply time
messaging_service_sid:
type:
- string
- 'null'
description: Messaging service SID for SMS providers
phone_number:
type:
- string
- 'null'
description: Phone number associated with the inbox
medium:
type: string
description: Medium of communication (e.g., sms, email)
provider:
type:
- string
- 'null'
description: Provider of the channel
campaign_update_payload:
type: object
required:
- campaign
properties:
campaign:
allOf:
- $ref: '#/components/schemas/campaign_fields'
parameters:
account_id:
in: path
name: account_id
schema:
type: integer
required: true
description: The numeric ID of the account
securitySchemes:
userBearerAuth:
type: http
scheme: bearer
description: 'Authenticate with `Authorization: Bearer <token>` using a user API token from **Profile Settings**. Available in Chatwoot `v4.19.0` and later.'
agentBotBearerAuth:
type: http
scheme: bearer
description: 'Authenticate with `Authorization: Bearer <token>` using an agent bot token from **Settings → Agent Bots**. Available in Chatwoot `v4.19.0` and later.'
platformAppBearerAuth:
type: http
scheme: bearer
description: 'Authenticate with `Authorization: Bearer <token>` using a platform app token from **Super Admin**. Available in Chatwoot `v4.19.0` and later.'
userApiKey:
type: apiKey
in: header
name: api_access_token
description: Find your API token in **Profile Settings**. The `api_access_token` header remains supported, but will be deprecated in a future release. For new integrations, use Bearer authentication.
agentBotApiKey:
type: apiKey
in: header
name: api_access_token
description: Find your agent bot token in **Settings → Agent Bots**. For new integrations, use Bearer authentication in Chatwoot `v4.19.0` and later. Agent bot tokens can access only bot-permitted APIs.
platformAppApiKey:
type: apiKey
in: header
name: api_access_token
description: Create a platform app in **Super Admin** to get its token. For new integrations, use Bearer authentication in Chatwoot `v4.19.0` and later. Platform app tokens can provision agent bots, accounts, users, and roles.
x-tagGroups:
- name: Platform
tags:
- Accounts
- Account Users
- AgentBots
- Users
- name: Application
tags:
- Account AgentBots
- Account
- Agents
- Audit Logs
- Campaigns
- Canned Responses
- Contacts
- Contact Labels
- Conversation Assignments
- Conversation Labels
- Conversations
- Custom Attributes
- Custom Filters
- Inboxes
- Integrations
- Labels
- Messages
- Profile
- Reports
- Teams
- Webhooks
- Automation Rule
- Help Center
- name: Client
tags:
- Contacts API
- Conversations API
- Messages API
- name: Others
tags:
- CSAT Survey Page