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

# Create Campaign

> This API creates a new Push or Email campaign in MoEngage with specified content, audience, and delivery settings.   


#### Rate Limits

| Rate Limit Name            | Rate Limit                                                                        |
| :------------------------- | :-------------------------------------------------------------------------------- |
| Create campaign per second | The total number of create campaign requests per second per client allowed is 5.  |
| Create campaign per minute | The total number of create campaign requests per minute per client allowed is 25. |
| Create campaign per hour   | The total number of create campaign requests per hour per client allowed is 100.  |

### Campaign Creation Limits

You can create 5 campaigns per minute, 25 campaigns per hour, and 100 campaigns per day.

<Note>
  **Notes**

  * Higher limit (Total Calls): The system permits a higher volume of total API calls (for example, 120 calls) to accommodate potential failures or retries.
  * Minimum limit (Campaign Creation Limits): The system maintains a stricter quota for actual successful creations (100 campaigns per day).

    Example: If a client submits 120 requests and 20 fail, they successfully generate exactly 100 campaigns. Because the system applies the most restrictive threshold, the 100 successful operations trigger the quota limit, and the system issues a rate limit breach warning regardless of the total API calls made.
  * Breaching the limits will reject the request.
  * Per hour and per day limits will consider the calculation based on the last hour and last 24 hrs respectively.
</Note>


## OpenAPI

