Errors
A code for the machine, a sentence for the person.
Branch on the code, never on the sentence. The sentence is translated and may be reworded in any release; the code is part of the contract and changes only with the version in the path.
| Code | Status | When it happens |
|---|---|---|
| UNAUTHENTICATED | 401 | No key, an unreadable one, a revoked one or an expired one. All four answer alike. |
| ANFRAGE | 400 | The request could not be read: a missing required field, a value in the wrong shape. |
| PLAN_ERFORDERLICH | 403 | This company's plan does not include the interface. Only the business can change that, not the software. |
| KEINE_BERECHTIGUNG | 403 | The key does not carry the scope this address requires. |
| NICHT_GEFUNDEN | 404 | No such record — or it belongs to another company. Both answer alike, deliberately. |
| IDEMPOTENZ_KONFLIKT | 409 | The same idempotency key was already used for a different body or a different address. |
| FALSCHER_ZUSTAND | 409 | The request was well formed; the state of the record does not allow it. |
| ABGELEHNT | 409 | A domain rule refused the change. The sentence beside it says which one. |
| ZU_VIELE_ANFRAGEN | 429 | This key's budget is spent. Retry-After names the wait in seconds. |
The shape of every refusal.
Two fields, always the same two. No stack trace, no query, no file path: what comes back names the rule that stopped the request and says nothing else about the interior.
{"fehler": "…", "code": "KEINE_BERECHTIGUNG"}
The number you can quote.
Every answer carries this header, refusals included. Send your own value and it appears in our records; send none and we make one. In a support conversation it replaces describing a request by the time of day.
X-Correlation-Id: 6f1c2a8e-4b3d-4a21-9d77-0c5e1f9b2a44