Skip to main content
The MoEngage Subscription Preferences API (V5) lets you read and manage a user’s Subscription Category preferences directly from your own systems, without depending on MoEngage-hosted landing-page flows. Users are identified by a user_identifier_type / user_identifier_value pair (moe_user_id, uid, or email), rather than a path parameter.
The Subscription Preferences (V5) API supports only the email channel.
  • For PII-tokenized databases, only UID and MoEngage ID are supported.
  • For PII-encrypted databases, the API also accepts the encrypted email value.

Endpoints

The Subscription Categories (V5) API consists of the following endpoints:
Transitional authentication note: This route currently accepts HTTP Basic Auth only. Bearer token support is planned but not yet active on this path — Bearer requests return 401 until the APISIX gateway fronts this route.

FAQs

Get Subscription Categories

No. This endpoint returns the workspace’s full active subscription-category catalog and isn’t scoped to any individual user — you only need to authenticate the request.
The catalog is served from the existing hourly category cache, so a category you just created or edited in the dashboard may take up to an hour to appear here.
Categories for all channels are returned. Since this API supports only the email channel at present, passing channel=email returns the same catalog.

Get Subscription Preferences

When the EMAIL_UNSUB_BASED_ON_EMAIL sentry flag is on, MoEngage processes every user profile that has the same email address.
The call returns 404.
Yes — set user_identifier_type to whichever identifier you hold (moe_user_id, uid, or email) along with the matching user_identifier_value. You don’t need to look up a different identifier first.

Update Subscription Preferences

This endpoint is processed asynchronously by a separate worker, under the existing SLA. A 202 only confirms the request was accepted — it doesn’t confirm the change has taken effect yet. Poll Get Subscription Preferences for the same identifier and confirm the returned state matches what you sent.
No — it’s required on every call, since it has no neutral default: true unsubscribes the profile from every category on the channel, false explicitly clears an existing global unsubscribe.
They’re left unchanged. categories is a sparse map — only the category names present in the request are updated.
The call fails with 409. Reusing the same key with the same body, however, returns the original response without reapplying the update.
It defaults to email, the only channel this API supports at present, so the update applies to the user’s email subscription categories.
No — any attribute name is accepted. The only limits are a maximum of 5 attributes per call, names of 50 characters or fewer, and values of 255 characters or fewer.

Postman Collection

Test these endpoints quickly by importing our Postman collection: View in Postman