A working reference for the WhatsApp Cloud API errors you actually hit in production - what code 100, 131047, 131048, 132001 and 190 mean, where Meta hides the real reason, and what to do about each.
Key takeaways
- Code 100 "Invalid parameter" is almost never the real message. The specific reason lives in error_user_title, error_user_msg and error_data.details - if you only log error.message you will debug blind.
- 131047 is not a failure - it is the 24-hour service window closing. Free text is rejected until the customer writes again; only an approved template gets through.
- 131048, 131056, 80007 and 368 mean slow down or stop. Retrying them in a loop is how a WhatsApp Business account gets restricted.
- Store the whole error object per message, not a boolean. Without code, subcode, details and fbtrace_id you cannot tell a bad phone number from a paused template from an expired token.
The WhatsApp Cloud API returns errors in the standard Graph API envelope, but the field most developers log - error.message - is usually the least useful one in the response. The real reason sits in other fields of the same payload. This is the working reference: what each code means, which codes require you to stop rather than retry, and what to persist so failures are debuggable after the fact.
The error envelope, and where Meta hides the reason
Every failure arrives as JSON under an error key:
code- the numeric code. This is what you branch on.error_subcode- a sub-code, not always present.message- generic text. For code 100 this is just "Invalid parameter".error_user_titleanderror_user_msg- the actual reason lives here, especially for template validation failures.error_data.details- further detail, often the most precise field of all.fbtrace_id- attach this to any support request to Meta.
The practical consequence: if your system stores only message, every template failure looks identical - "Invalid parameter" - and you cannot tell a wrong variable count from over-long text from a paused template. Persist all of it, and concatenate error_user_title, error_user_msg and error_data.details into one operator-facing string.
Auth and permissions
| Code | Meaning and fix |
|---|---|
| 190 | Access token expired or invalid. The fix is a System User token from Business Manager, not a short-lived token from the Graph API Explorer. |
| 131005 | The token lacks whatsapp_business_messaging, or the System User is not assigned to the WABA and phone number assets. |
| 131042 | Billing problem at the WABA level. Without an active payment method in Business Manager you cannot send paid templates. |
Phone number registration
| Code | Meaning and fix |
|---|---|
| 131045 | Number not correctly registered on the Cloud API. Complete registration, including the two-step PIN. |
| 133010 | Number not registered on the Cloud API at all. Finish API Setup before attempting any send. |
The 24-hour window
| Code | Meaning and fix |
|---|---|
| 131047 | The 24-hour service window has closed. Free-form text is rejected - only an approved template goes through - until the customer messages you again. This is a platform rule, not a bug, and it is better enforced server-side before sending than discovered from the error. |
| 131050 | The recipient opted out of marketing messages from this number. Mark them opted-out and stop. |
| 131049 | Meta chose not to deliver due to per-recipient marketing limits. Nothing to fix in code. |
Rate and spam - the codes that mean stop
These four are different in kind. They are not a malformed request; they are a signal that the account is at risk. A correct sender pauses the campaign automatically when one of them comes back, rather than retrying in a loop.
| Code | Meaning and fix |
|---|---|
| 131048 | Send blocked on spam suspicion and low quality rating. Slow down substantially and improve the content. |
| 131056 | Too many messages to the same recipient in a short period. Wait before sending again to that number. |
| 80007 | WhatsApp Business account rate limit exceeded. |
| 368 | Account temporarily blocked for a policy violation. Check WhatsApp Manager - this is no longer a pacing problem. |
Templates
| Code | Meaning and fix |
|---|---|
| 132000 | Parameter count does not match the number of variables in the template. Three variables require exactly three values. |
| 132001 | Template does not exist or is not approved in the selected language. Approval in he is not approval in en_US. |
| 132005 | Text too long after parameter substitution. Shorten the values or the template body. |
| 132007 | Template content violates WhatsApp policy. |
| 132012 | Parameter value format does not match the template definition. |
| 132015 | Template paused due to low quality rating. It cannot be used until released. |
| 132016 | Template permanently disabled. Create a new one. |
Delivery, media and general errors
| Code | Meaning and fix |
|---|---|
| 131026 | Undeliverable. The recipient has no WhatsApp, blocked you, or has not accepted the current terms. This is the most common error on uncleaned number lists. |
| 131021 | Recipient equals sender. You cannot message yourself. |
| 131009 | Invalid parameter value. Check the phone number ID and the recipient number format. |
| 131008 | Required parameter missing. |
| 131051 | Unsupported message type. |
| 131052 | Failed to download media from the supplied link. |
| 131053 | Media upload failed. Check format and size. |
| 131000 | Generic Meta error. Retry later. |
| 131016 | Meta service temporarily unavailable. |
| 131031 | WhatsApp Business account locked. Check WhatsApp Manager. |
| 130472 | Recipient is in a Meta experiment and cannot receive marketing messages. |
What to persist
For every outbound message, store a row keyed by a unique wamid alongside the full error object. The wamid doubles as the deduplication key: Meta delivers status updates by webhook and occasionally delivers the same update twice. A sparse unique index on wamid handles that without extra code.
Persisting the complete error lets you show the operator, inside the chat thread itself, exactly why a message failed - instead of a red exclamation mark that says nothing.
Frequently asked questions
What does WhatsApp Cloud API error 131047 mean?
It means the 24-hour customer service window has closed. Once 24 hours pass since the customer's last inbound message, free-form text is rejected and only an approved message template can be delivered. It is a platform rule, not a bug. The window reopens the moment the customer sends you another message.
Why does the WhatsApp API keep returning code 100 "Invalid parameter"?
Code 100 is Meta's generic validation error and its message field is deliberately vague. The specific cause is in error_user_title, error_user_msg and error_data.details in the same response. Log those three fields and the real reason - usually a template name, language or parameter structure problem - becomes visible immediately.
Which WhatsApp API errors should stop a bulk send instead of retrying?
131048 (spam suspicion), 131056 (too many messages to one recipient), 80007 (account rate limit) and 368 (temporary policy block). These indicate the account itself is at risk. Retrying them in a loop is a common way to get a WhatsApp Business account restricted, so a sender should auto-pause the campaign when any of them appears.
What causes error 132001 when the template clearly exists?
Almost always a language mismatch. Templates are approved per language code, so a template approved as "he" will return 132001 if you send it as "en_US". The second common cause is that the template is approved in a different WhatsApp Business Account than the one your phone number ID belongs to.
Is error 131026 something I can fix in code?
No. 131026 means the message is undeliverable to that specific person - they have no WhatsApp account, they blocked your number, or they have not accepted WhatsApp's current terms. The correct handling is to mark the number as undeliverable and stop retrying it, not to change the request.
What is fbtrace_id and do I need it?
It is a per-request identifier Meta returns on errors. You cannot use it yourself, but Meta support will ask for it, and without it a support ticket about an intermittent failure usually goes nowhere. Store it with every logged error.
Keep reading
Related service
WhatsApp Cloud API
Templates, a two-way inbox and reminders on the official Meta API.
About the author
Yehonatan Saadia
Freelance automation, web & MVP engineer
I'm Yehonatan Saadia, a senior engineer who builds business automation, custom websites, and MVPs for small and mid-sized companies across the US, Europe, and Israel. These guides come from real client work, not theory.
Work with meHave a project like this?
Tell me what you're trying to automate or build and I'll tell you the fastest reliable way to ship it.
