Update Offering
This API partially updates an existing offering. Only the fields present in the request body are
changed; omitted fields keep their current values. You can update offerings in the
active and scheduled states. Requires the write:offers scope and an
Idempotency-Key header.
tags and offering_attribute_configuration overwrite the existing values when included. To add one tag, send the current list plus the new tag ID. To remove all tags, send an empty array.Rate Limit
The rate limits are at the workspace level. Each endpoint allows 100 requests per minute, 300 requests per hour, and 600 requests per day.Authorizations
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 Personalize tile.
For more information on authentication and getting your credentials, refer here.
Headers
Client-generated UUID v4. Reusing the same key within 24 hours returns the original 200 response without re-applying the update. A concurrent in-progress key returns 409 DUPLICATE_IDEMPOTENCY_KEY; reusing a key with a different body returns 409 IDEMPOTENCY_CONFLICT.
Client-supplied trace ID (UUID v4). The server echoes it in the X-MOE-Request-Id response header so you can correlate the request with server-side logs.
Path Parameters
Prefixed offering ID returned by the create endpoint, including the offer_ prefix.
Body
Only the fields you include are updated; omitted fields keep their current values.
Immutable and state-gated fields:
variation_metais fully editable while the offering isscheduled. Onceactive,typeand thevariantsPerLocalekey set are locked and returnIMMUTABLE_FIELD; what stays editable depends ontype— forSMV, thesmv_distributionsplit percentages andcontrol_group.percentage; forDMV, onlycontrol_group.percentage.conversioncan be updated only while the offering isscheduled.scheduling.start_datetimecan be changed only while the offering isscheduled.expiry_datetimecan be updated in any modifiable state.
Client-generated tracing ID for server-side log correlation. Format: the req_ prefix followed by a UUID v4.
^req_[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"req_7b3f9200-c14a-42e8-b891-557766330002"
Email address of the user making the update. Always recorded in the audit log.
New display name, unique within the workspace. 5–100 characters. Allowed characters: letters, numbers, and underscores.
5 - 100^[a-zA-Z0-9_]+$New free-text description. Maximum 500 characters.
500New priority value used to rank this offering. Integer from 1 to 100.
1 <= x <= 100Replacement tag list. This overwrites the existing tags entirely rather than adding to them. To add one tag, send the current tags plus the new one; to remove all tags, send an empty array. Each tag ID must already exist. Maximum 10 tags.
10Partial scheduling update. All fields are optional. start_datetime can be changed only
while the offering is scheduled. expiry_datetime can be updated in any modifiable state
to extend or shorten the window.
Audience targeting that controls which users are eligible for the offering. The filter
structure is forwarded as-is to the MoEngage segmentation service. Use included_filters
for criteria a user must match and excluded_filters for criteria that disqualify a user.
To target all users, send an empty filters object: { "filters": {} }.
{
"filters": {
"included_filters": {
"filter_operator": "and",
"filters": [
{
"filter_type": "user_attributes",
"name": "country",
"operator": "equals",
"data_type": "string",
"value": "IN"
}
]
}
}
}Content delivered to the user. Choose one of two formats:
- Flat format (single variant, single locale): send a
content_1object at the root. - Nested format (multiple variants or multiple locales): send a
localesmap. Each key is a locale identifier; within each locale, avariationsmap keys variation IDs (matching the names invariation_meta.variantsPerLocale) to their content.
Do not send both content_1 and locales in the same request.
{
"content_1": {
"type": "json",
"value": "{\"headline\":\"Save 20% today\",\"cta_text\":\"Claim offer\",\"image_url\":\"https://cdn.example.com/banner.png\",\"cta_url\":\"https://example.com/offer/summer\"}"
}
}Variation configuration for the offering. Editability depends on the offering's status and
variation type:
- While the offering is
scheduled, the entire object is editable. - Once
active, thetypeandvariantsPerLocalekey set are locked and returnIMMUTABLE_FIELD. ForSMVyou can still update thesmv_distributionsplit percentages andcontrol_group.percentage; forDMVonlycontrol_group.percentageis editable.
Variation strategies:
SMV(Static Multi-Variant): static allocation that you control. Variations are served according to the fixed percentagesmv_distributionsplit you define.DMV(Dynamic Multi-Variant): dynamic allocation that MoEngage optimizes automatically. You still provide ansmv_distributionsplit, but the system adjusts how variations are served.CONTROL_ONLY: control group only, with no content variations served.
{
"type": "SMV",
"variantsPerLocale": ["Variant_A", "Variant_B"],
"smv_distribution": {
"split": { "Variant_A": 70, "Variant_B": 30 }
},
"control_group": { "is_enabled": true, "percentage": 10 }
}Frequency capping that limits how often the offering is delivered. Two independent rules can be enabled at the same time:
overall— caps total deliveries across all users within the schedule period.user_level— caps deliveries to a single user within the schedule period.
{
"overall": {
"enabled": true,
"limit_value": 10000,
"limit_schedule": "DAILY"
},
"user_level": {
"enabled": true,
"limit_value": 3,
"limit_schedule": "WEEKLY"
}
}Toggle the account-level Global Control Group holdout for this offering.
New impression tracking window in hours. Range 1–240.
1 <= x <= 240Replacement custom attribute configuration. This overwrites the existing list entirely. Maximum 5 entries.
5Conversion goal configuration used to measure offering effectiveness. You can set or change
conversion only while the offering is scheduled; on an active offering it returns
400 IMMUTABLE_FIELD.
Response
Offering updated.