Complete WhatsApp Cloud API and Meta Graph error code reference — what each code means, where it appears, and how to fix it.
Meta Graph and WhatsApp Cloud API errors can appear in two places:
- The immediate API response when your backend calls Meta.
- A later
statuses[].errors[] object in a message-status webhook (asynchronous). Some errors arrive through both channels.
Dualhook does not proxy outbound sends or message-status webhooks, so message-send failures happen in your own backend and in the webhook endpoint you configured with Webhook Override. This page is a comprehensive reference for the WhatsApp Cloud API and Graph API error codes — what they mean, where they appear, and how to fix them. Build your handling logic around the numeric code and error_data.details, not titles or HTTP status (Meta is deprecating titles and error_subcode).
Where Errors Appear
If Meta rejects a request before accepting it, your sender receives an HTTP error and an error object immediately. Examples: invalid token, missing parameter, wrong template variable count, permission issue.
Status webhook after the send
If Meta accepts the request but later cannot deliver the message, your webhook receives a failed status with statuses[].errors[]. Cloud API surfaces asynchronous errors under entry.changes.value.errors and entry.changes.value.messages.errors. Examples: recipient cannot receive the message, pair rate limit, user stopped marketing messages.
Most API failures return an error object with this shape:
{
"error": {
"message": "(#130429) Rate limit hit",
"type": "OAuthException",
"code": 130429,
"error_data": {
"messaging_product": "whatsapp",
"details": "Cloud API message throughput has been reached."
},
"error_subcode": 2494055,
"fbtrace_id": "Az8or2yhqkZfEZ-_4Qn_Bam"
}
}
Always log: error.code, error.message, error_data.details, and fbtrace_id. error_subcode is deprecated and is not returned on v16.0+ — do not build logic around it.
Status webhooks use a similar shape inside statuses[].errors[]:
{
"statuses": [
{
"id": "wamid...",
"status": "failed",
"errors": [
{
"code": 131026,
"title": "Message undeliverable",
"message": "Message undeliverable",
"error_data": {
"details": "Message Undeliverable."
}
}
]
}
]
}
Quick Triage
| Symptom | First place to check |
|---|
Sends fail immediately with 190, 0, 10, or 200 | Token validity, app permissions, WABA/phone-number asset tasks |
Free-form text fails with 131047 (legacy 470) | Customer service window expired; send a template instead |
Template send fails with 132000 / 132001 | Template name, language, status, and variable count |
Status webhook shows 131026 | Recipient cannot receive the message; validate opt-in/contact quality |
Status webhook shows 131056 | Too many messages to the same user too quickly; slow down per recipient |
Throughput error 130429 or 131048 / 131064 | Per-number throughput, quality, or template-classification limits |
Marketing send shows 131049 / 131050 / 131063 | Marketing eligibility, recipient preference, send endpoint, or region |
Status webhook shows 137000 | Identity-key check mismatch; re-verify the user outside WhatsApp |
Account-wide failures 368 / 131031 / 130497 | Account restriction, policy enforcement, or country eligibility |
Authorization and Permission Errors
| Code | Meaning | Recommended action |
|---|
0 | Unable to authenticate the app user | Token expired, invalidated, or access revoked — get a new access token |
3 | Capability or permissions issue | Verify the endpoint's required permissions with the access token debugger |
10 | Permission not granted or removed | Verify app permissions and review status; check API eligibility requirements |
190 | Access token expired | Get a new access token (in Dualhook, reconnect or reveal the current token) |
200 | No access token provided ("Provide valid app ID") | Include a valid access token. Codes 200–299 also indicate a permission that is not granted or has been removed |
131005 | Permission not granted or removed | Confirm the token belongs to the business/phone number and holds the needed WhatsApp permissions |
Integrity and Policy Errors
| Code | Meaning | Recommended action |
|---|
368 | WABA restricted or disabled for a platform policy violation | See Meta's Policy Enforcement docs; check Account Health |
130497 | Business restricted from messaging users in certain countries | Review the WhatsApp Business Messaging Policy for allowed countries in your category |
131031 | Account locked/restricted, or request data could not be verified (e.g. wrong two-step PIN) | Review account quality/policy status; the Health Status API may show the lock reason |
Request and Parameter Errors
| Code | Meaning | Recommended action |
|---|
100 | Unsupported or misspelled parameter | Check the endpoint reference for supported parameter names, formats, and length limits |
131008 | Required parameter missing | Add the missing field per the endpoint reference |
131009 | One or more parameter values invalid | Check field formats, IDs, button payloads, or reaction target message |
131051 | Unsupported message type | Fix the message type and object structure |
131062 | Message type does not support BSUID recipients | Use a phone number for one-tap/zero-tap/copy-code auth templates — see BSUID Transition |
135000 | Generic error with request parameters | Verify endpoint syntax; contact support if it persists |
Delivery Errors
| Code | Meaning | Recommended action |
|---|
130403 | Business has blocked the end user on WhatsApp | Do not retry; unblock the user to resume sending |
130472 | Message not sent as part of an experiment | Expected for Marketing Message experiments — no action needed |
131021 | Sender and recipient phone number are the same | Send to a number different from the sender |
131026 | Message undeliverable | Recipient is not on WhatsApp, hasn't accepted ToS, or is on an outdated app version — validate the destination and opt-in |
131047 | More than 24h since the recipient last replied (legacy code 470) | Send an approved template message to re-engage |
131049 | Not delivered to maintain healthy ecosystem engagement (per-user marketing limit) | Wait ≥24h before resending; segment recipients — see Per-User Marketing Template Limits |
131050 | Recipient stopped marketing messages from your business | Suppress marketing sends; subscribe to the user_preferences webhook to track opt-out/resume |
131052 | Unable to download media sent by the user | Check error_data.details; ask the user to resend via a non-WhatsApp method |
131053 | Unable to upload the media used in the message | Confirm the media MIME type is supported before retrying |
Throttling and Rate-Limit Errors
| Code | Meaning | Recommended action |
|---|
4 | App reached its API call rate limit | Back off and retry later; reduce call frequency |
80007 | WABA reached its rate limit | Reduce query frequency; see Capacity & Limits |
130429 | Cloud API message throughput reached (per-number ~80 msg/s default) | Queue/throttle and retry with backoff — see Throughput |
131048 | Spam-rate restriction (too many prior messages blocked or flagged) | Check quality status in WhatsApp Manager; improve template/account quality |
131056 | Pair rate limit — too many messages to the same recipient too quickly | Back off (4^X seconds) per retry to that recipient; see Pair Rate Limit |
131064 | Messaging limit reached due to template classification violations | Re-check template categories; restriction lifts after the enforcement period |
133016 | Too many registration/deregistration attempts for this number | Wait until the number is unblocked before retrying |
Template Creation Errors
| Code | Meaning | Recommended action |
|---|
2388040 | A template field exceeded its maximum character limit | Shorten the affected field per the error message |
2388047 | Message header format incorrect | Fix header formatting per the error message |
2388072 | Message body format incorrect | Fix body formatting per the error message |
2388073 | Message footer format incorrect | Fix footer formatting per the error message |
2388293 | Parameter-to-words ratio exceeds the limit | Reduce variables or increase message length |
2388299 | Leading or trailing parameters not allowed | Move variables away from the start/end of the template |
2388019 | Message template limit exceeded | A WABA allows up to 250 templates — delete unused ones. See Templates |
Template Send Errors
| Code | Meaning | Recommended action |
|---|
132000 | Variable count mismatch vs. the approved template | Match the number of variables to the template definition |
132001 | Template not found in the specified language, or not approved | Use the exact name + language locale and confirm it is approved |
132005 | Translated text too long | Shorten variable values or template text |
132007 | Template content violates a WhatsApp policy | See the Template Review docs for the violation reason |
132012 | Variable parameter values formatted incorrectly | Match the component/button/media parameter format defined in the template |
132015 | Template paused due to low quality | Improve quality and wait for re-approval, or use another template |
132016 | Template permanently disabled (paused too many times) | Create a new template with different content |
131061 | Template carries a bid_spec / max-price and can't be sent via Cloud API /messages | Send through the Marketing Messages API |
131063 | Marketing templates disabled for this WABA's Cloud API config | Use the Marketing Messages API, or set disable_marketing_messages_on_cloud_api to false |
Marketing Message Errors
The Marketing Messages API for WhatsApp (MM Lite) reuses Cloud API codes with these additions:
| Code | HTTP | Meaning | Recommended action |
|---|
100 | 400 | "Message must be a template message" | Send a marketing template, not a free-form message |
131009 | 400 | Parameter value not valid | Verify parameters; ad syncing may be incomplete — wait 10 min and retry |
131055 | 400 | Method not allowed — only marketing templates supported | Don't send authentication/utility templates on this API |
132018 | 400 | Template validation error | Review and fix the template parameters, then resend |
134100 | 400 | Only marketing messages supported | Send a MARKETING-category template (Graph API v23.0+) |
134101 | 400 | Template still syncing | New templates take up to 10 min to sync — wait and retry |
134102 | 500 | Template unavailable for use | Check eligibility; confirm marketing_messages_lite_api_status is ONBOARDED, else contact support |
1752041 | 400 | Duplicate onboarding request | The client was already invited by a partner — no action needed; all eligible WABAs onboard automatically |
Flows Errors
| Code | Meaning | Recommended action |
|---|
132068 | Flow is in a blocked state | Correct the Flow before sending |
132069 | Flow is throttled (10 messages with this Flow already sent in the last hour) | Slow down sends using this Flow |
Phone Number and Registration Errors
| Code | Meaning | Recommended action |
|---|
33 | Business phone number has been deleted | Verify the phone number ID is correct |
131037 | The 555 test number has no approved display name | Set/approve a display name for the number — see Display Names |
131045 | Message failed due to a phone number registration error | Register the phone number before sending |
131057 | Business Account in maintenance mode | Often a throughput upgrade — retry shortly |
133000 | Previous deregistration attempt failed | Deregister the number again before registering |
133005 | Two-step verification PIN incorrect | Verify the PIN; reset it via two-step verification if needed |
133006 | Phone number needs verification before registering | Verify and register the number |
133008 | Too many two-step PIN guesses | Wait the time specified in details before retrying |
133009 | Two-step PIN entered too quickly | Check details and slow down retries |
133010 | Phone number not registered on the platform | Register the number before sending |
133015 | Number recently deleted; deletion not yet complete | Wait ~5 minutes, then retry |
2494100 | Account is in maintenance mode | Try again in a few minutes |
Payment and Billing Errors
| Code | Meaning | Recommended action |
|---|
131042 | Payment-method error (no/over-limit credit line, inactive account, missing currency/timezone, pending "Messaging For") | Verify billing setup for the WABA/business portfolio |
131044 | No valid payment method (also seen on user-initiated Calling) | Attach a valid payment method to the WABA |
134011 | WhatsApp Payments terms of service acceptance pending | Accept the WhatsApp Payments ToS via the link in the error message |
Phone Migration Errors
| Code | Meaning | Recommended action |
|---|
2388012 | Phone number already exists in your WhatsApp account | Migrate a number not already present |
2388091 / 2388093 | Number isn't eligible to receive/verify a registration code (not being migrated) | Register and verify the number instead |
2388103 | Cannot migrate phone number (multiple causes) | Common fixes: subscribe the destination WABA to webhooks; get the display name approved; complete business verification and review approval; ensure the source/destination WABAs represent the same business; set up a payment account/credit line; or contact support for OBO-model accounts |
WABA and OBO Ownership Errors
| Code | Meaning | Recommended action |
|---|
2593079 | WABA already marked for migration to a different solution ID | The OBO ownership model is deprecated — contact support |
2593085 | Invalid WABA for OBO mobility | WABA may already use the WABA-Sharing model, or the OBO request wasn't accepted. OBO is deprecated — contact support |
Coexistence Synchronization Errors
These occur in the Coexistence onboarding flow when syncing contacts/history from the WhatsApp Business app.
| Code | Meaning | Recommended action |
|---|
2593107 | Exceeded the max sync API calls for this number | Contacts and history can each sync only once — offboard and re-onboard to retry |
2593108 | Sync request made outside the 24h post-onboarding window | Re-onboard the user, then sync within 24 hours |
2593109 | History sharing is turned off by the business | Live Coexistence still works; the business declined or disabled chat-history sharing |
Template Insights Errors
| Code | Meaning | Recommended action |
|---|
200005 | Template insights unavailable for this WABA | Insights can't be enabled for this WABA right now |
200006 | Cannot disable template insights | Insights can't be disabled once enabled |
200007 | Template insights not enabled | Enable insights first — see Confirming template analytics |
Server and Generic Errors
| Code | Meaning | Recommended action |
|---|
1 | Invalid request or possible server error | Check the WhatsApp Business Platform status page; verify request formatting |
2 | Temporary downtime or overload | Check the platform status page before retrying |
131000 | Message failed due to an unknown error | Retry; if it persists, open a Direct Support ticket |
131016 | A service is temporarily unavailable | Retry with backoff and a circuit-breaker guard |
133004 | Server temporarily unavailable | Check the platform status page and details before retrying |
What to Send Support
When asking Dualhook or Meta support about a send failure, include:
- The full
error.code, error.message, error_data.details, and fbtrace_id.
- Whether it came from an API response or a status webhook.
- The
wamid / message ID if Meta accepted the send.
- The phone number ID and WABA ID.
- The template name + language, if it was a template send.
- The timestamp and Graph API version.
Do not send message content unless support explicitly needs a redacted payload shape. Dualhook support can usually diagnose setup, permissions, template, or health issues from metadata.
Error Handling Strategy
Retryable:
4 / 80007 / 130429 / 131056 rate and throughput limits (with backoff)
1 / 2 / 131000 / 131016 / 133004 transient server failures
- Network timeout/connectivity errors
Usually non-retryable without payload, access, or account changes:
100 / 131008 / 131009 / 131051 validation errors
0 / 10 / 190 / 200 / 131005 auth and permission errors
132000 / 132001 / 132012 template errors
131047 service-window violations (send a template instead)
131049 / 131050 / 131063 marketing preference or policy failures
368 / 130497 / 131031 integrity/policy restrictions
137000 identity-key mismatches (re-verify the recipient)
Suggested Retry Policy
- Use exponential backoff with jitter.
- Cap retry attempts for transient classes (3–6 attempts).
- Send non-retryable errors directly to a dead-letter/ops queue.
- Include idempotency keys in sender jobs to avoid duplicate sends.
- Always store
fbtrace_id for support escalation.
Dualhook surfaces webhook-side delivery errors and management alerts in monitoring views. Message-send API failures happen in your backend caller and should be logged there with full Graph error metadata.