What MM API for WhatsApp Is
Not exposed by Dualhook: Dualhook's Embedded Signup v4 configuration does not request Marketing Messages Lite and the allowlisted runtime does not expose
/marketing_messages. All examples on this page describe Meta's separate product and require a separately reviewed, customer-owned Meta app and authorization. Never substitute adh_live_...key or a Dualhook-managed credential.
Marketing Messages API for WhatsApp (formerly "Marketing Messages Lite API", now generally available) is Meta's optimized send path for marketing template messages. It uses the same templates, the same phone numbers, and the same per-message billing as Cloud API — but routes sends through a parallel /marketing_messages endpoint that adds delivery and creative optimizations.
MM API is send-only. To receive incoming messages, status webhooks for non-marketing traffic, or send anything other than marketing templates, you continue to use Cloud API in parallel on the same phone number.
Feature Comparison vs Cloud API
| Capability | Cloud API | MM API for WhatsApp |
|---|---|---|
| Send marketing templates | Yes | Yes |
| Send authentication / utility / service templates | Yes | No |
Send freeform (text, image, etc.) | Yes (inside CSW) | No |
| Receive incoming messages and statuses | Yes | No |
| Quality-based delivery optimization | No | Yes — up to ~9% higher delivery for high-engagement messages |
| Automatic creative optimizations | No | Yes |
| Animated image (GIF) header | No | Yes |
| Android app deep links on URL buttons | No | Yes |
| Customizable TTL on marketing templates | No | Yes (12 hours – 30 days) |
| TTL on auth/utility templates | Yes | N/A |
| Performance benchmarks vs similar businesses | No | Yes |
| Tailored creative recommendations | No | Yes |
| Conversion metrics (Web/App) | No | Yes |
| Cost metrics (spend per template, per click, per delivery) | Yes | Yes |
| Basic metrics (sent, delivered, read, clicked, errors) | Yes | Yes |
| Local Storage support | Yes | Yes |
| Formal compliance program support | Yes | Yes |
| Max-price (beta) | No | Yes |
| Onboarding | Embedded Signup | Embedded Signup, Intent API, Intent UI |
The /marketing_messages Endpoint
POST https://graph.facebook.com/<GRAPH_VERSION>/<PHONE_NUMBER_ID>/marketing_messages
The send payload is identical to Cloud API's /messages payload for template messages, with two MM-specific optional fields:
{
"messaging_product": "whatsapp",
"recipient_type": "individual",
"to": "<WHATSAPP_USER_PHONE_NUMBER>",
"type": "template",
"template": {
"name": "<TEMPLATE_NAME>",
"language": { "code": "<LANGUAGE_AND_LOCALE_CODE>" },
"components": [ /* same shape as Cloud API */ ]
},
"product_policy": "CLOUD_API_FALLBACK",
"message_activity_sharing": true
}
| Field | Default | Purpose |
|---|---|---|
product_policy | CLOUD_API_FALLBACK | If the WABA hasn't completed MM API onboarding, the message is automatically sent through Cloud API instead. Set to STRICT to disable this fallback (the call fails instead of falling back). |
message_activity_sharing | WABA-level default | Per-message override of whether read/click events from this send are shared with Meta to improve optimization. Boolean. |
Authentication must come from the business's own separately reviewed Meta integration. Dualhook does not reveal or authorize use of its customer-scoped BISU token for this endpoint.
Fallback Behavior to Cloud API
By default (product_policy omitted or set to CLOUD_API_FALLBACK), MM API will silently route a marketing template send through Cloud API if the WABA has not yet completed MM API onboarding. This makes MM API safe to wire up before the customer has signed the ToS.
Two important caveats:
- If you have set
disable_marketing_messages_on_cloud_api: trueon the WABA (see below), the fallback is rejected with error131063because Cloud API marketing is disabled. - If you set
product_policy: STRICTon the call, no fallback is attempted regardless of the disable flag.
Disable Marketing on Cloud API
Once a WABA has fully onboarded to MM API, you can require all marketing traffic to go through MM API by setting:
POST /<WABA_ID>
{ "disable_marketing_messages_on_cloud_api": true }
When this is true, attempting to send a MARKETING category template through /messages returns:
{
"error": {
"code": 131063,
"message": "(#131063) Marketing templates disabled for Cloud API",
"error_data": {
"details": "Your template is categorized as Marketing, but marketing templates are currently disabled for your Cloud API configuration. To send this template, use the Marketing Messages API for WhatsApp or enable marketing templates on Cloud API by turning off disable_marketing_messages_on_cloud_api."
}
}
}
This setting only takes effect on WABAs that have fully onboarded (ToS signed). Setting it on a partially-onboarded WABA can produce blocked sends without a working fallback path. To check the current value:
GET /<WABA_ID>?fields=disable_marketing_messages_on_cloud_api
To re-enable Cloud API marketing, set the field back to false.
Geographic Availability
| Region | MM API behavior |
|---|---|
| EEA, UK, Japan, South Korea | Sends work, but no delivery optimizations, no click/conversion reporting, no per-user marketing limits. Metrics available only via Business Management API and WhatsApp Manager (not Ads Manager / Insights API). |
| United States | Marketing messages to US recipients are blocked by Meta with error 131049 since April 1, 2025 — applies to both Cloud API and MM API. US-based business numbers can still send to non-US recipients. |
| Russia | MM API works since June 20, 2025, but with no delivery optimization or click/conversion reporting for sends from Russian business profiles or Russian payment methods. |
| Cuba, Iran, North Korea, Syria, Crimea, Donetsk, Luhansk | Cannot onboard, cannot send. Applies platform-wide. |
| Everywhere else | Full feature set. |
Status Webhooks
MM API sends emit the same sent / delivered / read status webhooks as Cloud API, but the pricing object distinguishes them:
"conversation": {
"id": "<CONVERSATION_ID>",
"origin": { "type": "marketing_lite" }
},
"pricing": {
"billable": true,
"pricing_model": "PMP",
"category": "marketing_lite"
}
For Cloud API marketing sends, pricing.category is marketing and conversation.origin.type is marketing. For MM API sends, both fields use marketing_lite.
If you want to attribute outgoing message IDs back to their send path (e.g. for billing reconciliation), log which endpoint each wamid was returned from at send time and join against the webhook's id field.
Incoming Messages (Send-Only)
MM API does not deliver incoming messages. The messages field in webhooks for inbound user messages always comes through Cloud API's webhook subscription. In Dualhook setups, this is delivered directly to your endpoint via Webhook Override — there is no separate MM API inbound channel to subscribe to.
Errors Specific to MM API
| Code | Meaning | Fix |
|---|---|---|
131049 | Marketing messages cannot be delivered to US recipients | Suppress US wa_ids before sending |
131063 | Marketing templates disabled for Cloud API | Either send via /marketing_messages or set disable_marketing_messages_on_cloud_api: false |
131061 | Templates with bid_spec (max-price) cannot be sent via Cloud API | Send via /marketing_messages instead |
131050 | Recipient stopped marketing messages from your business | Suppress the recipient and respect the user_preferences webhook |
Dualhook's Stance
Dualhook supports marketing templates through the standard Cloud API /messages route at api.dualhook.com. It does not request MM Lite terms, ad assets, ads_read, or the MM Lite feature during Embedded Signup. Meta-generated MM_LITE_TERMS_SIGNED management events may still be observed and recorded as lifecycle metadata, but Dualhook does not initiate that event or enable the product.