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

# Test Campaign

> This API sends a test Push or Email campaign to specific users or identifiers before launching it to your entire audience. You can only test campaigns created via the API, not campaigns created through the MoEngage dashboard.


#### Rate Limits

| Rate  Limit Name         | Rate Limit                                                                       |
| :----------------------- | :------------------------------------------------------------------------------- |
| Test campaign per second | The total number of test campaign requests per second per client allowed is 10.  |
| Test campaign per minute | The total number of test campaign requests per minute per client allowed is 100. |
| Test campaign per hour   | The total number of test campaign requests per hour per client allowed is 6000.  |

<Note>
  **Notes**

  * 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/test
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/test:
    post:
      tags:
        - Test Campaigns
      summary: Test Campaign
      description: >
        This API sends a test Push or Email campaign to specific users or
        identifiers before launching it to your entire audience. You can only
        test campaigns created via the API, not campaigns created through the
        MoEngage dashboard.
      operationId: test_campaign
      parameters:
        - $ref: '#/components/parameters/MOE-APPKEY'
      requestBody:
        description: >-
          Test campaign configuration including content and target test users.

          **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/CampaignTestRequest'
            examples:
              push_test_basic:
                summary: Push - Test with User ID
                value:
                  request_id: test_push_123
                  channel: PUSH
                  basic_details:
                    name: Flash Sale Push Test
                    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: 'Test: Flash Sale!'
                            message: Testing message content
                            default_click_action: DEEPLINKING
                            default_click_action_value: https://example.com/sale
                        ios:
                          template_type: BASIC
                          basic_details:
                            title: 'Test: Flash Sale!'
                            message: Testing message content
                            default_click_action: DEEPLINKING
                            default_click_action_value: https://example.com/sale
                  test_campaign_meta:
                    identifier: USER_ATTRIBUTE_UNIQUE_ID
                    identifier_values:
                      - user_12345
              email_test_with_personalization:
                summary: Email - Test with Personalization
                value:
                  request_id: test_email_456
                  channel: EMAIL
                  basic_details:
                    name: Newsletter Test
                    content_type: PROMOTIONAL
                    subscription_category: marketing
                    user_attribute_identifier: MOE_EMAIL_ID
                  connector:
                    connector_type: SENDGRID
                    connector_name: default
                  campaign_content:
                    content:
                      email:
                        subject: 'Test: Weekly Newsletter'
                        preview_text: Testing email content
                        sender_name: MoEngage Store
                        from_address: noreply@example.com
                        reply_to_address: support@example.com
                        html_content: >-
                          <!DOCTYPE html><html><body><p>Hi
                          {{UserAttribute['First Name']}},</p><p>Testing
                          personalized content</p></body></html>
                  personalization_details:
                    user_attributes:
                      First Name: John
                      Last Name: Doe
                    event_attributes:
                      Campaign Name: Test Campaign
                  test_campaign_meta:
                    identifier: EMAIL
                    identifier_values:
                      - john.doe@example.com
                      - jane.smith@example.com
              email_test_locale_variation:
                summary: Email - Test with Locale & Variation
                value:
                  request_id: test_email_locale
                  channel: EMAIL
                  basic_details:
                    name: Multi-locale Test
                    content_type: PROMOTIONAL
                    subscription_category: marketing
                    user_attribute_identifier: MOE_EMAIL_ID
                  connector:
                    connector_type: SENDGRID
                    connector_name: default
                  campaign_content:
                    locales:
                      - en-US
                      - es-ES
                      - default
                    content:
                      en-US:
                        variation_1:
                          email:
                            subject: Test EN
                            sender_name: Store
                            from_address: noreply@example.com
                            reply_to_address: support@example.com
                            html_content: <html><body>English content</body></html>
                  test_campaign_meta:
                    identifier: ID
                    identifier_values:
                      - user_001
                    locale_name: en-US
                    variation: variation_1
      responses:
        '200':
          description: Test campaign sent successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TestCampaignSuccessResponse'
              examples:
                success:
                  summary: Successful Test
                  value:
                    data:
                      user_12345:
                        status: success
                    message: Test campaign created successfully
                partial_success:
                  summary: Partial Success
                  value:
                    data:
                      john.doe@example.com:
                        status: success
                      jane.smith@example.com:
                        status: failed
                        failure_reason: User not found
                    message: Test campaign created successfully
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '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:
    CampaignTestRequest:
      oneOf:
        - $ref: '#/components/schemas/PushCampaignTestRequest'
        - $ref: '#/components/schemas/EmailCampaignTestRequest'
      discriminator:
        propertyName: channel
        mapping:
          PUSH:
            $ref: '#/components/schemas/PushCampaignTestRequest'
          EMAIL:
            $ref: '#/components/schemas/EmailCampaignTestRequest'
    TestCampaignSuccessResponse:
      type: object
      description: Response after successfully sending a test campaign.
      properties:
        data:
          type: object
          additionalProperties:
            type: object
            properties:
              status:
                type: string
                enum:
                  - success
                  - failed
                description: The status of the test campaign delivery for this identifier.
              failure_reason:
                type: string
                description: The reason for failure (only present if status is "failed").
          description: |
            Object containing test results for each identifier.

            Each key is an identifier value with its delivery status.
          example:
            user_12345:
              status: success
            user_67890:
              status: failed
              failure_reason: User not found
        message:
          type: string
          description: A success message.
          example: Test campaign created successfully
    PushCampaignTestRequest:
      title: Push Campaign
      type: object
      required:
        - request_id
        - channel
        - basic_details
        - campaign_content
        - test_campaign_meta
      properties:
        request_id:
          type: string
          description: A unique identifier for this test request.
          example: test_push_12345
        channel:
          type: string
          enum:
            - PUSH
          description: The communication channel (automatically set to PUSH for this tab).
        basic_details:
          $ref: '#/components/schemas/PushBasicDetails'
        campaign_content:
          $ref: '#/components/schemas/PushCampaignContent'
        personalization_details:
          $ref: '#/components/schemas/PersonalizationDetails'
        test_campaign_meta:
          $ref: '#/components/schemas/PushTestCampaignMeta'
    EmailCampaignTestRequest:
      title: Email Campaign
      type: object
      required:
        - request_id
        - channel
        - basic_details
        - connector
        - campaign_content
        - test_campaign_meta
      properties:
        request_id:
          type: string
          description: A unique identifier for this test request.
          example: test_email_12345
        channel:
          type: string
          enum:
            - EMAIL
          description: The communication channel (automatically set to EMAIL for this tab).
        basic_details:
          $ref: '#/components/schemas/EmailBasicDetails'
        connector:
          $ref: '#/components/schemas/Connector'
        campaign_content:
          $ref: '#/components/schemas/EmailCampaignContent'
        utm_params:
          $ref: '#/components/schemas/UTMParams'
        personalization_details:
          $ref: '#/components/schemas/PersonalizationDetails'
        test_campaign_meta:
          $ref: '#/components/schemas/EmailTestCampaignMeta'
    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.
    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'
    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'
    PersonalizationDetails:
      type: object
      description: |
        Override values for personalizing campaign content during testing.

        **Important**: 
          - When you pass personalization details in the personalization_details object of this API, MoEngage uses those details to personalize the user attributes or event attributes present in the content instead of the attributes present in the user profile.
          - You can use this API only for 10 users at a time.
          - The same personalization details are used across all users. For example, you pass the first name as Dave in personalization details, you have used the first name in the content, and there are 10 users. In this case, all 10 users will get the same first name (Dave).
      properties:
        user_attributes:
          type: object
          additionalProperties: true
          description: |
            Key-value pairs for user attribute personalization.

            The same values are used for all test recipients.
          example:
            First Name: John
            Last Name: Doe
            Email: john.doe@example.com
        event_attributes:
          type: object
          additionalProperties: true
          description: >
            Key-value pairs for event attribute personalization.


            If you pass only a subset of attributes, remaining values are picked
            from the user profile.
          example:
            Campaign Name: Test Campaign
            Campaign Channel: Email
    PushTestCampaignMeta:
      type: object
      description: Metadata for specifying test recipients for Push campaigns.
      required:
        - identifier
        - identifier_values
      properties:
        identifier:
          type: string
          enum:
            - USER_ATTRIBUTE_UNIQUE_ID
            - USER_ATTRIBUTE_USER_EMAIL
            - USER_ATTRIBUTE_USER_MOBILE
            - MOE_GAID
            - ADVERTISING_IDENTIFIER
            - PUSH_ID
            - CUSTOM_SEGMENT
          description: >
            The type of identifier used to target test users.


            - **USER_ATTRIBUTE_UNIQUE_ID**: Permanent internal user ID (e.g.,
            USER_1138)

            - **USER_ATTRIBUTE_USER_EMAIL**: User's email address (e.g.,
            john.doe@example.com)

            - **USER_ATTRIBUTE_USER_MOBILE**: User's mobile number (e.g.,
            +14155550101)

            - **MOE_GAID**: Google Advertising ID from Android device

            - **ADVERTISING_IDENTIFIER**: Resettable advertising ID (GAID on
            Android, IDFA on iOS)

            - **PUSH_ID**: Unique device token for push notifications

            - **CUSTOM_SEGMENT**: User-defined segment for targeting
        identifier_values:
          type: array
          items:
            type: string
          description: Array of identifier values to send the test campaign to.
          example:
            - user_12345
            - user_67890
        locale_name:
          type: string
          description: >-
            The locale name to use for the test campaign (when using
            multi-locale campaigns).
        variation:
          type: string
          description: >-
            The variation name to use for the test campaign (when using A/B
            testing).
          example: variation_1
    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
    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'
    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).
    EmailTestCampaignMeta:
      type: object
      description: |
        Metadata for specifying test recipients for Email campaigns.
      required:
        - identifier
        - identifier_values
      properties:
        identifier:
          type: string
          enum:
            - EMAIL
            - ID
            - CUSTOM_SEGMENT
            - MOBILE_NUMBER
          description: >
            The type of identifier used to target test users.


            - **EMAIL**: Email address (content will not be personalized with
            user profile data)

            - **ID**: User ID from your system

            - **CUSTOM_SEGMENT**: User-defined segment

            - **MOBILE_NUMBER**: User's mobile phone number
        identifier_values:
          type: array
          items:
            type: string
          description: |
            Array of identifier values to send the test campaign to.

            **Note:** Maximum 10 users at a time.
          maxItems: 10
          example:
            - john.doe@example.com
            - jane.smith@example.com
        locale_name:
          type: string
          description: >-
            The locale name to use for the test campaign (when using
            multi-locale campaigns).
          example: en-US
        variation:
          type: string
          description: >-
            The variation name to use for the test campaign (when using A/B
            testing).
          example: variation_1
    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.
    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'
    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'
    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'
    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:
    BadRequest:
      description: Bad Request - Missing or invalid parameters
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            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'
    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: ''
    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).

````