# Errors

Every refusal is a structured object in the response’s `errors` list — `{ "major", "minor", "retryable", "message" }`, with `detail` when the refusal has more to say — and the response still carries `extensions.at` with its `callId`. `major` names the class, `minor` the code inside it, and `retryable` says whether the identical call may succeed if you simply try again.

## The majors

| Major | Codes | Meaning |
| --- | --- | --- |
| [VALIDATION](/errors/VALIDATION/) | 11 | The request itself is not acceptable. |
| [AUTHN](/errors/AUTHN/) | 4 | Who is calling could not be established. |
| [AUTHZ](/errors/AUTHZ/) | 6 | The caller is known but not allowed. |
| [NOT_FOUND](/errors/NOT_FOUND/) | 9 | Nothing answers the reference given. |
| [CONFLICT](/errors/CONFLICT/) | 66 | The record’s state or a concurrent change refuses the call. |
| [RATE_LIMIT](/errors/RATE_LIMIT/) | 2 | Too many calls in the window. |
| [PAYMENT](/errors/PAYMENT/) | 5 | The payment step did not go through. |
| [FULFILLMENT](/errors/FULFILLMENT/) | 1 | The fulfillment step did not complete. |
| [TAX](/errors/TAX/) | 0 | A tax step could not be resolved. |
| [FISCAL](/errors/FISCAL/) | 3 | The fiscal authority or provider refused or did not answer. |
| [INTEGRATION](/errors/INTEGRATION/) | 1 | An outside service did not answer. |
| [INTERNAL](/errors/INTERNAL/) | 1 | The platform failed; nothing about the request caused it. |

## Retrying

When `retryable` is true, the same call, unchanged, may succeed a moment later — wait, then send it again. When it is false, change something first: the values, the record’s state, or who is calling.

