openapi: 3.0.3
info:
title: MoEngage Data APIs
version: '1.0'
description: |-
This is a comprehensive OpenAPI specification for MoEngage's Data APIs, including User, Event, and Device management.
It's designed to power an interactive API playground on your new documentation site.
tags:
- name: User
description: Operations for creating, updating, retrieving, and managing user profiles.
- name: Event
description: Operations for tracking user events.
- name: Device
description: Operations for managing user devices.
- name: Tracking
description: Endpoints for tracking attribution and installs.
- name: Utilities
description: Utility endpoints for testing connections.
- name: File Imports
description: Operations for managing asynchronous file imports.
- name: Bulk
description: Operations for importing users and events in bulk.
- name: Webhooks
description: Incoming webhook specifications from MoEngage.
servers:
- url: 'https://api-{dc}.moengage.com/v1'
description: MoEngage Core 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:
- Authentication: []
paths:
# SECTION 1: USER
/customer/{app_id}:
post:
tags:
- User
summary: Track User
x-mint:
content: |
- For more information about trackable user attributes, reserved keys, and general data information, refer to the [Data Overview](https://www.moengage.com/docs/api/data/data-overview).
- If you have [Portfolio](/user-guide/settings/account/portfolio/portfolio) enabled for your workspace, you must pass `project_code` in the API endpoint. This identifies which project a user or event belongs to. For more information, refer to [Portfolio: Data Ingestion and Management](/user-guide/data/key-concepts/portfolio-data-ingestion-and-management).
#### Rate Limit
A single API request contains one or more user updates. Maintain a rate limit of 10,000 user updates per minute.
description: "This API adds or updates users and user properties in MoEngage. You can create a new user, create new user property, or update existing user properties of users."
parameters:
- name: app_id
in: path
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: VJ0GSMESHMQA3L7WV1EEK3UR
- name: X-Forwarded-For
in: header
required: false
description: |
The 'X-Forwarded-For' header is used to specify the IP address of the client that made the request. This header may be added by proxy servers or load balancers. The header value must contain the IP address of the original client that initiated the request. Multiple IP addresses may be specified in the header value, separated by commas.
schema:
type: string
example: "203.0.113.195"
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CreateUserRequest'
examples:
Standard Example:
summary: Sample cURL
value:
type: "customer"
customer_id: "john@example.com"
attributes:
name: "JohnDoe"
first_name: "John"
platforms:
- platform: "ANDROID"
active: "true"
User property as Date/Time:
summary: Example Payload
value:
type: "customer"
customer_id: "john@example.com"
update_existing_only: true
attributes:
points: 20
expiry_date: "2020-05-31T03:47:35Z"
super_user: true
user_persona: "browsers"
platforms:
- platform: "ANDROID"
active: "true"
User property as Array:
summary: Array Support
value:
type: "customer"
customer_id: "123"
attributes:
removeValueFromArrayField: {}
addValueToArrayField:
attribute1: ["abc", "def"]
attribute2: ["a"]
attribute3: ["123"]
platforms:
- platform: "iOS"
active: "true"
responses:
'200':
description: This response is returned when the request is processed successfully.
content:
application/json:
schema:
$ref: '#/components/schemas/GenericSuccess'
examples:
success_response:
summary: Success Response
value:
status: "success"
message: "Your request has been accepted and will be processed soon."
'400':
description: This response is returned when the required parameters are missing from the request, attributes are not found, and incorrect values are passed.
content:
application/json:
schema:
type: object
properties:
status:
type: string
description: This field contains the status of the request and specifies whether the request was a failure.
example: fail
error:
type: object
properties:
attribute:
type: string
description: "The attribute in the payload that caused the error."
message:
type: string
description: "A descriptive error message explaining why the request failed."
type:
type: string
description: 'The type or category of the error ("MissingAttributeError").'
request_id:
type: string
description: "A unique identifier for the request, useful for debugging."
examples:
missing_customer_id:
summary: Customer ID is missing in the payload
value:
status: "fail"
error:
attribute: "customer_id"
message: "customer_id is not found in the payload"
type: "MissingAttributeError"
request_id: "ZbPXtKFL"
empty_customer_id:
summary: Customer ID is empty
value:
status: "fail"
error:
attribute: "customer_id"
message: "customer_id can not be empty Unicode String"
type: "MissingAttributeError"
request_id: "VgjtLxTu"
array_field_error:
summary: Array field error
value:
status: "fail"
error:
attribute: "addValueToArrayField"
message: "Cannot add and remove 'first_name' at the same time"
type: "ArrayFieldError"
request_id: "WPDAbugh"
'401':
description: This response is returned when the request does not have valid authentication credentials.
content:
application/json:
schema:
type: object
properties:
status:
type: string
example: fail
error:
type: object
properties:
message:
type: string
description: "A descriptive error message explaining why the request failed."
type:
type: string
description: 'The type or category of the error (e.g., Authentication required).'
request_id:
type: string
description: "A unique identifier for the request, useful for debugging."
examples:
auth_error:
summary: Authorization errors
value:
status: "fail"
error:
message: "App Secret key mismatch. Please login to the dashboard to verify key"
type: "Authentication required"
request_id: "PVUDFisO"
missing_header:
summary: Missing authentication header
value:
status: "fail"
error:
message: "Authentication Header Required"
type: "Authentication required"
request_id: "PisPjGQQ"
'403':
description: This response is returned when your MoEngage account is suspended or blocked.
content:
application/json:
schema:
type: object
properties:
status:
type: string
example: fail
error:
type: object
properties:
message:
type: string
description: "A descriptive error message explaining why the request failed.(e.g., Your account is suspended. Please contact MoEngage team.)"
type:
type: string
description: "The type or category of the error (e.g., BlockedClient, Account Suspended, Account Temporarily Suspended)."
request_id:
type: string
description: "A unique identifier for the request, useful for debugging."
examples:
account_blocked:
summary: Account is blocked
value:
status: "fail"
error:
message: "Your account is blocked. Please contact MoEngage team."
type: "BlockedClient"
request_id: "Block123"
account_suspended:
summary: Account is suspended
value:
status: "fail"
error:
message: "Your account is suspended. Please contact MoEngage team."
type: "Account Suspended"
request_id: "Susp123"
temp_suspended:
summary: Account is temporarily suspended
value:
status: "fail"
error:
message: "Your account is temporarily suspended due to payment issues."
type: "Account Temporarily Suspended"
request_id: "TempSusp123"
'413':
description: This response is returned when the payload size exceeds 128 KB.
content:
application/json:
schema:
type: object
properties:
status:
type: string
example: fail
error:
type: object
properties:
message:
type: string
description: "A descriptive error message explaining why the request failed."
type:
type: string
description: "The type or category of the error (e.g., Payload too large)."
request_id:
type: string
description: "A unique identifier for the request, useful for debugging."
examples:
payload_exceeded:
summary: Payloads exceeding the size limit
value:
status: "fail"
error:
message: "Payload size exceeds 128 KB"
type: "PayloadTooLarge"
request_id: "VFzDwhwt"
'415':
description: This response is returned when the content type is not supported.
content:
application/json:
schema:
type: object
properties:
status:
type: string
example: fail
error:
type: object
properties:
message:
type: string
description: "A descriptive error message explaining why the request failed."
type:
type: string
description: "The type or category of the error (e.g., Unsupported media type)."
request_id:
type: string
description: "A unique identifier for the request, useful for debugging."
examples:
unsupported_media_type:
summary: Unsupported media type
value:
status: "fail"
error:
message: "Unsupported Media Type"
type: "MediaTypeError"
request_id: "SgBQfKJh"
'429':
description: This response is returned when the number of requests has exceeded the rate limit.
content:
application/json:
schema:
type: object
properties:
status:
type: string
example: fail
error:
type: object
properties:
message:
type: string
description: "A descriptive error message explaining why the request failed."
type:
type: string
description: "The type or category of the error (e.g., Rate Limits Exceeded)."
request_id:
type: string
description: "A unique identifier for the request, useful for debugging."
examples:
rate_limit:
summary: Rate limit breach
value:
status: "fail"
error:
message: "Rate limit exceeded"
type: "RateLimitError"
request_id: "onqucLYL"
'500':
description: This response is returned when the system runs into an unexpected error.
content:
application/json:
schema:
type: object
properties:
status:
type: string
example: fail
error:
type: object
properties:
message:
type: string
description: "A descriptive error message explaining why the request failed."
type:
type: string
description: "The type or category of the error (e.g., Server Error)."
request_id:
type: string
description: "A unique identifier for the request, useful for debugging."
examples:
unknown_error:
summary: Unknown errors
value:
status: "fail"
error:
message: "Internal Server Error"
type: "ServerError"
request_id: "KovrwJiF"
/customers/export:
post:
tags:
- User
summary: Get User
x-mint:
content: |
#### Rate Limit
The rate limit is 20 users per payload and 1000 users per minute.
description: This API facilitates the retrieval of information of users by specifying the user IDs.
parameters:
- name: app_id
in: query
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: VJ0GSMESHMQA3L7WV1EEK3UR
- name: X-Forwarded-For
in: header
required: false
description: "The 'X-Forwarded-For' header is used to specify the IP address of the client that made the request. This header may be added by proxy servers or load balancers. The header value must contain the IP address of the original client that initiated the request. Multiple IP addresses may be specified in the header value, separated by commas."
schema:
type: string
example: "203.0.113.195"
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/GetUserRequest'
examples:
export_users:
summary: Export users by identifiers
value:
data:
identifiers:
- identifier_type: customer_id
identifier: "6416d1a318r98264512c0f89"
- identifier_type: id
identifier: "62e79fb15ada55x123g987bu"
user_fields_to_export:
- last_name
- customer_id
- name
responses:
'200':
description: This response is returned when the request is processed successfully.
content:
application/json:
schema:
type: object
properties:
status:
type: string
description: "This field contains the status of the request and specifies whether the request was successful. Supported values are : \"success\", \"failure\""
example: success
type:
type: string
description: "This field denotes the fetch type. Supported values are: \"export_users\"."
example: export_users
data:
type: object
description: |
This field contains the list of users who were not found in MoEngage and returns the data specified for the list of users who were found in MoEngage.
This is the structure:
```json
{
"users_not_found": [
{
"identifier_type": "customer_id",
"identifier": ""
}
],
"users": [
{
"user_attributes": {
""
}
}
]
}
```
properties:
users_not_found:
type: array
description: "An array of JSON Objects that contains the list of users who were not found in MoEngage."
items:
$ref: '#/components/schemas/IdentifierObject'
users:
type: array
description: "Contains the user_attributes specified in the request for each user in specified in the request."
items:
type: object
properties:
user_attributes:
type: object
additionalProperties: true
example:
last_name: Doe
customer_id: john_doe
id: 62e79fb15ada55x123g987bu
examples:
success_response:
summary: Success Response
value:
status: "success"
type: "export_users"
data:
users_not_found:
- identifier_type: "customer_id"
identifier: "john_doe"
users:
- user_attributes:
last_name: "Doe"
customer_id: "john_doe"
name: "John"
custom_user_attr: 12345
id: "62e79fb15ada55x123g987bu"
'400':
description: "This response is returned when the required parameters APP KEY, user_id, and so on are missing from the request or when the provided params are invalid."
content:
application/json:
schema:
type: object
properties:
status:
type: string
description: This field contains the status of the request and specifies whether the request was a failure.
example: fail
error:
type: object
properties:
message:
type: string
description: "A descriptive error message explaining why the request failed."
type:
type: string
description: "The type or category of the error (\"MissingAttributeError, Malformed JSON, LimitBreached\")."
request_id:
type: string
description: "A unique identifier for the request, useful for debugging."
attribute:
type: string
description: "The attribute in the payload that caused the error."
examples:
missing_identifiers:
summary: Identifiers are missing in the request
value:
status: "fail"
error:
attribute: "identifiers"
message: "identifiers is not found in the payload"
type: "MissingAttributeError"
request_id: "UkBwaUmU"
data_missing:
summary: Data is missing in the request
value:
status: "fail"
error:
attribute: "data"
message: "data is not found in the payload"
type: "MissingAttributeError"
request_id: "DataMiss2"
incorrect_json:
summary: JSON is incorrect in the request
value:
status: "fail"
error:
message: "Could not decode the request body. The JSON was incorrect or not encoded as UTF-8."
type: "Malformed JSON"
request_id: "NphDCzWk"
limit_exceeded:
summary: Users exceeds the allowed limit in the request
value:
status: "fail"
error:
attribute: "users"
message: "max limit allowed is 20"
type: "LimitBreached"
request_id: "LimitX4"
'401':
description: Unauthorized.
content:
application/json:
schema:
type: object
properties:
status:
type: string
description: This field contains the status of the request and specifies whether the request was a failure.
example: fail
error:
type: object
properties:
message:
type: string
description: "A descriptive error message explaining why the request failed."
type:
type: string
description: 'The type or category of the error (e.g., Authentication required).'
request_id:
type: string
description: "A unique identifier for the request, useful for debugging."
examples:
auth_error:
summary: Authorization errors
value:
status: "fail"
error:
message: "App Secret key mismatch. Please login to the dashboard to verify key"
type: "Authentication required"
request_id: "PVUDFisO"
missing_header:
summary: Missing authentication header
value:
status: "fail"
error:
message: "Authentication Header Required"
type: "Authentication required"
request_id: "PisPjGQQ"
'403':
description: This response is returned when your MoEngage account is suspended or blocked.
content:
application/json:
schema:
type: object
properties:
status:
type: string
description: This field contains the status of the request and specifies whether the request was a failure.
example: fail
error:
type: object
properties:
message:
type: string
description: "A descriptive error message explaining why the request failed.(e.g., Your account is suspended. Please contact MoEngage team.)"
type:
type: string
description: "The type or category of the error (e.g., BlockedClient, Account Suspended, Account Temporarily Suspended)."
request_id:
type: string
description: "A unique identifier for the request, useful for debugging."
examples:
account_blocked:
summary: Sample response for when your account is blocked
value:
status: "fail"
error:
message: "Your account is suspended. Please contact MoEngage team."
type: "BlockedClient"
request_id: "ofHUEaEQ"
account_suspended:
summary: Sample response for when your account is suspended
value:
status: "fail"
error:
message: "Your account is suspended. Please contact MoEngage team."
type: "Account Suspended"
request_id: "gqJvCNYu"
temp_suspended:
summary: Sample response for when your account is temporarily suspended
value:
status: "fail"
error:
message: "Your account is temporarily suspended. Please contact MoEngage team."
type: "Account Temporarily Suspended"
request_id: "ssSJjoyD"
'413':
description: This response is returned when the payload size exceeds 128 KB.
content:
application/json:
schema:
type: object
properties:
status:
type: string
description: This field contains the status of the request and specifies whether the request was a failure.
example: fail
error:
type: object
properties:
message:
type: string
description: "A descriptive error message explaining why the request failed."
type:
type: string
description: "The type or category of the error (e.g., Payload too large)."
request_id:
type: string
description: "A unique identifier for the request, useful for debugging."
examples:
payload_exceeded:
summary: Payloads exceeding the size limit
value:
status: "fail"
error:
message: "Payload size exceeds 128 KB"
type: "PayloadTooLarge"
request_id: "VFzDwhwt"
'415':
description: This response is returned when the content type is not supported.
content:
application/json:
schema:
type: object
properties:
status:
type: string
description: This field contains the status of the request and specifies whether the request was a failure.
example: fail
error:
type: object
properties:
message:
type: string
description: "A descriptive error message explaining why the request failed."
type:
type: string
description: "The type or category of the error (e.g., Unsupported media type)."
request_id:
type: string
description: "A unique identifier for the request, useful for debugging."
examples:
unsupported_media_type:
summary: Unsupported media type
value:
status: "fail"
error:
message: "Unsupported Media Type"
type: "MediaTypeError"
request_id: "SgBQfKJh"
'429':
description: This response is returned when the number of requests has exceeded the rate limit.
content:
application/json:
schema:
type: object
properties:
status:
type: string
description: This field contains the status of the request and specifies whether the request was a failure.
example: fail
error:
type: object
properties:
message:
type: string
description: "A descriptive error message explaining why the request failed."
type:
type: string
description: "The type or category of the error (e.g., Rate Limits Exceeded)."
request_id:
type: string
description: "A unique identifier for the request, useful for debugging."
examples:
rate_limit:
summary: Rate limit breach
value:
status: "fail"
error:
message: "Rate limit exceeded"
type: "RateLimitError"
request_id: "onqucLYL"
'500':
description: This response is returned when the system runs into an unexpected error.
content:
application/json:
schema:
type: object
properties:
status:
type: string
description: This field contains the status of the request and specifies whether the request was a failure.
example: fail
error:
type: object
properties:
message:
type: string
description: "A descriptive error message explaining why the request failed."
type:
type: string
description: "The type or category of the error (e.g., Server Error)."
request_id:
type: string
description: "A unique identifier for the request, useful for debugging."
examples:
unknown_error:
summary: Unknown errors
value:
status: "fail"
error:
message: "Internal Server Error"
type: "ServerError"
request_id: "KovrwJiF"
/customer/merge:
post:
tags:
- User
summary: Merge Users
x-mint:
content: |
#### Types of user merging in MoEngage
* Default or normal merge:
* MoEngage merges users with the same ID.
* Happens automatically, and no action is required from your side.
* Manual merge:
* MoEngage merges users having different IDs.
* Does not happen automatically; you must call the Merge User API with the list of users to be merged along with their IDs.
* User Merging is a complex functionality and, if misused, can lead to data integrity issues. If the data passed to the API is incorrect, resulting in a merge of two unintended users, MoEngage will not be able to recover/rectify the data. The retained user would have erroneous data, and segmentation queries would not provide the right results.
* MoEngage does not support transitive/canonical merging. For example, if user A is merged to B (A ->B) and then user B is merged to C (B ->C), in this scenario, events of user A are not moved to user C.
* The Merge User API is not functional in workspaces where the [Identity Resolution](/user-guide/data/user-data/unified-identity-identity-resolution) feature is enabled.
* If you are updating the [Unique Identifier](/developer-guide/unity-sdk/data-tracking/tracking-user-attributes) for a user, use the Merge User API at least 2 hours after you have updated the Unique Identifier.
* Ensure that the data passed to the API is accurate. We recommend you test the merging starting with a small batch of users, such as 1, 5, 10, 20, 50, etc. Verify the merged data and users before proceeding with a bulk update.
* A maximum of 50 users can be merged in a single call.
* Payload size should not exceed 128 KB.
#### Rate limit
The rate limit is 1000 user updates per minute.
description: This API merges two users in MoEngage based on their ID, which is a client-defined identifier for a user. You can use this API when multiple profiles have been created for a single user. For example, you can merge a user registered once with a mobile number and once with an email ID. You can also merge duplicate users created due to integration or tech issues.
parameters:
- name: app_id
in: query
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
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/MergeUserRequest'
responses:
'200':
description: This response is returned when the request is processed successfully.
content:
application/json:
schema:
type: object
properties:
status:
type: string
description: "This field contains the status of the request and specifies whether the request was successful. Supported values are : \"success\", \"failure\""
example: success
operation:
type: string
description: This field contains “created” when there is no error in the payload, and the user merge is successful.
example: created
examples:
success_response:
summary: Successful request
value:
status: "success"
operation: "created"
'400':
description: "This response is returned when the required parameters are missing from the request or when the provided parameters are invalid."
content:
application/json:
schema:
type: object
properties:
status:
type: string
description: This field contains the status of the request and specifies whether the request was a failure.
example: fail
error:
type: object
properties:
message:
type: string
description: "A descriptive error message explaining why the request failed."
type:
type: string
description: "The type or category of the error (e.g., Malformed JSON)."
request_id:
type: string
description: "A unique identifier for the request, useful for debugging."
examples:
malformed_json:
summary: Malformed JSON request
value:
status: "fail"
error:
message: "Could not decode the request body. The JSON was incorrect or not encoded as UTF-8."
type: "Malformed JSON"
request_id: "pIvbWnGT"
app_blacklisted:
summary: App blacklisted by MoEngage
value:
status: "fail"
error:
message: "Your account is blacklisted, Please contact MoEngage."
type: "Blacklisted"
request_id: "pIvbWnGT"
invalid_workspaceid:
summary: Invalid Workspace ID in request parameter
value:
status: "fail"
error:
message: "given app_id is invalid/blocked"
type: "InvalidParams"
request_id: "pIvbWnGT"
missing_workspaceid:
summary: Workspace ID not present in the Request Parameter
value:
status: "fail"
error:
message: "app_id is required in path/query params."
type: "ParamsRequired"
request_id: "pIvbWnGT"
invalid_payload:
summary: Workspace ID not present in the Request Parameter
value:
status: "fail"
error:
message: "A valid JSON document is required."
type: "Body type is not JSON"
request_id: "pIvbWnGT"
empty_request:
summary: Empty request body
value:
status: "fail"
error:
message: "A valid JSON document is required."
type: "Body type is not JSON"
request_id: "pIvbWnGT"
invalid_datatype:
summary: Invalid datatype
value:
status: "fail"
error:
attribute: "merged_user"
message: "merged_user is expected to be String or Unicode String."
type: "MissingAttributeError"
request_id: "dBSEscwl"
missing_contenttype:
summary: Content type header is missing in the request
value:
status: "fail"
error:
message: "The Content-Type Header is required."
type: "Missing header value"
request_id: "pIvbWnGT"
suspended_account:
summary: Suspended MoEngage account used in the request
value:
status: "fail"
error:
message: "Account Suspended."
type: "Account Suspended"
request_id: "pIvbWnGT"
'401':
description: This response is returned when the authorization fails due to incorrect values for the APP KEY/ HTTP Auth Header.
content:
application/json:
schema:
type: object
properties:
status:
type: string
description: This field contains the status of the request and specifies whether the request was a failure.
example: fail
error:
type: object
properties:
message:
type: string
description: "A descriptive error message explaining why the request failed."
type:
type: string
description: 'The type or category of the error (e.g., Authentication required).'
request_id:
type: string
description: "A unique identifier for the request, useful for debugging."
examples:
incorrect_header:
summary: Incorrect values for the APP KEY/ HTTP Auth Header
value:
status: "fail"
error:
message: "MOE_APPKEY doesn't match the Username (APP_KEY) used in Basic Auth authorization."
type: "Authentication required"
request_id: "pIvbWnGT"
missing_header:
summary: Missing APP KEY in HTTP Auth Header
value:
status: "fail"
error:
message: "MOE-APPKEY is missing in Header"
type: "Authentication required"
request_id: "pIvbWnGT"
missing_appsecret:
summary: Missing APP SECRET in HTTP Auth Header
value:
status: "fail"
error:
message: "MOE-APPKEY is missing in Header"
type: "Authentication required"
request_id: "pIvbWnGT"
missing_username:
summary: Username is not provided in the Auth header
value:
status: "fail"
error:
message: "Username (APP_KEY) is missing in the Basic Auth authorization."
type: "Authentication required"
request_id: "pIvbWnGT"
missing_password:
summary: Password is not provided in the Auth header
value:
status: "fail"
error:
message: "Password (APP_SECRET) is missing in the Basic Auth authorization."
type: "Authentication required"
request_id: "pIvbWnGT"
invalid_auth:
summary: Other authorization type is used instead of Basic Auth
value:
status: "fail"
error:
message: "Invalid authorization used. MoEngage only supports 'Basic Auth' authorization."
type: "Authentication required"
request_id: "pIvbWnGT"
missing_authdetails:
summary: Authorization details are missing in the header
value:
status: "fail"
error:
message: "Authorization details are missing"
type: "Authentication required"
request_id: "pIvbWnGT"
invalid_appkey:
summary: Invalid APP Secret key in Authorization Header
value:
status: "fail"
error:
message: "App Secret key mismatch. Please login to the dashboard to verify key"
type: "Authentication required"
request_id: "JooAzchF"
incorrect_appkey:
summary: Incorrect APP KEY
value:
status: "fail"
error:
message: "Password (APP_KEY) doesn't match the one available on the dashboard. Kindly ensure the same APP_KEY available on the dashboard is used."
type: "Authentication required"
request_id: "pIvbWnGT"
'403':
description: This response is returned when the user account that is being merged has been suspended temporarily.
content:
application/json:
schema:
type: object
properties:
status:
type: string
description: This field contains the status of the request and specifies whether the request was a failure.
example: fail
error:
type: object
properties:
message:
type: string
description: "A descriptive error message explaining why the request failed.(e.g., Your account is suspended. Please contact MoEngage team.)"
type:
type: string
description: "The type or category of the error (e.g., Account Temporarily Suspended)."
request_id:
type: string
description: "A unique identifier for the request, useful for debugging."
examples:
account_suspension:
summary: Temporary account suspension
value:
status: "fail"
error:
message: "Account Temporarily Suspended."
type: "Account Temporarily Suspended."
request_id: "pIvbWnGT"
'409':
description: This response is returned when the authorization fails due to the APP SECRET key not being set on the Dashboard.
content:
application/json:
schema:
type: object
properties:
status:
type: string
description: This field contains the status of the request and specifies whether the request was a failure.
example: fail
error:
type: object
properties:
message:
type: string
description: "A descriptive error message explaining why the request failed."
type:
type: string
description: "The type or category of the error (e.g., Authentication required)."
request_id:
type: string
description: "A unique identifier for the request, useful for debugging."
examples:
authorization_errors:
summary: Authorization errors due to APP SECRET not being set in the Dashboard
value:
status: "fail"
error:
message: "App Secret key is not set. Please login to the dashboard to set a key."
type: "Authentication required."
request_id: "pIvbWnGT"
appkey_mismatch:
summary: Mismatch in the app id sent in the request parameter and the authorization header
value:
status: "fail"
error:
message: "App key mismatch in params and authentication."
type: "Authentication required."
request_id: "WNqwxfwM"
'413':
description: TThis response is returned when the payload size has exceeded the limit set.
content:
application/json:
schema:
type: object
properties:
status:
type: string
description: This field contains the status of the request and specifies whether the request was a failure.
example: fail
error:
type: object
properties:
message:
type: string
description: "A descriptive error message explaining why the request failed."
type:
type: string
description: "The type or category of the error (e.g., Payload too large)."
request_id:
type: string
description: "A unique identifier for the request, useful for debugging."
examples:
payload_exceeded:
summary: Request Payload Size Exceeded
value:
status: "fail"
error:
message: "The payload can not exceed 128KB"
type: "PayloadTooLarge"
request_id: "VFzDwhwt"
'415':
description: This response is returned when the header “Content-Type” is not provided/is not supported.
content:
application/json:
schema:
type: object
properties:
status:
type: string
description: This field contains the status of the request and specifies whether the request was a failure.
example: fail
error:
type: object
properties:
message:
type: string
description: "A descriptive error message explaining why the request failed."
type:
type: string
description: "The type or category of the error (e.g., Unsupported media type)."
request_id:
type: string
description: "A unique identifier for the request, useful for debugging."
examples:
unsupported_media_type:
summary: Unsupported Media Type
value:
status: "fail"
error:
message: "The header 'Content-Type' is missing. Kindly provide the header 'Content-Type' and set it as 'application/json'"
type: "MediaTypeError"
request_id: "SgBQfKJh"
'429':
description: This response is returned when the number of requests per minute has exceeded the rate limit.
content:
application/json:
schema:
type: object
properties:
status:
type: string
description: This field contains the status of the request and specifies whether the request was a failure.
example: fail
error:
type: object
properties:
message:
type: string
description: "A descriptive error message explaining why the request failed."
type:
type: string
description: "The type or category of the error (e.g., Rate Limits Exceeded)."
request_id:
type: string
description: "A unique identifier for the request, useful for debugging."
examples:
rate_limit:
summary: Rate limit breach
value:
status: "fail"
error:
message: "Rate limit exceeded"
type: "RateLimitError"
request_id: "onqucLYL"
'500':
description: This response is returned when the system runs into an unexpected error.
content:
application/json:
schema:
type: object
properties:
status:
type: string
description: This field contains the status of the request and specifies whether the request was a failure.
example: fail
error:
type: object
properties:
message:
type: string
description: "A descriptive error message explaining why the request failed."
type:
type: string
description: "The type or category of the error (e.g., Server Error)."
request_id:
type: string
description: "A unique identifier for the request, useful for debugging."
examples:
unknown_error:
summary: Unknown errors
value:
status: "fail"
error:
message: "An unexpected error was encountered while processing this request. Please contact MoEngage Team"
type: "ServerError"
request_id: "KovrwJiF"
/customer/delete:
post:
tags:
- User
summary: Delete Users
x-mint:
content: |
#### Rate Limit
The rate limit is 1 user per payload per request. You can run 5000 requests per minute.
description: |
This API deletes users in MoEngage. You cannot retrieve users once deleted. Users deleted (hard delete) using this API will be deleted after a default buffer of 24 hours. During this buffer period, the user will still be active in MoEngage and will be visible in Segments, Analytics, and Campaigns. You can update users in the buffer period. After the buffer elapses, the user is hard-deleted from MoEngage. If you create a user with the same unique identifiers as the deleted one in MoEngage (through APIs or imports), they will be created again in MoEngage.
parameters:
- name: app_id
in: query
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: VJ0GSMESHMQA3L7WV1EEK3UR
- name: X-Forwarded-For
in: header
required: false
description: "The 'X-Forwarded-For' header is used to specify the IP address of the client that made the request. This header may be added by proxy servers or load balancers. The header value must contain the IP address of the original client that initiated the request. Multiple IP addresses may be specified in the header value, separated by commas."
schema:
type: string
example: "203.0.113.195"
requestBody:
required: true
content:
application/json:
schema:
properties:
identity_type:
type: string
enum: [customer_id, id]
description: This field specifies the identifier type. Identifier types can either be customer_id (ID field in the User Profile) or moengage_id (the MoEngageID of the user in the User Profile). Allowed values are "moengage_id", "customer_id".
example: customer_id
identity_value:
type: string
description: This field specifies the unique identifier that identifies the user.
example: 6416d1a318r98264512c0f89
responses:
'200':
description: This response is returned when the request is processed successfully.
content:
application/json:
schema:
type: object
properties:
status:
type: string
description: "This field contains the status of the request and specifies whether the request was successful. Supported values are success, fail"
example: success
message:
type: string
description: This field contains information about whether the response is being processed, the user is deleted, and so on.
example: Your request has been accepted and will be processed soon
examples:
success_response:
summary: Successful request
value:
status: "success"
message: "Your request has been accepted and will be processed soon."
'400':
description: "This response is returned when the required parameters APP KEY, user_id, etc are missing from the request or when the provided params are invalid."
content:
application/json:
schema:
type: object
properties:
status:
type: string
description: This field contains the status of the request and specifies whether the request was successful. Supported values are success, fail
example: fail
error:
type: object
properties:
message:
type: string
description: "This field contains the error message and describes the reason for the error."
type:
type: string
description: "The type or category of the error (e.g., Authentication Required, Invalid Params)."
request_id:
type: string
description: "A unique identifier for the request, useful for debugging."
examples:
bad_request:
summary: Bad Requests
value:
status: "fail"
error:
message: "User doesn't exists with customer id b3XSJ7iXvqlCcrYGd5SB5m2m93eG9-9e9HPXd9GtufHvHueWm-mnuiAxUk7DGI1MKg=="
type: "Not Found"
request_id: "bYvNTyWb"
'401':
description: This response is returned when the authorization fails due to incorrect values for the APP KEY/ HTTP Auth Header.
content:
application/json:
schema:
type: object
properties:
status:
type: string
description: This field contains the status of the request and specifies whether the request was successful. Supported values are success, fail
example: fail
error:
type: object
properties:
message:
type: string
description: "This field contains the error message and describes the reason for the error"
type:
type: string
description: 'The type or category of the error (e.g., Authentication Required, Invalid Params).'
request_id:
type: string
description: "A unique identifier for the request, useful for debugging."
examples:
authorization_error:
summary: Authorization Errors
value:
status: "fail"
error:
message: "App Secret key mismatch. Please login to the dashboard to verify key"
type: "Authentication required"
request_id: "pIvbWnGT"
'403':
description: This response is returned when your MoEngage account has been blocked or suspended.
content:
application/json:
schema:
type: object
properties:
status:
type: string
description: This field contains the status of the request and specifies whether the request was successful. Supported values are success, fail
example: fail
error:
type: object
properties:
message:
type: string
description: This field contains the error message and describes the reason for the error
type:
type: string
description: "The type or category of the error (e.g., Authentication Required, Invalid Params)."
request_id:
type: string
description: "A unique identifier for the request, useful for debugging."
examples:
appid_invalid:
summary: Blocked/Suspended Accounts
value:
status: "fail"
error:
message: "given app_id is invalid/blocked"
type: "InvalidParams"
request_id: "pIvbWnGT"
'429':
description: This response is returned when the number of requests per minute has exceeded the rate limit.
content:
application/json:
schema:
type: object
properties:
title:
type: string
description: This field is present in the response in the case of 429 and 5xx errors and contains the type of error.
description:
type: string
description: This field is present in the response in the case of 429 and 5xx errors and contains the error description.
examples:
rate_limit:
summary: Rate limit breach
value:
status: "fail"
title: "Rate limit exceeded"
description: "Exceeded rate limit for this url"
'500':
description: This response is returned when the system runs into an unexpected error.
content:
application/json:
schema:
type: object
properties:
title:
type: string
description: This field is present in the response in the case of 429 and 5xx errors and contains the type of error.
description:
type: string
description: This field is present in the response in the case of 429 and 5xx errors and contains the error description.
examples:
unknown_error:
summary: Unknown errors
value:
status: "fail"
title: "Internal Error"
description: "Please contact the MoEngage team."
# SECTION 2: EVENT
/event/{Workspace_ID}:
post:
tags:
- Event
summary: Track Event
x-mint:
content: |
* If you have [Portfolio](/user-guide/settings/account/portfolio/portfolio) enabled for your workspace, you need to pass project_code in the API endpoint. This identifies which project a user or event belongs to. For more information, refer to [Portfolio: Data Ingestion and Management](/user-guide/data/key-concepts/portfolio-data-ingestion-and-management).
* MoEngage does not accept any future dated events.
#### Rate Limit
A single API request contains one or more events. Maintain a rate limit of 30,000 events per minute.
description: This API tracks the actions of a user.
parameters:
- name: Workspace_ID
in: path
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: OAPQQ2AMD01MJZYZX1YPG
- name: X-Forwarded-For
in: header
required: false
description: "The 'X-Forwarded-For' header is used to specify the IP address of the client that made the request. This header may be added by proxy servers or load balancers. The header value must contain the IP address of the original client that initiated the request. Multiple IP addresses may be specified in the header value, separated by commas."
schema:
type: string
example: "203.0.113.195"
requestBody:
description: |
**Note**: You cannot use “moe_” as a prefix while naming events, event attributes, or user attributes. It is a system prefix and using it might result in periodic blacklisting without prior communication.
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CreateEventRequest'
examples:
Standard Example:
summary: Sample cURL
value:
type: "event"
customer_id: "123"
actions:
- action: "ProductAdded"
attributes:
product: "Accessories"
color: "Black"
Brand: "Adidas"
platform: "Android"
app_version: "1.2.3"
user_time: "1708939453396"
current_time: "1708939453396"
Event property as Date/Time:
summary: Example Payload
value:
type: "event"
customer_id: "john@example.com"
actions:
- action: "Flight Booked"
attributes:
price: 3999
departure_date: "2019-05-21T03:47:35Z"
premium_seat: true
platform: "iOS"
app_version: "1.2.3"
current_time: 1433837969
user_timezone_offset: 19800
Event property as Array:
summary: Array Support
value:
type: "event"
customer_id: "John"
actions:
- action: "product_selected"
attributes:
product: "Shirt"
color: "Green"
arraySupport: ["abc", "xyz"]
Brand: "Adidas"
platform: "TV"
moe_os_type: "Xbox"
app_version: "1.2.3"
user_time: "1710740192"
current_time: "1710740192"
Using User Identifiers:
summary: User Identity Resolution
value:
type: "event"
user_identifiers:
moe_mobile: "{{Mobile_Number}}"
actions:
- action: "product_selected"
attributes:
product: "Shirt"
color: "Green"
moe_os_type: "Xbox"
arraySupport: ["abc", "xyz"]
Brand: "Adidas"
platform: "TV"
app_version: "1.2.3"
user_time: "1710740192"
current_time: "1710740192"
responses:
'200':
description: This response is returned when the request is processed successfully.
content:
application/json:
schema:
$ref: '#/components/schemas/GenericSuccess'
examples:
success_response:
summary: Success Response
value:
status: "success"
message: "Your request has been accepted and will be processed soon."
'400':
description: This response is returned when the required parameters are missing from the request, attributes are not found, and incorrect values are passed.
content:
application/json:
schema:
type: object
properties:
status:
type: string
example: fail
error:
type: object
properties:
message:
type: string
description: "A descriptive error message explaining why the request failed."
type:
type: string
description: 'The type or category of the error ("MissingAttributeError").'
request_id:
type: string
description: "A unique identifier for the request, useful for debugging."
attribute:
type: string
description: "The attribute in the payload that caused the error."
examples:
missing_actions:
summary: The actions are sent as an empty list
value:
status: "fail"
error:
attribute: "actions"
message: "actions can not be empty Array"
type: "MissingAttributeError"
request_id: "izsZuQNw"
missing_customer_id:
summary: Customer_id or user_alias is missing
value:
status: "fail"
error:
attribute: "customer_id"
message: "customer_id is not found in the payload"
type: "MissingAttributeError"
request_id: "TtnwRNrU"
incorrect_json:
summary: The elements in actions are not in json format
value:
status: "fail"
error:
message: "Could not decode the request body. The JSON was incorrect or not encoded as UTF-8."
type: "Malformed JSON"
request_id: "USkbHpIK"
missing_actionkey:
summary: Action key is not present, or if it is not in string or unicode string format
value:
status: "fail"
error:
attribute: "action"
message: "action is not found in the payload"
type: "MissingAttributeError"
request_id: "TgzuJhcj"
incorrect_action:
summary: Action key is not sent as a string
value:
status: "fail"
error:
attribute: "action"
message: "Could not decode the request body. The JSON was incorrect or not encoded as UTF-8."
type: "Malformed JSON"
request_id: "TgzuJhcj"
'401':
description: This response is returned when the authentication error occurs.
content:
application/json:
schema:
type: object
properties:
status:
type: string
example: fail
error:
type: object
properties:
message:
type: string
description: "A descriptive error message explaining why the request failed."
type:
type: string
description: 'The type or category of the error (e.g., Authentication required).'
request_id:
type: string
description: "A unique identifier for the request, useful for debugging."
examples:
auth_error:
summary: Authorization errors
value:
status: "fail"
error:
message: "App Secret key mismatch. Please login to the dashboard to verify key"
type: "Authentication required"
request_id: "PVUDFisO"
missing_header:
summary: Missing authentication header
value:
status: "fail"
error:
message: "Authentication Header Required"
type: "Authentication required"
request_id: "PisPjGQQ"
'403':
description: This response is returned when your MoEngage account is suspended or blocked.
content:
application/json:
schema:
type: object
properties:
status:
type: string
example: fail
error:
type: object
properties:
message:
type: string
description: "A descriptive error message explaining why the request failed.(e.g., Your account is suspended. Please contact MoEngage team.)"
type:
type: string
description: "The type or category of the error (e.g., BlockedClient, Account Suspended, Account Temporarily Suspended)."
request_id:
type: string
description: "A unique identifier for the request, useful for debugging."
examples:
account_blocked:
summary: Account is blocked
value:
status: "fail"
error:
message: "Your account is suspended. Please contact MoEngage team."
type: "BlockedClient"
request_id: "Block123"
account_suspended:
summary: Account is suspended
value:
status: "fail"
error:
message: "Your account is suspended. Please contact MoEngage team."
type: "Account Suspended"
request_id: "gqJvCNYu3"
temp_suspended:
summary: Account is temporarily suspended
value:
status: "fail"
error:
message: "Your account is temporarily suspended. Please contact MoEngage team."
type: "Account Temporarily Suspended"
request_id: "ssSJjoyD"
'413':
description: This response is returned when the payload size exceeds the size limit.
content:
application/json:
schema:
type: object
properties:
status:
type: string
example: fail
error:
type: object
properties:
message:
type: string
description: "A descriptive error message explaining why the request failed."
type:
type: string
description: "The type or category of the error (e.g., Payload too large)."
request_id:
type: string
description: "A unique identifier for the request, useful for debugging."
examples:
payload_exceeded:
summary: Payloads exceeding the size limit
value:
status: "fail"
error:
message: "Payload size exceeds 128 KB"
type: "PayloadTooLarge"
request_id: "VFzDwhwt"
'415':
description: This response is returned when the content type is not supported.
content:
application/json:
schema:
type: object
properties:
status:
type: string
example: fail
error:
type: object
properties:
message:
type: string
description: "A descriptive error message explaining why the request failed."
type:
type: string
description: "The type or category of the error (e.g., Unsupported media type)."
request_id:
type: string
description: "A unique identifier for the request, useful for debugging."
examples:
unsupported_media_type:
summary: Unsupported media type
value:
status: "fail"
error:
message: "Content type is not supported"
type: "Unsupported media type"
request_id: "SgBQfKJh"
'429':
description: This response is returned when the number of requests has exceeded the rate limit.
content:
application/json:
schema:
type: object
properties:
status:
type: string
example: fail
error:
type: object
properties:
message:
type: string
description: "A descriptive error message explaining why the request failed."
type:
type: string
description: "The type or category of the error (e.g., Rate Limits Exceeded)."
request_id:
type: string
description: "A unique identifier for the request, useful for debugging."
examples:
rate_limit:
summary: Rate limit breach
value:
status: "fail"
error:
message: "Rate limits for customers exceeded. Please Try After Some Time"
type: "Rate Limits Exceeded"
request_id: "onqucLYL"
'500':
description: This response is returned when the system runs into an unexpected error.
content:
application/json:
schema:
type: object
properties:
status:
type: string
example: fail
error:
type: object
properties:
message:
type: string
description: "A descriptive error message explaining why the request failed."
type:
type: string
description: "The type or category of the error (e.g., Server Error)."
request_id:
type: string
description: "A unique identifier for the request, useful for debugging."
examples:
unknown_error:
summary: Unknown errors
value:
status: "fail"
error:
message: "An unexpected error was encountered while processing this request. Please contact MoEngage Team"
type: "ServerError"
request_id: "KovrwJiF"
# SECTION 3: DEVICE
/device/{app_id}:
post:
tags:
- Device
summary: Track Device
x-mint:
content: |
#### Rate Limit
A single API request contains one or more device updates. Maintain a rate limit of 10,000 device updates per minute.
description: This API adds or updates devices and device properties in MoEngage. You can create a new device for an existing user, create new device properties for an existing user, or update the device properties of the existing user.
parameters:
- name: app_id
in: path
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: VJ0GSMESHMQA3L7WV1EEK3UR
- name: X-Forwarded-For
in: header
required: false
description: "The 'X-Forwarded-For' header is used to specify the IP address of the client that made the request. This header may be added by proxy servers or load balancers. The header value must contain the IP address of the original client that initiated the request. Multiple IP addresses may be specified in the header value, separated by commas."
schema:
type: string
example: "203.0.113.195"
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CreateDeviceRequest'
responses:
'200':
description: This response is returned when the request is processed successfully.
content:
application/json:
schema:
$ref: '#/components/schemas/GenericSuccess'
examples:
success_response:
summary: Success Response
value:
status: "success"
message: "Your request has been accepted and will be processed soon."
'400':
description: This response is returned when the required parameters are missing from the request, attributes are not found, and incorrect values are passed.
content:
application/json:
schema:
type: object
properties:
status:
type: string
example: fail
error:
type: object
properties:
attribute:
type: string
description: "The attribute in the payload that caused the error."
message:
type: string
description: "A descriptive error message explaining why the request failed."
type:
type: string
description: 'The type or category of the error ("MissingAttributeError").'
request_id:
type: string
description: "A unique identifier for the request, useful for debugging."
examples:
missing_customerid:
summary: Customer_id is missing
value:
status: "fail"
error:
attribute: "customer_id"
message: "'customer_id' is not found in the payload"
type: "MissingAttributeError"
request_id: "izsZuQNw"
missing_attributes:
summary: Attributes is missing
value:
status: "fail"
error:
attribute: "attributes"
message: "'attributes' is not found in the payload"
type: "MissingAttributeError"
request_id: "MwNnVDsC"
invalid_platform:
summary: Invalid platform
value:
status: "fail"
error:
attribute: "platform"
message: "'platform' is not a valid platform."
type: "ValueError"
request_id: "NDuFDLwS"
missing_pushid:
summary: Push_id is missing
value:
status: "fail"
error:
attribute: "push_id"
message: "'push_id' is not found in payload"
type: "MissingAttributeError"
request_id: "dsLXpKgJ"
missing_platform:
summary: Platform is not found in payload
value:
status: "fail"
error:
attribute: "platform"
message: "'platform' is not found in payload"
type: "MissingAttributeError"
request_id: "gyLYpBFV"
'401':
description: This response is returned when the request does not have valid authentication credentials.
content:
application/json:
schema:
type: object
properties:
status:
type: string
example: fail
error:
type: object
properties:
message:
type: string
description: "A descriptive error message explaining why the request failed."
type:
type: string
description: 'The type or category of the error (e.g., Authentication required).'
request_id:
type: string
description: "A unique identifier for the request, useful for debugging."
examples:
auth_error:
summary: Authorization errors
value:
status: "fail"
error:
message: "App Secret key mismatch. Please login to the dashboard to verify key"
type: "Authentication required"
request_id: "PVUDFisO"
missing_header:
summary: Missing authentication header
value:
status: "fail"
error:
message: "Authentication Header Required"
type: "Authentication required"
request_id: "PisPjGQQ"
'403':
description: This response is returned when your MoEngage account is suspended or blocked.
content:
application/json:
schema:
type: object
properties:
status:
type: string
example: fail
error:
type: object
properties:
message:
type: string
description: "A descriptive error message explaining why the request failed.(e.g., Your account is suspended. Please contact MoEngage team.)"
type:
type: string
description: "The type or category of the error (e.g., BlockedClient, Account Suspended, Account Temporarily Suspended)."
request_id:
type: string
description: "A unique identifier for the request, useful for debugging."
examples:
account_blocked:
summary: Account is blocked
value:
status: "fail"
error:
message: "Your account is suspended. Please contact MoEngage team."
type: "BlockedClient"
request_id: "ofHUEaEQ"
account_suspended:
summary: Account is suspended
value:
status: "fail"
error:
message: "Your account is suspended. Please contact MoEngage team."
type: "Account Suspended"
request_id: "gqJvCNYu3"
temp_suspended:
summary: Account is temporarily suspended
value:
status: "fail"
error:
message: "Your account is temporarily suspended. Please contact MoEngage team."
type: "Account Temporarily Suspended"
request_id: "ssSJjoyD"
'413':
description: This response is returned when the payload size exceeds 128 KB.
content:
application/json:
schema:
type: object
properties:
status:
type: string
example: fail
error:
type: object
properties:
message:
type: string
description: "A descriptive error message explaining why the request failed."
type:
type: string
description: "The type or category of the error (e.g., Payload too large)."
request_id:
type: string
description: "A unique identifier for the request, useful for debugging."
examples:
payload_exceeded:
summary: Payloads exceeding the size limit
value:
status: "fail"
error:
message: "Payload size exceeds 128 KB"
type: "PayloadTooLarge"
request_id: "VFzDwhwt"
'415':
description: This response is returned when the content type is not supported.
content:
application/json:
schema:
type: object
properties:
status:
type: string
example: fail
error:
type: object
properties:
message:
type: string
description: "A descriptive error message explaining why the request failed."
type:
type: string
description: "The type or category of the error (e.g., Unsupported media type)."
request_id:
type: string
description: "A unique identifier for the request, useful for debugging."
examples:
unsupported_media_type:
summary: Unsupported media type
value:
status: "fail"
error:
message: "Content type is not supported"
type: "Unsupported media type"
request_id: "SgBQfKJh"
'429':
description: This response is returned when the number of requests has exceeded the rate limit.
content:
application/json:
schema:
type: object
properties:
status:
type: string
example: fail
error:
type: object
properties:
message:
type: string
description: "A descriptive error message explaining why the request failed."
type:
type: string
description: "The type or category of the error (e.g., Rate Limits Exceeded)."
request_id:
type: string
description: "A unique identifier for the request, useful for debugging."
examples:
rate_limit:
summary: Rate limit breach
value:
status: "fail"
error:
message: "Rate limits for customers exceeded. Please Try After Some Time"
type: "Rate Limits Exceeded"
request_id: "onqucLYL"
'500':
description: This response is returned when the system runs into an unexpected error.
content:
application/json:
schema:
type: object
properties:
status:
type: string
example: fail
error:
type: object
properties:
message:
type: string
description: "A descriptive error message explaining why the request failed."
type:
type: string
description: "The type or category of the error (e.g., Server Error)."
request_id:
type: string
description: "A unique identifier for the request, useful for debugging."
examples:
unknown_error:
summary: Unknown errors
value:
status: "fail"
error:
message: "An unexpected error was encountered while processing this request. Please contact MoEngage Team"
type: "ServerError"
request_id: "KovrwJiF"
/devices/manage:
post:
tags:
- Device
summary: Device Opt-out
description: This API blocks or unblocks specific devices from receiving push notifications triggered from MoEngage. To prevent push notifications from reaching a specific user or all devices associated with a user, call the API to block them. This is useful for reasons such as device theft or fraudulent activity. For example, if a device is stolen, you can use this API to block it in MoEngage, ensuring that any scheduled push notifications with sensitive content do not get delivered. You can also use the API to unblock a device if it is recovered.
x-mint:
content: |
#### Rate Limit
The rate limit is 1000 API requests per minute.
parameters:
- name: app_id
in: query
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
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/DeviceOptOutRequest'
responses:
'200':
description: This response is returned when the request is processed successfully.
content:
application/json:
schema:
$ref: '#/components/schemas/GenericSuccess'
examples:
success_response:
summary: Success Response
value:
status: "success"
message: "Your request has been accepted and will be processed soon."
'400':
description: This response is returned when the required parameters are missing from the request, attributes are not found, and incorrect values are passed.
content:
application/json:
schema:
type: object
properties:
status:
type: string
example: fail
error:
type: object
properties:
message:
type: string
description: "A descriptive error message explaining why the request failed."
type:
type: string
description: 'The type or category of the error ("MissingAttributeError").'
request_id:
type: string
description: "A unique identifier for the request, useful for debugging."
attribute:
type: string
description: "This field denotes the attribute missing in the payload."
examples:
missing_useridentifiervalue:
summary: User_identifier_value is missing in the payload
value:
status: "fail"
error:
attribute: "user_identifier_value"
message: "user_identifier_value is not found in the payload"
type: "MissingAttributeError"
request_id: "YRJTbvRM"
missing_useridentifiertype:
summary: User_identifier_type is missing in the payload
value:
status: "fail"
error:
attribute: "user_identifier_type"
message: "customer_identifier_type is not found in the payload"
type: "MissingAttributeError"
request_id: "nuJPehHC"
missing_actiontype:
summary: Action_type is missing in the payload
value:
status: "fail"
error:
attribute: "action_type"
message: "Action_type is not found in the payload"
type: "MissingAttributeError"
request_id: "nuJPehHC"
missing_deviceid:
summary: Device_identifiers is missing in the payload
value:
status: "fail"
error:
attribute: "device_identifiers"
message: "device_identifiers is missing in the payload"
type: "MissingAttributeError"
request_id: "jRwBuxdC"
invalid_deviceid:
summary: Action_type is missing in the payload
value:
status: "fail"
error:
attribute: "device_identifiers"
message: "device identifier can only be in ['moe_gaid', 'push_id', 'unique_id', 'device_unique_id'] "
type: "ValueError"
request_id: "ZtrftlVn"
'401':
description: This response is returned when the request does not have valid authentication credentials.
content:
application/json:
schema:
type: object
properties:
status:
type: string
example: fail
error:
type: object
properties:
message:
type: string
description: "A descriptive error message explaining why the request failed."
type:
type: string
description: 'The type or category of the error (e.g., Authentication required).'
request_id:
type: string
description: "A unique identifier for the request, useful for debugging."
examples:
auth_error:
summary: Authorization errors
value:
status: "fail"
error:
message: "App Secret key mismatch. Please login to the dashboard to verify key"
type: "Authentication required"
request_id: "PVUDFisO"
missing_header:
summary: Missing authentication header
value:
status: "fail"
error:
message: "Authentication Header Required"
type: "Authentication required"
request_id: "PisPjGQQ"
'403':
description: This response is returned when your MoEngage account is suspended or blocked.
content:
application/json:
schema:
type: object
properties:
status:
type: string
example: fail
error:
type: object
properties:
message:
type: string
description: "A descriptive error message explaining why the request failed.(e.g., Your account is suspended. Please contact MoEngage team.)"
type:
type: string
description: "The type or category of the error (e.g., BlockedClient, Account Suspended, Account Temporarily Suspended)."
request_id:
type: string
description: "A unique identifier for the request, useful for debugging."
examples:
account_blocked:
summary: Account is blocked
value:
status: "fail"
error:
message: "Your account is suspended. Please contact MoEngage team."
type: "BlockedClient"
request_id: "ofHUEaEQ"
account_suspended:
summary: Account is suspended
value:
status: "fail"
error:
message: "Your account is suspended. Please contact MoEngage team."
type: "Account Suspended"
request_id: "gqJvCNYu"
temp_suspended:
summary: Account is temporarily suspended
value:
status: "fail"
error:
message: "Your account is temporarily suspended due to payment issues."
type: "Account Temporarily Suspended"
request_id: "ssSJjoyD"
'413':
description: This response is returned when the payload size exceeds 128 KB.
content:
application/json:
schema:
type: object
properties:
status:
type: string
example: fail
error:
type: object
properties:
message:
type: string
description: "A descriptive error message explaining why the request failed."
type:
type: string
description: "The type or category of the error (e.g., Payload too large)."
request_id:
type: string
description: "A unique identifier for the request, useful for debugging."
examples:
payload_exceeded:
summary: Payloads exceeding the size limit
value:
status: "fail"
error:
message: "Payload cannot exceed 128KB"
type: "Payload too large"
request_id: "VFzDwhwt"
'415':
description: This response is returned when the content type is not supported.
content:
application/json:
schema:
type: object
properties:
status:
type: string
example: fail
error:
type: object
properties:
message:
type: string
description: "A descriptive error message explaining why the request failed."
type:
type: string
description: "The type or category of the error (e.g., Unsupported media type)."
request_id:
type: string
description: "A unique identifier for the request, useful for debugging."
examples:
unsupported_media_type:
summary: Unsupported media type
value:
status: "fail"
error:
message: "Content type is not supported"
type: "Unsupported media type"
request_id: "SgBQfKJh"
'429':
description: This response is returned when the number of requests has exceeded the rate limit.
content:
application/json:
schema:
type: object
properties:
status:
type: string
example: fail
error:
type: object
properties:
message:
type: string
description: "A descriptive error message explaining why the request failed."
type:
type: string
description: "The type or category of the error (e.g., Rate Limits Exceeded)."
request_id:
type: string
description: "A unique identifier for the request, useful for debugging."
examples:
rate_limit:
summary: Rate limit breach
value:
status: "fail"
error:
message: "Rate limits for customers exceeded. Please Try After Some Time"
type: "Rate Limits Exceeded"
request_id: "onqucLYL"
'500':
description: This response is returned when the system runs into an unexpected error.
content:
application/json:
schema:
type: object
properties:
status:
type: string
example: fail
error:
type: object
properties:
message:
type: string
description: "A descriptive error message explaining why the request failed."
type:
type: string
description: "The type or category of the error (e.g., Server Error)."
request_id:
type: string
description: "A unique identifier for the request, useful for debugging."
examples:
unknown_error:
summary: Unknown errors
value:
status: "fail"
error:
message: "An unexpected error was encountered while processing this request. Please contact MoEngage Team"
type: "Server Error"
request_id: "KovrwJiF"
# SECTION 4: TRACKING
/installInfo:
get:
tags:
- Tracking
summary: Track App Install
description: |
This API tracks the install attribution data in MoEngage, which you can then use to enhance your marketing automation campaigns on MoEngage.
Install attribution tracking is a great way to improve your initial relationship with your user. Knowing how, where, and even more importantly, why a user installs your app allows you to get a better understanding of who your user is and how you should introduce them to your app.
security: []
x-code-samples:
- lang: Bash
label: Android
source: |
curl -L -g -X GET 'https://api-0X.moengage.com/v1/installInfo?src=&appAttributionKey=&appId=&campaign_name=&publisher_name=&advertising_id='
- lang: Bash
label: iOS
source: |
curl -L -g -X GET 'https://api-0X.moengage.com/v1/installInfo?src=&appAttributionKey=&appId=&campaign_name=&publisher_name=&idfv='
parameters:
- name: publisher_name
in: query
schema:
type: string
description: Publisher name of the install.
- name: campaign_name
in: query
schema:
type: string
description: Campaign name of the install.
- name: src
in: query
required: true
schema:
type: string
description: Partner name.
- name: appId
in: query
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)**.
- name: advertising_id
in: query
schema:
type: string
description: Google Advertising ID of the device on which the install was detected (for Android only).
- name: idfv
in: query
schema:
type: string
description: IDFV of the iOS device on which the install was detected (for iOS only).
- name: appAttributionKey
in: query
required: true
schema:
type: string
description: Available on the MoEngage dashboard by navigating to **Settings > Analytics > Acquisition Tracking > Attribution Key**.
responses:
'200':
description: |
**Success**
This response is returned when the request is processed successfully.
content:
application/json:
schema:
$ref: '#/components/schemas/GenericSuccess'
'400':
description: |
**Bad Request**
This response is returned when the required parameters are missing from the request, attributes are not found, and incorrect values are passed.
content:
application/json:
schema:
$ref: '#/components/schemas/GenericError'
'401':
description: |
**Unauthorized**
This response is returned when the request does not have valid authentication credentials.
content:
application/json:
schema:
$ref: '#/components/schemas/GenericError'
'403':
description: |
**Account Blocked**
This response is returned when your MoEngage account is suspended or blocked.
'413':
description: |
**Payload Size Exceeded**
This response is returned when the payload size exceeds 128 KB.
'415':
description: |
**Unsupported Media Type**
This response is returned when the content type is not supported.
'429':
description: |
**Rate Limit Breach**
This response is returned when the number of requests has exceeded the rate limit.
'500':
description: |
**Internal Server Error**
This response is returned when the system runs into an unexpected error.
/integrations/authentication:
post:
tags:
- Utilities
summary: Test Connection API
description: |
This API validates if the entered endpoint details are valid. It verifies if the provided endpoint URL, workspace ID, and data key are accessible and responds without any errors.
parameters:
- 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
requestBody:
required: true
description: Set the Content-Type header to application/json.
content:
application/json:
schema:
$ref: '#/components/schemas/TestConnectionRequest'
examples:
cURL_Body:
value:
app_id: "********"
app_secret: "**********"
source: "test"
region: "01"
responses:
'200':
description: |
Success. This response is returned when the request is processed successfully.
content:
application/json:
schema:
type: object
properties:
status:
type: string
description: |
This field contains the status of the request and denotes whether it was successful or not.
**Example**: "status": "success", "status": "error"
example: success
app_name:
type: string
description: This field contains the workspace name of your MoEngage workspace
example: Your_Workspace_ID
example:
status: "success"
app_name: "Your_Workspace_ID"
'401':
description: |
Authorization Failure. This response is returned when the authorization parameters are missing in the HTTP Auth Header.
content:
application/json:
schema:
type: object
properties:
status:
type: string
description: This field denotes the overall outcome of the API request (e.g., "success" or "fail"), allowing the client to quickly determine if the operation was completed as expected.
example: fail
error:
type: object
description: This field denotes a container object that holds specific technical details and context regarding the failure when the status is returned as "fail".
properties:
message:
type: string
description: This field denotes a human-readable description explaining the specific cause of the error, intended to help the developer or end-user understand what went wrong (e.g., "Missing required parameter").
example: "App Secret key mismatch. Please login to the dashboard to verify key"
type:
type: string
description: This field denotes a machine-readable classification or category of the error (e.g., validation_error, authentication_error), which allows the client application to programmatically handle specific error scenarios.
example: "Authentication required"
request_id:
type: string
description: This field denotes a unique identifier assigned to this specific API transaction.
example: "kKcQUqvo"
example:
status: "fail"
error:
message: "App Secret key mismatch. Please login to the dashboard to verify key"
type: "Authentication required"
request_id: "kKcQUqvo"
# SECTION 6: FILE IMPORT
/fileimports/trigger/{schedule_id}:
post:
servers:
- url: 'https://fileimports-data-api-{dc}.moengage.com/v1.0/data'
description: MoEngage File Imports 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."
tags:
- File Import
summary: Trigger File Imports
description: This API triggers scheduled file imports. You can trigger periodic imports to run using this API if the import has not expired and is in any of the following states- Scheduled, Successful, Partially Successful, and Failed.
x-mint:
content: |
#### Rate Limit
You can trigger this API once in every five minutes for a specific schedule_id. A Bad request response (400) response will be sent if this is exceeded.
parameters:
- name: schedule_id
in: path
required: true
description: This field specifies the Import ID (the unique identifier for the import) of the import that needs to be triggered. You can find the Import ID in the MoEngage Dashboard on the Imports History page. Click **Actions** > **View import** to view the Import Details. You can also view the Import ID in the email notification received once the import has been set up.
schema:
type: string
- 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
responses:
'200':
description: This response is returned when the request is processed successfully.
content:
application/json:
schema:
type: object
properties:
status:
type: string
description: "This field contains the status of the request and specifies whether the request was successful."
example: success, failure
message:
type: string
description: This field contains information about whether the request was successful or not.
example: Trigger Import Successful
examples:
success_response:
summary: Successful request
value:
status: "success"
message: "Triggered Import Successfully"
'400':
description: "This response is returned when the Import ID/Schedule ID is missing from the request or when the provided parameters are invalid. Also, this response is returned when the rate limit (one request in five minutes) is breached."
content:
application/json:
schema:
type: object
properties:
status:
type: string
example: fail
description: This field contains the status of the request and specifies whether the request was successful.
error_type:
type: object
description: "This field is present in the response when the Import/Schedule ID in the request is not found in the system (either because it is invalid or has been deleted)."
message:
type: string
description: "This field contains information about whether the request was successful or not. "
examples:
invalid_scheduleid:
summary: The Import ID (Schedule ID) in the Request is Invalid
value:
status: "fail"
error_type: "NOT_FOUND"
message: "This import is either deleted or expired."
exceeded_user_limit:
summary: The Number of Users Exceeds the Allowed Limit in the Request
value:
status: "fail"
error_type: "ALREADY_EXISTS"
message: "Import has run in the last 5 min."
'401':
description: This response is returned when the APP Key is invalid or missing, the password is incorrect, or there are other such authorization-related errors in the request.
content:
application/json:
schema:
type: object
properties:
title:
type: string
example: fail
description: "This field is present in the response in the case of errors and contains the type of error."
description:
type: string
description: "This field is present in the response in the case of errors and contains the error description."
examples:
incorrect_password:
summary: Incorrect Password in the Header
value:
title: "AuthenticationInvalid"
description: "Password (APP_KEY) doesn't match the one available on the dashboard. Kindly ensure the same APP_KEY available on the dashboard is used."
missing_authorization_key:
summary: Missing Authorization Key in the Header
value:
title: "HeaderMissing"
description: "MOE-APPKEY is missing in Header"
header_mismatch:
summary: APP Key Mismatch in the Header
value:
title: "HeaderMismatch"
description: "MOE_APPKEY doesn't match the Username (APP_KEY) used in Basic Auth authorization"
'403':
description: This response is returned when your MoEngage account has been blocked or suspended.
content:
application/json:
schema:
type: object
properties:
status:
type: string
example: fail
error:
type: object
properties:
message:
type: string
description: "This field contains information about whether the request was successful or not."
type:
type: string
description: "This field is present in the response in the case of 403 errors and contains the error type."
request_id:
type: string
description: "This field is present in the response in the case of 403 errors and contains the request-id."
examples:
account_blocked:
summary: Your Account is Blocked
value:
status: "fail"
error:
message: "Your account is suspended. Please contact MoEngage team."
type: "BlockedClient"
request_id: "ofHUEaEQ"
'404':
description: This response is returned when the request contains the incorrect URL (when you try to access a resource that is not present).
content:
application/json:
schema:
type: object
properties:
status:
type: string
example: fail
description: This field contains the status of the request and specifies whether the request was successful.
message:
type: string
description: "This field contains information about whether the request was successful or not."
examples:
missing_resource:
summary: Resource Not Found Error
value:
status: "fail"
message: "Resource not found"
'405':
description: This response is returned when the request contains an unsupported method. For example, if you were to use the GET method instead of POST for this request, you would result in a 405 error.
content:
application/json:
schema:
type: object
properties:
status:
type: string
example: fail
description: This field contains the status of the request and specifies whether the request was successful.
message:
type: string
description: "This field contains information about whether the request was successful or not."
examples:
missing_resource:
summary: Method Not Allowed Error
value:
status: "fail"
message: "Method not allowed"
'500':
description: This response is returned when the system runs into an unexpected error.
content:
application/json:
schema:
type: object
properties:
title:
type: string
example: fail
description: "This field is present in the response in the case of errors and contains the type of error."
description:
type: string
description: "This field is present in the response in the case of errors and contains the error description."
code:
type: string
description: This field is present in the response in the case of 5xx errors and contains the error code.
examples:
unknown_error:
summary: Unknown Errors
value:
title: "Server Error"
description: "An unexpected error was encountered while processing this request. Please contact MoEngage Team."
code: "GlQhUzvM"
/fileimports/import/status:
post:
servers:
- url: 'https://fileimports-data-api-{dc}.moengage.com/v1.0/data'
description: MoEngage File Imports 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."
tags:
- File Import
summary: Import Details
description: This API fetches the status at an import level. It can fetch the status of multiple imports but not the status of the files within the import.
x-mint:
content: |
#### Rate Limit
You can create 50 requests per minute.
parameters:
- 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
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/ImportDetailsRequest'
examples:
all_the_filters_passed:
summary: Sample cURL with all the filters passed in the API body.
value:
import_name: "test_import"
import_type:
- "USERS"
- "EVENTS"
- "AUX_DATA"
date:
start_date: "14/11/2024"
end_date: "14/11/2024"
format: "DD/MM/YYYY"
schedule_type:
- "PERIODIC"
- "ONETIME"
file_source:
- "SFTP"
- "S3"
- "CSV"
schedule_status:
- "SUCCESSFUL"
- "FAILED"
- "PARTIAL_SUCCESS"
- "SCHEDULED"
- "PROCESSING"
- "QUEUED"
- "ARCHIVED"
offset: "1"
no_filters_passed:
summary: Sample cURL with no filters passed in the API body.
value: {}
responses:
'200':
description: Success.
content:
application/json:
schema:
$ref: '#/components/schemas/ImportDetailsResponse'
examples:
success_response:
summary: Successful request
value:
status: "success"
total_count: 2
data:
- import_id: "67348ff2e15wwe63bc257d9bf"
import_name: "Special"
last_run_status: "FAILED"
import_type: "AUX_DATA"
schedule_type: "ONETIME"
import_source: "S3"
custom_segment_config: {}
aux_data_config:
primary_key: "Email"
retention_period: 15
retention_type: "DAYS"
total_files: 0
processed_files: 0
total_rows: 0
processed_rows: 0
created_at: "2024-11-13T17:09:30.635000"
last_run_at: "2024-11-13T17:09:32.024000"
next_scheduled_at: "2024-11-13T11:39:30.619000"
created_by_email: "abc@moengage.com"
status: "FAILED"
time_zone: "Asia/Calcutta"
- import_id: "67348f4a55f435b54f109i9"
import_name: "Duplicate_special"
last_run_status: "FAILED"
import_type: "AUX_DATA"
schedule_type: "ONETIME"
import_source: "S3"
custom_segment_config: {}
aux_data_config:
primary_key: "Email"
retention_period: 15
retention_type: "DAYS"
total_files: 0
processed_files: 0
total_rows: 0
processed_rows: 0
created_at: "2024-11-13T17:06:42.722000"
last_run_at: "2024-11-13T17:06:44.182000"
next_scheduled_at: "2024-11-13T11:36:42.697000"
created_by_email: "abc@moengage.com"
status: "FAILED"
time_zone: "Asia/Calcutta"
offset: 1
more_files: false
'400':
description: "This response is returned when the required parameters are missing from the request, attributes are not found, and incorrect values are passed."
content:
application/json:
schema:
type: object
properties:
status:
type: string
example: fail
description: This field denotes the status of the request.
error_type:
type: string
description: "This field denotes the type of error occured"
message:
type: string
description: "This field denotes the error message. "
examples:
invalid_date_format:
summary: Invalid or Mismatched date format passed
value:
status: "FAILURE"
error_type: "Invalid Date format"
message: "The provided date format is either incorrect or doesn't match the entered dates. Please ensure both the dates and the format are valid."
case_sensitivity:
summary: Invalid bad request - Case sensitivity in parameter values passed in the API body
value:
success: false
status_code: "400 Bad Request"
data: "Unable to process the request"
invalid_offset:
summary: Bad request - Incorrect offset value passed
value:
status: "FAILURE"
error_type: "Invalid Offset Value"
message: "The offset value you have provided is not valid. Please review and correct the offset."
date_range_exceeded:
summary: Date range exceeds 30 days
value:
status: "FAILURE"
error_type: "Difference exceeds 30 days"
message: "Please note that only imports with a date difference of 30 can be displayed. Kindly adjust the dates accordingly."
'401':
description: This response is returned when the APP Key is invalid or missing, the password is incorrect, or there are other such authorization-related errors in the request.
content:
application/json:
schema:
type: object
properties:
title:
type: string
example: fail
description: This field denotes the error title.
description:
type: string
description: This field denotes error description.
examples:
missing_header:
summary: MoeAPPkey missing, Invalid username, invalid password
value:
title: "HeaderMissing"
description: "MOE-APPKEY is missing in Header"
'404':
description: This response is returned when the APP Key is invalid or missing, the password is incorrect, or there are other such authorization-related errors in the request.
content:
application/json:
schema:
type: object
properties:
status:
type: string
example: fail
description: This field denotes the status of the request.
data:
type: string
description: This field denotes the error description.
examples:
invalid_endpoint:
summary: Resource not found
value:
status: "fail"
data: "Resource not found."
'415':
description: This response is returned when the APP Key is invalid or missing, the password is incorrect, or there are other such authorization-related errors in the request.
content:
application/json:
schema:
type: object
properties:
title:
type: string
example: fail
description: This field denotes the error title.
description:
type: string
description: This field denotes the error description.
examples:
unsupported_media_type:
summary: Unsupported media type
value:
title: "Unsupported media type"
description: "Content type is not supported"
'429':
description: This response is returned when the number of requests has exceeded the rate limit.
content:
application/json:
schema:
type: object
properties:
status:
type: string
example: fail
description: This field contains the status of the request and specifies whether the request was a failure.
error:
type: object
properties:
message:
type: string
description: "A descriptive error message explaining why the request failed."
type:
type: string
description: "The type or category of the error (e.g., Rate Limits Exceeded)."
request_id:
type: string
description: "A unique identifier for the request, useful for debugging."
examples:
rate_limit_exceeded:
summary: Rate limits exceeded
value:
status: "fail"
error:
message: "Rate limits exceeded, please try after some time"
type: "Rate Limits Exceeded"
request_id: "1234"
/fileimports/import/run/history:
post:
servers:
- url: 'https://fileimports-data-api-{dc}.moengage.com/v1.0/data'
description: MoEngage File Imports 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."
tags:
- File Import
summary: Import File Run History
description: This API fetches the file processing status of each file contained in an import. The API request must contain either the import_name or the import_id. If you are not sure of the import_id or the import_name, you can use the [Import Details API](https://www.moengage.com/docs/api/file-import/import-details) to get the import details, which can be further used in the Import File Run History API.
x-mint:
content: |
#### Rate Limit
You can create 50 requests per minute.
parameters:
- 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
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/FileRunHistoryRequest'
responses:
'200':
description: Success.
content:
application/json:
schema:
$ref: '#/components/schemas/FileRunHistoryResponse'
examples:
success_response:
summary: Successful request
value:
status: "success"
total_count: "1"
data:
type: object
items:
type: object
properties:
id: "672561rr0abd2da34cf7f7df"
file_name: "filename.csv"
scheduled_at: "2024-11-14T12:31:31.713000"
completed_at: "2024-11-14T12:32:09.942000"
type: "AUX_DATA"
file_size: "1544"
file_status: "SUCCESSFUL"
status_msg: ""
total_rows: 10
skipped_rows: 0
updated_rows: 0
failed_rows: 0
aux_data_added_count: 10
aux_data_failed_count: 0
added_rows: 10
offset: 1
more_files: "false"
'400':
description: "This response is returned when the required parameters are missing from the request, attributes are not found, and incorrect values are passed."
content:
application/json:
schema:
type: object
properties:
status:
type: string
example: fail
description: This field denotes the status of the request.
error_type:
type: object
description: "This field denotes the type of error occured"
message:
type: string
description: "This field denotes the error message. "
examples:
bad_request:
summary: Bad request
value:
status: "FAILURE"
error_type: "Import Doesn't Exist"
message: "No import exist in the database with the given query parameters."
invalid_date_format:
summary: Date range not in ISO format
value:
status: "FAILURE"
error_type: "Invalid Date format"
message: "The date entered is not in the correct format. Please ensure you are using the ISO 8601 format which should look like this: YYYY-MM-DDTHH:MM:SS.ssssss. Please check this and try again."
incorrect_offset_value:
summary: Incorrect offset value passed
value:
status: "FAILURE"
error_type: "Import Doesn't Exist"
message: "No import exist in the database with the given query parameters."
'401':
description: This response is returned when the APP Key is invalid or missing, the password is incorrect, or there are other such authorization-related errors in the request.
content:
application/json:
schema:
type: object
properties:
title:
type: string
example: fail
description: The title of the error.
description:
type: string
description: The description of the error.
examples:
missing_header:
summary: MOE-APPKEY is missing in Header
value:
title: "HeaderMissing"
description: "MOE-APPKEY is missing in Header"
'404':
description: This response is returned when the APP Key is invalid or missing, the password is incorrect, or there are other such authorization-related errors in the request.
content:
application/json:
schema:
type: object
properties:
status:
type: string
example: fail
description: This field contains the status of the request and specifies whether the request was a failure.
data:
type: string
description: The description of the data.
examples:
invalid_endpoint:
summary: Resource not found
value:
status: "fail"
data: "Resource not found."
'415':
description: This response is returned when the APP Key is invalid or missing, the password is incorrect, or there are other such authorization-related errors in the request.
content:
application/json:
schema:
type: object
properties:
title:
type: string
example: fail
error_description:
type: string
examples:
unsupported_media_type:
summary: Unsupported media type
value:
title: "Unsupported media type"
error_description: "Content type is not supported"
'429':
description: This response is returned when the number of requests has exceeded the rate limit..
content:
application/json:
schema:
type: object
properties:
status:
type: string
example: fail
error:
type: object
properties:
message:
type: string
description: "A descriptive error message explaining why the request failed."
type:
type: string
description: "The type or category of the error (e.g., Rate Limits Exceeded)."
request_id:
type: string
description: "A unique identifier for the request, useful for debugging."
examples:
rate_limit_exceeded:
summary: Rate limits exceeded
value:
status: "fail"
error:
message: "Rate limits exceeded, please try after some time"
type: "Rate Limits Exceeded"
request_id: "1234"
# SECTION 7: BULK
/transition/{Workspace_ID}:
post:
tags:
- Bulk
summary: Bulk Import Users and Events
description: 'The Bulk Import API sends multiple user and event requests in batch to MoEngage, using a single API request. You can send a batch request of a maximum of 100 KB in a single API call.'
x-mint:
content: |
All bulk API requests return a 200 response code. Debugging should be done on the user profile on the dashboard.
#### User Identity Resolution
In MoEngage, data ingestion uses an ID to create or update a user. For workspaces in MoEngage with [Identity Resolution](/user-guide/data/user-data/unified-identity-identity-resolution) enabled, you can use the Bulk Import API to create or update users using a specific identifier, such as a mobile number or email ID. These identifiers must be enabled for the workspace in the Identity Resolution dashboard.
You can:
* Create users through Server-to-Server Data APIs even when they do not have an ID (but have other identifiers).
* Create a user or track events of a user when identifiers other than ID (for example, email ID or phone number) are known.
#### Rate Limit
A single bulk import API contains users, devices, and events together. Send a maximum of 60,000 users and 60,000 events per minute across all API requests.
parameters:
- name: Workspace_ID
in: path
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
- name: X-Forwarded-For
in: header
required: false
description: "The 'X-Forwarded-For' header is used to specify the IP address of the client that made the request. This header may be added by proxy servers or load balancers. The header value must contain the IP address of the original client that initiated the request. Multiple IP addresses may be specified in the header value, separated by commas."
schema:
type: string
example: "203.0.113.195"
requestBody:
required: true
description: |
**Types of Payload in Request Body**
The sample cURL request for a Bulk Import API consisting of the following payloads:
* **User payload**: Attribute parameters must contain at least one of the identifiers you have configured based on which users in MoEngage will be created, updated, or merged.
* **Event payload**: Identifiers set up in the workspace must be mentioned within the _user_identifiers_ parameter, as shown in the below example where _moe_mobile_ is one of the identifiers in the workspace:
```json
"user_identifiers":{
"moe_mobile":"{{Mobile_Number}}"
}
```
content:
application/json:
schema:
$ref: '#/components/schemas/BulkImportRequest'
examples:
Standard Example:
summary: Combined User, Event, and Device Import
value:
type: "transition"
elements:
- type: "customer"
customer_id: "AZ8TM"
attributes:
name: "qjDKn"
first_name: "xSEdd"
last_name: "UWbah"
platforms:
- platform: "iOS"
active: "true"
- type: "customer"
customer_id: "9yt8q8"
attributes:
name: "5Np"
first_name: "2irjN"
last_name: "CH4Zo"
platforms:
- platform: "ANDROID"
active: "true"
- type: "customer"
customer_id: "ONfYcF"
attributes:
name: "U92"
first_name: "zgI63"
last_name: "Dle4b"
platforms:
- platform: "web"
active: "true"
- type: "device"
customer_id: "AZ8TM"
device_id: "AZ8TM"
attributes:
brand: "{{model_bulk1}}"
platform: "{{platform_bulk1}}"
push_id: "pushid1991"
- type: "device"
customer_id: "9yt8q8"
device_id: "9yt8q8"
attributes:
brand: "{{model_bulk1}}"
platform: "{{platform_bulk1}}"
push_id: "pushid2744"
- type: "device"
customer_id: "ONfYcF"
device_id: "ONfYcF"
attributes:
brand: "{{model_bulk1}}"
platform: "{{platform_bulk1}}"
push_id: "pushid3546"
- type: "event"
customer_id: "ONfYc"
actions:
- action: "A6CO5"
attributes:
product: "Shirt"
platform: "{{platform_bulk1}}"
app_version: "839"
user_time: "1712567385726"
current_time: "1712567385726"
- action: "wuDX8"
attributes:
product: "MacBook Air"
brand: "Apple"
platform: "iOS"
app_version: "1.2.3"
user_time: "1712567385726"
current_time: "1712567385726"
- type: "event"
customer_id: "9yt8q8"
actions:
- action: "A6CO5"
attributes:
product: "Shirt"
platform: "{{platform_bulk1}}"
app_version: "1.2.3"
user_time: "1712567385726"
current_time: "1712567385726"
- action: "Purchase"
attributes:
product: "MacBook Air"
brand: "Apple"
platform: "iOS"
app_version: "1.2.3"
user_time: "1712567385726"
current_time: "1712567385726"
- type: "event"
customer_id: "ONfYcF"
actions:
- action: "A6CO5"
attributes:
product: "Shirt"
platform: "{{platform_bulk1}}"
app_version: "1.2.3"
user_time: "1712567385726"
current_time: "1712567385726"
- action: "Purchase"
attributes:
product: "MacBook Air"
brand: "Apple"
platform: "iOS"
app_version: "1.2.3"
user_time: "1712567385726"
current_time: "1712567385726"
Properties as Date/Time:
summary: Properties as Date/Time
value:
type: "transition"
elements:
- type: "customer"
customer_id: "john@example.com"
attributes:
name: "John"
platforms:
- platform: "ANDROID"
active: "true"
- type: "event"
customer_id: "john@example.com"
device_id: "96bd03b6-defc-4203-83d3-dc1c73080232"
actions:
- action: "Added to Cart"
attributes:
product: "Mobile"
color: "white"
Brand: "Apple"
platform: "iOS"
app_version: "1.2.3"
current_time: "2020-05-31T16:33:35Z"
user_timezone_offset: 19800
- action: "Purchase"
attributes:
product: "MacBook Air"
Brand: "Apple"
platform: "iOS"
app_version: "1.2.3"
current_time: 1590404615
user_timezone_offset: 19800
Properties as Array:
summary: Properties as Array
value:
type: "transition"
elements:
- type: "customer"
customer_id: "OTBoS"
attributes:
name: "wtmNx"
first_name: "bt016"
last_name: "JPCUi"
Array_attribute:
- "one"
- "two"
platforms:
- platform: "iOS"
active: "true"
- type: "device"
customer_id: "OTBoS"
device_id: "OTBoS"
attributes:
brand: "Mi"
platform: "Windows"
push_id: "pushid1186"
- type: "event"
customer_id: "OTBoS"
actions:
- action: "mOhrP"
attributes:
product: "Shoe"
platform: "Windows"
app_version: "581"
user_time: "1712568861457"
current_time: "1712568861457"
Using User Identifiers:
summary: Using User Identifiers
value:
type: "transition"
elements:
- type: "customer"
attributes:
moe_mobile: "{{Mobile_Number}}"
first_name: "John"
- type: "event"
user_identifiers:
moe_mobile: "{{Mobile_Number}}"
actions:
- action: "AddToCart"
attributes:
product: "MacBook Air"
Brand: "Apple"
responses:
'200':
description: This response is returned when the request is processed successfully.
content:
application/json:
schema:
$ref: '#/components/schemas/GenericSuccess'
examples:
success_response:
summary: Success Response
value:
status: "success"
message: "Your request has been accepted and will be processed soon."
'400':
description: This response is returned when the required parameters are missing from the request, attributes are not found, and incorrect values are passed.
content:
application/json:
schema:
type: object
properties:
status:
type: string
example: fail
error:
type: object
properties:
attribute:
type: string
description: "This field denotes the attribute missing in the payload."
message:
type: string
description: "A descriptive error message explaining why the request failed."
type:
type: string
description: 'The type or category of the error ("MissingAttributeError").'
request_id:
type: string
description: "A unique identifier for the request, useful for debugging."
examples:
bad_request:
summary: Bad Request
value:
status: "fail"
error:
message: "'Could not decode the request body. The JSON was incorrect or not encoded as UTF-8."
type: "Malformed JSON"
request_id: "oWvxnUuo"
empty_elements:
summary: Empty Body
value:
status: "fail"
error:
attribute: "elements"
message: "'elements cannot be empty array"
type: "MissingAttributeError"
request_id: "oWvxnUuo"
invalid_type:
summary: Invalid Type
value:
status: "fail"
error:
attribute: "type"
message: "'type in elements should be customer/event/device"
type: "AttributeError"
request_id: "oWvxnUuo"
missing_customerid:
summary: Customer ID is Missing
value:
status: "fail"
error:
attribute: "customer_id"
message: "'customer_id not found in the payload"
type: "MissingAttributeError"
request_id: "oWvxnUuo"
empty_action:
summary: Empty Action
value:
status: "fail"
error:
attribute: "action"
message: "'action cannot be empty Unicode string"
type: "MissingAttributeError"
request_id: "oWvxnUuo"
malformed_json:
summary: Element Data Type
value:
status: "fail"
error:
message: "'Could not decode the request body. The JSON was incorrect or not decoded as UTF-8."
type: "Malformed JSON"
request_id: "oWvxnUuo"
# SECTION 8: WEBHOOKS
components:
securitySchemes:
Authentication:
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 **Data** tile.
**Note**: After you generate and save the Data API Key, DO NOT generate a new key unless there is a security breach. After you generate a different Data API key and save it, the authentication will start failing. You must update your existing data tracking.
For more information on authentication and getting your credentials, refer [here](https://www.moengage.com/docs/api/introduction#getting-your-credentials).
schemas:
GenericSuccess:
type: object
properties:
status:
type: string
description: "This field contains the status of the request and specifies whether the request was successful."
example: success
message:
type: string
example: Your request has been accepted and will be processed soon.
GenericError:
type: object
properties:
status:
type: string
description: This field contains the status of the request and specifies whether the request was a failure.
example: fail
error:
type: object
properties:
message:
type: string
description: "A descriptive error message explaining why the request failed."
type:
type: string
description: "The type or category of the error (e.g., MissingAttributeError)."
request_id:
type: string
description: "A unique identifier for the request, useful for debugging."
attribute:
type: string
description: "The attribute in the payload that caused the error."
PlatformObject:
type: object
properties:
platform:
type: string
enum: [ANDROID, iOS, web]
active:
type: string
enum: ["true", "false"]
UserAttributes:
type: object
description: |
A dictionary containing user attributes to add / update in the user profile.
For example, to track custom attributes of different data types like string, numeric, boolean, and date, pass the following payload where points are a number, expiry_date is a date type attribute, and super_user is a boolean attribute.
> **Note:**
> * "id", "_id", and "" keywords are blocked and not to be used as user attribute names.
> * You can not use "moe_" as a prefix while naming user attributes. It is a system prefix and using it might result in periodic blacklisting without prior communication.
> For other attributes that are not listed below, use the key-value pairs that you intend to use.
**Array Support**
If you want to pass an attribute in an array, the appropriate syntax for that is:
```json
"Array_attributeName":["abc","123"]
```
properties:
u_n:
type: string
description: Full name of the user.
u_fn:
type: string
description: First name of the user.
u_ln:
type: string
description: Last name of the user.
u_gd:
type: string
description: Gender of the user.
u_em:
type: string
format: email
description: Email Address of the user (Standard).
u_mb:
type: string
description: Mobile Number of the user (Standard). Example `918888444411`.
uid:
type: string
description: 'A unique ID that the app has set for a user. This is a standard attribute where MoEngage provides the name, and the value is provided by the client.'
u_bd:
type: string
format: date-time
description: 'Birthdate of the user in ISO 8601 format (e.g., 2019-05-21T03:47:35Z).'
moe_wa_subscription:
type: boolean
description: WhatsApp subscription status of a user.
moe_em_unsub_categories:
type: string
description: Email Unsubscribed Categories. The list of email categories user has unsubscribed.
push_preference:
type: boolean
description: Push Opt In Status (iOS).The push permission status of a user on an iOS device.
moe_sub_w:
type: boolean
description: Web Push Subscription Status. The web push subscription status of a user. Use this to find your aggregate subscribers and users who unsubscribed after subscribing once.
moe_spam:
type: boolean
description: Spam. Email Spam Attribute. The emails are not sent to the user when the set value is true.
moe_unsubscribe:
type: boolean
description: Unsubscribe. Email Unsubscribe Attribute. Emails are not sent to the user when the set value is true.
moe_hard_bounce:
type: boolean
description: Hard Bounce. Email Hard Bounce Attribute. The emails are not sent to the user when the set value is true.
moe_sms_subscription:
type: string
description: SMS Subscription Status. An attribute which stores the SMS subscription status of the user. This will be used to see if a user is reachable based on certain values of the attribute.
moe_email_optin_status:
type: string
enum: [DOUBLE_OPTED_IN, OPTED_OUT, OPT_IN_PENDING]
description: |
Email Opt-in Status. An attribute that stores the opt-in status of the user for the email channel. Supported values are:
* `DOUBLE_OPTED_IN`
* `OPTED_OUT`
* `OPT_IN_PENDING`
publisher_name:
type: string
description: Publisher Name. The name of the campaign publisher. This standard attribute can only be created through the Track User API and cannot be updated later.
campaign_name:
type: string
description: Campaign Name. The name of the campaign. This standard attribute can only be created through the Track User API and cannot be updated later.
u_l_a:
type: integer
format: int64
description: Last Seen. Time in epoch format (for example, `1767092989259`). This standard attribute can only be created through the Track User API and cannot be updated later.
cr_t:
type: integer
format: int64
description: First Seen. Time in epoch format (for example, `1767092989259`). This standard attribute can only be created through the Track User API and cannot be updated later.
geo:
type: string
description: 'Geolocation of the user as a string of latitude and longitude (for example, `88.90 89.00`).'
moe_gaid:
type: string
description: Google Advertising ID (Android). A unique, resettable identifier provided by Google for ad tracking and attribution on Android devices. This standard attribute can only be created through the Track User API and cannot be updated later.
advertising_identifier:
type: string
description: Advertising Identifier (iOS & Windows). A unique alphanumeric string used for ad tracking on iOS (IDFA) and Windows devices. This standard attribute can only be created through the Track User API and cannot be updated later.
additionalProperties: true
example:
name: John
points: 20
expiry_date: '2020-05-31T03:47:35Z'
super_user: true
user_persona: browsers
CreateUserRequest:
title: "User"
type: object
required:
- type
- customer_id
properties:
type:
type: string
description: 'This is used to identify the type of request. This field is case-sensitive. Follow the case as in the example when passing the value in the request.'
enum: [customer]
customer_id:
type: string
description: |
The unique identifier is used to identify/create a user in MoEngage. Not mandatory in [Identity Resolution](/user-guide/data/user-data/unified-identity-identity-resolution) enabled workspaces. If the User Identity Resolution feature is enabled in your workspace, the attribute parameters in the payload must contain at least one of the identifiers you have activated in your workspace based on which users in MoEngage will be created, updated, or merged. In the following example, moe_mobile is one of the identifiers in the workspace and is passed in attributes:
```json
{
"type": "customer",
"attributes": {"moe_mobile": "{{Mobile_Number}}",
"first_name": "John"
}
}
```'
update_existing_only:
type: boolean
default: false
description: |
This field should be passed in the request when only existing users in MoEngage should be updated.
**If this value is passed as true:**
1. Only those users for whom the customer_id from the request payload matches the customer identifier in MoEngage will be updated.
2. In case of new users (customer_id in the payload does not match any of the existing customer ids in your MoEngage account), they will not be created.
**If this value is passed as false:**
1. The user attributes will be updated with the values present in the payload for existing customers.
2. In case of new users (customer_id in the payload does not match any of the existing customer ids in your MoEngage account), a new customer will be created in the system with the details specified in the payload.
attributes:
$ref: '#/components/schemas/UserAttributes'
platforms:
type: array
description: "List of dictionaries with the associated platforms out of ANDROID, iOS, and web and their status."
items:
$ref: '#/components/schemas/PlatformObject'
IdentifierObject:
type: object
properties:
identifier_type:
type: string
enum: [customer_id, moengage_id]
description: This field specifies the identifier type. Identifier types can either be customer_id (ID field in the User Profile) or moengage_id (the MoEngageID of the user in the User Profile). Allowed values are "moengage_id", "customer_id".
example: customer_id
identifier:
type: string
description: This field specifies the unique identifier that identifies the user.
example: 6416d1a318r98264512c0f89
GetUserRequest:
type: object
required:
- data
properties:
data:
type: object
description: |
Wrapper object that contains the user identifiers to look up. The API expects `identifiers` inside this object, not at the root of the JSON body.
required:
- identifiers
properties:
identifiers:
type: array
description: |
This field is used to specify the identifiers for the users for whom the data needs to be fetched.
Structure:
```json
"data": {
"identifiers": [
{
"identifier_type": "customer_id",
"identifier": ""
},
{
"identifier_type": "id",
"identifier": ""
},
...{}
]
}
```
items:
$ref: '#/components/schemas/IdentifierObject'
user_fields_to_export:
type: array
items:
type: string
description: This field is used to specify the fields that need to be fetched for the user specified in Identifiers. Tracked standard user attributes and custom attributes can be fetched using this API. For the list of tracked standard attributes in MoEngage, refer to [User Attributes](#user-attributes).
example: ["last_name", "customer_id", "name"]
GetUserResponse:
type: object
properties:
status:
type: string
example: success
type:
type: string
example: export_users
data:
type: object
properties:
users_not_found:
type: array
items:
$ref: '#/components/schemas/IdentifierObject'
users:
type: array
items:
type: object
properties:
user_attributes:
type: object
additionalProperties: true
example:
last_name: Doe
customer_id: john_doe
id: 62e79fb15ada55x123g987bu
error:
type: object
description: |
This field is present in the response only in the case of an error and contains the error details.
This is the structure:
```json
{
"attribute": "",
"message": "",
"type": "",
"request_id": ""
}
```
properties:
attribute:
type: string
description: |
This field contains the name of the request attribute causing the error. For example, "attribute": "identifiers" implies that the identifiers request attribute is causing the error.
message:
type: string
description: This field contains the error message.
type:
type: string
description: |
This field contains the error type. For example, "type": "Malformed JSON" implies that the JSON in the request is incorrectly formed.
request_id:
type: string
description: This field denotes the request-id for which the error response is being returned.
MergeUserRequest:
type: object
properties:
merge_data:
type: array
description: |
This field contains the list of UID pairs of the users who are to be merged.
Example:
```json
{
"merge_data": [ // All the different pairs of users to merge
{
"merged_user": "", // This user will merge into below user
"retained_user": "" // Above user will merge into this user
},
{
"merged_user": "", // This user will merge into below user
"retained_user": "" // Above user will merge into this user
}
]
}
```
* Every object in the Array contains a pair of UID strings - the ‘merged_user’ and the ‘retained_user’.
* UID is the unique identifier for a user maintained by you. MoEngage stores this identifier in the ID attribute in the user profile.
* If the merging of any user fails in the array, it will skip that object and continue with others.
items:
type: object
properties:
merged_user:
type: string
description: |
The user ID to be merged and then deleted. All the data of this user will merge into the retained user. Merged users will be deleted after 30 days of inactivity. If MoEngage receives any event or user property for the merged user after the merging activity, the merged user will not be deleted. The following happens in MoEngage post-user merging:
* In the user profile, all events of the last 30 days are moved from the merged user to the retained user.
* Segmentation and campaign move all data from merged user to retained user.
retained_user:
type: string
description: |
The user ID that will remain and absorb the merged user's data. The merged user’s attributes and associated devices are mapped to the retained user post-merge. Reachability calculation is done for the retained user based on the devices. All of the user attributes of the merged user are moved to the retained user. If an attribute is present for the retained user and the same attribute is not for the merged user, the attribute is retained for the retained user.
DeleteUserRequest:
type: object
description: 'Request body to delete users. Based on the Get User API structure.'
properties:
identifiers:
type: array
description: Array of user identifiers to delete.
items:
$ref: '#/components/schemas/IdentifierObject'
EventAction:
type: object
required:
- action
properties:
action:
type: string
description: The name of the event to be tracked.
attributes:
type: object
additionalProperties: true
description: >-
A dictionary containing event attributes to track with the event.
**Array Support**
If you want to pass an attribute in an array, the appropriate syntax for that is:
```json
"Array_attributeName":["abc","123"]
```
example:
price: 3999
departure_date: '2019-05-21T03:47:35Z'
premium_seat: true
platform:
type: string
enum: [ANDROID, iOS, web, TV, unknown]
description: |
Used to identify the platform on which the event happened. Allowed values are ANDROID, iOS, web, or unknown.
**Note**: Ensure that the platform value sent is Android, iOS, or web. Platform value depends on which platform the event was generated. If you are unsure about the platform on which the event occurred, send the value as unknown or do not send any value. Incorrect platform value leads to inconsistencies in platform level campaigns like Push and In-App.
moe_os_type:
type: string
enum: [ROKU, WebOS, AndroidTV, tvOS, Tizen, FireOS, VizioTV, Xbox]
description: |
Used to identify the operating system of the TV.
**Note**: Ensure that you pass this parameter only when the platform is TV. Following are the valid moe_os_type accepted in MoEngage:
* ROKU for RokuTV
* WebOS for LGTV
* AndroidTV for AndroidTV
* tvOS for AppleTV
* Tizen for SamsungTV
* FireOS for FireTV
* VizioTV for VizioTV
* Xbox for Xbox
app_version:
type: string
description: App Version of the app on which the event originated.
user_time:
oneOf:
- type: number
- type: string
description: |
Local time at which the event happened. This field lets the system identify the local system time for when the event happened. Acceptable formats for user_time:
* ISO 8601 (for example - 2020-05-31T16:33:35Z)
* Epoch time in seconds (for example - 1590404615)
current_time:
oneOf:
- type: number
- type: string
description: |
UTC time at which the event happened. This field is necessary to specify the UTC time of the event. Acceptable formats for current_time include:
* ISO 8601 (for example - 2020-05-31T16:33:35Z)
* Epoch time in seconds (for example - 1590404615)
user_timezone_offset:
type: number
description: |
The difference in time between UTC and the local system time in a particular time zone. All time zones are defined by their offset from UTC. The offset is expressed as either UTC- or UTC+.
* user_timezone_offset should have a value in seconds which can be between -54000 to 54000. For example, for IST (UTC+0530), "user_timezone_offset" will be 19800.
* This field is crucial for establishing the `user_time` or `current_time`.
* If the field is absent, MoEngage gets this information from the internal system in the sequence as follows:
* The user profile’s timezone is taken into consideration.
* If the user profile’s timezone is not present, the App/account’s timezone is considered.
* In cases where neither is present, the UTC timezone is used.
* Include `user_timezone_offset` in your request only if you have accurate timezone information for each user, as incorrect info could disrupt event timelines in the user profile.
**Note:**
MoEngage generates current_time and user_time if they are not provided in the request. Use the following information and provide current_time, user_time, and user_timezone_offset accordingly:
* If you do not provide any of current_time, user_time, and user_timezone_offset, MoEngage automatically uses the UTC time when the request was received by MoEngage as the current_time. MoEngage uses internal data to calculate the user_timezone_offset to generate the user_time.
* If you provide only the current_time, MoEngage uses internal data to calculate the user_timezone_offset to generate the user_time.
- If you provide only the user_time, MoEngage uses internal data to calculate the user_timezone_offset to generate the current_time.
* If you send the current_time and user_time, MoEngage uses them as is.
* If you provide the current_time and user_timezone_offset, MoEngage generates the user_time.
* If you provide user_time and user_timezone_offset, MoEngage generates the current_time.
CreateEventRequest:
title: "Event"
type: object
required:
- type
- customer_id
- actions
properties:
type:
type: string
description: 'This is used to identify the type of request. Allowed value is event. This field is case-sensitive. Follow the case as in the example when passing the value in the request.'
enum: [event]
customer_id:
type: string
description: 'Identifier to identify or create a user in MoEngage. Not mandatory in Identity resolution enabled workspaces.'
device_id:
type: string
description: 'Device_id in event payload is optional. The default value is the customer_id value. The value is used to map events to specific devices.'
user_identifiers:
type: object
description: |
Required if Identity Resolution is enabled and customer_id is not provided.
**User Identity Resolution:**
If the [User Identity Resolution](/user-guide/data/user-data/unified-identity-identity-resolution) feature is enabled in your workspace, identifiers set up in the workspace must be mentioned within the user_identifiers parameter.
additionalProperties: true
example:
moe_mobile: "+9198765xxxxx"
actions:
type: array
description: List of events to be tracked for the user.
items:
$ref: '#/components/schemas/EventAction'
DeviceAttributes:
type: object
description: This field contains the device attributes to add or update in the device profile.
required:
- platform
- push_id
properties:
model:
type: string
description: This field denotes the model of the device.
platform:
type: string
enum: [ANDROID, iOS, web, TV]
description: This field denotes the platforms where the device is supported. Using unsupported values may result in an API response of 400.
push_id:
type: string
description: This field denotes the Push token of the device. When you pass a push token using this API, reachability is only updated if the device is currently marked as _Installed_. If a device is marked as _Uninstalled_, updating the `push_id` or `moe_push_opted` using Track Device API will not affect its reachability (it will remain Unreachable). To change a device's status back to _Installed_, the MoEngage SDK must actively track the device.
moe_push_opted:
type: string
enum: ["True", "False"]
description: This field denotes the opt-in status of the device of the user.
moe_push_provisional_opted:
type: string
description: This field denotes the provisional push opt-in status of the user. Know more about provisional push [here](/user-guide/campaigns-and-channels/mobile-push/notification-features-and-behavior/ios-push-permission-and-reachability).
app_version:
type: string
description: This field denotes the version of the app on the device.
os_version:
type: string
description: This field denotes the device's operating system version.
moe_gaid:
type: string
description: This field denotes the unique advertising identifier for Android devices to measure user behavior and campaign performance.
idfv:
type: string
description: This field denotes the unique advertising identifier for iOS devices.
CreateDeviceRequest:
title: "Device"
type: object
required:
- type
- customer_id
- device_id
- attributes
properties:
type:
type: string
enum: [device]
description: 'This field denotes the type of request. Supported value is: device. This field is case-sensitive. When passing the value in the request, follow the case as in the example.'
customer_id:
type: string
description: 'This field denotes the unique identifier used to identify a user in MoEngage. Note that devices can be created for existing users only.'
device_id:
type: string
description: 'This field denotes the unique identifier used to identify the device associated with a user in MoEngage.
If your app is integrated with MoEngage SDK, the SDK assigns a unique device_id to the devices of your end-users.
If your app is not integrated with MoEngage SDK, you can use unique alphanumeric values or other device attributes such as Push token, GAID/IDFV to assign unique device_id values to devices of your user.'
attributes:
$ref: '#/components/schemas/DeviceAttributes'
DeviceOptOutRequest:
type: object
required:
- user_identifier_type
- user_identifier_value
- action_type
properties:
user_identifier_type:
type: string
description: This field denotes the type of user identifier.
user_identifier_value:
type: string
description: This field denotes the user identifier.
action_type:
type: string
enum: [block, unblock]
description: This field denotes the type of action to be achieved using this API.
reason:
type: string
description: This field denotes the reason for blocking or unblocking a device.
client_reference_id:
type: string
description: This field denotes the reference ID of the user.
device_identifiers:
type: array
description: |
This field denotes the device identifiers associated with the device you intend to block or unblock. Supported values are:
* `unique_id` (unique_id)
* `device_unique_id` (device_id)
* `push_id` (push_id)
* `moe_gaid` (GAID)
Note:
* If you do not pass this value, the API blocks/unblocks all current devices of the user.
* Ensure to pass any one of the device identifiers for a particular device.
* When passing the device identifiers within the array, ensure to explicitly define each of them.
items:
type: object
properties:
GAID:
type: string
description: This field denotes the unique advertising identifier for Android devices to measure user behavior and campaign performance.
IDFV:
type: string
description: This field denotes the unique advertising identifier for iOS devices.
unique_id:
type: string
device_unique_id:
type: string
description: This field denotes the unique identifier used to identify the device associated with a user in MoEngage.
push_id:
type: string
description: This field denotes the Push token of the device.
TestConnectionRequest:
type: object
required:
- app_id
- app_secret
- source
- region
properties:
app_id:
type: string
description: 'Your MoEngage Workspace ID.'
app_secret:
type: string
description: 'Your MoEngage Data API Key.'
source:
type: string
description: 'The tool from where you are sending the request.'
example: test
region:
type: string
description: 'Your MoEngage region (e.g., "01" for DC-01).'
example: "01"
ImportDetailsRequest:
type: object
properties:
import_type:
type: string
enum: [USERS, EVENTS, AUX_DATA]
description: 'This field denotes the type of data to be imported.'
date:
type: object
description: |
This field denotes the file processing date. Supported values are:
* `start_date`
* `end_date`
* `format`
If this field is not passed, the API will respond with details of all the files corresponding to the import_id or import_name passed and in accordance to the offset and limit values.
Supported date time formats are:
* `"datetime_format": "YYYY-MM-DD"` (2022-01-22)
* `"datetime_format": "YYYY/MM/DD"` (2022/01/22)
* `"datetime_format": "DD/MM/YYYY"` (22/01/2022)
* `"datetime_format": "DD-MM-YYYY"` (22-01-2022)
* `"datetime_format": "DD-MM-YYYY hh:mm:ss"` (31-12-2022 12:10:33)
* `"datetime_format": "DD/MM/YYYY hh:mm:ss"` (31/12/2022 12:10:33)
* `"datetime_format": "YYYY-MM-DD hh:mm:ss"` (2019-02-22 17:54:14)
* `"datetime_format": "YYYY/MM/DD hh:mm:ss"` (2019/02/22 17:54:14)
properties: # <--- Use 'properties' directly for objects, NO 'items'
start_date:
type: string
format: date-time
description: The start date of the import.
end_date:
type: string
format: date-time
description: The end date of the import.
format:
type: string
description: The format of the date.
schedule_type:
type: string
enum: [PERIODIC, ONETIME]
description: 'This field denotes the type of import schedule.'
file_source:
type: string
enum: [SFTP, S3, CSV]
description: 'This field denotes the file source of the import.'
schedule_status:
type: string
enum: [SUCCESSFUL, FAILED, PARTIAL_SUCCESS,SCHEDULED, PROCESSING, QUEUED, ARCHIVED ]
description: |
This field denotes the import schedule status.
* PARTIAL_SUCCESS is displayed when all rows in the files are not processed successfully.
* QUEUED is displayed when the import is queued to be processed next.
* ARCHIVED is displayed when the import is archived.
import_name:
type: string
description: "This field denotes the name of the import."
offset:
type: integer
description: |
'API responds with a maximum of 50 file details in a single response. For example, if there are a total of 150 files that are part of the API response, then:
* Offset = 1 will fetch the details of the first 50 files
* Offset = 2 will fetch the file details of the next 50 imports
* Offset = 3 will fetch the import details of the last 50 imports
* If offset is not passed in the request body, the API response will consider offset = 1.
You can refer to the total_count parameter in the response to understand how many total files are part of the response.
OR
If the API responds with more_files = true, it indicates that there are more files that are not part of the current response for which another API request must be made with offset +1.'
default: 1
ImportDetailsResponse:
type: object
properties:
status:
type: string
description: "This field denotes the status of the API response."
example: success
total_count:
type: integer
description: "This field denotes the total count of the imports in the response."
example: 1
data:
type: array
description: "This field contains the import data details."
items:
type: object
properties:
import_id:
type: string
description: This field denotes the unique ID of the import.
import_name:
type: string
description: This field denotes the unique name of the import.
last_run_status:
type: string
description: This field denotes the latest sync status of the import.
format: date-time
import_type:
type: string
description: This field denotes the import type.
enum: [USERS, EVENTS, AUX_DATA]
schedule_type:
type: string
description: This field denotes the file type.
enum: [ONETIME, PERIODIC]
import_source:
type: string
description: "This field denotes the source of import."
enum: [S3, SFTP, CSV]
custom_segment_config:
type: array
description: This field contains details about the custom segment.
items:
type: object
properties:
id:
type: string
description: This field denotes the custom segment ID.
name:
type: string
description: This field denotes the unique name of the custom event.
type:
type: string
description: This field denotes the type of custom segment.
user_id_column:
type: string
description: This field denotes the attribute selected as the identifier.
aux_data_config:
type: array
description: This field contains details about the auxiliary data.
items:
type: object
properties:
primary_key:
type: string
description: This field denotes the attribute used as the auxiliary data import ID.
retention_period:
type: integer
description: This field denotes the number of days, weeks, and months (to be read with retention_type).
retention_type:
type: string
description: The field denotes retention type.
enum: [DAYS, WEEKS, MONTHS]
total_files:
type: integer
description: This field denotes the total number of files in the import.
processed_files:
type: integer
description: This field denotes the total number of processed files in the import.
total_rows:
type: integer
description: This field denotes the total number of rows across all files.
processed_rows:
type: integer
description: This field denotes the total number of processed rows across all files.
created_at:
type: integer
description: This field denotes the date at which the import is created.
last_run_at:
type: string
description: This field denotes the date on which the import was last run.
format: date time
next_scheduled_at:
type: string
description: This field denotes the date on which the import is next scheduled.
format: date time
created_by_email:
type: string
description: This field denotes the email ID of the team member who created the import.
status:
type: string
description: This field denotes the import status.
time_zone:
type: string
description: This field denotes the timezone of the workspace.
offset:
type: integer
description: |
This field denotes the pagination value of the imports. For example, if there are 100 imports to be fetched in the response:
* Offset = 1 will return the first 50 imports
* Offset = 2 will return the next 50 import details
more_files:
type: string
description: This field indicates if there are more files. For example, if there are 100 imports and offset = 1, 50 imports will be returned with more_file = true to indicate that offset = 2 must be passed to get the next 50 imports.
FileRunHistoryRequest:
type: object
required:
- import_id
- import_name
properties:
import_id:
type: string
description: 'The unique identifier is used to identify the import. You can find this on the Data Imports page of the MoEngage dashboard. Data > Data Imports > Click the ellipsis icon for an import > View. The import_id or the import_name must be passed.'
import_name:
type: string
description: 'This field denotes the name of the import.The import_id or import_name has to be passed. If both are passed, import_id takes precedence.'
date:
type: object
description: |
This field denotes the file processing date. Supported values are:
* `start_date`
* `end_date`
* `format`
If this field is not passed, the API will respond with details of all the files corresponding to the import_id / import_name passed and in accordance to the offset and limit values.
Supported date time formats are:
* `"datetime_format": "YYYY-MM-DD"` (2022-01-22)
* `"datetime_format": "YYYY/MM/DD"` (2022/01/22)
* `"datetime_format": "DD/MM/YYYY"` (22/01/2022)
* `"datetime_format": "DD-MM-YYYY"` (22-01-2022)
* `"datetime_format": "DD-MM-YYYY hh:mm:ss"` (31-12-2022 12:10:33)
* `"datetime_format": "DD/MM/YYYY hh:mm:ss"` (31/12/2022 12:10:33)
* `"datetime_format": "YYYY-MM-DD hh:mm:ss"` (2019-02-22 17:54:14)
* `"datetime_format": "YYYY/MM/DD hh:mm:ss"` (2019/02/22 17:54:14)
properties: # <--- Use 'properties' directly for objects, NO 'items'
start_date:
type: string
format: date-time
description: The start date of the import.
end_date:
type: string
format: date-time
description: The end date of the import.
format:
type: string
description: The format of the date.
file_status:
type: array
description: 'This field denotes the status of files contained in an import.'
items:
type: string
enum: [SUCCESSFUL, FAILED, PARTIAL_SUCCESS, PROCESSING, QUEUED, WAITING]
offset:
type: integer
description: |
'API responds with a maximum of 50 file details in a single response. For example, if there are a total of 150 files that are part of the API response, then:
* Offset = 1 will fetch the details of the first 50 files
* Offset = 2 will fetch the file details of the next 50 imports
* Offset = 3 will fetch the import details of the last 50 imports
* If offset is not passed in the request body, the API response will consider offset = 1.
You can refer to the total_count parameter in the response to understand how many total files are part of the response.
OR
If the API responds with more_files = true, it indicates that there are more files that are not part of the current response for which another API request must be made with offset +1.'
default: 1
FileRunHistoryResponse:
type: object
properties:
status:
type: string
description: "This field denotes the status of the API response."
example: success
total_count:
type: integer
description: "This field denotes the total count of the files fetched based on the API request."
example: 1
data:
type: array
description: "This field contains the file data details."
items:
type: object
properties:
id:
type: string
description: This field denotes the unique ID of the file.
file_name:
type: string
description: This field denotes the name of the file.
scheduled_at:
type: string
description: This field denotes the time at which the file is scheduled.
format: date-time
completed_at:
type: string
description: This field denotes the time at which the file is completed.
format: date-time
type:
type: string
description: This field denotes the file type.
enum: [USERS, EVENTS, AUX_DATA]
file_size:
type: string
description: "This field denotes the file size in terms of the number of rows in the file."
file_status:
type: string
description: This field denotes the file status.
enum: [SUCCESSFUL, FAILED, PARTIAL_FAILURE, QUEUED]
status_msg:
type: string
description: This field denotes the error message in case of failure or partial failure.
total_rows:
type: integer
description: This field denotes the total number of rows in the file.
skipped_rows:
type: integer
description: This field denotes the skipped number of rows in the file.
updated_rows:
type: integer
description: This field denotes the updated number of rows in the file.
failed_rows:
type: integer
description: This field denotes the number of rows in the file that failed to process.
aux_data_added_count:
type: integer
description: This field denotes the number of rows added as auxiliary data. This is applicable to auxiliary data.
aux_data_failed_count:
type: integer
description: This field denotes the number of rows that failed to process. This is applicable to auxiliary data.
added_rows:
type: integer
description: This field denotes the total number of rows added from the file.
offset:
type: integer
description: |
This field denotes the pagination value of the imports. For example, if there are 100 imports to be fetched in the response:
* Offset = 1 will return the first 50 imports
* Offset = 2 will return the next 50 import details
more_files:
type: string
description: This field indicates if there are more files. For example, if there are 100 imports and offset = 1, 50 imports will be returned with more_file = true to indicate that offset = 2 must be passed to get the next 50 imports.
BulkImportRequest:
type: object
required:
- type
- elements
properties:
type:
type: string
enum: [transition]
description: This is used to identify the type of request. This field is case-sensitive. Follow the case as in the example when passing the value in the request.
elements:
type: array
enum: [customer, event, device]
description: List of data points (events and customers) to track. The type field in this list denotes whether the information is for a customer or an event. This field is case-sensitive. Follow the case as in the example when passing the value in the request.
items:
oneOf:
- $ref: '#/components/schemas/CreateUserRequest'
- $ref: '#/components/schemas/CreateEventRequest'
- $ref: '#/components/schemas/CreateDeviceRequest'
StreamsWebhookPayload:
type: object
properties:
app_name: { type: string }
source: { type: string, example: "MOENGAGE" }
moe_request_id: { type: string, format: uuid }
events:
type: array
items:
type: object
properties:
event_name: { type: string }
event_code: { type: string }
event_uuid: { type: string, format: uuid }
event_time: { type: integer, format: int64, description: "Epoch time in seconds" }
event_type: { type: string, enum: [CAMPAIGN_EVENT, USER_ACTION_EVENT] }
event_source: { type: string, example: "MOENGAGE" }
uid: { type: string, description: "MoEngage customer_id" }
event_attributes:
type: object
additionalProperties: true
user_attributes:
type: object
additionalProperties: true
device_attributes:
type: object
additionalProperties: true