WhaBuzz docs
Reference

Errors

The source meta or whabuzz contract, the WhaBuzz error codes, and how to read Meta's errors.

Every error response says who produced it, in the body and in a header. Check source first.

sourceMeaningHTTP status
whabuzzWhaBuzz stopped the request: auth, validation, account state, WhaBuzz's own limits. Meta was not called, or could not be reached.WhaBuzz's
metaMeta answered with an error. WhaBuzz returns it verbatim.Meta's own status

The header X-WhaBuzz-Error-Source: whabuzz or meta repeats it, so you can branch without parsing JSON.

#WhaBuzz errors

{
  "source": "whabuzz",
  "error": {
    "code": "number_not_connected",
    "message": "Number 1013622581841046 is not connected.",
    "details": { "connection_detail": "no_verified_endpoint" }
  },
  "request_id": "req_01JAB3W1Z4B7D0F3H6K9N2Q5S8"
}
json

Always log request_id (also the X-WhaBuzz-Request-Id header). It is what support looks up.

HTTPcodeWhendetails
400invalid_requestMalformed JSON, missing or invalid field, missing X-WhaBuzz-Tenantfield errors
401unauthorizedMissing, wrong, revoked or expired API key
403forbiddenThe key's role cannot do this
403tenant_not_approvedAccount is pending_approval or rejected
403tenant_suspendedAccount is suspendedreason
403email_not_verifiedConsole sign-in before the email link was used
404not_foundNo such resource, or not yoursreason: "payload_expired" when a replay is outside retention
409number_not_connectedSend from a number that is not connectedconnection_detail
409idempotency_conflictSame Idempotency-Key still in flight
422idempotency_conflictSame Idempotency-Key with a different body
422webhook_verify_failedYour endpoint failed the verify pinghttp_status, body_excerpt
429rate_limitedSign-up, login or password reset only. Retry-After is set.
502meta_unreachableGraph API did not answer within 15 seconds. The outcome is unknown.
400invalid_tokenSign-up or password-reset link is unknown, used or expired
409conflictThe resource is in the wrong state for this action, or the WABA is already connected to another account
409limit_reachedA per-account cap, for example the number of webhook endpoints
503billing_disabledAny /v1/billing route before billing is switched onbilling_enabled: false
503billing_not_configuredBilling is on but the payment gateway is not configured
502billing_gateway_errorThe payment gateway answered with an error
502meta_token_invalidThe Embedded Signup token failed Meta's validation
500meta_not_configuredWhaBuzz's Meta credentials are missing (our fault, not yours)
500internal_errorA fault in WhaBuzz. Retry; report the request_id if it persists. The message is always Internal error.

meta_unreachable is the one to handle carefully: the message may or may not have been sent. Retry with the same Idempotency-Key (see Idempotency) rather than composing a new send.

#Reading Meta errors

When Meta refuses a call, you get Meta's HTTP status and Meta's error object under error, unchanged:

{
  "source": "meta",
  "error": {
    "message": "(#131030) Recipient phone number not in allowed list",
    "type": "OAuthException",
    "code": 131030,
    "error_data": {
      "messaging_product": "whatsapp",
      "details": "Recipient phone number not in allowed list: Add recipient phone number to recipient list and try again."
    },
    "error_subcode": 2655007,
    "fbtrace_id": "AqN2fZtPLm1oV0xK3wRhjQe"
  }
}
json

Reading it:

The example above, 131030, is what you get while a WABA is in test mode and the recipient is not on its allowed list. Add the number to the list in Meta's manager, or finish business verification.

Common ones: 131047 (re-engagement: the 24-hour window is closed, use a template), 131026 (message undeliverable), 132000 series (template parameter problems), 130429 (throughput), 131056 (pair rate limit), 190 (token expired or invalid; reconnect the number).

If Meta's response is not JSON, WhaBuzz wraps it as {"source":"meta","error":{"raw_body":"<first 4 KB>"}}.

The complete list, with Meta's recommended fix for each, is in Meta's documentation: Cloud API error codes.

#Errors inside events

Failures after acceptance arrive as events, not HTTP errors: a message.status with status: "failed" carries status.errors[] in Meta's format. The same error.code numbers apply.

This page as Markdown: /errors.md. All docs in one file: /llms-full.txt.