---
title: Error Codes | API Docs
description: Complete reference of WhatsApp API error codes with troubleshooting guides.
---

Every error returns the same JSON envelope: a `success: false` flag, a nested `error` object, and a `request_id` naming the request that failed. The `error` object always carries the HTTP `status` the response was written with, a numeric `code`, and a human-readable `message`.

```
{
  "success": false,
  "error": {
    "status": 422,
    "code": 1001,
    "message": "Field required.",
    "doc_url": "https://docs.linqapp.com/channel/whatsapp/error/codes/1xxx/1001/",
    "param": "/parts/0/body",
    "details": [
      {
        "code": "field_required",
        "param": "/parts/0/body",
        "message": "Body is required."
      }
    ]
  },
  "request_id": "req_01JQZ8X4K2N3P5R7T9V1W3Y5Z7"
}
```

`error.code` is a number and is the field to branch on. `error.message` is written for a human reading a log and may be reworded at any time, so matching on it will break. A code is never removed and never reassigned to a different failure: once a number means something, it means that forever.

The optional members carry the specifics. `param` is present only when the response is about exactly one field and is that field’s JSON Pointer; with zero or several faults it is absent. `details` lists every field-level finding on a validation failure, each with a string `code`, a JSON Pointer `param` and a `message`. `retry_after` is present exactly when the response also carries a `Retry-After` header, with the same value in seconds. `trace_id` appears when a valid trace context exists. `doc_url` is present on every response whose code has a published page and is the absolute address of that page, `https://docs.linqapp.com/channel/whatsapp/error/codes/<N>xxx/<code>/`, so a client can link straight to it; it is derived from the code alone, and a code reachable only on a surface that has not been released yet carries no `doc_url`.

**These codes belong to WhatsApp.** Every channel numbers its own errors, which is why this reference is namespaced to `/channel/whatsapp/` — the same integer means something different on another channel, so branch on the code only in code paths you know are talking to this API.

Tip

Include `request_id` when contacting Linq support. It identifies the exact request in our logs.

## Error code ranges

The set of codes grows over time. Branch on the integers you know, and treat an integer you do not know by its range plus the HTTP `status` that came with it — the range says what kind of failure it is, and the status says whether the request or the service was at fault.

