openapi: 3.2.0
info:
title: Moengage Create Campaigns API
version: '2025-11-20'
contact:
name: MoEngage Developer Team
email: support@moengage.com
url: https://developers.moengage.com
description: 'Operations tagged Create Campaigns across 2 of this provider''s published API definitions: moengage-campaign-draft-openapi.yml, moengage-campaigns-openapi.yml. Each path carries the servers of the definition it was published in.'
servers:
- url: https://api-{dc}.moengage.com/
description: MoEngage Campaigns API Server
variables:
dc:
default: '01'
description: Data center (DC) segment in the hostname. Replace `OX` with your workspace DC (01–06 or 101). See [Data centers](/api/introduction#data-centers).
- 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: []
tags:
- name: Create Campaigns
paths:
/v5/campaigns:
post:
operationId: create_draft_campaign_v5
summary: Create Campaign Draft (V5)
description: 'Creates a Push or Email campaign draft. Content, audience, and delivery settings can be included at the time of creation, or added later via `PATCH /v5/campaigns/{campaign_id}`.
'
x-mint:
content: "\n
Get 50% off on all items!
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:Deal!
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:Shop now!
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:Shop now!
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' 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. components: schemas: EmailCampaignContent: type: object description: 'Email content, locales, and A/B variations. For full `POST /v5/campaigns` request examples that include `campaign_content`, refer to `campaign_delivery_type` on `EmailCampaignCreateV5Request`, `VariationDetails`, and the Create Campaign Draft code samples. For Email content variants, including `html_content` versus `custom_template_id`, CC/BCC, attachments, and editor selection (`Froala Editor` versus `Ace Editor`), refer to [Email content](/api/campaigns/campaign-content-reference#email-content). ' properties: locales: type: array items: type: string description: 'Additional locale names for multi-language campaigns. List only the non-default locales here (for example, `"en-US"`, `"es-ES"`). The `"default"` locale is always implicitly present and must not be included in this array. ' example: - en-US - es-ES variation_details: $ref: '#/components/schemas/VariationDetails' content: type: object description: 'The campaign message payload. Two shapes are accepted: - **Flat shape (no locales or variations):** Pass a flat `email` object directly under `content`. - **Locale-keyed and variation-keyed shape:** Key by locale name, then by variation name: `content[locale_name][variation_name] = { email: { ... } }`. The `"default"` locale key is always required and serves as the fallback. Additional locale keys must match values listed in `locales`. For runnable payloads for both shapes, refer to [Content payload structure](/api/campaigns/campaign-content-reference#content-payload-structure). ' properties: email: $ref: '#/components/schemas/EmailContent' additionalProperties: type: object description: Variation-keyed content blocks for a single locale. additionalProperties: type: object properties: email: $ref: '#/components/schemas/EmailContent' 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 items: type: object description: A list of sub-filters used when data_type is OBJECT or ARRAY_OBJECT. is_case_sensitive: type: boolean description: Whether the goal event attribute is case-sensitive. KeyValuePair: type: object description: A custom key-value pair attached to the push payload. properties: key: type: string description: The key name. value: type: string description: The value. V5SuccessEnvelope: type: object properties: response_id: type: string type: type: string example: campaign data: type: object Geofences: type: object description: 'Geofence location details for location-triggered campaigns. **Required** for LOCATION_TRIGGERED campaigns. For per-`triggered_at` runnable payloads (`ENTRY`, `EXIT`, `dwell`) and the casing distinction between `ENTRY`/`EXIT` (uppercase) and `dwell` (lowercase), refer to [Geofence targeting](/api/campaigns/audience-scheduling-delivery-reference#geofence-targeting). ' 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). ' EmailCampaignCreateV5Request: title: Email Campaign type: object description: 'Request body for creating an Email campaign draft via `POST /v5/campaigns`. Required fields are `channel`, `campaign_delivery_type`, and `created_by`. `connector` is required before the campaign can be published or sent for testing, but can be added later via `PATCH` (progressive creation). `campaign_content` can be added when the message content is ready. For the component-level schemas with conditional rules: - [Campaign content reference](/api/campaigns/campaign-content-reference) — `basic_details`, `campaign_content` (`html_content` and `custom_template_id`), `variation_details`, and `connector`. - [Audience and delivery reference](/api/campaigns/audience-scheduling-delivery-reference) — `trigger_condition`, `segmentation_details`, `scheduling_details`, `delivery_controls`, `conversion_goal_details`, `control_group_details`, `utm_params`, and `campaign_audience_limit`. ' required: - channel - campaign_delivery_type - created_by 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: '{{request_id}}' channel: type: string enum: - EMAIL description: The campaign channel. One of `PUSH` or `EMAIL`. campaign_delivery_type: type: string enum: - ONE_TIME - PERIODIC - EVENT_TRIGGERED - BUSINESS_EVENT_TRIGGERED description: 'The delivery type of the campaign. For full request payloads per delivery type, see the code examples on this page. ' 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/EmailBasicDetailsV5' 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' AndroidTimer: type: object description: 'Timer configuration for Timer and Timer with Progress Bar templates. **Required for:** TIMER and TIMER_WITH_PROGRESS_BAR templates ' 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' ConversionGoalDetails: type: object description: 'Configuration for tracking campaign conversion goals. For runnable single-goal and multi-goal examples, refer to [Conversion goal tracking](/api/campaigns/audience-scheduling-delivery-reference#conversion-goal-tracking). ' 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. PushCampaignCreateV5Request: title: Push Campaign type: object description: 'Request body for creating a Push campaign draft via `POST /v5/campaigns`. Only `channel`, `campaign_delivery_type`, and `created_by` are required. Optional components (`basic_details`, `campaign_content`, `segmentation_details`, and so on) can be included in the same request, or added later via `PATCH /v5/campaigns/{campaign_id}`. For full examples per delivery type, refer to `campaign_delivery_type` below. For the component-level schemas with conditional rules per template type, platform, and delivery type, refer to: - [Campaign content reference](/api/campaigns/campaign-content-reference) — `basic_details` and `campaign_content`. - [Audience and delivery reference](/api/campaigns/audience-scheduling-delivery-reference) — `trigger_condition`, `segmentation_details`, `scheduling_details`, `delivery_controls`, `conversion_goal_details`, `control_group_details`, `utm_params`, `campaign_audience_limit`, `advanced`, and `geofences`. ' required: - channel - campaign_delivery_type - created_by 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: '{{request_id}}' channel: type: string enum: - PUSH description: The campaign channel. One of `PUSH` or `EMAIL`. campaign_delivery_type: type: string enum: - ONE_TIME - PERIODIC - EVENT_TRIGGERED - BUSINESS_EVENT_TRIGGERED - DEVICE_TRIGGERED - LOCATION_TRIGGERED description: 'The delivery type of the campaign. **Note:** `BROADCAST_LIVE_ACTIVITY` is not supported through the draft-based creation flow. For full request payloads per delivery type, see the code examples on this page. ' 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/PushBasicDetailsV5' 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' campaign_audience_limit: $ref: '#/components/schemas/CampaignAudienceLimit' CampaignCreateV5Request: oneOf: - $ref: '#/components/schemas/PushCampaignCreateV5Request' - $ref: '#/components/schemas/EmailCampaignCreateV5Request' discriminator: propertyName: channel mapping: PUSH: '#/components/schemas/PushCampaignCreateV5Request' EMAIL: '#/components/schemas/EmailCampaignCreateV5Request' SegmentationDetails: type: object description: 'Defines the target audience for the campaign. For included/excluded filter combinations, filter primitives (`user_attributes`, `actions`, `custom_segments`), and opt-out targeting, refer to [Campaign audience](/api/campaigns/audience-scheduling-delivery-reference#campaign-audience). ' properties: included_filters: $ref: '#/components/schemas/FilterGroup' excluded_filters: allOf: - $ref: '#/components/schemas/FilterGroup' description: 'Filters that exclude users from the campaign audience. ' 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. For runnable examples, refer to [Campaign audience](/api/campaigns/audience-scheduling-delivery-reference#campaign-audience). PeriodicDetails: type: object description: 'Configuration for periodic campaigns. **Required** for PERIODIC campaigns. For runnable Daily, Weekly, Monthly (specific dates), and Monthly (first Monday) examples, refer to [Periodic schedules](/api/campaigns/audience-scheduling-delivery-reference#periodic-schedules). ' 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. ' AdvancedDetails: type: object description: 'Advanced Push delivery settings, including notification expiration and per-platform priority. For runnable iOS APNS priority and Android priority examples, refer to [Advanced Push settings](/api/campaigns/audience-scheduling-delivery-reference#advanced-push-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. 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 ' 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. PushDeliveryControls: type: object description: 'Controls for Push campaign delivery behavior. For per-delivery-type runnable examples (throttle, event-triggered, device-triggered, location-triggered, queuing), refer to [Push delivery controls](/api/campaigns/audience-scheduling-delivery-reference#push-delivery-controls). ' 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. ' ignore_global_minimum_delay: type: boolean description: 'Whether to bypass the global minimum delay setting configured at the workspace level. When `true`, this campaign ignores the workspace-wide minimum interval between push notifications and can be delivered to a user regardless of how recently they received another push. Use this for time-sensitive campaigns (for example, transactional or alert-style messages) where respecting the global delay would reduce delivery timeliness. Applies to event-triggered campaigns. ' queuing_enabled: type: boolean description: 'Enables message queuing for this campaign. When set to `true`, messages that are temporarily blocked by DND, frequency capping, or minimum delay restrictions are held in a queue and delivered as soon as the restriction clears, rather than being dropped. **Supported delivery types:** `ONE_TIME`, `PERIODIC`, `EVENT_TRIGGERED`, `BUSINESS_EVENT_TRIGGERED`. Not applicable to `DEVICE_TRIGGERED` or `LOCATION_TRIGGERED` campaigns. **DND interaction:** - When `bypass_dnd` is `false` (DND respected): messages blocked during a DND window are queued and delivered once the window passes. - When `bypass_dnd` is `true` (DND ignored): queuing applies to frequency capping and minimum delay blocks only. **Auto-disabled:** When both `ignore_frequency_capping` and `minimum_delay_between_two_notification_in_hour` are configured to bypass all delivery restrictions, queuing is automatically disabled. **Queue limits:** Up to 10,000,000 messages for `ONE_TIME`, `PERIODIC`, and `BUSINESS_EVENT_TRIGGERED` campaigns; up to 1,000,000 for `EVENT_TRIGGERED` campaigns. **Delivery order:** Queued messages are delivered in first-in, first-out (FIFO) order. ' queue_duration: type: integer minimum: 0 maximum: 48 description: 'The duration in hours during which a queued message will be retried for delivery. Accepted range: `1`–`48` hours. Set to `0` when `queuing_enabled` is `false`. If a user does not become eligible for delivery within the configured window, the message is dropped and the outcome is recorded in campaign analytics. For active `PERIODIC` and triggered campaigns, changes to this value apply only to messages queued after the update. Messages already in the queue retain the original duration. ' ControlGroupDetails: type: object description: 'Configuration for control groups. For runnable campaign-control-group and global-control-group examples, refer to [Control groups](/api/campaigns/audience-scheduling-delivery-reference#control-groups). ' properties: is_campaign_control_group_enabled: type: boolean description: Whether the campaign control group is enabled. campaign_control_group_percentage: type: integer minimum: 0 maximum: 100 description: 'The percentage of users added to the exclusion list. **Required** if is_campaign_control_group_enabled is true. ' is_global_control_group_enabled: type: boolean description: 'Whether the global control group is enabled. ' UserAttributeFilter: type: object title: User attributes-based filters description: Filter based on user attributes. 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. is_dynamic_value: type: boolean description: 'When `true`, the filter value is treated as a dynamic expression and resolved at send time rather than evaluated as a literal string. Set this to `true` for Business Event-triggered campaigns where the filter value references a Business Event attribute, for example, `{{BusinessEventAttribute[''season'']}}`. ' 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. ' BTSDetails: type: object description: 'Best Time to Send (BTS) configuration. BTS selects an optimal send time per user based on historical engagement patterns. For the field schema and required-when-`SEND_IN_BTS` rule, refer to [Best Time to Send](/api/campaigns/audience-scheduling-delivery-reference#best-time-to-send). ' 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 PushBasicDetailsV5: type: object description: 'Identifying metadata for the Push campaign, including name, team, tags, and platform targeting. For field-by-field rules, conditional requirements, and platform-specific delivery flags (Android `push_amp_plus_enabled`, iOS provisional-push audience flags), refer to [Push campaign metadata](/api/campaigns/campaign-content-reference#push-campaign-metadata). ' 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](https://help.moengage.com/hc/en-us/articles/360028586211-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. **Not applicable in the draft-based creation flow.** `BROADCAST_LIVE_ACTIVITY` is not supported via POST `/v5/campaigns`. ' 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' UTMParams: type: object description: 'UTM parameters for tracking campaign performance. The five standard keys (`utm_source`, `utm_medium`, `utm_campaign`, `utm_term`, `utm_content`) are explicitly defined. **Custom UTM parameters:** Up to 5 additional custom parameters can be passed as separate keys directly inside the `utm_params` object. Custom keys accept arbitrary names — the `utm_` prefix is a convention, not a requirement (for example, `utm_cust` or `campaign_source` are both accepted). For runnable examples, refer to [UTM parameters](/api/campaigns/audience-scheduling-delivery-reference#utm-parameters). ' properties: utm_source: type: string description: 'The source of the traffic (for example, YouTube, Instagram, Google). **Required** when using UTM parameters. ' example: '{{utm_source}}' utm_medium: type: string description: 'The channel type (for example, Push, SMS, Email). **Required** when using UTM parameters. ' example: '{{utm_medium}}' utm_campaign: type: string description: The name of the campaign (for example, Newyear, Bigbillionday). example: '{{utm_campaign}}' utm_term: type: string description: Search terms for paid traffic (for example, Mobile+sale). utm_content: type: string description: The content element that differentiates links (for example, banner, video). utm_custom: type: string description: 'A single custom UTM parameter value. For multiple custom parameters, pass them as separate top-level keys inside the `utm_params` object using arbitrary `utm_`-prefixed names (for example, `utm_cust`, `utm_c1ust`, `utm_c2ust`). A maximum of 5 custom parameters is supported in total. ' additionalProperties: type: string description: 'Arbitrary custom UTM parameters with `utm_`-prefixed key names (for example, `utm_cust`, `utm_c1ust`). Up to 5 custom parameters are supported in total across all custom keys. ' AndroidPushContent: type: object description: Android push notification content. 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" and use `custom_template_id`. ' 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 items: $ref: '#/components/schemas/AndroidButton' description: Action buttons for the notification. advanced: $ref: '#/components/schemas/AndroidAdvanced' template_backup: $ref: '#/components/schemas/AndroidTemplateBackup' IOSButton: type: object description: Action button configuration for iOS push notifications. 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 PushTriggerCondition: type: object description: 'Trigger condition details for Push event-triggered, device-triggered, and related campaigns. **Required** for `EVENT_TRIGGERED`, `DEVICE_TRIGGERED`, and `LOCATION_TRIGGERED` Push campaigns. For per-delay-type runnable payloads (`ASAP`, `DELAY` with `AFTER`/`BEFORE`, `INTELLIGENT_DELAY`), filter primitives, and primary/secondary filter combinations, refer to [Trigger conditions](/api/campaigns/audience-scheduling-delivery-reference#trigger-conditions). ' properties: included_filters: $ref: '#/components/schemas/FilterGroup' secondary_included_filters: allOf: - $ref: '#/components/schemas/FilterGroup' description: Additional filters that must also be satisfied for the trigger to fire. For runnable examples, refer to [Primary and secondary trigger filters](/api/campaigns/audience-scheduling-delivery-reference#primary-and-secondary-trigger-filters). 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 minimum: 0 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: string description: The attribute value of the trigger. Pass the string `"If Action"` for event-triggered campaigns. 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. CampaignDraftCreatedData: type: object required: - id - status description: Payload returned when a draft is successfully created. properties: id: type: string description: Raw 24-character campaign ObjectId. example: 64a1b2c3d4e5f6a7b8c9d0e1 status: type: string enum: - DRAFT description: Created campaigns are always returned as `DRAFT`. IOSAdvanced: type: object description: Platform-level advanced settings for push delivery - TTL, priority, badge count, and similar controls. 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. ' CustomSegmentFilter: type: object title: Custom segments description: Filter using a custom segment. 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. WebBasicDetails: type: object description: Basic details for the Web push notification. 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. IOSPushContent: type: object description: iOS push notification content. 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 items: $ref: '#/components/schemas/IOSButton' description: Action buttons for the notification. advanced: $ref: '#/components/schemas/IOSAdvanced' template_backup: $ref: '#/components/schemas/IOSTemplateBackup' AndroidButton: type: object description: Action button configuration for Android push notifications. 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. Connector: type: object description: 'Email connector configuration for sending email campaigns. Required for inline Email test requests and before an Email campaign can be published or sent for testing. Not required at draft create time — it can be added later via `PATCH`. For runnable examples, refer to [Email delivery connector](/api/campaigns/campaign-content-reference#email-delivery-connector). ' required: - connector_type - connector_name properties: connector_type: type: string enum: - SENDGRID - AMAZON_SES - SPARKPOST - MANDRILL - CUSTOM_SMTP - CUSTOM_API - NETCORE description: 'The email service provider for this campaign. Must match a connector configured in your MoEngage workspace. Accepted values: `SENDGRID`, `AMAZON_SES`, `SPARKPOST`, `MANDRILL`, `CUSTOM_SMTP`, `CUSTOM_API`, `NETCORE`. To find which connectors are active, go to **Settings** > **Email** > **Connectors** in the MoEngage dashboard. ' connector_name: type: string description: The name of the connector configuration as configured in your MoEngage workspace. IOSTemplateBackup: type: object description: 'Fallback notification content for when the template cannot be rendered. **Required for:** Stylized Basic and Simple Image Carousel templates ' 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. V5ErrorEnvelope: type: object properties: response_id: type: string error: type: object properties: code: type: string enum: - VALIDATION_FAILED - UNPROCESSABLE_ENTITY - BAD_REQUEST - RATE_LIMITED - UNAUTHORIZED - INTERNAL_ERROR - FORBIDDEN message: type: string target: type: string details: type: array items: type: object properties: target: type: string message: type: string request_id: type: string description: 'The `request_id` from the originating request. Use this to correlate a failed response back to the specific call that triggered it, particularly useful in high-volume or retry scenarios. In V1, `request_id` appeared inside the `error` object. V5 preserves this field in the same location. ' WebAdvanced: type: object description: 'Platform-level advanced settings for push delivery - TTL, priority, badge count, and similar controls. ' 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. WebPushContent: type: object description: Web push notification content. 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 items: $ref: '#/components/schemas/WebButton' description: 'Action buttons for the notification. ' advanced: $ref: '#/components/schemas/WebAdvanced' CampaignAudienceLimit: type: object description: "Configuration for capping the number of users a campaign can reach (max-send).\n\nCampaign Audience Limit (also called max-send) caps how many users a single campaign can reach. Use it to control reach on high-volume campaigns and protect users from over-messaging. The cap can apply across the campaign's full lifetime (`frequency: TOTAL`) or per send instance (`frequency: INSTANCE`).\n\nFor runnable `TOTAL` (lifetime cap), `INSTANCE` (per-send cap, Periodic Push only), and disabled-cap examples, refer to [Campaign audience cap](/api/campaigns/audience-scheduling-delivery-reference#campaign-audience-cap).\n\n**Supported channels:** Email, Push.\n\n**Supported delivery types:**\n- All delivery types support `frequency: TOTAL` (lifetime cap).\n- `frequency: INSTANCE` (per-send cap) is supported only for **Periodic Push** campaigns.\n- `campaign_audience_limit` is not supported for `BROADCAST_LIVE_ACTIVITY`.\n\n**Flag-gated feature:** This feature is not enabled by default for any workspace and requires\nexplicit activation by your MoEngage account team. If you include `campaign_audience_limit` in\na request on a workspace where the flag has not been enabled, the API returns a `400` with the\nfollowing error body:\n\n```json\n{\n \"error\": {\n \"code\": \"VALIDATION_FAILED\",\n \"message\": \"Campaign Audience Limit feature is not enabled for this db\",\n \"target\": \"campaign_audience_limit\",\n \"details\": [\n {\n \"target\": \"campaign_audience_limit\",\n \"message\": \"Campaign Audience Limit feature is not enabled for this db\"\n }\n ]\n },\n \"response_id\": \"{{response_id}}\"\n}\n```\n\nWhen `is_campaign_audience_limit_enabled` is `true`, the fields `metric`, `frequency`, and\n`limit` are all required. When set to `false`, those three fields must not be provided.\n\nFor `ONE_TIME` campaigns, only `limit` and `is_campaign_audience_limit_enabled` are supported. Do not pass `metric` or `frequency`, they are only valid for `PERIODIC` and `EVENT_TRIGGERED` campaigns. \nPassing them for a ONE_TIME campaign causes the validate API to fail. \n" properties: is_campaign_audience_limit_enabled: type: boolean description: 'Whether the campaign audience limit is active. Set to `true` to enforce the cap; `false` to disable. When `true`, `metric`, `frequency`, and `limit` are all required. When `false`, `metric`, `frequency`, and `limit` must not be provided. ' metric: type: string description: 'The type of send event counted toward the limit. Must be uppercase. **Required** when `is_campaign_audience_limit_enabled` is `true`. ' enum: - SENT example: SENT frequency: type: string description: 'The window over which the limit is applied. Must be uppercase. - `TOTAL` - applies the cap across the full lifetime of the campaign. Supported for all delivery types on both Email and Push. - `INSTANCE` - applies the cap per campaign instance (for example, per periodic send). **Valid only for Push `PERIODIC` campaigns.** For all other delivery types, use `TOTAL`. **Required** when `is_campaign_audience_limit_enabled` is `true`. ' enum: - TOTAL - INSTANCE example: TOTAL limit: type: integer minimum: 1 maximum: 9999999999 description: 'The maximum number of users who can receive this campaign (or per instance, when `frequency` is `INSTANCE`). Must be between 1 and 9,999,999,999. **Required** when `is_campaign_audience_limit_enabled` is `true`. ' example: 100000 CarouselContent: type: object description: 'Configuration for image carousel in Simple Image Carousel template. **Required for:** Simple Image Carousel template ' properties: slider_transition: type: string enum: - MANUAL - AUTOMATIC description: 'The transition type for the carousel slides. In earlier versions of this API, the accepted values were `manual` and `automatic` (lowercase). They are now `MANUAL` and `AUTOMATIC` (uppercase). Update any existing integrations that pass lowercase values. ' slide_data: type: array description: Array of slide configurations. items: type: object 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' IOSBasicDetails: type: object description: Basic details for the iOS push notification. 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. EmailBasicDetailsV5: type: object description: 'Identifying metadata for the Email campaign, including name, team, tags, and subscription category. **Conditional requirements:** `name`, `content_type`, `user_attribute_identifier`, and `subscription_category` are strictly required only when using the `/v5/campaigns/test` endpoint in **inline mode**. They are not required at campaign creation time (V5 supports progressive creation, where components are added later via PATCH) and are not needed in **draft mode** tests, where content comes from the saved draft. ' properties: name: type: string description: Any string name for the test or campaign. example: Summer Sale Email business_event: type: string description: The business event to be mapped to the campaign. example: user_signup content_type: type: string enum: - PROMOTIONAL - TRANSACTIONAL description: The type of content in the campaign. "PROMOTIONAL" or "TRANSACTIONAL". subscription_category: type: string description: 'The subscription category for promotional email campaigns. **Must match a valid category configured in your workspace.** **Required** for PROMOTIONAL email campaigns and inline tests. ' example: marketing 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. example: marketing_team user_attribute_identifier: type: string default: Email (Standard) description: 'The user attribute that stores the recipient email address. Use "Email (Standard)" for email channels. ' example: Email (Standard) 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. ActionFilter: type: object title: Action-based filters (with or without attributes) description: 'Filter based on user actions/events. Use inside `segmentation_details.included_filters.filters` or `trigger_condition.included_filters.filters`. ' 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. Must be passed as the string "IF". VariationDetails: type: object description: 'Configuration for A/B testing variations. For runnable `MANUAL` (fixed split) and `SHERPA` (auto-optimized) examples, refer to [A/B test variations](/api/campaigns/campaign-content-reference#a-b-test-variations). ' properties: distribution_type: type: string enum: - SHERPA - MANUAL description: 'The traffic distribution method for A/B test variations. - `MANUAL` - you specify a fixed percentage split across variations. - `SHERPA` - MoEngage''s AI-powered optimizer automatically shifts traffic toward the best-performing variation during the campaign run. ' no_of_variations: type: integer minimum: 1 description: The number of A/B test variations. example: 2 manual_distribution_percentage: type: object additionalProperties: type: integer description: "Fixed percentage of audience assigned to each variation. \n**Note:** Variation keys must follow the `variation_N` naming format (e.g. `variation_1`, `variation_2`). Keys with any other format like `var_1`, `1`, `2` will be rejected with a validation error.\n\n**Required** when `distribution_type` is `MANUAL`.\n" example: variation_1: 50 variation_2: 50 sherpa_campaign_duration: type: integer description: 'Duration in hours over which MoEngage Sherpa collects performance data before declaring a winning variation. **Required** when `distribution_type` is `SHERPA`. ' sherpa_distribution_metric: type: string enum: - OPEN_RATE - CLICK_RATE - BOTH description: 'The engagement metric Sherpa uses to evaluate and rank variations. **Required** when `distribution_type` is `SHERPA`. ' PushCampaignContent: type: object description: 'Push message content, locales, and A/B variations. For full `POST /v5/campaigns` request examples that include `campaign_content`, refer to `campaign_delivery_type` on `PushCampaignCreateV5Request`, `VariationDetails`, and the Create Campaign Draft code samples. For per-template-type runnable payloads, refer to [Android push content](/api/campaigns/campaign-content-reference#android-push-content), [iOS push content](/api/campaigns/campaign-content-reference#ios-push-content), or [Web push content](/api/campaigns/campaign-content-reference#web-push-content). ' properties: locales: type: array items: type: string description: 'Additional locale names for multi-language campaigns. List only the non-default locales here (for example, `"en-US"`, `"es-ES"`). The `"default"` locale is always implicitly present and must not be included in this array. ' example: - en-US - es-ES variation_details: $ref: '#/components/schemas/VariationDetails' content: type: object description: 'The campaign message payload. Two shapes are accepted: - **Flat shape (no locales or variations):** Pass a flat `push` object directly under `content`. - **Locale-keyed and variation-keyed shape:** Key by locale name, then by variation name: `content[locale_name][variation_name] = { push: { ... } }`. The `"default"` locale key is always required and serves as the fallback. Additional locale keys must match values listed in `locales`.Hello {{UserAttribute['First Name']}}
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. ' 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](https://developers.moengage.com/hc/en-us/articles/13277936457748). ' 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 ' 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' UserTimezoneDetails: type: object description: 'Configuration for sending in the user''s timezone. For the field schema and required-when-`SEND_IN_USER_TIMEZONE` rule, refer to [User timezone](/api/campaigns/audience-scheduling-delivery-reference#user-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. AndroidAdvanced: type: object description: Platform-level advanced settings for push delivery - TTL, priority, badge count, and similar controls. 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. ' WebButton: type: object description: Action button configuration for Web push notifications. 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. IOSCarouselContent: type: object description: 'Configuration for image carousel in Simple Image Carousel template. **Required for:** Simple Image Carousel template ' properties: slider_transition: type: string enum: - MANUAL - AUTOMATIC description: 'The transition type for the carousel slides. In earlier versions of this API, the accepted values were `manual` and `automatic` (lowercase). They are now `MANUAL` and `AUTOMATIC` (uppercase). Update any existing integrations that pass lowercase values. ' slide_data: type: array description: Array of slide configurations. items: type: object 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' V5ValidateResponse: type: object description: '- When `valid` is `true`, only `valid` is returned. - When `valid` is `false`, `errors` lists one or more field-level issues found during publish-time validation (`DRAFT_PUBLISH`). ' properties: valid: type: boolean description: '`true` if the campaign passes all publish-time validation checks. `false` if one or more checks fail.' example: false errors: type: array description: 'Present only when `valid` is `false`. Each item describes a single validation failure. Multiple errors can be returned, and more than one error can reference the same field. ' items: type: object properties: field: type: string description: 'Dot-separated JSON path to the field that failed validation, relative to the campaign document root (for example, `campaign_content.content.push.android.basic_details.title` or `scheduling_details`). ' example: campaign_content.content.push.android.basic_details.title issue: type: string description: Human-readable description of the validation failure for this field. The value is free-form and may vary by channel, delivery type, and component. example: title is required EmailTriggerCondition: type: object description: 'Trigger condition details for Email event-triggered campaigns. **Required** for EVENT_TRIGGERED campaigns. For per-delay-type runnable payloads (`ASAP`, `DELAY` with `AFTER`/`BEFORE`), filter primitives, and primary/secondary filter combinations, refer to [Trigger conditions](/api/campaigns/audience-scheduling-delivery-reference#trigger-conditions). ' properties: included_filters: $ref: '#/components/schemas/FilterGroup' secondary_included_filters: allOf: - $ref: '#/components/schemas/FilterGroup' description: Additional filters that must also be satisfied for the Email trigger to fire. For runnable examples, refer to [Primary and secondary trigger filters](/api/campaigns/audience-scheduling-delivery-reference#primary-and-secondary-trigger-filters). 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 minimum: 0 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: string description: The attribute value of the trigger. Pass the string `"If Action"` for event-triggered campaigns. EmailCampaignContent_2: 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_2' content: type: object description: The actual Email campaign content. required: - email properties: email: $ref: '#/components/schemas/EmailContent_2' KeyValuePair_2: 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. Geofences_2: 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). AndroidTimer_2: 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' ConversionGoalDetails_2: 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. AndroidTemplateBackup_2: 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_2' description: Custom key-value pairs specific to the fallback payload. SegmentationDetails_2: type: object description: Defines the target audience for the campaign. properties: included_filters: $ref: '#/components/schemas/FilterGroup_2' excluded_filters: $ref: '#/components/schemas/FilterGroup_2' 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. PeriodicDetails_2: 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. 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' 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 AdvancedDetails_2: 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. ControlGroupDetails_2: 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. UserAttributeFilter_2: 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. ' BTSDetails_2: 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 PushDeliveryControls_2: 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. ' UTMParams_2: 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). 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 AndroidPushContent_2: 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_2' timer: $ref: '#/components/schemas/AndroidTimer_2' buttons: type: array description: Action buttons for the notification. items: $ref: '#/components/schemas/AndroidButton_2' advanced: $ref: '#/components/schemas/AndroidAdvanced_2' template_backup: $ref: '#/components/schemas/AndroidTemplateBackup_2' IOSButton_2: 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 PushTriggerCondition_2: type: object description: 'Trigger condition details for Push event-triggered campaigns. **Required** for EVENT_TRIGGERED campaigns. ' properties: included_filters: $ref: '#/components/schemas/FilterGroup_2' secondary_included_filters: $ref: '#/components/schemas/FilterGroup_2' 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. IOSAdvanced_2: 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. ' CustomSegmentFilter_2: 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. WebBasicDetails_2: 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. IOSPushContent_2: 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_2' buttons: type: array description: Action buttons for the notification. items: $ref: '#/components/schemas/IOSButton_2' advanced: $ref: '#/components/schemas/IOSAdvanced_2' template_backup: $ref: '#/components/schemas/IOSTemplateBackup_2' AndroidButton_2: 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_2' description: Custom key-value pairs specific to this button's click event. Connector_2: 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 IOSTemplateBackup_2: 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_2' description: Custom key-value pairs specific to the fallback payload. WebAdvanced_2: 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. WebPushContent_2: 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_2' buttons: type: array description: Action buttons for the notification. items: $ref: '#/components/schemas/WebButton_2' advanced: $ref: '#/components/schemas/WebAdvanced_2' CampaignAudienceLimit_2: 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). ' CarouselContent_2: 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_2' IOSBasicDetails_2: 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_2' 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_2' description: Custom key-value pairs sent with the push payload for in-app handling. 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' 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_2' campaign_content: $ref: '#/components/schemas/PushCampaignContent_2' segmentation_details: $ref: '#/components/schemas/SegmentationDetails_2' scheduling_details: $ref: '#/components/schemas/SchedulingDetails_2' delivery_controls: $ref: '#/components/schemas/PushDeliveryControls_2' advanced: $ref: '#/components/schemas/AdvancedDetails_2' conversion_goal_details: $ref: '#/components/schemas/ConversionGoalDetails_2' control_group_details: $ref: '#/components/schemas/ControlGroupDetails_2' utm_params: $ref: '#/components/schemas/UTMParams_2' ActionFilter_2: 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_2' condition: type: string description: The condition type (e.g., "IF"). VariationDetails_2: 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. ' PushCampaignContent_2: 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_2' content: type: object description: The actual Push campaign content. required: - push properties: push: $ref: '#/components/schemas/PushContent' PlatformSpecificDetails_2: 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. ' AndroidBasicDetails_2: type: object description: "Basic details for the Android push notification. \n\nFields vary by template_type. All templates support common fields like title, message, default_click_action.\n" 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_2' 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_2' description: Custom key-value pairs for the notification payload. CampaignCreateRequest: oneOf: - $ref: '#/components/schemas/PushCampaignRequest' - $ref: '#/components/schemas/EmailCampaignRequest' discriminator: propertyName: channel mapping: PUSH: '#/components/schemas/PushCampaignRequest' EMAIL: '#/components/schemas/EmailCampaignRequest' SchedulingDetails_2: 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_2' bts_details: $ref: '#/components/schemas/BTSDetails_2' user_timezone_details: $ref: '#/components/schemas/UserTimezoneDetails_2' EmailDeliveryControls_2: 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. EmailContent_2: 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:Hello {{UserAttribute['First Name']}}
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' 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_2' 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_2' 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' 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. 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 FilterGroup_2: 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_2' - $ref: '#/components/schemas/ActionFilter_2' - $ref: '#/components/schemas/CustomSegmentFilter_2' 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 ' UserTimezoneDetails_2: 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. 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_2' connector: $ref: '#/components/schemas/Connector_2' campaign_content: $ref: '#/components/schemas/EmailCampaignContent_2' segmentation_details: $ref: '#/components/schemas/SegmentationDetails_2' scheduling_details: $ref: '#/components/schemas/SchedulingDetails_2' delivery_controls: $ref: '#/components/schemas/EmailDeliveryControls_2' conversion_goal_details: $ref: '#/components/schemas/ConversionGoalDetails_2' control_group_details: $ref: '#/components/schemas/ControlGroupDetails_2' utm_params: $ref: '#/components/schemas/UTMParams_2' campaign_audience_limit: $ref: '#/components/schemas/CampaignAudienceLimit_2' 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' AndroidAdvanced_2: 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. ' WebButton_2: 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. IOSCarouselContent_2: 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_2' 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 EmailTriggerCondition_2: type: object description: 'Trigger condition details for Email event-triggered campaigns. **Required** for EVENT_TRIGGERED campaigns. ' properties: included_filters: $ref: '#/components/schemas/FilterGroup_2' secondary_included_filters: $ref: '#/components/schemas/FilterGroup_2' 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. responses: V5InternalError: description: Unhandled server-side failure. content: application/json: schema: $ref: '#/components/schemas/V5ErrorEnvelope' example: response_id: abc-101 error: code: INTERNAL_ERROR message: Internal server error. details: [] V5Unauthorized: description: Authentication failure. content: application/json: schema: $ref: '#/components/schemas/V5ErrorEnvelope' example: response_id: abc-101 error: code: UNAUTHORIZED message: Invalid or missing credentials. details: [] V5RateLimited: description: Per-app rate limit exceeded. Retry after the window indicated in `Retry-After` (seconds). content: application/json: schema: $ref: '#/components/schemas/V5ErrorEnvelope' example: response_id: abc-101 error: code: RATE_LIMITED message: Rate limit exceeded for app key. details: [] V5ValidationError: description: Request failed schema or component validation. content: application/json: schema: $ref: '#/components/schemas/V5ErrorEnvelope' example: response_id: abc-101 error: code: VALIDATION_FAILED message: One or more fields failed validation. request_id: req-push-001 details: - target: campaign_delivery_type message: campaign_delivery_type value is required. 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: '' 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 parameters: Idempotency-Key-Required: name: Idempotency-Key in: header required: true description: 'UUID v4. Required on all `POST` and `PATCH` requests except `POST /v5/campaigns/{campaign_id}/validate`. Repeating the same key returns the same response body. ' schema: type: string format: uuid X-MOE-Request-Id: name: X-MOE-Request-Id in: header required: true description: 'Correlates with `response_id`. Supply this header or `request_id` in the body; if both are set, they must match. ' schema: type: string MOE-APPKEY: name: MOE-APPKEY in: header required: true description: 'Your MoEngage Workspace ID (App ID). Find it in the dashboard at **Settings** > **Account** > **APIs** > **Workspace ID**. ' schema: type: string example: '{{workspace_id}}' MOE-APPKEY_2: 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 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**: On your MoEngage workspace, navigate to **Settings** → **Account** → **API keys** and click **Create new key**. The tab lists every API surface (Data, Segmentation, Push, Email, Campaigns, Templates, and more) and exposes per-resource actions. For Campaigns, ensure the **View**, **Create & Manage**, and **Create, Manage & Publish** checkboxes are selected. For more information on authentication and getting your credentials, refer to [Getting your credentials](/api/introduction#getting-your-credentials). Send the value in the `Authorization` header as `Basic` followed by Base64-encoding of `appkey:apisecret` (workspace ID and API key). ' x-refined-from: - moengage-campaign-draft-openapi.yml - moengage-campaigns-openapi.yml