WhatsApp Cloud API error codes: what they mean and how to fix them
A practical guide to the WhatsApp Cloud API error codes developers hit most (131047, 131026, 131049, 132000, 132001, 130429, 190 and more): what each means, whether to retry, and how to fix it.
October 18, 2026 · 9 min read
You send a WhatsApp message, the API says it was accepted, and then a webhook arrives with a number like 131047 and a one-line title. This guide explains the codes developers hit most often, what to do about each, and which ones are worth retrying at all.
The meanings below come from Meta's own Cloud API error codes page, which we read on 18 October 2026. Meta updates that page, and it lists many more codes than we cover here, so check it for anything not in this guide. If a code isn't listed below, it's because we couldn't confirm it on that page and chose not to guess.
SendFromChat is an independent product and is not affiliated with Meta or WhatsApp. It runs on Meta's official WhatsApp Cloud API. Codes and descriptions are Meta's; the "what to do" advice is ours, and where we're adding to Meta's text we say so.
Where you see these codes
Two places, and they behave differently:
- In the response to your send request. Some problems are caught right away: a bad parameter, an expired token, a missing template.
- Later, in a status webhook. A message can be accepted first and fail afterwards, for example because the person isn't on WhatsApp or Meta held it back. A
202 acceptedonly means Meta took the message, not that it was delivered. Always listen for status updates (receive WhatsApp replies and statuses with webhooks).
The quick table
| Code | What it means | Retry? | First thing to check |
|---|---|---|---|
| 131047 | More than 24 hours since the person last replied | No | Send a template instead |
| 131026 | Recipient can't receive the message | No | Number isn't reachable on WhatsApp |
| 131049 | Held back to protect recipient engagement | Not soon | Wait at least 24 hours |
| 131056 | Too many messages to one person | Later | Space out messages to them |
| 130429 | Throughput limit hit | Yes, slower | Queue and back off |
| 132000 | Wrong number of template variables | No | Fix the variables |
| 132001 | Template missing in that language, or not approved | No | Name, language, approval |
| 132012 | Variable values don't match the template's format | No | Match the template's format |
| 132015 / 132016 | Template paused / permanently disabled | No | Template quality |
| 131048 | Restrictions on how many messages can be sent from this number | No | Number quality |
| 131042 | Payment method problem | No | Billing on the WhatsApp account |
| 190 / 0 | Token expired or not authenticated | After fixing | Get a new token |
| 10 / 200–299 | Permission not granted or removed | After fixing | App permissions |
| 368 | Account restricted or disabled for a policy violation | No | Policy enforcement |
| 131000 / 131016 | Unknown error / service unavailable | Yes, a few times | Retry, then check Meta's status |
The meanings are our short summaries of Meta's descriptions. The guide is organised by code because that's the stable part of the error.
Message rules
131047: re-engagement window
More than 24 hours have passed since the recipient last replied. Meta's fix: send a template message. This is the single most common code, and it isn't a bug: free-form text is only allowed inside the 24-hour window. See the 24-hour window explained.
Don't retry the same text. Check whether the window is open before you send free-form text, and fall back to an approved template when it isn't.
131026: message undeliverable
Meta lists three causes: the recipient isn't a WhatsApp user, they haven't accepted WhatsApp's latest terms, or they're on an outdated WhatsApp client. Meta's suggestion is to have the person confirm and update, or reach them another way.
From your side this usually means: check the number format (country code, no stray characters), and treat repeated 131026 on the same number as "can't reach on WhatsApp". Retrying the same number every hour won't change that, so move them to another channel.
131049: not delivered to maintain a healthy ecosystem
Meta didn't deliver the message, to maintain healthy ecosystem engagement. Meta's guidance: if you suspect the per-user limit, wait at least 24 hours before resending the template.
What helps: send marketing only to people who opted in and want it (how to collect opt-in), keep the message relevant, and don't immediately re-send to people it was held back for. For the wider picture on pacing and reputation, see WhatsApp bulk messaging without getting banned.
131056: pair rate limit
You sent too many messages from one number to the same recipient in a short time. Meta says to wait and retry, and that other recipients aren't affected. If a workflow can fire several messages for one customer in a row (order placed, paid, packed), combine them or space them out.
130429 and the throughput limit
You hit the Cloud API's throughput limit. Meta says to retry later or send less often. This is the one to handle with a queue: back off, then retry with a delay that grows each time. It's separate from your daily messaging limit tier, which caps how many unique people you can start conversations with in 24 hours.
Template errors
Template problems are the ones you can fully fix in your own code or in the template itself.
- 132000, parameter count mismatch. The number of variables you sent doesn't match the template. Send a value for every
{{1}},{{2}}and so on. - 132001, template does not exist. Meta says the template is missing in that language, or isn't approved. Check three things: the exact name, the language code (
en_USisn'ten), and the approval status. - 132012, parameter format mismatch. The values don't match the format the template expects. Match what the template specifies.
- 132015, template paused. Paused for low quality. Meta says to edit the template to improve quality and resend once it's approved again.
- 132016, template disabled. Paused too many times and now permanently disabled. Create a new template.
For wording that passes review in the first place, read the template approval rules.
Account and quality errors
- 131048, send restriction. There are restrictions on how many messages can be sent from this number. Meta's advice is to check the number's quality status in WhatsApp Manager and review template limits and quality. Stop sending to cold lists while you investigate.
- 131042, payment issue. A problem with the payment method on the WhatsApp Business account, such as no payment method on file. Fix it in your WhatsApp account's billing settings; sending won't recover until you do.
- 368, restricted for policy violations. Your WhatsApp Business account was restricted or disabled for a policy violation. Meta points to its Policy Enforcement documentation. This needs a human to read it, not code.
Authorization errors
- 190, access token expired. Get a new access token. If you copy a temporary token out of a developer console into your server, this is the first error you'll see when it lapses. Use a long-lived system user token instead, and rotate it deliberately.
- 0, authorization. The user couldn't be authenticated: token expired, invalidated or access revoked. Same fix: a new token.
- 10 and 200–299, permission denied. A permission wasn't granted or was removed. Meta suggests checking permissions with its access token debugger.
Unknown and temporary errors
131000 (unknown error) and 131016 (service unavailable) are the ones worth a plain retry. Retry a few times with a delay. 131057 (the business account is in maintenance mode) is similar: wait and retry. For 131016, Meta says to check its status page. If 131000 persists, Meta says to open a Direct Support ticket.
A small decision table in code
This function sorts an error code into "retry", "fix and resend" or "stop". It's our own sketch, not Meta's: it takes the code from a webhook or API error and returns what to do next. We ran the logic locally with sample codes; we have not run it against a live WhatsApp API key, so test it with your own payloads.
const RETRY_WITH_BACKOFF = new Set([130429, 131000, 131016, 131056, 131057]);
const WAIT_24H = new Set([131049]);
const SEND_TEMPLATE_INSTEAD = new Set([131047]);
const FIX_TEMPLATE_CALL = new Set([132000, 132001, 132012]);
const NEEDS_A_HUMAN = new Set([131042, 131048, 368, 132015, 132016]);
export function nextStep(code) {
if (RETRY_WITH_BACKOFF.has(code)) return "retry-with-backoff";
if (WAIT_24H.has(code)) return "wait-24h";
if (SEND_TEMPLATE_INSTEAD.has(code)) return "use-template";
if (FIX_TEMPLATE_CALL.has(code)) return "fix-request";
if (code === 131026) return "unreachable-try-another-channel";
if (code === 190 || code === 0) return "refresh-token";
if (code === 10 || (code >= 200 && code <= 299)) return "fix-permissions";
if (NEEDS_A_HUMAN.has(code)) return "alert-a-human";
return "log-and-review";
}
Keep the last line. A code you haven't seen should be logged with the full error body, not silently retried.
How SendFromChat shows these
SendFromChat sends through Meta's Cloud API, so these are the same underlying codes. Where we can, we translate them into plain words so you don't have to look them up:
- Bulk send reports show a reason for each person who didn't receive the message, for example "Outside the 24-hour window", "Not on WhatsApp, or can't receive messages right now", "Held back by Meta to limit marketing messages to this person" or "Template variables didn't match". A report lets you save those people as a new list or retry the failed ones.
- REST API. Errors come back with a stable
typesuch aswindow_closed,opted_out,template_not_approvedandwarmup_limit. When Meta itself refuses a message, the type iswhatsapp_rejectedand it carries Meta's reason. The full list is in the REST API reference. - Some mistakes are caught before they reach Meta. Free-form text isn't sent when the window is known to be closed, opted-out contacts aren't messaged, and new numbers are paced under a warm-up limit. A test key (
sfc_test_…) runs these checks without sending anything.
We don't claim this removes errors. Meta decides delivery, and some codes, like 131049, can't be engineered away. The aim is to make the reason visible and to avoid the avoidable ones.
Quick checklist when something fails
- Read the code in the webhook, not only the HTTP status.
- Is it a retry-able code (130429, 131016, 131000)? Back off and retry a limited number of times.
- Is it a rule (131047, 131026, 131049)? Retrying won't help; change what you send, to whom, or when.
- Is it a template code (132000, 132001, 132012)? Fix the call or the template.
- Is it about the account (131042, 131048, 368, 190)? Fix it in WhatsApp Manager or your token setup, then resume.
Try it
Start the 30-day free trial (no card), connect a number with Continue with Facebook, and use a test key to see how refusals look before you send for real. If you're building in code, see WhatsApp order notifications from your app and the WhatsApp 24-hour window guide. Prefer to ask an assistant? Connect Claude or ChatGPT.
Do this from your AI assistant
SendFromChat connects Claude, ChatGPT, Cursor or any MCP client to the WhatsApp Business API — templates, bulk sends, inbox, chatbots and sequences, just by asking. 30 days free, no card.
Start freeMore guides
Receive WhatsApp replies in your app: a signed webhook example
Build a Next.js webhook endpoint that receives WhatsApp replies, verifies the signature in constant time, ignores repeated deliveries, answers within 5 seconds, replies inside the 24-hour window and honours STOP.
Send OTP login codes over WhatsApp: a REST API example
Send one-time passcodes over WhatsApp from your own backend with an Authentication template, a test key and idempotent retries. Node example, error handling and what to build around it.
Send WhatsApp messages from n8n with an HTTP Request node
Build an n8n workflow that sends WhatsApp order updates and sign-in codes through a REST API, with a test key, idempotent retries and a webhook for delivery status and replies.
How to send a WhatsApp broadcast from a spreadsheet, safely
A step-by-step walkthrough for small businesses — turn a spreadsheet into a personalised WhatsApp broadcast, check the preview, respect opt-out and warm up a new number. Do it by asking Claude or ChatGPT, or in the dashboard.