Chatwoot Campaigns API

Create, schedule, and manage campaigns. Requires an account administrator and API access enabled for the account.

Operations 5

GET /api/v1/accounts/{account_id}/campaigns List campaigns #
POST /api/v1/accounts/{account_id}/campaigns Create a campaign #
GET /api/v1/accounts/{account_id}/campaigns/{id} Get a campaign #
PATCH /api/v1/accounts/{account_id}/campaigns/{id} Update a campaign #
DELETE /api/v1/accounts/{account_id}/campaigns/{id} Delete a campaign #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • 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.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/chatwoot:chatwoot-campaigns-api"
All apis
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.

Get an API 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 Specification

chatwoot-campaigns-api-openapi.yml Raw ↑
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