Developer Reference · Meta Graph API v25.0

WhatsApp Cloud API Error Codes Directory

Last verified: · Reviewed quarterly · Meta error code reference ↗

Most WhatsApp Cloud API errors are permanent for that message: change the request rather than retrying it. Three are not. 130429, 131048 and 131056 are throughput caps that Meta returns as HTTP 400 rather than 429, so the standard “do not retry a 4xx” rule fails them permanently even though the cap clears on its own. This page lists what each code means and, unusually, what to do with it.

Searchable reference for Meta WhatsApp Cloud API error codes: plain language root causes, Meta documentation references, production remediation code, and an open dataset of the handling decision each code implies.

Free dataset: error codes with retry semantics

Every code we document, as JSON, licensed CC-BY. Every vendor lists what a code means. This also records what to do with it: retry, fail, suppress the contact, switch to a template, or raise an account alert. 130429, 131048 and 131056 are throughput caps that Meta returns as HTTP 4xx, not 429 — a generic "4xx is not retryable" rule fails them permanently. The flags are generated from the same classifier our live send path uses.

Get the JSON → On GitHub →
400 Bad Request
Payload & Format Errors
Codes 100, 131009, 131047
401 Unauthorized
Token & Auth Failures
Codes 190, 200, 131030
429 Too Many Requests
Rate Limit Exceeded
Codes 4, 8, 130429, 131056
500 Internal Error
Meta Platform Outage
Codes 2, 131000, 131016

Codes worth their own page

Most references tell you what a code means. These cover what to do with it: whether to retry, suppress the contact, switch to a template, or raise an account alert. Ordered by how often they actually occur.

131049 · Per-user marketing cap Do not retry, and do not suppress either. The most common failure we see. 131026 · Message undeliverable A bucket error. Suppressing on it blindly silences reachable contacts, especially in India. 130429 · Rate limit hit A throughput cap returned as HTTP 400, not 429. Retryable. 131056 · Pair rate limit Scoped to one conversation, not your account. Back off for that contact only. 190 · Access token expired Account-level. One alert, not thousands of contact failures. 133010 · Sending number not registered Your number, not theirs. We had this classified wrong and wrote down why.
Error Code 131030 HTTP 400 Bad Request · Category: Rate Limit

Optionally Capped / Messaging Limit Reached

Root Cause: Your WhatsApp Business Account (WABA) has exceeded its 24-hour unique recipient tier capacity (e.g., 1,000 unique customers per 24 hours for Tier 1). Outbound messages to new recipients are rejected until the 24-hour rolling window resets or your tier upgrades.

// Klaros Auto-Retry & Capped Queue Handling
if (error.code === 131030) {
  // Queue message for staggered retry after rolling 24h window reset
  await env.CAMPAIGN_QUEUE.send({ payload, retryAt: Date.now() + (3600 * 1000) });
}
Error Code 131047 HTTP 400 Bad Request · Category: Service Window

Re-engagement Window Expired (24-Hour Gate)

Root Cause: More than 24 hours have elapsed since the customer's last inbound message. Free-form text or media messages cannot be delivered outside the 24-hour service window.

// Remediation: Fallback to Approved Utility/Marketing Template
if (error.code === 131047) {
  return await sendWhatsAppTemplate({ to: recipient, template: "reengage_notification" });
}
Error Code 131051 HTTP 400 Bad Request · Category: Payload Validation

Unsupported Message Type

Root Cause: The message payload format or media type is not supported by the Meta Graph API v25.0 endpoint.

// Ensure valid message type schema
const validTypes = ["text", "template", "interactive", "image", "document", "audio", "video", "location"];
if (!validTypes.includes(payload.type)) throw new Error("Invalid Meta payload type");
Error Code 132001 HTTP 400 Bad Request · Category: Template Management

Template Does Not Exist or Language Mismatch

Root Cause: The requested template name or language code (e.g. `en_US` vs `en`) does not exist or is not approved in your WABA.

// Check template status before campaign dispatch
const template = await getTemplateByName(db, templateName, languageCode);
if (!template || template.status !== "APPROVED") {
  throw new Error(`Template ${templateName} (${languageCode}) is not approved`);
}
Error Code 100 HTTP 400 Bad Request · Category: Authentication

Invalid Parameter / Expired Access Token

Root Cause: The Meta System User access token passed in the `Authorization: Bearer` header has expired or lacks the `whatsapp_business_messaging` permission.

// Verify Bearer Token validity
curl -X GET "https://graph.facebook.com/v25.0/debug_token?input_token=YOUR_ACCESS_TOKEN" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

Tired of handling Meta Cloud API error retries & rate limits manually?

Klaros is the self-deployed WhatsApp Business CRM running on your own Cloudflare Worker. Includes built-in exponential backoff retries, DLQ queues, 24-hour service window gating, and automatic template fallbacks.

Deploy Klaros in 5 Minutes →

Deeper reading on WhatsApp API failure modes

Production post-mortems for the errors developers hit most.