# Errors

All errors are RFC 9457 `application/problem+json` with `type`, `title`, `status`, `detail` and `instance`; validation errors add `errors[]` with `field` and `message`. The `type` is a URL of the form `https://api.criptonlabs.com/errors/<slug>.md` and resolves to a page describing the problem.

| Status | Type slug | Retry? |
|---|---|---|
| 400 | [invalid-parameters](https://api.criptonlabs.com/errors/invalid-parameters.md), [bad-request](https://api.criptonlabs.com/errors/bad-request.md) | No, fix the request |
| 404 | [not-found](https://api.criptonlabs.com/errors/not-found.md), [unknown-route](https://api.criptonlabs.com/errors/unknown-route.md) | No |
| 429 | [rate-limited](https://api.criptonlabs.com/errors/rate-limited.md) | Yes, after `Retry-After` |
| 500 | [internal-error](https://api.criptonlabs.com/errors/internal-error.md) | Yes, with backoff |
| 503 | [upstream-unavailable](https://api.criptonlabs.com/errors/upstream-unavailable.md) | Yes, after `Retry-After` |

Client errors reported by the XRP Ledger itself (such as a missing account) are not retried by the service and surface as 400 or 404.

Over MCP, the same problem body is returned as the text of a tool result with `isError: true`.
