WhatsApp Cloud API error codes
This is every WhatsApp Cloud API error code we document, in one table, with what each one means and whether retrying it helps. Most do not: they are deterministic, so the same request fails the same way and a retry loop turns a bad request into a rate limit.
Request
| Code | What it means | Retry |
|---|---|---|
| 100 | A parameter is unsupported, misspelled or malformed. | No |
| 131008 | A required parameter was not included at all. | No |
| 131009 | A parameter is present with a value the endpoint rejects. | No |
| 131021 | Sender and recipient are the same number. | No |
| 131051 | The message type is not supported, often a Coexistence limit. | No |
| 131052 | Meta could not download media a customer sent. | No |
| 131053 | Meta could not upload media you sent. Size, format or reach. | No |
Template
| Code | What it means | Retry |
|---|---|---|
| 132000 | The number of parameters does not match the template. | No |
| 132001 | No template exists with that name and language pair. | No |
| 132007 | The template breaks messaging policy. Rewrite and resubmit. | No |
| 132012 | Parameter format does not match what the template defines. | No |
| 132015 | The template is paused after a quality decline. Temporary. | Wait |
| 132016 | The template is permanently disabled. It will not come back. | No |
Window and recipient
Registration and PIN
| Code | What it means | Retry |
|---|---|---|
| 131045 | The number was never registered for Cloud API messaging. | No |
| 133010 | The number is not registered. Registration must be completed. | No |
| 133006 | The number must be verified before it can be registered. | No |
| 133005 | The two-step verification PIN was wrong. Stop guessing. | No |
| 133008 | Too many PIN attempts. Registration is locked for a period. | Wait |
Access and account
| Code | What it means | Retry |
|---|---|---|
| 190 | The access token expired or was invalidated. | No |
| 368 | The account is restricted after a policy violation. | No |
| 131031 | The account is restricted, or its data does not match Meta's. | No |
| 131042 | A payment problem on the business account blocks sending. | No |
| 131049 | Meta blocked the message to protect ecosystem health. | No |
Rate limits
Transient
Coexistence sync
How to read the retry column
It has three values, and choosing between them wrong is the most expensive mistake in this whole reference.
No means the failure is deterministic. The request, the template or the recipient's state is what failed, and sending the identical request again produces the identical error while consuming throughput you will want later. Yes means the failure was on Meta's side and a backoff genuinely resolves it. Wait means the condition is real but temporary: a limit or a lock that lifts on its own, where retrying before it lifts does nothing and can extend it.
Why most of these are not retryable
Because the platform returns specific codes rather than generic ones. A malformed parameter, a template that does not exist, a closed messaging window and an opted-out recipient are all knowable at the moment of the response, so Meta names them instead of failing vaguely.
- A request problem does not become correct on the second attempt.
- A template problem lives in the template, which the request cannot change.
- A window or opt-out problem is about the recipient's state, not yours.
- An account restriction is a decision, and retrying is not an appeal.
What to log when one of these arrives
Enough to diagnose it without reproducing it, which is the difference between a five-minute fix and a day of guessing.
- The full error response, including the trace id, which is what Meta support asks for.
- The request body as sent, not as intended. The gap between those two is usually the bug.
- The phone number id, so a problem on one number is distinguishable from one across the account.
- The timestamp, so the failure can be checked against the connection's state at that moment.
The codes that only exist on Coexistence
Two of them, and they confuse people because they look like ordinary send failures. 2593107 and 2593108 both concern chat history synchronisation, which is the step that copies recent conversations from the WhatsApp Business app when a number is first connected.
They are not messaging errors and they do not mean the connection failed. A sync that exceeds its limit or runs outside its window leaves the number connected and sending normally, with less history copied than expected. Reading them as a broken connection leads people to disconnect and start again, which loses more history rather than recovering it.
Frequently asked questions
Which errors should I retry?
131016 and 131000, with exponential backoff. 130429, 132015 and 133008 clear on their own if you wait. Everything else is deterministic.
Does an error code mean my number is disconnected?
Usually not. Most of these concern the request, the template or the recipient. Connection problems appear as account and quality webhooks rather than send errors.
What is a trace id?
An identifier in the error response that lets Meta support find the specific request. Log it on every failure; without it a ticket cannot be actioned.
Are these codes the same on every provider?
Yes. They come from Meta's Cloud API, so they are identical whichever provider connected the number. A provider can only change how clearly they reach you.
Ready to get started?
Set up WhatsApp Coexistence in minutes, not months. The app keeps working on the phone.
Start Free TrialNothing charged for 7 days. Cancel anytime.