Offering lifecycle
An offering moves through different states automatically based on its scheduling window. There is no separate publish step — the offering goes live as soon as it is created, if the scheduling window is current.Endpoints
The Offerings API is a collection of the following endpoints:- List Offerings: Returns a paginated list of offerings, with filtering by ID, name, status, tags, date range, and creator.
- Create Offering: Creates an offering in your workspace, including content, scheduling, segmentation, and variation configuration.
- Update Offering: Partially updates an existing offering. Only the fields in the request body are changed.
- List Offer Templates: Returns a paginated list of the personalization templates available in your workspace. Use a template
idasmeta.templateIdin offering content.
Rate Limits
Rate limits apply per consumer. Each endpoint has its own limit:429 response with a Retry-After header indicating how many seconds to wait before retrying.
Idempotency
The Create and Update endpoints require anIdempotency-Key header (UUID v4). Reusing the same key within 24 hours returns the original response without re-running the operation, so retries on network failures are safe.
Two conflict cases return 409:
DUPLICATE_IDEMPOTENCY_KEY- a request with the same key is already in progress. Wait for it to complete before retrying.IDEMPOTENCY_CONFLICT- the key was already used within 24 hours with a different request body. Use a new UUID v4 key to submit the changed payload.
Errors
The Offerings API uses standard HTTP status codes and returns all errors in a consistent JSON envelope.HTTP status codes
Error response shape
All4xx and 5xx responses return a JSON body in the following format:
details array is only present on 400 VALIDATION_FAILED responses. All other error codes return only the top-level error object.Common error codes
For the full list of error codes per endpoint, see the individual endpoint pages. The most commonly encountered codes across all Offerings API operations are:FAQs
Getting Started
Do I need to do anything before using the API?
Do I need to do anything before using the API?
403 FORBIDDEN. Contact your MoEngage CSM or the Support team to request enablement.
Before calling the Create Offering API, ensure the following workspace resources already exist:- Tags — create and manage them in the MoEngage dashboard under Settings → Advanced Settings → Tags. The tag IDs you pass in the
tagsarray must already exist. - Offering attributes — configured under Offer Decisioning → Attributes in the dashboard. Pass their IDs in
offering_attribute_configuration. - Personalization templates — list available templates using
GET /v5/offers/templatesand use the returnedidasmeta.templateIdin your content.
Where do I find my API key and Workspace ID?
Where do I find my API key and Workspace ID?
Offering Lifecycle
What states can an offering be in?
What states can an offering be in?
scheduled, active, expired, archived, or draft.
See the Offering lifecycle section above for the full state table.Can I fetch a single offering by ID?
Can I fetch a single offering by ID?
GET /v5/offers/{offer_id} endpoint. To retrieve a specific offering, call List Offerings with the id query parameter set to the offering’s ID (including the offer_ prefix). This returns a single-item list for that offering.Create Offering
What is the minimum required to create an offering?
What is the minimum required to create an offering?
name, priority, delivery, created_by, scheduling (with both start_datetime and expiry_datetime), segment_info, offer_content, and variation_meta. All other fields — tags, capping_rules, conversion, imp_track_hours, offering_attribute_configuration — are optional and can be omitted.Can I change variation_meta after creation?
Can I change variation_meta after creation?
type:- While the offering is
scheduled, the entirevariation_metaobject is editable. - Once the offering is
active, thetypeand thevariantsPerLocalekey set are locked. ForSMV, you can still update thesmv_distributionsplit percentages andcontrol_group.percentage. ForDMV, onlycontrol_group.percentageis editable.
IMMUTABLE_FIELD. The variation types are SMV (static allocation you control) and DMV (dynamic allocation MoEngage optimizes).Can I include all fields in a single Create request, or do I build it incrementally?
Can I include all fields in a single Create request, or do I build it incrementally?
scheduled when start_datetime is in the future, active when the current time is within the scheduling window, or expired when start_datetime is already in the past.What does priority control?
What does priority control?
offering_attribute_configuration scores.What characters are allowed in an offering name?
What characters are allowed in an offering name?
Summer_Sale_Promo_2026.Update Offering
Which fields can I update after creation?
Which fields can I update after creation?
name, description, priority, tags, scheduling (within state-based rules below), segment_info, offer_content, capping_rules, is_global_control_enabled, imp_track_hours, offering_attribute_configuration, and conversion. You can also update variation_meta, but only within the status-based and type-based rules described below.What can I change when an offering is active vs. scheduled?
What can I change when an offering is active vs. scheduled?
Do I need to send the full offering payload when updating?
Do I need to send the full offering payload when updating?
tags and offering_attribute_configuration are replaced entirely when included, not merged. To add a single tag, send the current tag list plus the new one. To remove all tags, send an empty array.Can I update an expired or archived offering?
Can I update an expired or archived offering?
403 with EXPIRED_OFFERING or ARCHIVED_OFFERING. Only offerings in active and scheduled states can be updated.How do I find the offering ID to use in the Update request?
How do I find the offering ID to use in the Update request?
offer_id (including the offer_ prefix) is returned in the data.id field of the Create Offering response. You can also retrieve it by calling List Offerings and filtering by name or status.Idempotency
When should I use the same Idempotency-Key vs. a new one?
When should I use the same Idempotency-Key vs. a new one?
What happens if I reuse an Idempotency-Key with a different request body?
What happens if I reuse an Idempotency-Key with a different request body?
409 IDEMPOTENCY_CONFLICT. The original operation is not replayed and the new payload is not processed. Generate a new UUID v4 key and resubmit.What format is required for the Idempotency-Key?
What format is required for the Idempotency-Key?
550e8400-e29b-41d4-a716-446655440000). For automated workflows, generate a fresh UUID v4 per distinct operation. Do not derive the key from the request payload — if the payload is identical to a previous request, an intentional replay would return the cached response.