````yaml /api/campaigns/campaigns.yaml post /campaigns
openapi: 3.0.3
info:
  title: MoEngage Campaigns API
  version: '2025-11-20'
  description: >
    The MoEngage Campaigns API allows you to create and manage Push and Email
    campaigns programmatically.


    **Supported Channels:**

    - Push (Android, iOS, Web)

    - Email


    **Supported Delivery Types:**

    - ONE_TIME

    - PERIODIC

    - EVENT_TRIGGERED

    - BUSINESS_EVENT_TRIGGERED

    - DEVICE_TRIGGERED (Push only)

    - LOCATION_TRIGGERED (Push only)

    - BROADCAST_LIVE_ACTIVITY (Push iOS only)

     | Rate Limit Name | Rate Limit |
     | :--- | :--- |
     | Create campaign per second | The total number of create campaign operations per second per client allowed is 5. |
     | Create campaign per minute | The total number of create campaign operations per minute per client allowed is 25. |
     | Create campaign per hour | The total number of create campaign operations per hour per client allowed is 100. |

     You can create 5 campaigns per minute, 25 campaigns per hour, and 100 campaigns per day.

     <Note>
       * Breaching the limits will reject the request.
        * Per hour and per day limits will consider the calculation based on the last hour and last 24 hrs respectively.
     </Note>

    For more details, visit [MoEngage Developer
    Documentation](https://developers.moengage.com).
  contact:
    name: MoEngage Developer Team
    email: support@moengage.com
    url: https://developers.moengage.com
servers:
  - url: https://api-{dc}.moengage.com/core-services/v1
    description: MoEngage Campaigns API Server
    variables:
      dc:
        default: '01'
        description: >-
          The ‘dc’ in the API Endpoint URL refers to the MoEngage Data Center
          (DC). MoEngage hosts each customer in a different DC. You can find
          your DC number and replace the value of ‘dc’ in the URL by referring
          to the DC and API endpoint mapping
          [here](/api/introduction#data-centers). Your MoEngage Data Center (DC)
          can be 01, 02, 03, 04, 05, 06, or 101.
security:
  - BasicAuth: []
paths:
  /campaigns:
    post:
      tags:
        - Create Campaigns
      summary: Create Campaign
      description: >
        This API creates a new Push or Email campaign in MoEngage with specified
        content, audience, and delivery settings.   
      operationId: create_campaign
      parameters:
        - $ref: '#/components/parameters/MOE-APPKEY'
      requestBody:
        description: >-
          You can configure campaign content, audience, and scheduling details.

          **Note:** Use the tabs below to select your campaign type. The schema 
          will adapt based on the selected channel.
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CampaignCreateRequest'
            examples:
              push_one_time_android_ios:
                summary: Push - One-Time (Android & iOS)
                value:
                  request_id: push_req_12345
                  channel: PUSH
                  campaign_delivery_type: ONE_TIME
                  created_by: john.doe@example.com
                  basic_details:
                    name: Summer Sale Push
                    tags:
                      - activation
                      - sale
                    platforms:
                      - ANDROID
                      - IOS
                    platform_specific_details:
                      android:
                        push_amp_plus_enabled: true
                      ios:
                        send_to_all_eligible_device: true
                        exclude_provisional_push_devices: false
                        send_to_only_provisional_push_enabled_devices: false
                  campaign_content:
                    content:
                      push:
                        android:
                          template_type: BASIC
                          basic_details:
                            notification_channel: general
                            title: 50% Off Summer Sale!
                            message: Dont miss out on our biggest sale
                            default_click_action: DEEPLINKING
                            default_click_action_value: https://example.com/sale
                            key_value_pairs:
                              - key: promo_code
                                value: SUMMER50
                        ios:
                          template_type: BASIC
                          basic_details:
                            title: 50% Off Summer Sale!
                            message: Dont miss out on our biggest sale
                            default_click_action: DEEPLINKING
                            default_click_action_value: https://example.com/sale
                  segmentation_details:
                    included_filters:
                      filter_operator: and
                      filters:
                        - filter_type: user_attributes
                          data_type: string
                          name: uid
                          operator: exists
                  scheduling_details:
                    delivery_type: ASAP
                  delivery_controls:
                    campaign_throttle_rpm: 50000
                    ignore_frequency_capping: false
              email_one_time_promotional:
                summary: Email - One-Time Promotional
                value:
                  request_id: email_req_12345
                  channel: EMAIL
                  campaign_delivery_type: ONE_TIME
                  created_by: john.doe@example.com
                  basic_details:
                    name: Summer Sale Email
                    content_type: PROMOTIONAL
                    subscription_category: marketing
                    user_attribute_identifier: MOE_EMAIL_ID
                    tags:
                      - summer
                      - sale
                  connector:
                    connector_type: SENDGRID
                    connector_name: default
                  campaign_content:
                    content:
                      email:
                        subject: Exclusive Summer Sale - 50% Off!
                        preview_text: Limited time offer on all products
                        sender_name: MoEngage Store
                        from_address: noreply@example.com
                        reply_to_address: support@example.com
                        html_content: >-
                          <!DOCTYPE html><html><body><h1>Summer Sale</h1><p>Get
                          50% off on all items!</p></body></html>
                  segmentation_details:
                    included_filters:
                      filter_operator: and
                      filters:
                        - filter_type: user_attributes
                          data_type: string
                          name: u_em
                          operator: exists
                  scheduling_details:
                    delivery_type: ASAP
                  delivery_controls:
                    campaign_throttle_rpm: 50000
                    ignore_frequency_capping: false
              email_with_gmail_annotations_deal_card:
                summary: Email - Gmail Annotations Deal Card (IST +05:30)
                value:
                  request_id: '{{request_id}}'
                  channel: EMAIL
                  campaign_delivery_type: ONE_TIME
                  created_by: '{{created_by}}'
                  basic_details:
                    name: Exclusive Deal Email
                    content_type: PROMOTIONAL
                    subscription_category: '{{subscription_category}}'
                    user_attribute_identifier: MOE_EMAIL_ID
                    send_only_double_opt_in_users: true
                    deduplication_attribute: '{{deduplication_attribute}}'
                    tags: []
                  connector:
                    connector_type: '{{connector_type}}'
                    connector_name: '{{connector_name}}'
                  campaign_content:
                    content:
                      email:
                        subject: Exclusive Deal Just for You
                        preview_text: Save big with our limited-time offer
                        sender_name: Your Brand
                        from_address: '{{from_address}}'
                        reply_to_address: '{{reply_to_address}}'
                        html_content: <!DOCTYPE html><html><body><p>Deal!</p></body></html>
                        gmail_annotations:
                          send_email_if_personalization_fails: true
                          sender_logo: https://example.com/logo.png
                          sender_logo_type: image_url
                          deal_card:
                            description: Get 20% off on all orders above $50
                            discount_code: SAVE20
                            availability_starts: '2026-06-01T00:00:00+05:30'
                            availability_ends: '2026-06-30T23:59:59+05:30'
                  segmentation_details:
                    is_all_user_campaign: false
                    included_filters:
                      filter_operator: and
                      filters:
                        - data_type: string
                          category: Tracked Custom Attribute
                          name: u_em
                          filter_type: user_attributes
                          case_sensitive: false
                          operator: exists
                          negate: false
                  scheduling_details:
                    delivery_type: ASAP
                  delivery_controls:
                    bypass_dnd: false
                    ignore_frequency_capping: false
                    count_for_frequency_capping: false
                    campaign_throttle_rpm: 3000
              email_with_gmail_annotations_product_carousel_manual:
                summary: Email - Gmail Annotations Product Carousel (Manual)
                value:
                  request_id: '{{request_id}}'
                  channel: EMAIL
                  campaign_delivery_type: ONE_TIME
                  created_by: '{{created_by}}'
                  basic_details:
                    name: Featured Products Email
                    content_type: PROMOTIONAL
                    subscription_category: '{{subscription_category}}'
                    user_attribute_identifier: MOE_EMAIL_ID
                    send_only_double_opt_in_users: true
                    deduplication_attribute: '{{deduplication_attribute}}'
                    tags: []
                  connector:
                    connector_type: '{{connector_type}}'
                    connector_name: '{{connector_name}}'
                  campaign_content:
                    content:
                      email:
                        subject: Featured Products This Week
                        preview_text: Discover our latest deals
                        sender_name: Your Brand
                        from_address: '{{from_address}}'
                        reply_to_address: '{{reply_to_address}}'
                        html_content: >-
                          <!DOCTYPE html><html><body><p>Shop
                          now!</p></body></html>
                        gmail_annotations:
                          send_email_if_personalization_fails: true
                          sender_logo: https://example.com/logo.png
                          sender_logo_type: image_url
                          product_carousel:
                            type: MANUAL
                            manual_data:
                              currency: USD
                              products:
                                - id: prod-001
                                  headline: Wireless Headphones
                                  original_price: '199.99'
                                  discount_value: '30'
                                  discount_type: PERCENT
                                  promo_url: https://example.com/products/prod-001
                                  product_image: https://example.com/images/prod-001.png
                                - id: prod-002
                                  headline: Smart Watch
                                  original_price: '299.99'
                                  discount_value: '50'
                                  discount_type: VALUE
                                  promo_url: https://example.com/products/prod-002
                                  product_image: https://example.com/images/prod-002.png
                  segmentation_details:
                    is_all_user_campaign: false
                    included_filters:
                      filter_operator: and
                      filters:
                        - data_type: string
                          category: Tracked Custom Attribute
                          name: u_em
                          filter_type: user_attributes
                          case_sensitive: false
                          operator: exists
                          negate: false
                  scheduling_details:
                    delivery_type: ASAP
                  delivery_controls:
                    bypass_dnd: false
                    ignore_frequency_capping: false
                    count_for_frequency_capping: false
                    campaign_throttle_rpm: 3000
              email_with_gmail_annotations_product_carousel_product_set:
                summary: Email - Gmail Annotations Product Carousel (Product Set)
                value:
                  request_id: '{{request_id}}'
                  channel: EMAIL
                  campaign_delivery_type: ONE_TIME
                  created_by: '{{created_by}}'
                  basic_details:
                    name: Recommended For You Email
                    content_type: PROMOTIONAL
                    subscription_category: '{{subscription_category}}'
                    user_attribute_identifier: MOE_EMAIL_ID
                    send_only_double_opt_in_users: true
                    deduplication_attribute: '{{deduplication_attribute}}'
                    tags: []
                  connector:
                    connector_type: '{{connector_type}}'
                    connector_name: '{{connector_name}}'
                  campaign_content:
                    content:
                      email:
                        subject: Picks Curated For You
                        preview_text: Personalized recommendations
                        sender_name: Your Brand
                        from_address: '{{from_address}}'
                        reply_to_address: '{{reply_to_address}}'
                        html_content: >-
                          <!DOCTYPE html><html><body><p>Shop
                          now!</p></body></html>
                        gmail_annotations:
                          send_email_if_personalization_fails: true
                          sender_logo: https://example.com/logo.png
                          sender_logo_type: image_url
                          product_carousel:
                            type: PRODUCT_SET
                            product_set_data:
                              product_set: product_set_12345
                              image_url: https://example.com/images/fallback.png
                              headline: Recommended For You
                              promo_url: https://example.com/shop
                              product_count: 3
                  segmentation_details:
                    is_all_user_campaign: false
                    included_filters:
                      filter_operator: and
                      filters:
                        - data_type: string
                          category: Tracked Custom Attribute
                          name: u_em
                          filter_type: user_attributes
                          case_sensitive: false
                          operator: exists
                          negate: false
                  scheduling_details:
                    delivery_type: ASAP
                  delivery_controls:
                    bypass_dnd: false
                    ignore_frequency_capping: false
                    count_for_frequency_capping: false
                    campaign_throttle_rpm: 3000
              push_event_triggered:
                summary: Push - Event Triggered
                value:
                  request_id: push_event_12345
                  channel: PUSH
                  campaign_delivery_type: EVENT_TRIGGERED
                  created_by: john.doe@example.com
                  basic_details:
                    name: Cart Abandonment Push
                    platforms:
                      - ANDROID
                      - IOS
                    platform_specific_details:
                      android:
                        push_amp_plus_enabled: true
                      ios:
                        send_to_all_eligible_device: true
                        exclude_provisional_push_devices: false
                        send_to_only_provisional_push_enabled_devices: false
                  trigger_condition:
                    included_filters:
                      filter_operator: and
                      filters:
                        - filter_type: actions
                          action_name: cart_abandoned
                          execution:
                            type: atleast
                            count: 1
                          executed: true
                          attributes:
                            filter_operator: and
                            filters: []
                    trigger_delay_type: DELAY
                    trigger_delay_value: 1
                    trigger_delay_granularity: HOURS
                    trigger_relation: AFTER
                  campaign_content:
                    content:
                      push:
                        android:
                          template_type: BASIC
                          basic_details:
                            notification_channel: general
                            title: Complete your purchase
                            message: Items in your cart are waiting
                            default_click_action: DEEPLINKING
                            default_click_action_value: myapp://cart
                  segmentation_details:
                    included_filters:
                      filter_operator: and
                      filters:
                        - filter_type: user_attributes
                          data_type: string
                          name: uid
                          operator: exists
                  scheduling_details:
                    delivery_type: AT_FIXED_TIME
                    start_time: '2024-12-01T10:00:00'
                    expiry_time: '2024-12-31T23:59:59'
                  delivery_controls:
                    bypass_dnd: false
                    ignore_frequency_capping: false
      responses:
        '201':
          description: Campaign created successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CampaignCreateSuccessResponse'
              example:
                campaign_id: camp_abc123xyz
        '400':
          description: Bad Request - Missing or invalid parameters
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              examples:
                missing_request_id:
                  summary: Missing request_id
                  value:
                    error:
                      code: 400 Bad Request
                      message: request_id key is mandatory field
                      target: request_id
                      details:
                        - target: request_id
                          message: request_id key is mandatory field
                      request_id: '11'
                deduplication_attribute_invalid_type:
                  summary: deduplication_attribute - invalid type
                  value:
                    error:
                      code: 400 Bad Request
                      message: >-
                        deduplication_attribute - Invalid value passed. Expected
                        type: string, but got: int.
                      target: basic_details
                      details:
                        - target: basic_details.deduplication_attribute
                          message: >-
                            deduplication_attribute - Invalid value passed.
                            Expected type: string, but got: int.
                send_only_double_opt_in_users_invalid_type:
                  summary: send_only_double_opt_in_users - invalid type
                  value:
                    error:
                      code: 400 Bad Request
                      message: >-
                        send_only_double_opt_in_users - Invalid value passed.
                        Expected type: boolean, but got: string.
                      target: basic_details
                      details:
                        - target: basic_details.send_only_double_opt_in_users
                          message: >-
                            send_only_double_opt_in_users - Invalid value
                            passed. Expected type: boolean, but got: string.
                gmail_annotations_on_transactional:
                  summary: gmail_annotations used on TRANSACTIONAL campaign
                  value:
                    error:
                      code: 400 Bad Request
                      message: >-
                        gmail_annotations is not supported for TRANSACTIONAL
                        content type. It is only supported for PROMOTIONAL
                        campaigns.
                      target: campaign_content.content
                      details:
                        - target: gmail_annotations
                          message: >-
                            gmail_annotations is not supported for TRANSACTIONAL
                            content type. It is only supported for PROMOTIONAL
                            campaigns.
                gmail_annotations_missing_sender_logo:
                  summary: sender_logo missing when gmail_annotations is present
                  value:
                    error:
                      code: 400 Bad Request
                      message: >-
                        sender_logo is required when gmail_annotations is
                        specified
                      target: campaign_content.content
                      details:
                        - target: gmail_annotations.sender_logo
                          message: >-
                            sender_logo is required when gmail_annotations is
                            specified
                gmail_annotations_invalid_sender_logo:
                  summary: sender_logo is not a valid HTTPS URL
                  value:
                    error:
                      code: 400 Bad Request
                      message: sender_logo must be a valid https URL
                      target: campaign_content.content
                      details:
                        - target: gmail_annotations.sender_logo
                          message: sender_logo must be a valid https URL
                deal_card_missing_field:
                  summary: Required deal_card field missing
                  value:
                    error:
                      code: 400 Bad Request
                      message: >-
                        availability_starts is required when deal_card is
                        specified
                      target: campaign_content.content
                      details:
                        - target: gmail_annotations.deal_card.availability_starts
                          message: >-
                            availability_starts is required when deal_card is
                            specified
                deal_card_invalid_end_time:
                  summary: availability_ends less than 1 hour after availability_starts
                  value:
                    error:
                      code: 400 Bad Request
                      message: >-
                        End date and time must be a minimum of one hour later
                        than the start date and time
                      target: campaign_content.content
                      details:
                        - target: gmail_annotations.deal_card
                          message: >-
                            End date and time must be a minimum of one hour
                            later than the start date and time
                product_carousel_minimum_products:
                  summary: Product carousel has fewer than 2 products
                  value:
                    error:
                      code: 400 Bad Request
                      message: Product carousel requires a minimum of 2 products
                      target: campaign_content.content
                      details:
                        - target: gmail_annotations.product_carousel
                          message: Product carousel requires a minimum of 2 products
                product_set_product_count_exceeds_maximum:
                  summary: product_count exceeds maximum of 9
                  value:
                    error:
                      code: 400 Bad Request
                      message: product_count must be between 2 and 9
                      target: campaign_content.content
                      details:
                        - target: gmail_annotations.product_carousel.product_set_data
                          message: product_count must be between 2 and 9
                product_carousel_invalid_original_price:
                  summary: Manual product has invalid original_price
                  value:
                    error:
                      code: 400 Bad Request
                      message: original_price must be a valid number
                      target: campaign_content.content
                      details:
                        - target: >-
                            gmail_annotations.product_carousel.manual_data.products[0].original_price
                          message: original_price must be a valid number
                product_carousel_invalid_discount_value:
                  summary: Manual product has invalid discount_value
                  value:
                    error:
                      code: 400 Bad Request
                      message: discount_value must be a valid number
                      target: campaign_content.content
                      details:
                        - target: >-
                            gmail_annotations.product_carousel.manual_data.products[0].discount_value
                          message: discount_value must be a valid number
                product_carousel_invalid_promo_url:
                  summary: Manual product has invalid promo_url
                  value:
                    error:
                      code: 400 Bad Request
                      message: promo_url must be a valid https URL
                      target: campaign_content.content
                      details:
                        - target: >-
                            gmail_annotations.product_carousel.manual_data.products[0].promo_url
                          message: promo_url must be a valid https URL
                product_carousel_empty_product_image:
                  summary: Manual product has empty product_image
                  value:
                    error:
                      code: 400 Bad Request
                      message: product_image (Image URL) cannot be empty
                      target: campaign_content.content
                      details:
                        - target: >-
                            gmail_annotations.product_carousel.manual_data.products[0].product_image
                          message: product_image (Image URL) cannot be empty
                product_carousel_invalid_product_image_url:
                  summary: Manual product has invalid product_image URL
                  value:
                    error:
                      code: 400 Bad Request
                      message: product_image must be a valid https URL
                      target: campaign_content.content
                      details:
                        - target: >-
                            gmail_annotations.product_carousel.manual_data.products[0].product_image
                          message: product_image must be a valid https URL
                product_set_not_found:
                  summary: Product set ID does not exist in the workspace
                  value:
                    error:
                      code: 400 Bad Request
                      message: product_set not found for the given workspace
                      target: campaign_content.content
                      details:
                        - target: gmail_annotations.product_carousel.product_set_data
                          message: product_set not found for the given workspace
                product_sets_feature_not_enabled:
                  summary: Product Sets feature is not enabled for the workspace
                  value:
                    error:
                      code: 400 Bad Request
                      message: Product Sets is not enabled for this workspace
                      target: campaign_content.content
                      details:
                        - target: gmail_annotations.product_carousel
                          message: Product Sets is not enabled for this workspace
        '401':
          $ref: '#/components/responses/Unauthorized'
        '429':
          $ref: '#/components/responses/RateLimitExceeded'
        '500':
          $ref: '#/components/responses/InternalServerError'
components:
  parameters:
    MOE-APPKEY:
      name: MOE-APPKEY
      in: header
      required: true
      description: >
        This is the Workspace ID of your MoEngage account that must be passed
        with the request. You can find it in the MoEngage dashboard at
        **Settings** > **Account** > **APIs** > **Workspace ID (earlier app
        id)**.
      schema:
        type: string
      example: YOUR_WORKSPACE_ID
  schemas:
    CampaignCreateRequest:
      oneOf:
        - $ref: '#/components/schemas/PushCampaignRequest'
        - $ref: '#/components/schemas/EmailCampaignRequest'
      discriminator:
        propertyName: channel
        mapping:
          PUSH:
            $ref: '#/components/schemas/PushCampaignRequest'
          EMAIL:
            $ref: '#/components/schemas/EmailCampaignRequest'
    CampaignCreateSuccessResponse:
      type: object
      properties:
        campaign_id:
          type: string
          description: >-
            The unique ID of the newly created campaign. Store this for future
            reference.
          example: camp_12345abc
    ErrorResponse:
      type: object
      properties:
        error:
          type: object
          properties:
            code:
              type: string
              description: The error code (e.g., "400 Bad Request").
            message:
              type: string
              description: Description of why the request failed.
            target:
              type: string
              description: The target of the error.
            details:
              type: array
              items:
                type: object
                properties:
                  target:
                    type: string
                  message:
                    type: string
            request_id:
              type: string
              description: The request ID associated with this error.
    PushCampaignRequest:
      title: Push Campaign
      type: object
      required:
        - request_id
        - channel
        - campaign_delivery_type
        - created_by
        - basic_details
        - campaign_content
        - segmentation_details
        - scheduling_details
        - delivery_controls
        - advanced
      properties:
        request_id:
          type: string
          description: >
            A unique identifier for this campaign creation request.


            **Important:** After successful campaign creation, do not reuse this
            request_id for the next 1 hour. If campaign creation fails, you can
            immediately retry with the same request_id.
          example: push_req_12345
        channel:
          type: string
          enum:
            - PUSH
          description: The communication channel for this campaign.
        campaign_delivery_type:
          type: string
          enum:
            - ONE_TIME
            - PERIODIC
            - EVENT_TRIGGERED
            - BUSINESS_EVENT_TRIGGERED
            - DEVICE_TRIGGERED
            - LOCATION_TRIGGERED
            - BROADCAST_LIVE_ACTIVITY
          description: The delivery type of the campaign.
        created_by:
          type: string
          format: email
          description: The email ID of the user creating this campaign.
          example: john.doe@example.com
        basic_details:
          $ref: '#/components/schemas/PushBasicDetails'
        trigger_condition:
          $ref: '#/components/schemas/PushTriggerCondition'
        campaign_content:
          $ref: '#/components/schemas/PushCampaignContent'
        segmentation_details:
          $ref: '#/components/schemas/SegmentationDetails'
        scheduling_details:
          $ref: '#/components/schemas/SchedulingDetails'
        delivery_controls:
          $ref: '#/components/schemas/PushDeliveryControls'
        advanced:
          $ref: '#/components/schemas/AdvancedDetails'
        conversion_goal_details:
          $ref: '#/components/schemas/ConversionGoalDetails'
        control_group_details:
          $ref: '#/components/schemas/ControlGroupDetails'
        utm_params:
          $ref: '#/components/schemas/UTMParams'
    EmailCampaignRequest:
      title: Email Campaign
      type: object
      required:
        - request_id
        - channel
        - campaign_delivery_type
        - created_by
        - basic_details
        - connector
        - campaign_content
        - segmentation_details
        - scheduling_details
      properties:
        request_id:
          type: string
          description: >
            A unique identifier for this campaign creation request.


            **Important:** After successful campaign creation, do not reuse this
            request_id for the next 1 day. If campaign creation fails, you can
            immediately retry with the same request_id.
          example: email_req_12345
        channel:
          type: string
          enum:
            - EMAIL
          description: The communication channel for this campaign.
        campaign_delivery_type:
          type: string
          enum:
            - ONE_TIME
            - PERIODIC
            - EVENT_TRIGGERED
            - BUSINESS_EVENT_TRIGGERED
          description: The delivery type of the campaign.
        created_by:
          type: string
          format: email
          description: The email ID of the user creating this campaign.
          example: john.doe@example.com
        basic_details:
          $ref: '#/components/schemas/EmailBasicDetails'
        trigger_condition:
          $ref: '#/components/schemas/EmailTriggerCondition'
        connector:
          $ref: '#/components/schemas/Connector'
        campaign_content:
          $ref: '#/components/schemas/EmailCampaignContent'
        segmentation_details:
          $ref: '#/components/schemas/SegmentationDetails'
        scheduling_details:
          $ref: '#/components/schemas/SchedulingDetails'
        delivery_controls:
          $ref: '#/components/schemas/EmailDeliveryControls'
        conversion_goal_details:
          $ref: '#/components/schemas/ConversionGoalDetails'
        control_group_details:
          $ref: '#/components/schemas/ControlGroupDetails'
        utm_params:
          $ref: '#/components/schemas/UTMParams'
        campaign_audience_limit:
          $ref: '#/components/schemas/CampaignAudienceLimit'
    PushBasicDetails:
      type: object
      description: Contains the basic information about the Push campaign.
      required:
        - name
        - platforms
        - platform_specific_details
      properties:
        name:
          type: string
          description: The name of the campaign.
          example: Summer Sale Push Notification
        business_event:
          type: string
          description: |
            The business event to be mapped to the campaign.

            **Required** for BUSINESS_EVENT_TRIGGERED campaigns.
          example: user_signup
        tags:
          type: array
          items:
            type: string
          description: Tags that provide context about the campaign's nature or theme.
          example:
            - activation
            - summer_sale
        team:
          type: string
          description: >
            The name of the team collaborating on this campaign.

            For more information, refer to [Teams in
            MoEngage](/user-guide/settings/account/team-management/teams-in-moengage).
          example: marketing_team
        platforms:
          type: array
          items:
            type: string
            enum:
              - ANDROID
              - IOS
              - WEB
          description: The platforms to target for this Push campaign.
          example:
            - ANDROID
            - IOS
        broadcast_live_activity_id:
          type: string
          description: >
            The broadcast live activity ID for iOS Live Activities.


            **Required** when platform is iOS and delivery_type is
            BROADCAST_LIVE_ACTIVITY.
          example: live_check123
        geofences:
          $ref: '#/components/schemas/Geofences'
        send_to_triggered_platform_only:
          type: boolean
          description: >-
            Whether to send the campaign only to the platform that triggered the
            event. Applicable for event-triggered campaigns.
        platform_specific_details:
          $ref: '#/components/schemas/PlatformSpecificDetails'
    PushTriggerCondition:
      type: object
      description: |
        Trigger condition details for Push event-triggered campaigns.

        **Required** for EVENT_TRIGGERED campaigns.
      properties:
        included_filters:
          $ref: '#/components/schemas/FilterGroup'
        secondary_included_filters:
          $ref: '#/components/schemas/FilterGroup'
        trigger_delay_type:
          type: string
          enum:
            - DELAY
            - ASAP
            - INTELLIGENT_DELAY
          description: |
            The type of triggered delay.

            When set to DELAY, the following fields are mandatory:
            - trigger_delay_value
            - trigger_delay_granularity
            - trigger_relation
        trigger_delay_value:
          type: integer
          description: The numeric value of the triggered delay.
        trigger_delay_granularity:
          type: string
          enum:
            - MINUTES
            - HOURS
            - DAYS
          description: The time unit for the trigger delay.
        trigger_relation:
          type: string
          enum:
            - BEFORE
            - AFTER
          description: |
            The trigger relation with delay.

            **Required** when trigger_delay_type is DELAY.
        trigger_attr:
          type: object
          description: The attribute value of the trigger.
        intelligent_delay_optimization:
          type: object
          description: >
            Configuration for intelligent delay optimization.


            Used when trigger_delay_type is INTELLIGENT_DELAY. Defines a time
            window (min/max delay) within which the system finds the optimal
            moment to send the message.
          properties:
            min_delay_value:
              type: integer
              description: >-
                The numeric component of the lower bound for the intelligent
                delay window.
            min_delay_granularity:
              type: string
              enum:
                - MINUTES
                - HOURS
              description: The time unit that qualifies the min_delay_value.
            max_delay_value:
              type: integer
              description: >-
                The numeric component of the upper bound for the intelligent
                delay window.
            max_delay_granularity:
              type: string
              enum:
                - HOURS
                - DAYS
              description: The time unit that qualifies the max_delay_value.
    PushCampaignContent:
      type: object
      description: Contains the content and variations for the Push campaign.
      required:
        - content
      properties:
        locales:
          type: array
          items:
            type: string
          description: |
            List of locales for multi-language campaigns.
            You can send campaigns in multiple languages using locales.
          example:
            - en-US
            - es-ES
            - default
        variation_details:
          $ref: '#/components/schemas/VariationDetails'
        content:
          type: object
          description: The actual Push campaign content.
          required:
            - push
          properties:
            push:
              $ref: '#/components/schemas/PushContent'
    SegmentationDetails:
      type: object
      description: Defines the target audience for the campaign.
      properties:
        included_filters:
          $ref: '#/components/schemas/FilterGroup'
        excluded_filters:
          $ref: '#/components/schemas/FilterGroup'
        is_all_user_campaign:
          type: boolean
          description: Whether to include all users in the campaign.
        send_campaign_to_opt_out_users:
          type: boolean
          description: Whether to send the campaign to users who have opted out.
    SchedulingDetails:
      type: object
      description: >-
        Defines when the campaign should be sent. All date-time values must be
        passed in UTC.
      required:
        - delivery_type
      properties:
        delivery_type:
          type: string
          enum:
            - ASAP
            - AT_FIXED_TIME
            - SEND_IN_BTS
            - SEND_IN_USER_TIMEZONE
          description: When to deliver the campaign.
        start_time:
          type: string
          format: date-time
          description: >
            The start time for the campaign in ISO 8601 format. Pass this value
            in UTC.


            Example: "2024-06-21T12:59:00"
        expiry_time:
          type: string
          format: date-time
          description: >-
            The expiry time for the campaign in ISO 8601 format. Pass this value
            in UTC.
        periodic_details:
          $ref: '#/components/schemas/PeriodicDetails'
        bts_details:
          $ref: '#/components/schemas/BTSDetails'
        user_timezone_details:
          $ref: '#/components/schemas/UserTimezoneDetails'
    PushDeliveryControls:
      type: object
      description: Controls for Push campaign delivery behavior.
      properties:
        bypass_dnd:
          type: boolean
          description: |
            Whether to bypass Do Not Disturb settings.

            Required for event-triggered campaigns.
        campaign_throttle_rpm:
          type: integer
          description: >
            The campaign throttle in requests per minute.


            Not applicable for device-triggered, location-triggered, and
            event-triggered campaigns.
          example: 50000
        count_for_frequency_capping:
          type: boolean
          description: Whether to count this campaign for frequency capping.
        ignore_frequency_capping:
          type: boolean
          description: Whether to ignore frequency capping for this campaign.
        minimum_delay_between_two_notification_in_hour:
          type: integer
          description: |
            Minimum delay between two notifications in hours.

            Applies to event-triggered and device-triggered campaigns.
        max_time_to_show_message_of_same_camapign:
          type: string
          description: >
            Maximum duration (in hours) that a message from this campaign will
            be displayed to a user.


            Applicable for device-triggered campaigns.
        expiry_time_of_sync_data_in_hour:
          type: string
          description: >
            Duration (in hours) after which synced campaign data will expire if
            trigger condition is not met.


            Applicable for device-triggered campaigns.
        send_message_in_offline_mode:
          type: boolean
          description: |
            Whether to store and deliver the message when the device is offline.

            Applicable for device-triggered campaigns.
        send_limit_value:
          type: string
          description: >
            Maximum number of times a user can receive this campaign within the
            specified time granularity.


            Applicable for location-triggered campaigns.
        send_limit_granularity_in_hours:
          type: string
          description: >
            Time window (in hours) during which the send_limit_value is
            enforced.


            Applicable for location-triggered campaigns.
    AdvancedDetails:
      type: object
      description: Advanced campaign settings.
      properties:
        expiration_settings:
          type: object
          properties:
            expire_notification_after_value:
              type: integer
              description: The numeric value for the notification expiration time.
            expire_notification_after_type:
              type: string
              enum:
                - HOUR
                - DAY
              description: The time unit for notification expiration.
            remove_from_inbox_after_value:
              type: integer
              description: The numeric value for when to remove the message from the inbox.
            remove_from_inbox_after_type:
              type: string
              enum:
                - DAY
              description: The time unit for removing the message from the inbox.
        platform_level_priority:
          type: object
          properties:
            android_specific_priority:
              type: object
              properties:
                send_with_priority:
                  type: boolean
                  description: Whether to send with priority.
            ios_specific_priority:
              type: object
              properties:
                apns_priority:
                  type: string
                  enum:
                    - '1'
                    - '5'
                    - '10'
                  description: The priority of notification delivery for APNS.
                interruption_level:
                  type: string
                  enum:
                    - Passive
                    - Active
                    - Time sensitive
                    - Critical
                  description: The interruption level for iOS notifications.
                relevance_score:
                  type: number
                  enum:
                    - 0
                    - 0.5
                    - 1
                  description: The relevance score for iOS notifications.
    ConversionGoalDetails:
      type: object
      description: Configuration for tracking campaign conversion goals.
      properties:
        attribution_window_in_hours:
          type: integer
          description: The attribution window in hours.
          example: 36
        goals:
          type: array
          items:
            $ref: '#/components/schemas/Goal'
          description: List of conversion goals to track.
    ControlGroupDetails:
      type: object
      description: Configuration for control groups.
      properties:
        is_campaign_control_group_enabled:
          type: boolean
          description: Whether the campaign control group is enabled.
        campaign_control_group_percentage:
          type: integer
          description: |
            The percentage of users added to the exclusion list.

            **Required** if is_campaign_control_group_enabled is true.
          minimum: 0
          maximum: 100
        is_global_control_group_enabled:
          type: boolean
          description: Whether the global control group is enabled.
    UTMParams:
      type: object
      description: UTM parameters for tracking campaign performance.
      required:
        - utm_source
        - utm_medium
      properties:
        utm_source:
          type: string
          description: |
            The source of the traffic (e.g., YouTube, Instagram, Google).

            **Required** when using UTM parameters.
          example: google
        utm_medium:
          type: string
          description: |
            The channel type (e.g., Push, SMS, Email).

            **Required** when using UTM parameters.
          example: email
        utm_campaign:
          type: string
          description: The name of the campaign (e.g., Newyear, Bigbillionday).
          example: summer_sale
        utm_term:
          type: string
          description: Search terms for paid traffic (e.g., Mobile+sale).
        utm_content:
          type: string
          description: The content element that differentiates links (e.g., banner, video).
        utm_custom:
          type: string
          description: Custom UTM parameter (maximum of 5 custom parameters).
    EmailBasicDetails:
      type: object
      description: Contains the basic information about the Email campaign.
      required:
        - name
        - content_type
        - user_attribute_identifier
      properties:
        name:
          type: string
          description: The name of the campaign.
          example: Summer Sale Email
        business_event:
          type: string
          description: |
            The business event to be mapped to the campaign.

            **Required** for BUSINESS_EVENT_TRIGGERED campaigns.
          example: user_signup
        content_type:
          type: string
          enum:
            - PROMOTIONAL
            - TRANSACTIONAL
          description: The type of content in the campaign.
        subscription_category:
          type: string
          description: >
            The subscription category for promotional email campaigns.

            This targets only users who have opted-in to receive communication
            about this category.


            **Required** for PROMOTIONAL email campaigns.
          example: music
        tags:
          type: array
          items:
            type: string
          description: Tags that provide context about the campaign's nature or theme.
          example:
            - activation
            - summer_sale
        team:
          type: string
          description: >
            The name of the team collaborating on this campaign.

            For more information, refer to [Teams in
            MoEngage](/user-guide/settings/account/team-management/teams-in-moengage).
          example: marketing_team
        user_attribute_identifier:
          type: string
          description: |
            The user attribute that stores the email address.

            Standard identifier is `MOE_EMAIL_ID`.
          example: MOE_EMAIL_ID
          default: MOE_EMAIL_ID
        send_only_double_opt_in_users:
          type: boolean
          description: >
            Whether to send the campaign only to users who have completed double
            opt-in.


            When `false` or omitted, the campaign sends to all eligible users.


            Ensure the Double Opt-In feature is enabled for your workspace.
          default: false
          example: true
        deduplication_attribute:
          type: string
          description: >
            The user attribute used for brand deduplication.


            Pass `""` (empty string) or omit the field to treat the campaign as
            single-brand. For multi-brand deduplication, pass the backend
            attribute name that stores the brand identifier (for example,
            `u_em`).


            Always use the backend attribute name (for example, `u_em`), not the
            display label (for example, `Email (Standard)`).


            Ensure the Brand Deduplication feature is enabled for your
            workspace.
          default: ''
          example: u_em
    EmailTriggerCondition:
      type: object
      description: |
        Trigger condition details for Email event-triggered campaigns.

        **Required** for EVENT_TRIGGERED campaigns.
      properties:
        included_filters:
          $ref: '#/components/schemas/FilterGroup'
        secondary_included_filters:
          $ref: '#/components/schemas/FilterGroup'
        trigger_delay_type:
          type: string
          enum:
            - DELAY
            - ASAP
          description: |
            The type of triggered delay.

            When set to DELAY, the following fields are mandatory:
            - trigger_delay_value
            - trigger_delay_granularity
            - trigger_relation
        trigger_delay_value:
          type: integer
          description: The numeric value of the triggered delay.
        trigger_delay_granularity:
          type: string
          enum:
            - MINUTES
            - HOURS
            - DAYS
          description: The time unit for the trigger delay.
        trigger_relation:
          type: string
          enum:
            - BEFORE
            - AFTER
          description: |
            The trigger relation with delay.

            **Required** when trigger_delay_type is DELAY.
        trigger_attr:
          type: object
          description: The attribute value of the trigger.
    Connector:
      type: object
      description: Email connector configuration for sending email campaigns.
      required:
        - connector_type
        - connector_name
      properties:
        connector_type:
          type: string
          description: The type of connector service (e.g., SENDGRID, AWS SES, etc.).
          example: SENDGRID
        connector_name:
          type: string
          description: The name of the connector configuration.
          example: default
    EmailCampaignContent:
      type: object
      description: Contains the content and variations for the Email campaign.
      required:
        - content
      properties:
        locales:
          type: array
          items:
            type: string
          description: |
            List of locales for multi-language campaigns.
            You can send campaigns in multiple languages using locales.
          example:
            - en-US
            - es-ES
            - default
        variation_details:
          $ref: '#/components/schemas/VariationDetails'
        content:
          type: object
          description: The actual Email campaign content.
          required:
            - email
          properties:
            email:
              $ref: '#/components/schemas/EmailContent'
    EmailDeliveryControls:
      type: object
      description: Controls for Email campaign delivery behavior.
      properties:
        bypass_dnd:
          type: boolean
          description: Whether to bypass Do Not Disturb settings.
        campaign_throttle_rpm:
          type: integer
          description: The campaign throttle in requests per minute.
          example: 50000
        count_for_frequency_capping:
          type: boolean
          description: Whether to count this campaign for frequency capping.
        ignore_frequency_capping:
          type: boolean
          description: Whether to ignore frequency capping for this campaign.
        minimum_delay_between_two_notification_in_hour:
          type: integer
          description: Minimum delay between two notifications in hours.
    CampaignAudienceLimit:
      type: object
      description: Configuration for limiting campaign audience.
      properties:
        limit:
          type: integer
          description: >
            The maximum number of times an audience can be included or targeted
            within the campaign.
        metrics:
          type: string
          description: >
            The type of measurement being tracked (e.g., impressions, clicks,
            conversions).
        frequency:
          type: string
          description: >
            How often the limit and metrics are applied (e.g., daily, weekly,
            monthly).
    Geofences:
      type: object
      description: |
        Geofence location details for location-triggered campaigns.

        **Required** for LOCATION_TRIGGERED campaigns.
      required:
        - name
        - latitude
        - longitude
        - radius
        - response_time_value
        - response_time_granularity
        - triggered_at
      properties:
        name:
          type: string
          description: The unique name of the geofence location being targeted.
        latitude:
          type: string
          description: The latitude coordinate for the center of the geofence area.
        longitude:
          type: string
          description: The longitude coordinate for the center of the geofence area.
        radius:
          type: string
          description: >-
            The radius in meters from the center point that defines the boundary
            of the geofence.
        dwell_time_value:
          type: string
          description: >
            The numeric value for the time to wait before sending the message
            after the trigger condition is met.


            **Required** when triggered_at is set to "dwell".
        dwell_time_granularity:
          type: string
          enum:
            - MINUTES
            - HOURS
            - DAYS
          description: |
            The time unit for the dwell_time_value.

            **Required** when triggered_at is set to "dwell".
        response_time_value:
          type: string
          description: >-
            The numeric value for the time to wait before sending the message
            after the trigger condition is met.
        response_time_granularity:
          type: string
          enum:
            - MINUTES
            - HOURS
            - DAYS
          description: The time unit for the response_time_value.
        triggered_at:
          type: string
          enum:
            - ENTRY
            - EXIT
            - dwell
          description: >-
            The user action that triggers the campaign (when user enters/exits
            the geofence).
    PlatformSpecificDetails:
      type: object
      description: Platform-specific configuration details.
      properties:
        android:
          type: object
          properties:
            push_amp_plus_enabled:
              type: boolean
              description: Whether Push Amp+ feature is enabled for this campaign.
              default: false
        ios:
          type: object
          properties:
            send_to_all_eligible_device:
              type: boolean
              description: Whether to send the campaign to all eligible devices.
            exclude_provisional_push_devices:
              type: boolean
              description: Whether to exclude provisional push devices.
            send_to_only_provisional_push_enabled_devices:
              type: boolean
              description: Whether to send only to provisional push-enabled devices.
          description: |
            **Note:** You must pass one of these keys as true for iOS.
    FilterGroup:
      type: object
      description: >
        A group of filters combined with a logical operator.


        For detailed segmentation payload and supported fields, refer to [Create
        Custom Segment](/api/filter-segments/create-filter-segment).
      required:
        - filter_operator
        - filters
      properties:
        filter_operator:
          type: string
          enum:
            - and
            - or
          description: The logical operator to combine filters.
        filters:
          type: array
          items:
            oneOf:
              - $ref: '#/components/schemas/UserAttributeFilter'
              - $ref: '#/components/schemas/ActionFilter'
              - $ref: '#/components/schemas/CustomSegmentFilter'
          description: |
            The list of filters to be combined using the filter operator.

            Supported filter types:
            - User attributes-based filters
            - Action-based filters (with or without attributes)
            - Custom segments
    VariationDetails:
      type: object
      description: Configuration for A/B testing variations.
      required:
        - distribution_type
        - no_of_variations
      properties:
        distribution_type:
          type: string
          enum:
            - SHERPA
            - MANUAL
          description: The distribution type for variations.
        no_of_variations:
          type: integer
          description: The number of variations for the campaign.
          minimum: 1
          example: 2
        manual_distribution_percentage:
          type: object
          description: |
            Manual percentage distribution for each variation.

            **Required** when distribution_type is MANUAL.
          additionalProperties:
            type: string
          example:
            variation_1: '50'
            variation_2: '45'
        sherpa_campaign_duration:
          type: integer
          description: |
            The Sherpa campaign duration.

            **Required** when distribution_type is SHERPA.
        sherpa_distribution_metric:
          type: string
          enum:
            - OPEN RATE
            - CLICK RATE
            - BOTH
          description: |
            The Sherpa distribution metric.

            **Required** when distribution_type is SHERPA.
    PushContent:
      type: object
      description: Push notification content for Android, iOS, and Web platforms.
      properties:
        android:
          $ref: '#/components/schemas/AndroidPushContent'
        ios:
          $ref: '#/components/schemas/IOSPushContent'
        web:
          $ref: '#/components/schemas/WebPushContent'
    PeriodicDetails:
      type: object
      description: |
        Configuration for periodic campaigns.

        **Required** for PERIODIC campaigns.
      properties:
        sending_frequency:
          type: string
          enum:
            - DAILY
            - WEEKLY
            - MONTHLY
          description: The frequency to send the campaign.
        repeat_frequency:
          type: integer
          description: The repeat frequency of the campaign.
        no_of_occurences:
          type: integer
          description: The number of occurrences of the campaign.
        repeat_on_date_of_month:
          type: array
          items:
            type: integer
          description: |
            The dates of the month on which the campaign should be repeated.

            Example: [5, 25] to send on the 5th and 25th of each month.
        repeat_on_days_of_week:
          type: array
          items:
            type: string
            enum:
              - MONDAY
              - TUESDAY
              - WEDNESDAY
              - THURSDAY
              - FRIDAY
              - SATURDAY
              - SUNDAY
          description: The days of the week on which the campaign should repeat.
        repeat_on_days_of_week_for_month:
          type: array
          items:
            type: object
            properties:
              week_granularity:
                type: string
                enum:
                  - FIRST
                  - SECOND
                  - THIRD
                  - FOURTH
                  - LAST
              repeat_on_days_of_week:
                type: array
                items:
                  type: string
                  enum:
                    - MONDAY
                    - TUESDAY
                    - WEDNESDAY
                    - THURSDAY
                    - FRIDAY
                    - SATURDAY
                    - SUNDAY
          description: Configuration for repeating on specific weeks of the month.
    BTSDetails:
      type: object
      description: >
        Best Time to Send (BTS) configuration.


        BTS provides a prescriptive time slot to send a campaign to increase the
        chance of user interaction.
      properties:
        send_in_bts:
          type: boolean
          description: Whether to send the campaign at the best time.
        if_user_bts_is_not_available:
          type: string
          description: When to send the campaign if the user's best time is not available.
        if_user_bts_outside_time_window:
          type: string
          description: >-
            When to send the campaign if the user's best time is outside the
            time window.
        window_end_time:
          type: string
          description: The window end time.
          example: 6:43 am
    UserTimezoneDetails:
      type: object
      description: Configuration for sending in the user's timezone.
      properties:
        send_in_user_timezone:
          type: boolean
          description: >-
            Whether to send the campaign on a specific date and time within the
            user's timezone.
        send_if_user_timezone_has_passed:
          type: boolean
          description: Whether to send the campaign if the user's timezone has passed.
    Goal:
      type: object
      description: A single conversion goal configuration.
      properties:
        goal_name:
          type: string
          description: The name of the goal.
          example: Goal 1
        goal_event_name:
          type: string
          description: The event name associated with this goal.
        goal_event_attribute:
          $ref: '#/components/schemas/GoalEventAttribute'
        is_primary_goal:
          type: boolean
          description: Whether this is the primary goal.
        revenue_attribute:
          type: string
          description: The revenue attribute to track.
        revenue_currency:
          type: string
          description: The currency for revenue tracking.
    EmailContent:
      type: object
      description: Email campaign content.
      required:
        - subject
        - sender_name
        - from_address
        - reply_to_address
      properties:
        subject:
          type: string
          description: The subject line of the email.
          example: Exclusive Summer Sale - 50% Off!
        preview_text:
          type: string
          description: The preview text shown in email clients.
          example: Dont miss out on our biggest sale of the season
        sender_name:
          type: string
          description: The name of the sender that appears in the email.
          example: MoEngage Team
        from_address:
          type: string
          format: email
          description: The sender's email address.
          example: noreply@moengage.com
        reply_to_address:
          type: string
          format: email
          description: The reply-to email address.
          example: support@moengage.com
        cc_ids:
          type: array
          items:
            type: string
            format: email
          description: Email addresses to CC.
        bcc_ids:
          type: array
          items:
            type: string
            format: email
          description: Email addresses to BCC.
        html_content:
          type: string
          description: |
            The HTML content of the email.

            **Optional** if custom_template_id is provided.
          example: >-
            <!DOCTYPE html><html><head></head><body><p>Hello
            {{UserAttribute['First Name']}}</p></body></html>
        email_editor:
          type: string
          enum:
            - Froala Editor
            - Ace Editor
          description: >
            The HTML editor used for the email campaign.


            - **Required** if you want to create the campaign using the `Ace
            Editor`.

            - **Optional** if you want to use the default `Froala Editor`.
          example: Ace Editor
        custom_template_id:
          type: string
          description: |
            The ID of a custom email template.

            **Optional** if html_content is provided.

            When this field is provided, the following fields are not required:
            - subject
            - preview_text
            - sender_name
        custom_template_version:
          type: integer
          description: The version of the custom template.
        attachments:
          type: array
          items:
            type: object
            properties:
              file_type:
                type: string
                enum:
                  - URL
                  - PERSONALIZED_ATTACHMENT
              url:
                type: string
          description: Attachments to include in the email.
        gmail_annotations:
          $ref: '#/components/schemas/GmailAnnotations'
    UserAttributeFilter:
      type: object
      description: Filter based on user attributes.
      required:
        - filter_type
        - data_type
        - name
        - operator
      properties:
        filter_type:
          type: string
          enum:
            - user_attributes
        data_type:
          type: string
          enum:
            - string
            - double
            - datetime
            - bool
          description: The data type of the attribute being filtered.
        category:
          type: string
          description: The category of the attribute (e.g., "Tracked Standard Attribute").
        name:
          type: string
          description: The name of the attribute to filter on (e.g., "uid").
        operator:
          type: string
          description: >
            The operator to use in the filter. Allowed values depend on
            data_type:

            - bool: is, exists

            - double: in, between, lessThan, greaterThan, exists

            - string: in, contains, containsInTheFollowing,
            startWithInTheFollowing, endsWithInTheFollowing, exists, is

            - datetime: inTheLast, on, between, before, after, inTheNext,
            exists, today
        value:
          description: The value to filter on (not required for 'exists' operator).
        case_sensitive:
          type: boolean
          description: Whether the filter comparison should be case-sensitive.
        negate:
          type: boolean
          description: Whether to negate the filter condition.
        project_name:
          type: string
          description: |
            The name of the project associated with the user attributes.

            **Required** if the Portfolio feature is enabled in your workspace.
    ActionFilter:
      type: object
      description: Filter based on user actions/events.
      required:
        - filter_type
        - action_name
      properties:
        filter_type:
          type: string
          enum:
            - actions
        action_name:
          type: string
          description: The name of the action/event to filter on.
        execution:
          type: object
          properties:
            type:
              type: string
              enum:
                - atleast
                - atmost
                - exactly
            count:
              type: integer
        executed:
          type: boolean
          description: Whether the action was executed.
        attributes:
          $ref: '#/components/schemas/FilterGroup'
        condition:
          type: string
          description: The condition type (e.g., "IF").
    CustomSegmentFilter:
      type: object
      description: Filter using a custom segment.
      required:
        - filter_type
        - id
      properties:
        filter_type:
          type: string
          enum:
            - custom_segments
        name:
          type: string
          description: The name of the custom segment.
        id:
          type: string
          description: The ID of the custom segment.
    AndroidPushContent:
      type: object
      description: Android push notification content.
      required:
        - template_type
      properties:
        template_type:
          type: string
          enum:
            - BASIC
            - STYLIZED_BASIC
            - SIMPLE_IMAGE_CAROUSEL
            - IMAGE_BANNER_WITH_TEXT
            - TIMER
            - TIMER_WITH_PROGRESS_BAR
            - Custom
          description: >
            The type of Android push template.


            **Note:** If you are passing a template ID, set template_type to
            "Custom".
        custom_template_id:
          type: string
          description: |
            The ID of the custom template.

            **Required** when template_type is "Custom".
        custom_template_version:
          type: integer
          description: The version of the custom template.
        basic_details:
          $ref: '#/components/schemas/AndroidBasicDetails'
        timer:
          $ref: '#/components/schemas/AndroidTimer'
        buttons:
          type: array
          description: Action buttons for the notification.
          items:
            $ref: '#/components/schemas/AndroidButton'
        advanced:
          $ref: '#/components/schemas/AndroidAdvanced'
        template_backup:
          $ref: '#/components/schemas/AndroidTemplateBackup'
    IOSPushContent:
      type: object
      description: iOS push notification content.
      required:
        - template_type
      properties:
        template_type:
          type: string
          enum:
            - BASIC
            - STYLIZED_BASIC
            - SIMPLE_IMAGE_CAROUSEL
            - Custom
          description: The type of iOS push template.
        custom_template_id:
          type: string
          description: |
            The ID of the custom template.

            **Required** when template_type is "Custom".
        custom_template_version:
          type: integer
          description: The version of the custom template.
        basic_details:
          $ref: '#/components/schemas/IOSBasicDetails'
        buttons:
          type: array
          description: Action buttons for the notification.
          items:
            $ref: '#/components/schemas/IOSButton'
        advanced:
          $ref: '#/components/schemas/IOSAdvanced'
        template_backup:
          $ref: '#/components/schemas/IOSTemplateBackup'
    WebPushContent:
      type: object
      description: Web push notification content.
      required:
        - template_type
        - basic_details
      properties:
        template_type:
          type: string
          enum:
            - BASIC
          description: The template type for web push (currently only BASIC is supported).
        basic_details:
          $ref: '#/components/schemas/WebBasicDetails'
        buttons:
          type: array
          description: Action buttons for the notification.
          items:
            $ref: '#/components/schemas/WebButton'
        advanced:
          $ref: '#/components/schemas/WebAdvanced'
    GoalEventAttribute:
      type: object
      description: Attributes associated with the conversion goal event.
      properties:
        name:
          type: string
          description: The name of the goal event attribute.
        condition:
          type: string
          description: >-
            The condition used while creating the goal (e.g., "is", "contains",
            "between").
        data_type:
          type: string
          enum:
            - STRING
            - DOUBLE
            - BOOL
            - NUMBER
            - GEOPOINT
            - DATETIME
            - ARRAY_DOUBLE
            - ARRAY_STRING
            - OBJECT
            - ARRAY_OBJECT
          description: The data type of the attribute.
        value:
          type: string
          description: >
            The value of the goal event attribute.

            Supported data types: STRING, DOUBLE, BOOL, NUMBER, GEOPOINT,
            DATETIME, ARRAY_DOUBLE, ARRAY_STRING.
        value1:
          type: string
          description: >
            A secondary value, used for conditions like 'between'.

            Supported data types: STRING, DOUBLE, BOOL, NUMBER, GEOPOINT,
            DATETIME, ARRAY_DOUBLE, ARRAY_STRING.
        negate:
          type: boolean
          description: Whether to negate the filter condition.
        value_type:
          type: string
          description: The type of value being filtered.
        array_filter_type:
          type: string
          description: The logical filter type for array attributes.
        filters:
          type: array
          description: A list of sub-filters used when data_type is OBJECT or ARRAY_OBJECT.
          items:
            type: object
        is_case_sensitive:
          type: boolean
          description: Whether the goal event attribute is case-sensitive.
    GmailAnnotations:
      type: object
      description: >
        Gmail Annotations shown in Gmail's Promotions tab. Two annotation types
        are supported: `deal_card` and `product_carousel`. These are mutually
        exclusive — include only one per campaign.


        **Note:** `gmail_annotations` is only supported when `content_type` is
        `PROMOTIONAL`. Using it with `TRANSACTIONAL` returns a `400` error.
      required:
        - send_email_if_personalization_fails
        - sender_logo
        - sender_logo_type
      properties:
        send_email_if_personalization_fails:
          type: boolean
          description: >
            Whether to send the email if personalization of any Gmail annotation
            field fails.


            **Required** when `gmail_annotations` is present.
          example: true
        sender_logo:
          type: string
          description: |
            The sender logo shown in the Gmail annotation.

            Accepts a valid HTTPS URL or a MoEngage personalization token.

            **Required** when `gmail_annotations` is present.
          example: https://example.com/logo.png
        sender_logo_type:
          type: string
          enum:
            - image_url
            - uploaded_image
          description: |
            The source type of the sender logo.

            **Required** when `sender_logo` is provided.
          example: image_url
        deal_card:
          description: >
            The Deal Card annotation.


            **Optional.** Use either `deal_card` or `product_carousel` — not
            both.
          allOf:
            - $ref: '#/components/schemas/GmailAnnotationsDealCard'
        product_carousel:
          description: >
            The Product Carousel annotation.


            **Optional.** Use either `product_carousel` or `deal_card` — not
            both.
          allOf:
            - $ref: '#/components/schemas/GmailAnnotationsProductCarousel'
    AndroidBasicDetails:
      type: object
      description: >
        Basic details for the Android push notification. 


        Fields vary by template_type. All templates support common fields like
        title, message, default_click_action.
      required:
        - notification_channel
        - title
        - message
        - default_click_action
        - default_click_action_value
      properties:
        notification_channel:
          type: string
          description: The Android notification channel where the push will be sent.
          example: general
        include_app_name_and_time:
          type: boolean
          description: >
            Whether to include the application's name and timestamp within the
            banner image.


            **Supported Templates:** Image Banner with Text
        background_color_code:
          type: string
          description: >
            The hex code for the notification's background color.


            **Supported Templates:** Stylized Basic, Simple Image Carousel,
            Image Banner with Text
          example: '#9a4444'
        app_name_color_code:
          type: string
          description: >
            The hex code for the color of the application's name text.


            **Supported Templates:** Stylized Basic, Simple Image Carousel,
            Image Banner with Text
          example: '#dea1a1'
        notification_control_color:
          type: string
          enum:
            - LIGHT
            - DARK
          description: >
            The color scheme for the notification's control elements (action
            buttons).


            **Supported Templates:** Stylized Basic, Simple Image Carousel,
            Image Banner with Text
        include_title_and_message:
          type: boolean
          description: >
            Whether to include the notification's title and message text within
            the banner image.


            **Supported Templates:** Image Banner with Text
        apply_background_color_in_text_editor:
          type: boolean
          description: >
            Whether to apply the specified background color within the rich text
            editor for preview.


            **Supported Templates:** Stylized Basic, Simple Image Carousel,
            Image Banner with Text
        title:
          type: string
          description: The main title of the push notification.
          example: Limited Time Offer!
        message:
          type: string
          description: >
            The message body of the push notification.


            You can use HTML in the message parameter to apply rich text
            formatting, including text color and styles.
          example: Get 50% off on all items. Shop now!
        summary:
          type: string
          description: The summary text for the notification.
        image_url:
          type: string
          format: uri
          description: The image URL for the push notification.
          example: https://example.com/images/promo.jpg
        image_scaling:
          type: string
          enum:
            - FIT_INSIDE_IMAGE_CONTAINER
            - FILL_IMAGE_CONTAINER
          description: >
            The scaling behavior for images within the carousel template.


            **Supported Templates:** Simple Image Carousel, Image Banner with
            Text
        banner_image_url:
          type: string
          format: uri
          description: >
            The URL for the background image used in the Image Banner Text
            template.


            **Required for:** Image Banner with Text template
        input_gif_url:
          type: string
          format: uri
          description: |
            The URL for the GIF media used in the push campaign content.

            **Supported Templates:** Basic
        collapsed_push_notification:
          type: string
          description: >
            The configuration for the notification's collapsed state (view
            before user expands it).


            **Supported Templates:** Image Banner with Text
          example: SAME_AS_TEMPLATE_BACKUP
        carousel_content:
          $ref: '#/components/schemas/CarouselContent'
        default_click_action:
          type: string
          enum:
            - DEEPLINKING
            - NAVIGATE_TO_A_SCREEN
            - RICH_LANDING
          description: >-
            The action performed when the main body of the notification is
            clicked.
        default_click_action_value:
          type: string
          description: The URL or deep link to open when the notification is clicked.
          example: https://example.com/sale
        key_value_pairs:
          type: array
          items:
            $ref: '#/components/schemas/KeyValuePair'
          description: Custom key-value pairs for the notification payload.
    AndroidTimer:
      type: object
      description: |
        Timer configuration for Timer and Timer with Progress Bar templates.

        **Required for:** TIMER and TIMER_WITH_PROGRESS_BAR templates
      required:
        - timer_ends_at
        - personalized_value
      properties:
        timer_ends_at:
          type: string
          enum:
            - DURATION
            - SPECIFIC_TIME_USER_TIMEZONE
            - SPECIFIC_TIME_CAMPAIGN_TIMEZONE
          description: How the timer's endpoint is determined.
        specific_time:
          type: string
          format: date-time
          description: |
            The specific time when the timer ends.

            **Required** when personalized_value is true.
        time_period:
          type: string
          description: >
            The time period for the timer.


            **Required** when timer_ends_at is SPECIFIC_TIME_USER_TIMEZONE or
            SPECIFIC_TIME_CAMPAIGN_TIMEZONE.
        personalized_value:
          type: boolean
          description: |
            Whether the timer duration is personalized per user.

            If false, all users get the same duration.
        duration_hour:
          type: string
          description: |
            The number of hours the timer will run for.

            **Required** when personalized_value is false.
          example: '2'
        duration_minute:
          type: string
          description: |
            The number of minutes the timer will run for (in addition to hours).

            **Required** when personalized_value is false.
          example: '30'
    AndroidButton:
      type: object
      description: Action button configuration for Android push notifications.
      required:
        - btn_name
        - click_action_type
        - click_action_value
      properties:
        btn_name:
          type: string
          description: The text to be displayed on the button.
          example: Shop Now
        click_action_type:
          type: string
          enum:
            - DEEPLINKING
            - NAVIGATE_TO_A_SCREEN
            - RICH_LANDING
            - CALL
            - SHARE
            - COPY
            - SET_USER_ATTRIBUTE
            - TRACK_EVENT
            - CUSTOM_ACTION
            - SNOOZE
            - REMIND_LATER
          description: The type of action to perform when the button is clicked.
        click_action_name:
          type: string
          description: The name of the click action.
        click_action_value:
          type: string
          description: The URL or deep link to open for the button's action.
          example: https://example.com/product
        key_value_pairs:
          type: array
          items:
            $ref: '#/components/schemas/KeyValuePair'
          description: Custom key-value pairs specific to this button's click event.
    AndroidAdvanced:
      type: object
      description: Advanced configuration options for Android push notifications.
      properties:
        coupon_code:
          type: string
          description: The coupon code to be included in the push payload.
          example: SUMMER50
        icon_type_in_notification:
          type: string
          description: The icon type to be included in the push payload.
          example: app_icon
        use_large_icon:
          type: boolean
          description: Whether to use a large icon in the notification.
        make_notification_sticky:
          type: boolean
          description: |
            When enabled, the user cannot swipe away the notification.
        dismiss_button_text:
          type: string
          description: >
            The text to display on the dismiss button.


            **Required** when make_notification_sticky is true or
            auto_dismiss_notification is true.
        auto_dismiss_notification:
          type: boolean
          description: Whether the notification can be auto-dismissed.
        auto_dismiss_notification_time_value:
          type: integer
          description: |
            The time value after which to auto-dismiss the notification.

            **Required** when auto_dismiss_notification is true.
        auto_dismiss_notification_time_granularity:
          type: string
          enum:
            - DAYS
            - HOURS
            - MINUTES
          description: |
            The time unit for auto-dismiss.

            **Required** when auto_dismiss_notification is true.
        group_key:
          type: string
          description: >
            The group key used to identify and categorize related push
            notifications.


            **Note:**

            - Use the same group key for all push notifications you want to
            group

            - MoEngage automatically modifies the group key to ensure it doesn't
            exceed 45 characters

            - Non-Latin scripts, special characters, and spaces are removed
        collapse_replace_key:
          type: string
          description: >
            The update key used to identify and update related push
            notifications.


            Ensure you use the same update key for all push notifications
            intended to update each other.
    AndroidTemplateBackup:
      type: object
      description: >
        Fallback notification content for when the template cannot be rendered.


        **Required for:** Stylized Basic, Simple Image Carousel, Image Banner
        with Text, Timer, and Timer with Progress Bar templates
      required:
        - title
        - message
        - default_click_action
        - default_click_action_value
      properties:
        title:
          type: string
          description: The title for the fallback notification.
        message:
          type: string
          description: The message body for the fallback notification.
        summary:
          type: string
          description: The summary for the fallback notification.
        image_url:
          type: string
          format: uri
          description: The URL of an image for the fallback notification.
        default_click_action:
          type: string
          enum:
            - DEEPLINKING
            - NAVIGATE_TO_A_SCREEN
            - RICH_LANDING
          description: The default click action for the fallback notification.
        default_click_action_value:
          type: string
          description: The URL or deep link for the fallback's click action.
        key_value_pairs:
          type: array
          items:
            $ref: '#/components/schemas/KeyValuePair'
          description: Custom key-value pairs specific to the fallback payload.
    IOSBasicDetails:
      type: object
      description: Basic details for the iOS push notification.
      required:
        - title
        - message
      properties:
        background_color_code:
          type: string
          description: |
            The hexadecimal color code for the notification's background.

            **Supported Templates:** Simple Image Carousel, Stylized Basic
          example: '#a0a0a0'
        apply_background_color_in_text_editor:
          type: boolean
          description: |
            Whether to apply the background color within the text editor view.

            **Supported Templates:** Simple Image Carousel, Stylized Basic
        title:
          type: string
          description: The main title of the push notification.
          example: New Message
        message:
          type: string
          description: The main body text of the notification.
          example: You have a new message waiting for you
        subtitle:
          type: string
          description: The subtitle displayed below the main title.
        allow_bg_refresh:
          type: boolean
          description: >-
            Whether to allow the app to be woken up in the background to refresh
            content.
        rich_media_type:
          type: string
          enum:
            - Image
            - Video
            - GIF
          description: |
            The type of rich media to be included in the notification.

            **Supported Templates:** Basic
        rich_media_value:
          type: string
          format: uri
          description: >
            The URL of the rich media asset specified in the rich_media_type
            field.


            **Supported Templates:** Basic
        image_url:
          type: string
          format: uri
          description: >
            The URL of a large image to be displayed within the notification
            content.


            **Note:** Required when template_type is SIMPLE_IMAGE_CAROUSEL.
        input_gif_url:
          type: string
          format: uri
          description: |
            The URL for the GIF media used in the push campaign content.

            **Supported Templates:** Basic, Stylized Basic
        carousel_content:
          $ref: '#/components/schemas/IOSCarouselContent'
        default_click_action:
          type: string
          enum:
            - DEEPLINKING
            - NAVIGATE_TO_A_SCREEN
            - RICH_LANDING
          description: >-
            The action performed when the main body of the notification is
            tapped.
        default_click_action_value:
          type: string
          description: The URL or deep link associated with the default click action.
        key_value_pairs:
          type: array
          items:
            $ref: '#/components/schemas/KeyValuePair'
          description: >-
            Custom key-value pairs sent with the push payload for in-app
            handling.
    IOSButton:
      type: object
      description: Action button configuration for iOS push notifications.
      required:
        - button_category
      properties:
        button_category:
          type: string
          description: >
            The pre-defined category name for a set of interactive buttons
            configured in the app.
          example: MOE_PUSH_TEMPLATE
    IOSAdvanced:
      type: object
      description: Advanced configuration options for iOS push notifications.
      properties:
        coupon_code:
          type: string
          description: The coupon code to be included in the push payload.
        sound_file:
          type: string
          description: >-
            The name of a custom sound file located in the app bundle to play
            upon receiving the notification.
        enable_ios_badge:
          type: boolean
          description: >-
            Whether this campaign allows the notification to increment the app's
            badge count.
        group_key:
          type: string
          description: >
            The group key used to identify and categorize related push
            notifications.


            **Note:**

            - Use the same group key for all push notifications you want to
            group

            - MoEngage automatically modifies the group key to ensure it doesn't
            exceed 45 characters

            - Non-Latin scripts, special characters, and spaces are removed
        collapse_replace_key:
          type: string
          description: >
            The update key used to identify and update related push
            notifications.


            Ensure you use the same update key for all push notifications
            intended to update each other.
    IOSTemplateBackup:
      type: object
      description: |
        Fallback notification content for when the template cannot be rendered.

        **Required for:** Stylized Basic and Simple Image Carousel templates
      required:
        - title
        - message
      properties:
        title:
          type: string
          description: The title for the fallback notification.
        message:
          type: string
          description: The message body for the fallback notification.
        subtitle:
          type: string
          description: The subtitle for the fallback notification.
        allow_bg_refresh:
          type: boolean
          description: >-
            Whether to enable background app refresh for the fallback
            notification.
        rich_media_type:
          type: string
          enum:
            - Image
            - Video
            - GIF
          description: The type of media attachment for the fallback.
        rich_media_value:
          type: string
          format: uri
          description: The URL of the media attachment for the fallback.
        default_click_action:
          type: string
          enum:
            - DEEPLINKING
            - NAVIGATE_TO_A_SCREEN
            - RICH_LANDING
          description: The default click action for the fallback notification.
        default_click_action_value:
          type: string
          description: The URL or deep link for the fallback's click action.
        key_value_pairs:
          type: array
          items:
            $ref: '#/components/schemas/KeyValuePair'
          description: Custom key-value pairs specific to the fallback payload.
    WebBasicDetails:
      type: object
      description: Basic details for the Web push notification.
      required:
        - title
        - message
        - redirect_url
      properties:
        title:
          type: string
          description: The title text displayed at the top of the notification.
          example: Special Offer
        message:
          type: string
          description: The main body text of the notification.
          example: Check out our latest deals!
        redirect_url:
          type: string
          format: uri
          description: >-
            The URL that the user is redirected to when they click the main body
            of the notification.
          example: https://example.com/offers
        image_url:
          type: string
          format: uri
          description: >-
            The URL of a large image to be displayed within the notification
            content.
        auto_dismiss_notification:
          type: boolean
          description: Whether the notification should auto-dismiss.
    WebButton:
      type: object
      description: Action button configuration for Web push notifications.
      required:
        - title
      properties:
        title:
          type: string
          description: The text displayed on the button.
          example: View Offer
        icon_url:
          type: string
          format: uri
          description: The URL of an icon to be displayed next to the button text.
        url:
          type: string
          format: uri
          description: >-
            The destination URL that the user is redirected to when they click
            this button.
    WebAdvanced:
      type: object
      description: Advanced configuration options for Web push notifications.
      properties:
        icon_image_type:
          type: string
          enum:
            - DEFAULT
            - ICON_URL
          description: The type of icon to use for the notification.
        icon_url:
          type: string
          format: uri
          description: The URL for a custom notification icon.
    GmailAnnotationsDealCard:
      type: object
      description: >
        Deal Card annotation shown in Gmail's Promotions tab. All four fields
        below are required when `deal_card` is present.
      required:
        - description
        - discount_code
        - availability_starts
        - availability_ends
      properties:
        description:
          type: string
          description: |
            Short deal description shown in the Gmail annotation.

            **Required** when `deal_card` is present.
          example: Get 20% off on all orders above $50
        discount_code:
          type: string
          description: |
            Promo or discount code displayed with the deal.

            **Required** when `deal_card` is present.
          example: SAVE20
        availability_starts:
          type: string
          description: >
            ISO 8601 datetime indicating when the deal becomes active. Use the
            timezone of the promotion, not your server or API caller timezone.
            Ensure the timezone matches the promotion's local timezone so the
            deal displays the correct active and expiry times for your audience.


            **Accepted formats:**

            - UTC (`Z` suffix): `YYYY-MM-DDTHH:mm:ssZ` (for example,
            `2026-06-01T00:00:00Z`).

            - Positive offset: `YYYY-MM-DDTHH:mm:ss+HH:MM` (for example,
            `2026-06-01T00:00:00+05:30` for IST).

            - Negative offset: `YYYY-MM-DDTHH:mm:ss-HH:MM` (for example,
            `2026-06-01T00:00:00-07:00` for US Pacific PDT).


            **Common offsets:** IST `+05:30`, SGT `+08:00`, GST `+04:00`, CET
            `+01:00` or `+02:00` (DST), EST `-05:00`, EDT `-04:00`, PST
            `-08:00`, PDT `-07:00`, UTC `Z` or `+00:00`.


            **Required** when `deal_card` is present.
          example: '2026-06-01T00:00:00Z'
        availability_ends:
          type: string
          description: >
            ISO 8601 datetime indicating when the deal expires. Same format as
            `availability_starts`.


            Use the timezone of the promotion, not your server or API caller
            timezone. Ensure the timezone matches the promotion's local timezone
            so the deal displays the correct active and expiry times for your
            audience.


            Must be at least 1 hour after `availability_starts`.


            **Required** when `deal_card` is present.
          example: '2026-06-30T23:59:59Z'
    GmailAnnotationsProductCarousel:
      type: object
      description: >
        Product Carousel annotation shown in Gmail's Promotions tab.


        Use `MANUAL` to specify products directly in the request, or
        `PRODUCT_SET` to pull products dynamically from a MoEngage Catalog
        product set.
      required:
        - type
      properties:
        type:
          type: string
          enum:
            - MANUAL
            - PRODUCT_SET
          description: >
            The source type for the product carousel.


            - `MANUAL`: Specify products directly in the request using
            `manual_data`.

            - `PRODUCT_SET`: Pull products dynamically from a MoEngage Catalog
            product set using `product_set_data`. Requires the Product Sets
            feature to be enabled for your workspace.


            **Required** when `product_carousel` is present.
        manual_data:
          description: |
            Products specified directly in the request.

            **Required** when `product_carousel.type` is `MANUAL`.
          allOf:
            - $ref: '#/components/schemas/GmailAnnotationsProductCarouselManualData'
        product_set_data:
          description: |
            Reference to a MoEngage Catalog product set.

            **Required** when `product_carousel.type` is `PRODUCT_SET`.
          allOf:
            - $ref: >-
                #/components/schemas/GmailAnnotationsProductCarouselProductSetData
    CarouselContent:
      type: object
      description: |
        Configuration for image carousel in Simple Image Carousel template.

        **Required for:** Simple Image Carousel template
      required:
        - slider_transition
        - slide_data
      properties:
        slider_transition:
          type: string
          enum:
            - manual
            - automatic
          description: The transition type for the carousel slides.
        slide_data:
          type: array
          description: Array of slide configurations.
          items:
            type: object
            required:
              - image_url
            properties:
              image_url:
                type: string
                format: uri
                description: The image URL for this slide.
              image_click_action:
                type: string
                enum:
                  - DEEPLINKING
                  - RICH_LANDING
                  - NAVIGATE_TO_A_SCREEN
                description: The click action for this slide's image.
              image_click_action_value:
                type: string
                description: |
                  The click action value for this slide's image.

                  **Required** when image_click_action is provided.
              key_value_pairs:
                type: array
                items:
                  $ref: '#/components/schemas/KeyValuePair'
    KeyValuePair:
      type: object
      description: A key-value pair for custom data.
      required:
        - key
        - value
      properties:
        key:
          type: string
          description: The key name.
        value:
          type: string
          description: The value.
    IOSCarouselContent:
      type: object
      description: |
        Configuration for image carousel in Simple Image Carousel template.

        **Required for:** Simple Image Carousel template
      required:
        - slider_transition
        - slide_data
      properties:
        slider_transition:
          type: string
          enum:
            - MANUAL
            - AUTOMATIC
          description: The transition type for the carousel slides.
        slide_data:
          type: array
          description: Array of slide configurations.
          items:
            type: object
            required:
              - image_url
            properties:
              image_url:
                type: string
                format: uri
                description: The image URL for this slide.
              image_click_action:
                type: string
                enum:
                  - DEEPLINKING
                  - RICH_LANDING
                  - NAVIGATE_TO_A_SCREEN
                description: The click action for this slide's image.
              image_click_action_value:
                type: string
                description: The click action value for this slide's image.
              key_value_pairs:
                type: array
                items:
                  $ref: '#/components/schemas/KeyValuePair'
    GmailAnnotationsProductCarouselManualData:
      type: object
      description: >
        Manual product list for the Gmail Annotations product carousel.


        **Required** when `product_carousel.type` is `MANUAL`. Minimum 2
        products required.
      required:
        - currency
        - products
      properties:
        currency:
          type: string
          description: |
            ISO 4217 currency code applied to all products in the carousel.

            **Required** when `manual_data` is present.
          example: USD
        products:
          type: array
          description: |
            List of products to display in the carousel.

            **Required** when `manual_data` is present. Minimum 2 products.
          minItems: 2
          items:
            $ref: '#/components/schemas/GmailAnnotationsProductCarouselManualProduct'
    GmailAnnotationsProductCarouselProductSetData:
      type: object
      description: >
        Product set configuration for the Gmail Annotations product carousel.
        Pulls products dynamically from a MoEngage Catalog product set.


        **Required** when `product_carousel.type` is `PRODUCT_SET`. Requires the
        Product Sets feature to be enabled for your workspace.
      required:
        - product_set
        - image_url
        - headline
        - promo_url
        - product_count
      properties:
        product_set:
          type: string
          description: >
            Product set ID from MoEngage Catalog. Must be valid and exist in
            your workspace.


            **Required** when `product_set_data` is present.
          example: product_set_12345
        image_url:
          type: string
          description: |
            Fallback image URL if a product set image is unavailable.

            **Required** when `product_set_data` is present.
          example: https://example.com/images/fallback.png
        headline:
          type: string
          description: |
            Label shown for the product carousel.

            **Required** when `product_set_data` is present.
          example: Recommended For You
        promo_url:
          type: string
          description: |
            Destination URL when the user clicks the annotation.

            **Required** when `product_set_data` is present.
          example: https://example.com/shop
        product_count:
          type: integer
          description: >
            Number of products to display.


            **Required** when `product_set_data` is present. Minimum 2, maximum
            9.
          minimum: 2
          maximum: 9
          example: 3
    GmailAnnotationsProductCarouselManualProduct:
      type: object
      description: >-
        A single product entry in a manual product carousel. All fields below
        are required for each product.
      required:
        - id
        - headline
        - original_price
        - discount_value
        - discount_type
        - promo_url
        - product_image
      properties:
        id:
          type: string
          description: |
            Unique product identifier.

            **Required** for each product.
          example: prod-001
        headline:
          type: string
          description: |
            Product name shown in the annotation.

            **Required** for each product.
          example: Wireless Headphones
        original_price:
          type: string
          description: |
            Original price of the product as a numeric string.

            **Required** for each product.
          example: '199.99'
        discount_value:
          type: string
          description: >
            Discount amount as a numeric string. Interpreted as a percentage or
            absolute value depending on `discount_type`.


            **Required** for each product.
          example: '30'
        discount_type:
          type: string
          enum:
            - PERCENT
            - VALUE
          description: |
            How `discount_value` is interpreted.

            - `PERCENT`: `discount_value` is a percentage.
            - `VALUE`: `discount_value` is an absolute amount in `currency`.

            **Required** for each product.
          example: PERCENT
        promo_url:
          type: string
          description: |
            Product landing page URL. Must be a valid HTTPS URL.

            **Required** for each product.
          example: https://example.com/products/prod-001
        product_image:
          type: string
          description: |
            Product image URL. Must be a valid HTTPS URL. Cannot be empty.

            **Required** for each product.
          example: https://example.com/images/prod-001.png
  responses:
    Unauthorized:
      description: Authentication Failure - Invalid or missing authentication credentials
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            error:
              code: 401 Authentication error
              message: Authentication required
              details:
                - code: InvalidValue
                  target: APP_SECRET_KEY
                  message:
                    - code: InvalidValue
                      target: APP_SECRET_KEY
                      message: Invalid APP_SECRET_KEY is provided.
              request_id: ''
    RateLimitExceeded:
      description: Rate Limit Breach - Too many requests
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            error:
              code: 429 conflict
              message: rate_limit
              target: ''
              details:
                - target: rate_limit
                  message: Rate limiting breached
              request_id: 3UXNNGsqV
    InternalServerError:
      description: Internal Server Error - Unexpected system error
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            error:
              code: 500 Internal Server Error
              message: Something went wrong. Please contact Moengage team
              target: string
              details:
                - message: 'Expecting value: line 1 column 1 (char 0)'
                  target: ''
  securitySchemes:
    BasicAuth:
      type: http
      scheme: basic
      description: >
        Authentication is done via Basic Auth. This requires a base64-encoded
        string of your credentials in the format 'username:password'.


        - **Username**: Use your MoEngage workspace ID (also known as the App
        ID). You can find it in the MoEngage dashboard at **Settings** >
        **Account** > **APIs** > **Workspace ID (earlier app id)**.

        - **Password**: Use your API Key, which you can find within the
        **Campaign report/Business events/Custom templates/Catalog API/Inform
        Report** tile.


        For more information on authentication and getting your credentials,
        refer
        [here](https://www.moengage.com/docs/api/introduction#getting-your-credentials).

````