# Error Codes

## Error body

Every error, on every endpoint, has this shape:

```json
{
  "code": 404,
  "codeDescription": "ITEM_NOT_FOUND",
  "message": "Item not found"
}
```

| Field | Meaning |
| --- | --- |
| `code` | The HTTP status, repeated. Always present. |
| `message` | A sentence for a person. Always present; not stable. |
| `codeDescription` | A stable identifier for the specific error, when the endpoint distinguishes several. Branch on this, not on `message`. |
| `data` | Extra detail for some errors — for instance, the Items that already exist when creating one would duplicate a connection. |

## Status codes

| Status | Meaning | Usually because |
| --- | --- | --- |
| `400` Bad Request | The request is invalid. | A missing or malformed field. |
| `401` Unauthorized | The credential is missing, wrong or expired. | An API Key past its 2 hours, or wrong `clientId`/`clientSecret` on `POST /auth` (`CLIENT_KEYS_UNAUTHORIZED`, `CLIENT_DISABLED`). |
| `403` Forbidden | The credential cannot reach this resource. | A Connect Token used outside its scope — see [Authentication](/reference/authentication). |
| `404` Not Found | No such resource. | An `id` that does not exist. |
| `405` Method Not Allowed | The endpoint does not support this verb. | |
| `406` Not Acceptable | A format other than JSON was requested. | |
| `409` Conflict | The request contradicts the current state of the resource. | A conflict updating an Item — see [`PATCH /items/{id}`](/reference/items/items-update). |
| `429` Too Many Requests | A rate limit was exceeded. | See [Rate Limits](/reference/rate-limits) for the limits and the `Retry-After` header. |
| `500` Internal Server Error | Something failed on our side. | Retry later. |
| `503` Service Unavailable | Temporarily offline for maintenance. | Retry later. |

Each endpoint's page in this reference lists the statuses it returns and, where the API distinguishes them, the `codeDescription` values.

Read the guide: [Errors Codes](/docs/developer-tools/error-codes).