| Range                                               | Category                              | Retry?                                                       |
| --------------------------------------------------- | ------------------------------------- | ------------------------------------------------------------ |
| [1xxx](#1xxx--request-errors)                       | Request Errors                        | No — correct the request first                               |
| [2xxx](#2xxx--resource-permission-and-state-errors) | Resource, Permission and State Errors | No — inspect or reconcile that state                         |
| [3xxx](#3xxx--service-errors)                       | Service Errors                        | Yes — bounded backoff, unless the code’s page says otherwise |
| [4xxx](#4xxx--operational-and-send-refusals)        | Operational and Send Refusals         | Sometimes — follow the code’s remedy                         |
| [5xxx](#5xxx--attachment-and-file-errors)           | Attachment and File Errors            | Sometimes — follow the code’s remedy                         |

When `retry_after` is present, it overrides the guidance above: wait that many seconds, then retry.

## 1xxx — Request Errors

The request never reached the thing it was about. Correct the request and send it again; retrying it unchanged fails identically. Validation rejects and points at the most specific location it can identify — it never coerces a value into something acceptable.

| Code                                                     | Message                          | HTTP      | Troubleshooting                                                                                                                                                                               |
| -------------------------------------------------------- | -------------------------------- | --------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [1001](/channel/whatsapp/error/codes/1xxx/1001/index.md) | Field required.                  | 422       | Inspect error.param (or details\[].param) for the exact JSON Pointer to the missing field.                                                                                                    |
| [1002](/channel/whatsapp/error/codes/1xxx/1002/index.md) | Body missing.                    | 400       | Check that your client actually transmits the body (a GET-style call with no body on a POST route is the usual cause).                                                                        |
| [1003](/channel/whatsapp/error/codes/1xxx/1003/index.md) | Body unreadable.                 | 400       | Validate the body with a JSON linter and confirm it is a single object with no trailing bytes.                                                                                                |
| [1004](/channel/whatsapp/error/codes/1xxx/1004/index.md) | Invalid content.                 | 422       | Read details\[] for the exact param (a JSON Pointer into your request) and each field’s own fault code.                                                                                       |
| [1005](/channel/whatsapp/error/codes/1xxx/1005/index.md) | Value invalid.                   | 422       | Inspect error.param / details\[].param and the accompanying message, which names the rule.                                                                                                    |
| [1006](/channel/whatsapp/error/codes/1xxx/1006/index.md) | Channel message id inbound only. | 422       | Address a reply with reply\_to\_message\_id, using the message id this API returned or delivered in an event.                                                                                 |
| [1007](/channel/whatsapp/error/codes/1xxx/1007/index.md) | Duplicate value.                 | 422       | Inspect details\[].param for the second occurrence.                                                                                                                                           |
| [1008](/channel/whatsapp/error/codes/1xxx/1008/index.md) | Event kind unknown.              | 422       | Inspect details\[].param for the offending index in event\_kinds and compare it with the event kinds listed on the webhook endpoint operation.                                                |
| [1009](/channel/whatsapp/error/codes/1xxx/1009/index.md) | Field not allowed.               | 422       | Inspect details\[].param; GET /v1/parts/{type} documents which fields each shape accepts.                                                                                                     |
| [1010](/channel/whatsapp/error/codes/1xxx/1010/index.md) | Field type.                      | 400 / 422 | Inspect error.param / details\[].param and the message, which names the expected type.                                                                                                        |
| [1012](/channel/whatsapp/error/codes/1xxx/1012/index.md) | From ambiguous.                  | 503       | Resend with from set to the E.164 number you want this conversation to use; it becomes the pinned sender.                                                                                     |
| [1013](/channel/whatsapp/error/codes/1xxx/1013/index.md) | From not available.              | 422       | Call GET /v1/phone\_numbers to list the numbers this account may send from, and use one of them.                                                                                              |
| [1014](/channel/whatsapp/error/codes/1xxx/1014/index.md) | Idempotency key invalid.         | 400 / 422 | Send one Idempotency-Key header per request, generated per logical operation, and reuse it only to replay that same request.                                                                  |
| [1016](/channel/whatsapp/error/codes/1xxx/1016/index.md) | Invalid paging.                  | 400 / 422 | Inspect details\[].param (/query/limit, /query/cursor, /query/order or /headers/Last-Event-ID) and resend with a valid value; drop the cursor to start from the end the operation reads from. |
| [1017](/channel/whatsapp/error/codes/1xxx/1017/index.md) | Invalid template.                | 422       | Read details\[] for the exact param (a JSON Pointer into your request) and each field’s own fault code.                                                                                       |
| [1018](/channel/whatsapp/error/codes/1xxx/1018/index.md) | Method not allowed.              | 405       | Read the Allow header on this response and GET /v1/openapi.yaml for the operation’s method.                                                                                                   |
| [1019](/channel/whatsapp/error/codes/1xxx/1019/index.md) | Multiple parts not available.    | 422       | Send one request per part; separate requests are independent and no cross-request order is promised.                                                                                          |
| [1020](/channel/whatsapp/error/codes/1xxx/1020/index.md) | Mutually exclusive.              | 422       | Inspect details\[].param and GET /v1/parts/{type} for which fields form the choice.                                                                                                           |
| [1021](/channel/whatsapp/error/codes/1xxx/1021/index.md) | Not available.                   | 422       | Remove the reserved field or part named by details\[].param.                                                                                                                                  |
| [1022](/channel/whatsapp/error/codes/1xxx/1022/index.md) | Part not supported.              | 422       | Use a supported part type; GET /v1/openapi.yaml lists the sendable union.                                                                                                                     |
| [1023](/channel/whatsapp/error/codes/1xxx/1023/index.md) | Reply target wrong chat.         | 422       | Use a message id from the same chat, or address the send to the chat the message belongs to.                                                                                                  |
| [1024](/channel/whatsapp/error/codes/1xxx/1024/index.md) | Template refused.                | 422       | Revise the template per the message and submit again under a new name if the refusal was permanent.                                                                                           |
| [1025](/channel/whatsapp/error/codes/1xxx/1025/index.md) | Too few items.                   | 422       | Inspect details\[].param; GET /v1/parts/{type} states each array’s minimum.                                                                                                                   |
| [1026](/channel/whatsapp/error/codes/1xxx/1026/index.md) | Too many items.                  | 422       | Inspect details\[].param; GET /v1/parts/{type} states each array’s maximum.                                                                                                                   |
| [1027](/channel/whatsapp/error/codes/1xxx/1027/index.md) | Unknown field.                   | 422       | Inspect details\[].param and remove or correct the field; compare against GET /v1/openapi.yaml or GET /v1/parts/{type}.                                                                       |
| [1028](/channel/whatsapp/error/codes/1xxx/1028/index.md) | Unknown part type.               | 422       | GET /v1/openapi.yaml lists the part union; each member’s schema is at GET /v1/parts/{type}.                                                                                                   |
| [1029](/channel/whatsapp/error/codes/1xxx/1029/index.md) | Value too long.                  | 422       | Inspect details\[].param and shorten the value; limits are counted in characters, not bytes.                                                                                                  |
| [1030](/channel/whatsapp/error/codes/1xxx/1030/index.md) | Webhook field invalid.           | 422       | Read details\[] for the exact param (a JSON Pointer into your request) and each field’s own fault code.                                                                                       |
| [1031](/channel/whatsapp/error/codes/1xxx/1031/index.md) | Webhook status invalid.          | 422       | Read the endpoint with GET /v1/webhook\_endpoints/{endpoint} and choose a documented status.                                                                                                  |
| [1032](/channel/whatsapp/error/codes/1xxx/1032/index.md) | Webhook url invalid.             | 422       | Inspect details\[].param (/url) and supply an https URL on a public host.                                                                                                                     |
| [1033](/channel/whatsapp/error/codes/1xxx/1033/index.md) | Parameter invalid.               | 400       | Compare the named parameter against its schema in GET /v1/openapi.yaml.                                                                                                                       |
| [1034](/channel/whatsapp/error/codes/1xxx/1034/index.md) | Parameter missing.               | 400       | Add the named parameter or header and resend.                                                                                                                                                 |
| [1036](/channel/whatsapp/error/codes/1xxx/1036/index.md) | Replay range too large.          | 422       | Narrow after\_cursor / through\_cursor or the event kinds and request the replay in slices.                                                                                                   |
| [1037](/channel/whatsapp/error/codes/1xxx/1037/index.md) | Cursor invalid.                  | 400 / 422 | Take cursors from this collection’s own responses and restart the listing without one when in doubt.                                                                                          |
| [1038](/channel/whatsapp/error/codes/1xxx/1038/index.md) | Part not sendable.               | 422       | Use a sendable part type; GET /v1/openapi.yaml marks which are outbound.                                                                                                                      |
| [1039](/channel/whatsapp/error/codes/1xxx/1039/index.md) | Send at not available.           | 422       | Omit send\_at and send when you want the message delivered.                                                                                                                                   |
| [1040](/channel/whatsapp/error/codes/1xxx/1040/index.md) | Reaction target wrong chat.      | 422       | Use a message id from the same chat, or address the send to the chat the message belongs to.                                                                                                  |
| [1041](/channel/whatsapp/error/codes/1xxx/1041/index.md) | Webhook phone number not found.  | 422       | Choose ids returned by GET /v1/phone\_numbers using the same credential and mode.                                                                                                             |

## 2xxx — Resource, Permission and State Errors

The request was well formed and the thing it named was missing, not yours, or not in a state that allows this. Inspect or reconcile that state before sending again.

An id that belongs to another account answers exactly like one that does not exist. That is deliberate: it keeps one account from probing another’s ids.

| Code                                                     | Message                           | HTTP | Troubleshooting                                                                                                                                                                                                                                                   |
| -------------------------------------------------------- | --------------------------------- | ---- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [2001](/channel/whatsapp/error/codes/2xxx/2001/index.md) | Chat not found.                   | 404  | Verify the chat id came from GET /v1/chats or a message this account sent or received, in the same livemode.                                                                                                                                                      |
| [2002](/channel/whatsapp/error/codes/2xxx/2002/index.md) | Credential not permitted.         | 403  | Use a partner API key for this call; rotating the key you sent will not help.                                                                                                                                                                                     |
| [2003](/channel/whatsapp/error/codes/2xxx/2003/index.md) | Attachment not found.             | 404  | Take attachment ids from the message or event that delivered them, in the same livemode.                                                                                                                                                                          |
| [2004](/channel/whatsapp/error/codes/2xxx/2004/index.md) | Credential invalid.               | 401  | Send exactly one Authorization: Bearer header with a current partner API key or capability credential.                                                                                                                                                            |
| [2005](/channel/whatsapp/error/codes/2xxx/2005/index.md) | Not permitted.                    | 403  | Confirm the key’s livemode matches the resource and that it belongs to the account that owns the resource.                                                                                                                                                        |
| [2007](/channel/whatsapp/error/codes/2xxx/2007/index.md) | Attachment not ready.             | 409  | Wait error.retry\_after seconds and retry the same GET /v1/attachments/{attachment}/content.                                                                                                                                                                      |
| [2009](/channel/whatsapp/error/codes/2xxx/2009/index.md) | Idempotency conflict.             | 409  | Use a fresh Idempotency-Key for a new operation.                                                                                                                                                                                                                  |
| [2010](/channel/whatsapp/error/codes/2xxx/2010/index.md) | Webhook endpoint not found.       | 404  | List endpoints with GET /v1/webhook\_endpoints and use an id from that account.                                                                                                                                                                                   |
| [2011](/channel/whatsapp/error/codes/2xxx/2011/index.md) | Not found.                        | 404  | Verify the id came from this account’s own reads or events, in the same livemode.                                                                                                                                                                                 |
| [2012](/channel/whatsapp/error/codes/2xxx/2012/index.md) | Operation forbidden.              | 403  | Mint a capability credential whose operation class covers this operation, or use the account’s partner API key.                                                                                                                                                   |
| [2013](/channel/whatsapp/error/codes/2xxx/2013/index.md) | Part type not found.              | 404  | GET /v1/openapi.yaml lists every part type.                                                                                                                                                                                                                       |
| [2014](/channel/whatsapp/error/codes/2xxx/2014/index.md) | Reply target not found.           | 422  | Use a message id from this chat’s transcript (GET /v1/chats/{chat}/events).                                                                                                                                                                                       |
| [2015](/channel/whatsapp/error/codes/2xxx/2015/index.md) | Route not found.                  | 404  | GET /v1/openapi.yaml is the API’s own map of what exists.                                                                                                                                                                                                         |
| [2029](/channel/whatsapp/error/codes/2xxx/2029/index.md) | Webhook replay not found.         | 404  | Use the replay id returned by POST /v1/webhook\_endpoints/{endpoint}/replays and the endpoint it was created on.                                                                                                                                                  |
| [2030](/channel/whatsapp/error/codes/2xxx/2030/index.md) | Replay in progress.               | 409  | Poll GET /v1/webhook\_endpoints/{endpoint}/replays/{replay} until the running replay completes, then request the next one.                                                                                                                                        |
| [2031](/channel/whatsapp/error/codes/2xxx/2031/index.md) | Capability outcome indeterminate. | 409  | Do not retry blindly; read the affected resource (the chat, template or endpoint) to learn its current state first.                                                                                                                                               |
| [2032](/channel/whatsapp/error/codes/2xxx/2032/index.md) | Cursor expired.                   | 410  | Use the chat and transcript reads (GET /v1/chats/{chat}/events) to backfill anything you missed before resuming.                                                                                                                                                  |
| [2033](/channel/whatsapp/error/codes/2xxx/2033/index.md) | Last active secret.               | 409  | Add a new secret with POST /v1/webhook\_endpoints/{endpoint}/secrets first, then retire the old one.                                                                                                                                                              |
| [2034](/channel/whatsapp/error/codes/2xxx/2034/index.md) | No channel account.               | 503  | Complete channel onboarding for the account, then retry.                                                                                                                                                                                                          |
| [2035](/channel/whatsapp/error/codes/2xxx/2035/index.md) | Nothing unread.                   | 409  | Read the chat’s transcript (GET /v1/chats/{chat}/events) to confirm its state before sending another read command.                                                                                                                                                |
| [2036](/channel/whatsapp/error/codes/2xxx/2036/index.md) | Outside customer window.          | 422  | Read error.context.expires\_at: a timestamp means the window lapsed, null means the customer has never messaged this number.                                                                                                                                      |
| [2037](/channel/whatsapp/error/codes/2xxx/2037/index.md) | Reply target not ready.           | 422  | Read the target message until its status is sent (its channel\_message\_id appears at the same moment), then resend the reply. message.sent is journaled when the send is accepted, not when the channel acknowledges it, so it is not the signal to wait for.    |
| [2038](/channel/whatsapp/error/codes/2xxx/2038/index.md) | Template exists.                  | 409  | List templates with GET /v1/templates and reuse the existing one, or submit under a new name.                                                                                                                                                                     |
| [2039](/channel/whatsapp/error/codes/2xxx/2039/index.md) | Template outcome indeterminate.   | 409  | Do not resubmit under the same name; read GET /v1/templates after registry reconciliation, or contact support with the request\_id.                                                                                                                               |
| [2040](/channel/whatsapp/error/codes/2xxx/2040/index.md) | Too many active secrets.          | 409  | Retire a secret with the retire operation, then add the new one; a rotation needs two active secrets at most.                                                                                                                                                     |
| [2041](/channel/whatsapp/error/codes/2xxx/2041/index.md) | Webhook endpoint exists.          | 409  | List endpoints with GET /v1/webhook\_endpoints and update the existing one instead of creating a duplicate.                                                                                                                                                       |
| [2042](/channel/whatsapp/error/codes/2xxx/2042/index.md) | Webhook endpoint limit.           | 422  | Remove an unused endpoint with DELETE /v1/webhook\_endpoints/{endpoint}, then retry.                                                                                                                                                                              |
| [2043](/channel/whatsapp/error/codes/2xxx/2043/index.md) | Attachment unavailable.           | 410  | Download attachments promptly after the event that delivers them; retention is documented on the attachment operation.                                                                                                                                            |
| [2047](/channel/whatsapp/error/codes/2xxx/2047/index.md) | No sending number.                | 503  | Complete number provisioning, then retry; contact support if a number should already be attached.                                                                                                                                                                 |
| [2049](/channel/whatsapp/error/codes/2xxx/2049/index.md) | Reaction target not found.        | 422  | Use a message id from this chat’s transcript (GET /v1/chats/{chat}/events).                                                                                                                                                                                       |
| [2050](/channel/whatsapp/error/codes/2xxx/2050/index.md) | Reaction target not ready.        | 422  | Read the target message until its status is sent (its channel\_message\_id appears at the same moment), then resend the reaction. message.sent is journaled when the send is accepted, not when the channel acknowledges it, so it is not the signal to wait for. |
| [2051](/channel/whatsapp/error/codes/2xxx/2051/index.md) | Webhook delivery in progress.     | 409  | Read the delivery with GET /v1/webhook\_deliveries?delivery\_id=… and retry once its state is pending again.                                                                                                                                                      |
| [2052](/channel/whatsapp/error/codes/2xxx/2052/index.md) | Webhook delivery terminal.        | 409  | For a retry\_exhausted or permanent\_refusal delivery, replay its event with POST /v1/webhook\_endpoints/{endpoint}/replays.                                                                                                                                      |
| [2053](/channel/whatsapp/error/codes/2xxx/2053/index.md) | Webhook delivery not found.       | 404  | Use a delivery id from GET /v1/webhook\_deliveries under the same key and mode.                                                                                                                                                                                   |
| [2054](/channel/whatsapp/error/codes/2xxx/2054/index.md) | Environment has no sending line.  | 422  | Move a number into this environment where the account’s numbers are managed, then send again.                                                                                                                                                                     |
| [2055](/channel/whatsapp/error/codes/2xxx/2055/index.md) | Environment stream unavailable.   | 403  | Register a webhook endpoint with POST /v1/webhook\_endpoints under this key; it receives exactly this environment’s events.                                                                                                                                       |
| [2056](/channel/whatsapp/error/codes/2xxx/2056/index.md) | Nothing readable.                 | 409  | Nothing is owed on these messages; send a read command again after the customer’s next supported message, which it will target.                                                                                                                                   |
| [2057](/channel/whatsapp/error/codes/2xxx/2057/index.md) | Webhook account not connected.    | 409  | Finish connecting the account’s messaging account, then repeat the request.                                                                                                                                                                                       |

## 3xxx — Service Errors

Transient, and ours. Retry with bounded exponential backoff, starting at 1 second and capping at 30, unless the code’s own page says otherwise. Sends are idempotent on `Idempotency-Key`, so a retry of a send that actually succeeded returns the original result rather than sending twice.

| Code                                                     | Message                           | HTTP | Troubleshooting                                                                                                              |
| -------------------------------------------------------- | --------------------------------- | ---- | ---------------------------------------------------------------------------------------------------------------------------- |
| [3001](/channel/whatsapp/error/codes/3xxx/3001/index.md) | Attachment read unavailable.      | 503  | Wait error.retry\_after seconds and retry the same download.                                                                 |
| [3002](/channel/whatsapp/error/codes/3xxx/3002/index.md) | Authentication unavailable.       | 503  | Retry the same request with bounded backoff; nothing was recorded.                                                           |
| [3003](/channel/whatsapp/error/codes/3xxx/3003/index.md) | Capability audit unavailable.     | 503  | Retry the same request with bounded backoff; nothing was recorded.                                                           |
| [3004](/channel/whatsapp/error/codes/3xxx/3004/index.md) | Entitlement unavailable.          | 503  | Retry the same request with bounded backoff; nothing was recorded.                                                           |
| [3006](/channel/whatsapp/error/codes/3xxx/3006/index.md) | Internal error.                   | 500  | Retry with bounded backoff.                                                                                                  |
| [3008](/channel/whatsapp/error/codes/3xxx/3008/index.md) | Response failed.                  | 500  | Read the affected resource before retrying a mutation.                                                                       |
| [3009](/channel/whatsapp/error/codes/3xxx/3009/index.md) | Sending guard unavailable.        | 503  | Retry the same request with bounded backoff; nothing was recorded.                                                           |
| [3010](/channel/whatsapp/error/codes/3xxx/3010/index.md) | Stream unavailable.               | 503  | Use GET /v1/event\_log if it is available, or contact support.                                                               |
| [3011](/channel/whatsapp/error/codes/3xxx/3011/index.md) | Template asset unavailable.       | 503  | Retry the unchanged submission later; if it persists, upload the asset again and contact support with the request\_id.       |
| [3012](/channel/whatsapp/error/codes/3xxx/3012/index.md) | Template channel unavailable.     | 503  | Retry the same request with bounded backoff; nothing was recorded.                                                           |
| [3013](/channel/whatsapp/error/codes/3xxx/3013/index.md) | Webhook registration unavailable. | 503  | Retry later; if it persists, contact support.                                                                                |
| [3014](/channel/whatsapp/error/codes/3xxx/3014/index.md) | Webhook replay unavailable.       | 503  | Contact support if you need a replay.                                                                                        |
| [3015](/channel/whatsapp/error/codes/3xxx/3015/index.md) | Event log unavailable.            | 503  | Use GET /v1/streams/events if it is available, or contact support.                                                           |
| [3016](/channel/whatsapp/error/codes/3xxx/3016/index.md) | Event payload invalid.            | 500  | Retry the same read; if it persists, contact support and quote the request\_id.                                              |
| [3017](/channel/whatsapp/error/codes/3xxx/3017/index.md) | Webhook replay failed.            | 500  | Retry with the same Idempotency-Key.                                                                                         |
| [3019](/channel/whatsapp/error/codes/3xxx/3019/index.md) | Not implemented.                  | 501  | Check the operation’s first description line in GET /v1/openapi.yaml; it says Not yet available until the operation is live. |
| [3020](/channel/whatsapp/error/codes/3xxx/3020/index.md) | Rate not configured.              | 503  | Contact support rather than retrying; retries return the same answer until a rate is assigned.                               |
| [3021](/channel/whatsapp/error/codes/3xxx/3021/index.md) | Template submission in progress.  | 503  | Resend the identical request after a short wait; a changed body starts a new submission instead.                             |
| [3022](/channel/whatsapp/error/codes/3xxx/3022/index.md) | Unavailable.                      | 503  | Retry the same request with bounded backoff; nothing was recorded.                                                           |

## 4xxx — Operational and Send Refusals

The send was understood and refused for an operational reason: a sending number that cannot carry it, a paused account, or a limit that was reached. Each code names its own remedy; a retry without that remedy is refused the same way.

| Code                                                     | Message                          | HTTP      | Troubleshooting                                                                                                                                                         |
| -------------------------------------------------------- | -------------------------------- | --------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [4001](/channel/whatsapp/error/codes/4xxx/4001/index.md) | Exclude leaves no sender.        | 422       | Read error.context.pinned\_from when present: your exclude named the number this conversation already uses.                                                             |
| [4003](/channel/whatsapp/error/codes/4xxx/4003/index.md) | From not sendable.               | 422       | Call GET /v1/phone\_numbers and choose a number whose status admits sending.                                                                                            |
| [4004](/channel/whatsapp/error/codes/4xxx/4004/index.md) | Pinned line unsendable.          | 422       | Read error.context.pinned\_from (the current number, absent when it is no longer yours) and error.context.available\_from (a number that could serve instead).          |
| [4005](/channel/whatsapp/error/codes/4xxx/4005/index.md) | Sending paused.                  | 503       | Retry later with bounded backoff.                                                                                                                                       |
| [4006](/channel/whatsapp/error/codes/4xxx/4006/index.md) | Spend limit exceeded.            | 422 / 429 | When error.retry\_after is present, wait that many seconds; the reset is the UTC day or month boundary.                                                                 |
| [4007](/channel/whatsapp/error/codes/4xxx/4007/index.md) | Template not sendable.           | 422       | Read the template with GET /v1/templates to confirm its status and send\_schema; details\[].param names the discriminating field.                                       |
| [4008](/channel/whatsapp/error/codes/4xxx/4008/index.md) | Tier quota exceeded.             | 422 / 429 | Wait at least error.retry\_after seconds when present; replies inside an open customer window are not counted.                                                          |
| [4009](/channel/whatsapp/error/codes/4xxx/4009/index.md) | Replay capacity reached.         | 429       | Wait error.retry\_after seconds and request the replay again.                                                                                                           |
| [4010](/channel/whatsapp/error/codes/4xxx/4010/index.md) | Pinned line outside environment. | 422       | Read error.context.pinned\_from (the conversation’s current number) and error.context.available\_from (a number in this environment that could serve, when one exists). |
| [4011](/channel/whatsapp/error/codes/4xxx/4011/index.md) | Recipient phone number required. | 422       | Deliver the one-time code another way; every other message type, including templates without a one-time-code button, can still be sent to this customer.                |
| [4012](/channel/whatsapp/error/codes/4xxx/4012/index.md) | Request rate exceeded.           | 429       | Wait error.retry\_after seconds, then retry; back off further if the refusal repeats.                                                                                   |
| [4013](/channel/whatsapp/error/codes/4xxx/4013/index.md) | Event stream limit reached.      | 429       | Reuse one stream per consumer rather than opening a new stream per task, and close streams you no longer read.                                                          |

## 5xxx — Attachment and File Errors

The file’s bytes: its kind, its size, where it came from, or storing it. An attachment that is merely missing or not yet readable is a 2xxx resource error instead.

| Code                                                     | Message                          | HTTP | Troubleshooting                                                                                                              |
| -------------------------------------------------------- | -------------------------------- | ---- | ---------------------------------------------------------------------------------------------------------------------------- |
| [5001](/channel/whatsapp/error/codes/5xxx/5001/index.md) | Download capacity exhausted.     | 503  | Wait error.retry\_after seconds and retry the same download; nothing about the attachment changed.                           |
| [5002](/channel/whatsapp/error/codes/5xxx/5002/index.md) | Media id inbound only.           | 422  | Upload outbound bytes with POST /v1/media and reference the returned upload\_ref in the part.                                |
| [5003](/channel/whatsapp/error/codes/5xxx/5003/index.md) | Media invalid.                   | 422  | Read details\[] for the exact param (a JSON Pointer into your request) and each field’s own fault code.                      |
| [5004](/channel/whatsapp/error/codes/5xxx/5004/index.md) | Upload capacity exhausted.       | 503  | Wait error.retry\_after seconds and retry the same upload.                                                                   |
| [5005](/channel/whatsapp/error/codes/5xxx/5005/index.md) | Upload ref invalid.              | 422  | Use the upload\_ref exactly as returned by POST /v1/media, in the same livemode.                                             |
| [5006](/channel/whatsapp/error/codes/5xxx/5006/index.md) | Upload ref not found.            | 422  | Upload the bytes again with POST /v1/media and send promptly with the new upload\_ref.                                       |
| [5007](/channel/whatsapp/error/codes/5xxx/5007/index.md) | Media source invalid.            | 422  | Serve the file from a public https host on port 443 and supply that address without credentials.                             |
| [5008](/channel/whatsapp/error/codes/5xxx/5008/index.md) | Media source unavailable.        | 422  | Confirm the address serves the file directly with a 200 answer, without authentication or a redirect to a page.              |
| [5009](/channel/whatsapp/error/codes/5xxx/5009/index.md) | Media source unsupported.        | 422  | Set kind to match the file the address serves, and serve it under a media type the upload operation documents for that kind. |
| [5010](/channel/whatsapp/error/codes/5xxx/5010/index.md) | Media source capacity exhausted. | 503  | Retry the same request shortly.                                                                                              |
