---
title: Error Codes | API Docs
description: Complete reference of Apple Messages 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 carries a numeric `code` and a `doc_url` pointing at that code’s page here.

```
{
  "success": false,
  "error": {
    "status": 404,
    "code": 2001,
    "message": "Chat not found",
    "doc_url": "https://docs.linqapp.com/channel/amb/error/codes/2xxx/2001/"
  },
  "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.

Three fields appear only when they apply: `param` names the field a validation error is about, `retry_after` gives the seconds to wait, and `details` carries an array of field-level conditions. `trace_id` appears when tracing is enabled.

**These codes belong to Apple Messages.** Every channel numbers its own errors, which is why the `doc_url` is namespaced to `/channel/amb/` — 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

| Range                                | Category               | Retry?                              |
| ------------------------------------ | ---------------------- | ----------------------------------- |
| [1xxx](#1xxx--clientrequest-errors)  | Client/Request Errors  | No — fix the request                |
| [2xxx](#2xxx--resource-errors)       | Resource Errors        | No — fix auth or resource reference |
| [3xxx](#3xxx--server-errors)         | Server Errors          | Yes — retry with backoff            |
| [4xxx](#4xxx--delivery-errors)       | Delivery Errors        | Sometimes — depends on cause        |
| [5xxx](#5xxx--attachmentfile-errors) | Attachment/File Errors | Sometimes — depends on cause        |

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

## 1xxx — Client/Request Errors

The request never reached the thing it was about. Fix the request and send it again; retrying it unchanged fails identically.

| Code                                                | Message                                                                                     | HTTP | Troubleshooting                                                                                                                |
| --------------------------------------------------- | ------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------------------------------------------------------------------------------ |
| [1001](/channel/amb/error/codes/1xxx/1001/index.md) | Missing required field                                                                      | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1002](/channel/amb/error/codes/1xxx/1002/index.md) | Backlog horizon exceeded                                                                    | 429  | Wait the number of seconds in the `Retry-After` header (and `retry_after` in the body), then retry the same request unchanged. |
| [1003](/channel/amb/error/codes/1xxx/1003/index.md) | Invalid request body                                                                        | 400  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1004](/channel/amb/error/codes/1xxx/1004/index.md) | Batch exceeds horizon                                                                       | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1005](/channel/amb/error/codes/1xxx/1005/index.md) | Batch invalid                                                                               | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1006](/channel/amb/error/codes/1xxx/1006/index.md) | a JSON body is required; `{}` to change nothing                                             | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1007](/channel/amb/error/codes/1xxx/1007/index.md) | Rate limit exceeded                                                                         | 429  | Wait the number of seconds in the `Retry-After` header (and `retry_after` in the body), then retry the same request unchanged. |
| [1008](/channel/amb/error/codes/1xxx/1008/index.md) | Business hours invalid                                                                      | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1009](/channel/amb/error/codes/1xxx/1009/index.md) | Business id invalid                                                                         | 400  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1010](/channel/amb/error/codes/1xxx/1010/index.md) | Category invalid                                                                            | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1011](/channel/amb/error/codes/1xxx/1011/index.md) | Channel unsupported                                                                         | 400  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1012](/channel/amb/error/codes/1xxx/1012/index.md) | Count out of range                                                                          | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1013](/channel/amb/error/codes/1xxx/1013/index.md) | resume token is not one this API issued; reconnect without Last-Event-ID (and re-list       | 400  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1014](/channel/amb/error/codes/1xxx/1014/index.md) | Description too long                                                                        | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1015](/channel/amb/error/codes/1xxx/1015/index.md) | Duplicate                                                                                   | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1016](/channel/amb/error/codes/1xxx/1016/index.md) | Duplicate id                                                                                | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1017](/channel/amb/error/codes/1xxx/1017/index.md) | attachment body is empty                                                                    | 400  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1018](/channel/amb/error/codes/1xxx/1018/index.md) | Enabled events duplicate                                                                    | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1019](/channel/amb/error/codes/1xxx/1019/index.md) | Enabled events required                                                                     | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1020](/channel/amb/error/codes/1xxx/1020/index.md) | Enabled events unknown                                                                      | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1021](/channel/amb/error/codes/1xxx/1021/index.md) | Escalation handling invalid                                                                 | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1022](/channel/amb/error/codes/1xxx/1022/index.md) | Expiry invalid                                                                              | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1023](/channel/amb/error/codes/1xxx/1023/index.md) | Field mismatch                                                                              | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1024](/channel/amb/error/codes/1xxx/1024/index.md) | Field removed                                                                               | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1025](/channel/amb/error/codes/1xxx/1025/index.md) | the body carries trailing content after the definition                                      | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1026](/channel/amb/error/codes/1xxx/1026/index.md) | Flow reserved                                                                               | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1027](/channel/amb/error/codes/1xxx/1027/index.md) | Forbidden character                                                                         | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1028](/channel/amb/error/codes/1xxx/1028/index.md) | Forbidden identifier                                                                        | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1029](/channel/amb/error/codes/1xxx/1029/index.md) | Forbidden policy phrase                                                                     | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1030](/channel/amb/error/codes/1xxx/1030/index.md) | hours\_timezone must be an IANA zone name this platform can load, e.g. America/New\_York    | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1031](/channel/amb/error/codes/1xxx/1031/index.md) | Idempotency-Key header is required on all sends; it makes blind retries safe                | 400  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1032](/channel/amb/error/codes/1xxx/1032/index.md) | If match invalid                                                                            | 400  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1033](/channel/amb/error/codes/1xxx/1033/index.md) | If match required                                                                           | 428  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1034](/channel/amb/error/codes/1xxx/1034/index.md) | Integration invalid                                                                         | 400  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1035](/channel/amb/error/codes/1xxx/1035/index.md) | Invalid                                                                                     | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1036](/channel/amb/error/codes/1xxx/1036/index.md) | Invalid timestamp                                                                           | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1037](/channel/amb/error/codes/1xxx/1037/index.md) | Invalid type                                                                                | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1038](/channel/amb/error/codes/1xxx/1038/index.md) | Invalid url                                                                                 | 400  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1039](/channel/amb/error/codes/1xxx/1039/index.md) | the body must be multipart/form-data with a `name` field and an optional `logo` file part   | 400  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1040](/channel/amb/error/codes/1xxx/1040/index.md) | name is required; it is the brand name printed on the invitation card                       | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1041](/channel/amb/error/codes/1xxx/1041/index.md) | Non bmp character                                                                           | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1042](/channel/amb/error/codes/1xxx/1042/index.md) | Not before too far                                                                          | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1043](/channel/amb/error/codes/1xxx/1043/index.md) | Not future                                                                                  | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1044](/channel/amb/error/codes/1xxx/1044/index.md) | Not single line                                                                             | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1045](/channel/amb/error/codes/1xxx/1045/index.md) | Not whole minute                                                                            | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1046](/channel/amb/error/codes/1xxx/1046/index.md) | On invalid invalid                                                                          | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1047](/channel/amb/error/codes/1xxx/1047/index.md) | Operator invalid                                                                            | 400  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1048](/channel/amb/error/codes/1xxx/1048/index.md) | Out of range                                                                                | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1049](/channel/amb/error/codes/1xxx/1049/index.md) | Overlap hours invalid                                                                       | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1050](/channel/amb/error/codes/1xxx/1050/index.md) | Param invalid                                                                               | 400  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1051](/channel/amb/error/codes/1xxx/1051/index.md) | Part invalid                                                                                | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1052](/channel/amb/error/codes/1xxx/1052/index.md) | Parts empty                                                                                 | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1053](/channel/amb/error/codes/1xxx/1053/index.md) | Parts invalid                                                                               | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1054](/channel/amb/error/codes/1xxx/1054/index.md) | Replay max out of range                                                                     | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1055](/channel/amb/error/codes/1xxx/1055/index.md) | until is before since, so the range names no events                                         | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1056](/channel/amb/error/codes/1xxx/1056/index.md) | Replay range too large                                                                      | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1057](/channel/amb/error/codes/1xxx/1057/index.md) | Replay selector conflict                                                                    | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1058](/channel/amb/error/codes/1xxx/1058/index.md) | Replay selector required                                                                    | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1059](/channel/amb/error/codes/1xxx/1059/index.md) | Replay too many ids                                                                         | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1060](/channel/amb/error/codes/1xxx/1060/index.md) | no flow named                                                                               | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1061](/channel/amb/error/codes/1xxx/1061/index.md) | Secret value required                                                                       | 400  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1062](/channel/amb/error/codes/1xxx/1062/index.md) | Server owned                                                                                | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1063](/channel/amb/error/codes/1xxx/1063/index.md) | since must be an RFC3339 timestamp, e.g. 2026-08-14T00:00:00Z                               | 400  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1064](/channel/amb/error/codes/1xxx/1064/index.md) | Source invalid                                                                              | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1065](/channel/amb/error/codes/1xxx/1065/index.md) | Spread over seconds invalid                                                                 | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1066](/channel/amb/error/codes/1xxx/1066/index.md) | State invalid                                                                               | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1067](/channel/amb/error/codes/1xxx/1067/index.md) | Subject invalid                                                                             | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1068](/channel/amb/error/codes/1xxx/1068/index.md) | Subject kind invalid                                                                        | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1069](/channel/amb/error/codes/1xxx/1069/index.md) | subject is required                                                                         | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1070](/channel/amb/error/codes/1xxx/1070/index.md) | template\_id is required: a batch sends one of your invitation templates to every recipient | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1071](/channel/amb/error/codes/1xxx/1071/index.md) | To invalid                                                                                  | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1072](/channel/amb/error/codes/1xxx/1072/index.md) | To required                                                                                 | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1073](/channel/amb/error/codes/1xxx/1073/index.md) | flow definition exceeds the size ceiling                                                    | 413  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1074](/channel/amb/error/codes/1xxx/1074/index.md) | Too long                                                                                    | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1075](/channel/amb/error/codes/1xxx/1075/index.md) | Too many messages                                                                           | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1076](/channel/amb/error/codes/1xxx/1076/index.md) | Unhandled form kind                                                                         | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1077](/channel/amb/error/codes/1xxx/1077/index.md) | Unknown app extension                                                                       | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1078](/channel/amb/error/codes/1xxx/1078/index.md) | Unknown page                                                                                | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1079](/channel/amb/error/codes/1xxx/1079/index.md) | Unknown parameter                                                                           | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1080](/channel/amb/error/codes/1xxx/1080/index.md) | Unknown part type                                                                           | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1081](/channel/amb/error/codes/1xxx/1081/index.md) | Unknown template                                                                            | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1082](/channel/amb/error/codes/1xxx/1082/index.md) | Url invalid                                                                                 | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1090](/channel/amb/error/codes/1xxx/1090/index.md) | Claim required                                                                              | 400  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1091](/channel/amb/error/codes/1xxx/1091/index.md) | Degrade invalid                                                                             | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1092](/channel/amb/error/codes/1xxx/1092/index.md) | Duplicate recipient                                                                         | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1093](/channel/amb/error/codes/1xxx/1093/index.md) | No valid recipients                                                                         | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1094](/channel/amb/error/codes/1xxx/1094/index.md) | recipients must carry at least one row                                                      | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1095](/channel/amb/error/codes/1xxx/1095/index.md) | Too many recipients                                                                         | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1096](/channel/amb/error/codes/1xxx/1096/index.md) | Typing lead invalid                                                                         | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1097](/channel/amb/error/codes/1xxx/1097/index.md) | File conflicting                                                                            | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1098](/channel/amb/error/codes/1xxx/1098/index.md) | File part misplaced                                                                         | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1099](/channel/amb/error/codes/1xxx/1099/index.md) | File part missing                                                                           | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1100](/channel/amb/error/codes/1xxx/1100/index.md) | File part unused                                                                            | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1101](/channel/amb/error/codes/1xxx/1101/index.md) | Image att id reserved                                                                       | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1102](/channel/amb/error/codes/1xxx/1102/index.md) | Logo conflicting                                                                            | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |
| [1103](/channel/amb/error/codes/1xxx/1103/index.md) | Unknown image id                                                                            | 422  | Check this endpoint’s request schema in the API reference; `param` in the response names the exact field at fault.             |

## 2xxx — Resource Errors

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

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

| Code                                                | Message                                                                              | HTTP | Troubleshooting                                                         |
| --------------------------------------------------- | ------------------------------------------------------------------------------------ | ---- | ----------------------------------------------------------------------- |
| [2001](/channel/amb/error/codes/2xxx/2001/index.md) | Chat not found                                                                       | 404  | Verify the id came from a previous response on this brand’s credential. |
| [2002](/channel/amb/error/codes/2xxx/2002/index.md) | Message not found                                                                    | 404  | Verify the id came from a previous response on this brand’s credential. |
| [2003](/channel/amb/error/codes/2xxx/2003/index.md) | Attachment not found                                                                 | 422  | Verify the id came from a previous response on this brand’s credential. |
| [2005](/channel/amb/error/codes/2xxx/2005/index.md) | App extension not configured                                                         | 409  | Verify the id came from a previous response on this brand’s credential. |
| [2006](/channel/amb/error/codes/2xxx/2006/index.md) | Apple pay not configured                                                             | 409  | Verify the id came from a previous response on this brand’s credential. |
| [2007](/channel/amb/error/codes/2xxx/2007/index.md) | Attachment not ready                                                                 | 409  | Verify the id came from a previous response on this brand’s credential. |
| [2008](/channel/amb/error/codes/2xxx/2008/index.md) | your brand already holds a different business id on channel                          | 409  | Verify the id came from a previous response on this brand’s credential. |
| [2009](/channel/amb/error/codes/2xxx/2009/index.md) | Chat already claimed                                                                 | 409  | Verify the id came from a previous response on this brand’s credential. |
| [2010](/channel/amb/error/codes/2xxx/2010/index.md) | the chat is closed                                                                   | 409  | Verify the id came from a previous response on this brand’s credential. |
| [2011](/channel/amb/error/codes/2xxx/2011/index.md) | a flow can only start while the partner owns the chat                                | 409  | Verify the id came from a previous response on this brand’s credential. |
| [2012](/channel/amb/error/codes/2xxx/2012/index.md) | Chat superseded                                                                      | 409  | Verify the id came from a previous response on this brand’s credential. |
| [2013](/channel/amb/error/codes/2xxx/2013/index.md) | Claim invalid                                                                        | 403  | Verify the id came from a previous response on this brand’s credential. |
| [2014](/channel/amb/error/codes/2xxx/2014/index.md) | this brand does not attest its own consent (its consent\_mode is linq\_managed)      | 409  | Verify the id came from a previous response on this brand’s credential. |
| [2015](/channel/amb/error/codes/2xxx/2015/index.md) | no valid opt-in on file for this notification category                               | 403  | Verify the id came from a previous response on this brand’s credential. |
| [2016](/channel/amb/error/codes/2xxx/2016/index.md) | Cross brand conflict                                                                 | 409  | Verify the id came from a previous response on this brand’s credential. |
| [2017](/channel/amb/error/codes/2xxx/2017/index.md) | Endpoint limit reached                                                               | 409  | Verify the id came from a previous response on this brand’s credential. |
| [2018](/channel/amb/error/codes/2xxx/2018/index.md) | this brand already has an endpoint at that URL. If you are retrying a create whose   | 409  | Verify the id came from a previous response on this brand’s credential. |
| [2019](/channel/amb/error/codes/2xxx/2019/index.md) | we are holding this brand on managed escalation; contact support to release the lock | 409  | Verify the id came from a previous response on this brand’s credential. |
| [2020](/channel/amb/error/codes/2xxx/2020/index.md) | no such event                                                                        | 404  | Verify the id came from a previous response on this brand’s credential. |
| [2021](/channel/amb/error/codes/2xxx/2021/index.md) | no flow with that id                                                                 | 404  | Verify the id came from a previous response on this brand’s credential. |
| [2022](/channel/amb/error/codes/2xxx/2022/index.md) | no such flow or chat                                                                 | 404  | Verify the id came from a previous response on this brand’s credential. |
| [2023](/channel/amb/error/codes/2xxx/2023/index.md) | the original request with this key is still processing; retry shortly                | 409  | Verify the id came from a previous response on this brand’s credential. |
| [2024](/channel/amb/error/codes/2xxx/2024/index.md) | this Idempotency-Key was used with a different request body                          | 409  | Verify the id came from a previous response on this brand’s credential. |
| [2025](/channel/amb/error/codes/2xxx/2025/index.md) | that ownership change isn’t valid from the chat’s current owner                      | 409  | Verify the id came from a previous response on this brand’s credential. |
| [2026](/channel/amb/error/codes/2xxx/2026/index.md) | Integration group not found                                                          | 404  | Verify the id came from a previous response on this brand’s credential. |
| [2027](/channel/amb/error/codes/2xxx/2027/index.md) | this request carries no resolved API key                                             | 401  | Verify the id came from a previous response on this brand’s credential. |
| [2028](/channel/amb/error/codes/2xxx/2028/index.md) | invitation batch not found                                                           | 404  | Verify the id came from a previous response on this brand’s credential. |
| [2029](/channel/amb/error/codes/2xxx/2029/index.md) | Invitation card not granted                                                          | 403  | Verify the id came from a previous response on this brand’s credential. |
| [2030](/channel/amb/error/codes/2xxx/2030/index.md) | Invitation chat not addressable                                                      | 409  | Verify the id came from a previous response on this brand’s credential. |
| [2031](/channel/amb/error/codes/2xxx/2031/index.md) | Invitation not found                                                                 | 404  | Verify the id came from a previous response on this brand’s credential. |
| [2032](/channel/amb/error/codes/2xxx/2032/index.md) | Invitation template not authorized                                                   | 403  | Verify the id came from a previous response on this brand’s credential. |
| [2033](/channel/amb/error/codes/2xxx/2033/index.md) | no invitation template with that id                                                  | 404  | Verify the id came from a previous response on this brand’s credential. |
| [2034](/channel/amb/error/codes/2xxx/2034/index.md) | message template not found                                                           | 404  | Verify the id came from a previous response on this brand’s credential. |
| [2035](/channel/amb/error/codes/2xxx/2035/index.md) | provide Authorization: Bearer sk\_dev\_…                                             | 401  | Verify the id came from a previous response on this brand’s credential. |
| [2036](/channel/amb/error/codes/2xxx/2036/index.md) | Oauth not configured                                                                 | 409  | Verify the id came from a previous response on this brand’s credential. |
| [2037](/channel/amb/error/codes/2xxx/2037/index.md) | unknown part type                                                                    | 404  | Verify the id came from a previous response on this brand’s credential. |
| [2038](/channel/amb/error/codes/2xxx/2038/index.md) | a signing-key rotation is already in flight for this endpoint. The previous secret   | 409  | Verify the id came from a previous response on this brand’s credential. |
| [2039](/channel/amb/error/codes/2xxx/2039/index.md) | Structure unsupported                                                                | 409  | Verify the id came from a previous response on this brand’s credential. |
| [2040](/channel/amb/error/codes/2xxx/2040/index.md) | Version conflict                                                                     | 412  | Verify the id came from a previous response on this brand’s credential. |
| [2041](/channel/amb/error/codes/2xxx/2041/index.md) | Webhook endpoint not found                                                           | 404  | Verify the id came from a previous response on this brand’s credential. |
| [2042](/channel/amb/error/codes/2xxx/2042/index.md) | Webhook endpoint not receiving                                                       | 409  | Verify the id came from a previous response on this brand’s credential. |
| [2052](/channel/amb/error/codes/2xxx/2052/index.md) | Degrade requires sequence                                                            | 409  | Verify the id came from a previous response on this brand’s credential. |
| [2053](/channel/amb/error/codes/2xxx/2053/index.md) | Attachment failed                                                                    | 422  | Verify the id came from a previous response on this brand’s credential. |
| [2054](/channel/amb/error/codes/2xxx/2054/index.md) | Attachment not sendable                                                              | 422  | Verify the id came from a previous response on this brand’s credential. |
| [2056](/channel/amb/error/codes/2xxx/2056/index.md) | this invitation template has no logo                                                 | 404  | Verify the id came from a previous response on this brand’s credential. |
| [2057](/channel/amb/error/codes/2xxx/2057/index.md) | Operator forbidden                                                                   | 403  | Verify the id came from a previous response on this brand’s credential. |

## 3xxx — Server Errors

Transient, and ours. Retry with exponential backoff, starting at 1 second and capping at 30. 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/amb/error/codes/3xxx/3001/index.md) | brand has no outbound channel account; cannot send as this brand         | 503  | Retry with exponential backoff: this is our failure, not your request’s. |
| [3002](/channel/amb/error/codes/3xxx/3002/index.md) | AMB credentials not configured                                           | 503  | Retry with exponential backoff: this is our failure, not your request’s. |
| [3003](/channel/amb/error/codes/3xxx/3003/index.md) | the server could not encode this frame                                   | 500  | Retry with exponential backoff: this is our failure, not your request’s. |
| [3004](/channel/amb/error/codes/3xxx/3004/index.md) | the typing indicator could not be handed to the messaging channel; retry | 502  | Retry with exponential backoff: this is our failure, not your request’s. |
| [3005](/channel/amb/error/codes/3xxx/3005/index.md) | Streaming unsupported                                                    | 500  | Retry with exponential backoff: this is our failure, not your request’s. |
| [3006](/channel/amb/error/codes/3xxx/3006/index.md) | Internal server error                                                    | 500  | Retry with exponential backoff: this is our failure, not your request’s. |

## 4xxx — Delivery Errors

What the send attempt discovered, or an operational refusal. Apple Messages has no delivery or read receipts — `sent` means Apple accepted the message — so this range is small by construction, and a code here is something we learned while handing the message over, not afterwards.

| Code                                                | Message                                                                                   | HTTP | Troubleshooting                                                                                         |
| --------------------------------------------------- | ----------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------------------------------------------------------- |
| [4001](/channel/amb/error/codes/4xxx/4001/index.md) | Capability unknown                                                                        | 409  | This is an operational or capability refusal, not a malformed request; the same call may succeed later. |
| [4002](/channel/amb/error/codes/4xxx/4002/index.md) | this customer asked for the automated messages to stop; only the human desk may send here | 403  | This is an operational or capability refusal, not a malformed request; the same call may succeed later. |
| [4003](/channel/amb/error/codes/4xxx/4003/index.md) | sending is temporarily paused: the kill-switch state is not yet loaded; retry shortly     | 503  | This is an operational or capability refusal, not a malformed request; the same call may succeed later. |
| [4005](/channel/amb/error/codes/4xxx/4005/index.md) | Capability unsupported                                                                    | 409  | This is an operational or capability refusal, not a malformed request; the same call may succeed later. |

## 5xxx — Attachment/File Errors

The file’s bytes: its format, 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/amb/error/codes/5xxx/5001/index.md) | attachment source capacity is busy; retry shortly                                | 503  | Wait the number of seconds in the `Retry-After` header (and `retry_after` in the body), then retry the same request unchanged. |
| [5002](/channel/amb/error/codes/5xxx/5002/index.md) | attachment source returned an empty body                                         | 422  | Check the file against the documented size and format limits for this field.                                                   |
| [5003](/channel/amb/error/codes/5xxx/5003/index.md) | attachment source was refused by the secure URL policy                           | 422  | Check the file against the documented size and format limits for this field.                                                   |
| [5004](/channel/amb/error/codes/5xxx/5004/index.md) | attachment source bytes exceed the 100 MB request limit                          | 413  | Check the file against the documented size and format limits for this field.                                                   |
| [5005](/channel/amb/error/codes/5xxx/5005/index.md) | attachment source fetching is temporarily unavailable                            | 502  | Check the file against the documented size and format limits for this field.                                                   |
| [5006](/channel/amb/error/codes/5xxx/5006/index.md) | attachment storage is unavailable for this brand right now;                      | 503  | Wait the number of seconds in the `Retry-After` header (and `retry_after` in the body), then retry the same request unchanged. |
| [5007](/channel/amb/error/codes/5xxx/5007/index.md) | the logo must be a real PNG (checked by signature, not filename or content-type) | 422  | Check the file against the documented size and format limits for this field.                                                   |
| [5008](/channel/amb/error/codes/5xxx/5008/index.md) | Bubble image aspect                                                              | 422  | Check the file against the documented size and format limits for this field.                                                   |
| [5009](/channel/amb/error/codes/5xxx/5009/index.md) | Interactive image format unsupported                                             | 422  | Check the file against the documented size and format limits for this field.                                                   |
| [5010](/channel/amb/error/codes/5xxx/5010/index.md) | Interactive image too large                                                      | 413  | Check the file against the documented size and format limits for this field.                                                   |
| [5011](/channel/amb/error/codes/5xxx/5011/index.md) | Interactive images too large                                                     | 413  | Check the file against the documented size and format limits for this field.                                                   |
| [5012](/channel/amb/error/codes/5xxx/5012/index.md) | Logo too large                                                                   | 422  | Check the file against the documented size and format limits for this field.                                                   |
| [5013](/channel/amb/error/codes/5xxx/5013/index.md) | the default card image must be a PNG                                             | 422  | Check the file against the documented size and format limits for this field.                                                   |
| [5014](/channel/amb/error/codes/5xxx/5014/index.md) | the default card image is over the 200 KB decoded cap for a preview card         | 413  | Check the file against the documented size and format limits for this field.                                                   |
