# Errors

| Status | Code | When |
|---|---|---|
| 400 | `bad_request` | Invalid input. `details` lists the fields or the predicate paths that failed. |
| 401 | `unauthorized` | No key, an unknown key, an expired sandbox. |
| 403 | `forbidden` | The key lacks the scope the operation needs. |
| 404 | `not_found` | The message names the operation that lists the thing. |
| 409 | `conflict` | A bucket or destination with that name exists; approving a capture with unresolved validation issues. |
| 413 | `too_large` | The message exceeds the size limit. |
| 422 | `unparseable` | The email could not be parsed at all. |
| 429 | `cap_reached` | A sandbox has reached its message cap. |
| 500 | `internal` | Our fault. |

Over MCP, the same errors come back as `isError` results with the same text.
