> ## Documentation Index
> Fetch the complete documentation index at: https://developers.chatwoot.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Create a campaign

> 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.



## OpenAPI

````yaml https://raw.githubusercontent.com/chatwoot/chatwoot/develop/swagger/tag_groups/application_swagger.json post /api/v1/accounts/{account_id}/campaigns
openapi: 3.1.0
info:
  title: Chatwoot
  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/
security: []
tags:
  - name: Account AgentBots
    description: Account-specific Agent Bots
  - name: Agents
    description: Agent management APIs
  - name: Campaigns
    description: >-
      Create, schedule, and manage campaigns. Requires an account administrator
      and API access enabled for the account.
  - name: Canned Responses
    description: Pre-defined responses for common queries
  - name: Contacts
    description: Contact management APIs
  - name: Contact Labels
    description: Manage contact labels
  - name: Conversation Assignments
    description: Manage conversation assignments
  - name: Conversation Labels
    description: Manage conversation labels
  - name: Conversations
    description: Conversation management APIs
  - name: Custom Attributes
    description: Custom fields for contacts and conversations
  - name: Custom Filters
    description: Saved filters for conversations
  - name: Inboxes
    description: Communication channels setup
  - name: Integrations
    description: Third-party integrations
  - name: Labels
    description: Account label management APIs
  - name: Messages
    description: Message management APIs
  - name: Profile
    description: User profile APIs
  - name: Reports
    description: Analytics and reporting APIs
  - name: Teams
    description: Team management APIs
  - name: Webhooks
    description: Event notification webhooks
  - name: Automation Rule
    description: Workflow automation rules
  - name: Help Center
    description: Knowledge base management
paths:
  /api/v1/accounts/{account_id}/campaigns:
    parameters:
      - $ref: '#/components/parameters/account_id'
    post:
      tags:
        - Campaigns
      summary: Create a campaign
      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.
      operationId: create-campaign
      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
      security:
        - userApiKey: []
components:
  parameters:
    account_id:
      in: path
      name: account_id
      schema:
        type: integer
      required: true
      description: The numeric ID of the account
  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:
      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
    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'
    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_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 }}'
  securitySchemes:
    userApiKey:
      type: apiKey
      in: header
      name: api_access_token
      description: >-
        This token can be obtained by visiting the profile page or via rails
        console. Provides access to  endpoints based on the user permissions
        levels. This token can be saved by an external system when user is
        created via API, to perform activities on behalf of the user.

````