openapi: 3.0.3
info:
title: MoEngage Broadcast Live Activities API
version: '1.0'
description: API for starting, updating, and ending broadcast Live Activities for iOS Push Campaigns. Live Activities must be created via the Create Push Campaigns API with the `BROADCAST_LIVE_ACTIVITY` delivery type.
tags:
- name: Live Activities
description: Operations to manage broadcast Live Activities for iOS.
servers:
- url: 'https://api-{dc}.moengage.com/v1.0'
description: "Live Activities 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: []
moeAppKey: []
paths:
/live-activity/broadcast/start:
post:
tags:
- Live Activities
summary: Start Broadcast Live Activity
description: |
This API initiates a shared, real-time activity for a large audience, such as a live sporting match or real-time election result tracking.
x-mint:
content: |
You can start live activities for only push campaigns created with the BROADCAST_LIVE_ACTIVITY delivery type using the [Create Push Campaigns API](https://www.moengage.com/docs/api/create-campaigns/create-campaign), not campaigns created through the MoEngage UI.
#### Rate Limit
The rate limit for this endpoint is 5 requests per minute per workspace.
parameters:
- name: X-MOE-APPKEY
in: header
required: true
schema:
type: string
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)**.
example: 'YOUR_WORKSPACE_ID_XXXX'
requestBody:
required: true
description: |
The configuration for starting the Live Activity, including the initial content and alert message.
content:
application/json:
schema:
$ref: '#/components/schemas/StartLiveActivityRequest'
responses:
'200':
description: Success. The live activity instance was created.
content:
application/json:
schema:
$ref: '#/components/schemas/SuccessResponse'
'400':
description: Bad Request - Mandatory fields are missing or invalid.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponseWithDetails'
example:
error:
code: "PayloadError"
message: "Mandatory fields are missing or invalid"
details:
- code: "extra_forbidden"
target: "ios.alert.metrics"
message: "Extra inputs are not permitted"
'401':
description: Unauthorized - Invalid credentials or missing headers.
content:
application/json:
schema:
$ref: '#/components/schemas/BasicErrorResponse'
examples:
invalid-app-key:
summary: Invalid App Key
value:
error:
code: "AuthError"
message: "Invalid App Key"
invalid-data-key:
summary: Invalid Data Key
value:
error:
code: "AuthError"
message: "Invalid Data Key"
missing-headers:
summary: Missing Authorization Headers
value:
error:
code: "AuthError"
message: "Authorization header or X-MOE-APPKEY is missing"
'403':
description: Forbidden - Operation not allowed due to logic or permission constraints.
content:
application/json:
schema:
$ref: '#/components/schemas/BasicErrorResponse'
examples:
campaign-not-found:
summary: Campaign Not Found
value:
error:
code: "OperationNotAllowed"
message: "Campaign not found for "
ios-token-required:
summary: iOS Token Required
value:
error:
code: "OperationNotAllowed"
message: "Only IOS token auth is allowed, please upload .p8 file"
duplicate-request:
summary: Duplicate Request
value:
error:
code: "OperationNotAllowed"
message: "Duplicate Request, please use different instance_id"
limit-reached:
summary: Max Instances Limit Reached
value:
error:
code: "OperationNotAllowed"
message: "Max Instances Limit Reached"
'413':
description: Payload Too Large - The payload exceeds the limit (e.g., 5120 bytes for iOS).
content:
application/json:
schema:
$ref: '#/components/schemas/BasicErrorResponse'
example:
error:
code: "PayloadSizeError"
message: "Payload size exceeded for IOS. Max size is 5120 bytes"
'429':
description: Too Many Requests.
content:
application/json:
schema:
type: array
items: {}
example: []
'500':
description: Internal Server Error.
content:
application/json:
schema:
$ref: '#/components/schemas/BasicErrorResponse'
example:
error:
code: "ServerError"
message: "Internal Server Error, something went wrong"
/live-activity/broadcast/update:
post:
tags:
- Live Activities
summary: Update Broadcast Live Activity
description: |
This API pushes a single, unified update to all subscribed Live Activities, such as an updated game score or a new development in a breaking news story.
x-mint:
content: |
#### Rate Limit
The rate limit for this endpoint is 500 requests per minute per workspace and 5 requests per minute per live activity ID.
parameters:
- name: X-MOE-APPKEY
in: header
required: true
schema:
type: string
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)**.
example: 'YOUR_WORKSPACE_ID_XXXX'
requestBody:
required: true
description: |
The payload containing the updated content state and optional alert for the Live Activity.
content:
application/json:
schema:
$ref: '#/components/schemas/UpdateLiveActivityRequest'
responses:
'200':
description: Success. The live activity was updated.
content:
application/json:
schema:
$ref: '#/components/schemas/SuccessResponse'
'400':
description: Bad Request - Mandatory fields are missing or invalid.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponseWithDetails'
example:
error:
code: "PayloadError"
message: "Mandatory fields are missing or invalid"
details:
- code: "extra_forbidden"
target: "ios.alert.metrics"
message: "Extra inputs are not permitted"
'401':
description: Unauthorized - Invalid credentials or missing headers.
content:
application/json:
schema:
$ref: '#/components/schemas/BasicErrorResponse'
examples:
invalid-app-key:
summary: Invalid App Key
value:
error:
code: "AuthError"
message: "Invalid App Key"
invalid-data-key:
summary: Invalid Data Key
value:
error:
code: "AuthError"
message: "Invalid Data Key"
missing-headers:
summary: Missing Authorization Headers
value:
error:
code: "AuthError"
message: "Authorization header or X-MOE-APPKEY is missing"
'403':
description: Forbidden - Operation not allowed due to logic or permission constraints.
content:
application/json:
schema:
$ref: '#/components/schemas/BasicErrorResponse'
examples:
campaign-not-found:
summary: Campaign Not Found
value:
error:
code: "OperationNotAllowed"
message: "Campaign not found for "
ios-token-required:
summary: iOS Token Required
value:
error:
code: "OperationNotAllowed"
message: "Only IOS token auth is allowed, please upload .p8 file"
invalid-action:
summary: Invalid Action
value:
error:
code: "OperationNotAllowed"
message: "Invalid Action"
duplicate-request:
summary: Duplicate Request
value:
error:
code: "OperationNotAllowed"
message: "Duplicate Request, please use different instance_id"
dismissal-passed:
summary: Dismissal Date Passed
value:
error:
code: "OperationNotAllowed"
message: "Dismissal date is already passed"
limit-reached:
summary: Max Instances Limit Reached
value:
error:
code: "OperationNotAllowed"
message: "Max Instances Limit Reached"
'413':
description: Payload Too Large.
content:
application/json:
schema:
$ref: '#/components/schemas/BasicErrorResponse'
example:
error:
code: "PayloadSizeError"
message: "Payload size exceeded for IOS. Max size is 5120 bytes"
'429':
description: Too Many Requests.
content:
application/json:
schema:
type: array
items: {}
example: []
'500':
description: Internal Server Error.
content:
application/json:
schema:
$ref: '#/components/schemas/BasicErrorResponse'
example:
error:
code: "ServerError"
message: "Internal Server Error, something went wrong"
/live-activity/broadcast/end:
post:
tags:
- Live Activities
summary: End Broadcast Live Activity
description: |
This API terminates a broadcast Live Activity across all subscribed devices simultaneously, with options for a final state update or immediate dismissal.
x-mint:
content: |
#### Rate Limit
The rate limit for this endpoint is 500 requests per minute per workspace and 5 requests per minute per live activity ID.
parameters:
- name: X-MOE-APPKEY
in: header
required: true
schema:
type: string
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)**.
example: 'YOUR_WORKSPACE_ID_XXXX'
requestBody:
required: true
description: |
The payload containing the final content state and dismissal information for the Live Activity.
content:
application/json:
schema:
$ref: '#/components/schemas/EndLiveActivityRequest'
responses:
'200':
description: Success. The live activity was ended.
content:
application/json:
schema:
$ref: '#/components/schemas/SuccessResponse'
'400':
description: Bad Request - Mandatory fields are missing or invalid.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponseWithDetails'
example:
error:
code: "PayloadError"
message: "Mandatory fields are missing or invalid"
details:
- code: "extra_forbidden"
target: "ios.alert.metrics"
message: "Extra inputs are not permitted"
'401':
description: Unauthorized - Invalid credentials or missing headers.
content:
application/json:
schema:
$ref: '#/components/schemas/BasicErrorResponse'
examples:
invalid-app-key:
summary: Invalid App Key
value:
error:
code: "AuthError"
message: "Invalid App Key"
invalid-data-key:
summary: Invalid Data Key
value:
error:
code: "AuthError"
message: "Invalid Data Key"
missing-headers:
summary: Missing Authorization Headers
value:
error:
code: "AuthError"
message: "Authorization header or X-MOE-APPKEY is missing"
'403':
description: Forbidden - Operation not allowed due to logic or permission constraints.
content:
application/json:
schema:
$ref: '#/components/schemas/BasicErrorResponse'
examples:
campaign-not-found:
summary: Campaign Not Found
value:
error:
code: "OperationNotAllowed"
message: "Campaign not found for "
ios-token-required:
summary: iOS Token Required
value:
error:
code: "OperationNotAllowed"
message: "Only IOS token auth is allowed, please upload .p8 file"
invalid-action:
summary: Invalid Action
value:
error:
code: "OperationNotAllowed"
message: "Invalid Action"
duplicate-request:
summary: Duplicate Request
value:
error:
code: "OperationNotAllowed"
message: "Duplicate Request, please use different instance_id"
dismissal-passed:
summary: Dismissal Date Passed
value:
error:
code: "OperationNotAllowed"
message: "Dismissal date is already passed"
limit-reached:
summary: Max Instances Limit Reached
value:
error:
code: "OperationNotAllowed"
message: "Max Instances Limit Reached"
'413':
description: Payload Too Large - The payload exceeds the limit (e.g., 5120 bytes for iOS).
content:
application/json:
schema:
$ref: '#/components/schemas/BasicErrorResponse'
example:
error:
code: "PayloadSizeError"
message: "Payload size exceeded for IOS. Max size is 5120 bytes"
'429':
description: Too Many Requests.
content:
application/json:
schema:
type: array
items: {}
example: []
'500':
description: Internal Server Error.
content:
application/json:
schema:
$ref: '#/components/schemas/BasicErrorResponse'
example:
error:
code: "ServerError"
message: "Internal Server Error, something went wrong"
components:
securitySchemes:
basicAuth:
type: http
scheme: basic
description: |
Authentication is done via Basic Auth. This requires a base64-encoded string of your credentials in the format 'username:password'.
- **Username**: Use your MoEngage workspace ID (also known as the App ID). You can find it in the MoEngage dashboard at **Settings** > **Account** > **APIs** > **Workspace ID (earlier app id)**.
- **Password**: Use your API Key, which you can find within the **Push** tile.
For more information on authentication and getting your credentials, refer [here](https://www.moengage.com/docs/api/introduction#getting-your-credentials).
schemas:
ErrorDetail:
type: object
properties:
code:
type: string
example: "extra_forbidden"
description: "This field denotes a computer-readable identifier of the error type."
target:
type: string
example: "ios.alert.metrics"
description: "This field denotes the specific key parameter that triggered the validation error."
message:
type: string
example: "Extra inputs are not permitted"
description: "This field denotes a human-readable explanation of the error."
# For 400 Bad Request - Includes details array
ErrorResponseWithDetails:
type: object
properties:
error:
type: object
properties:
code:
type: string
example: "PayloadError"
description: "Each error code is unique and serves as a shorthand representation for the type of error, providing a quick reference that can be used to diagnose, troubleshoot, and address the problem based on a predefined set of error conditions."
message:
type: string
example: "Mandatory fields are missing or invalid"
description: "This field contains the message that denotes the type of error."
details:
type: array
description: "This object contains the error details. This field is applicable only for 400 error responses."
items:
$ref: '#/components/schemas/ErrorDetail'
# For 401, 403, 413, 500 - Does NOT include details array
BasicErrorResponse:
type: object
properties:
error:
type: object
properties:
code:
type: string
example: "AuthError"
description: "Each error code is unique and serves as a shorthand representation for the type of error, providing a quick reference that can be used to diagnose, troubleshoot, and address the problem based on a predefined set of error conditions."
message:
type: string
example: "Invalid App Key"
description: "This field contains the message that denotes the type of error."
SuccessResponse:
type: object
properties:
data:
type: object
properties:
instance_id:
type: string
example: "1749822841120-57c5c617"
description: "This field denotes the instance ID."
message:
type: string
example: "success"
description: "This field denotes the success message."
AlertObject:
type: object
required: [title, body]
properties:
title:
type: string
description: "This field denotes the primary heading of the Live Activity alert shown on the device. It captures the user’s attention and conveys the core event or message."
subtitle:
type: string
description: "This field denotes the defined additional context or information for the alert."
body:
oneOf:
- type: string
- type: object
description: "This field denotes the main message content of the alert. The value can be a string or JSON object depending on the widget UI configuration in your iOS app."
sound:
type: string
description: "This field denotes the name of the sound file in your app's main bundle or in the Library/Sounds folder of your app's container directory. Specify the string as 'default' to play the system sound."
IOSStartPayload:
type: object
required: [attribute_type, attribute_info, content_state, alert]
properties:
dismissal_date:
type: integer
format: int64
description: "This field denotes the epoch timestamp (in seconds) at which the Live Activity should be automatically dismissed from the device. If omitted, the activity will persist until dismissed manually or replaced."
attribute_type:
type: string
description: "This field denotes the attribute type defined in your iOS application’s Live Activity schema. It represents the data model or struct registered in your app that dictates the format of the Live Activity’s attributes. This value must exactly match the class or struct name used in the app to ensure compatibility."
example: "LiveActivityAttributes"
attribute_info:
type: object
additionalProperties: true
description: "This field denotes a JSON object containing the values for the attributes declared in the `attribute_type`. It defines the static or contextual information to be displayed when the Live Activity starts, for example, match name, participants, or scorecard details."
content_state:
type: object
additionalProperties: true
description: "This field denotes a JSON object representing the dynamic, real-time state of the Live Activity. It contains the content that will update in real time on the user’s device, such as live scores, countdowns, or player stats. The keys and structure must correspond to the content state struct in your app’s Live Activity configuration."
alert:
$ref: '#/components/schemas/AlertObject'
description: "This field denotes a JSON object containing the textual content for the Live Activity’s push notification alert. This controls the user-facing message elements such as the title, subtitle, and body displayed when the activity is triggered."
IOSUpdatePayload:
type: object
required: [content_state, alert]
properties:
dismissal_date:
type: integer
format: int64
description: |
This field denotes the epoch timestamp (in seconds) at which the Live Activity should be automatically dismissed from the device. If omitted, the activity will persist until dismissed manually or replaced.
**Note:** If the specified time stamp is in the past, the live activity ends immediately.
stale_date:
type: integer
format: int64
description: "This field denotes the time at which the Live Activity’s content is considered outdated. The value must be specified as an epoch timestamp (in seconds). After this time, the system may choose to deprioritize or visually de-emphasize the Live Activity on the user’s device, but it will not dismiss it."
content_state:
type: object
additionalProperties: true
description: "This field denotes a JSON object representing the dynamic, real-time state of the Live Activity. It contains the content that will update in real time on the user’s device, such as live scores, countdowns, or player stats. The keys and structure must correspond to the content state struct in your app’s Live Activity configuration."
alert:
$ref: '#/components/schemas/AlertObject'
description: "This field denotes a JSON object containing the textual content for the Live Activity’s push notification alert. This controls the user-facing message elements such as the title, subtitle, and body displayed when the activity is triggered."
StartLiveActivityRequest:
type: object
required: [broadcast_live_activity_id, ios]
properties:
broadcast_live_activity_id:
type: string
description: "This field denotes the unique identifier for the broadcast Live Activity campaign. It links the broadcast request to a specific campaign previously created via the [Create Push Campaigns API](/api/create-campaigns/create-campaign) with the `BROADCAST_LIVE_ACTIVITY` delivery type."
instance_id:
type: string
description: "This field denotes a unique, optional identifier for a specific instance of the Live Activity. It can be used to differentiate between multiple broadcasts of the same activity or to avoid duplicate requests. For example, '1749822841120-57c5c617'."
ios:
$ref: '#/components/schemas/IOSStartPayload'
description: "This field denotes a JSON object containing iOS-specific content, configuration details, and metadata necessary for managing the Live Activity on iOS devices."
UpdateLiveActivityRequest:
type: object
required: [broadcast_live_activity_id, ios]
properties:
broadcast_live_activity_id:
type: string
description: "This field denotes the unique identifier for the broadcast Live Activity campaign. It links the broadcast request to a specific campaign previously created via the [Create Push Campaigns API](/api/create-campaigns/create-campaign) with the `BROADCAST_LIVE_ACTIVITY` delivery type."
instance_id:
type: string
description: "This field denotes a unique, optional identifier for a specific instance of the Live Activity. It can be used to differentiate between multiple broadcasts of the same activity or to avoid duplicate requests. Sample value:1749822841120-57c5c617."
ios:
$ref: '#/components/schemas/IOSUpdatePayload'
description: "This field denotes a JSON object containing iOS-specific content, configuration details, and metadata necessary for managing the Live Activity on iOS devices."
EndLiveActivityRequest:
type: object
required: [broadcast_live_activity_id, ios]
properties:
broadcast_live_activity_id:
type: string
description: "This field denotes the unique identifier for the broadcast Live Activity campaign. It links the broadcast request to a specific campaign previously created via the [Create Push Campaigns API](/api/create-campaigns/create-campaign) with the `BROADCAST_LIVE_ACTIVITY` delivery type."
instance_id:
type: string
description: "This field denotes a unique, optional identifier for a specific instance of the Live Activity. It can be used to differentiate between multiple broadcasts of the same activity or to avoid duplicate requests. Sample value:1749822841120-57c5c617. Optional unique identifier for this specific broadcast instance."
ios:
$ref: '#/components/schemas/IOSUpdatePayload'
description: "This field denotes a JSON object containing iOS-specific content, configuration details, and metadata necessary for managing the Live Activity on iOS devices."