Content-Type: application/problem+json and a consistent shape. The HTTP
status is what you branch on; the body explains the detail.
Problem shape
A stable URI identifying the error category, under
https://errors.zeam.app/.Short, human-readable summary of the category.
The HTTP status code, repeated in the body.
A human-readable, actionable explanation of this specific failure.
The path that produced the error.
Mirrors the
X-Request-Id response header. Quote it in support requests.Field-level validation failures, when applicable. Each item has a
field and
a message.Error catalogue
| Status | type suffix | When it happens |
|---|---|---|
400 | validation-error | Malformed body or query parameters. |
401 | unauthenticated | Missing or invalid bearer token or x-zeam-auth. Generic by design. |
403 | forbidden | Authenticated, but not permitted for this action. |
404 | not-found | The wallet, intent, or other resource does not exist. |
422 | validation-error | The body parsed but failed field validation; see errors. |
429 | rate-limited | Too many requests. Honor Retry-After. See rate limits. |
502 | upstream-error | A downstream service returned an unexpected error. |
504 | upstream-timeout | A downstream service timed out. |
500 | internal-error | An unexpected error in the gateway. |
Handling guidance
- Branch on the HTTP status, then read
typefor the specific category. 401is intentionally generic and never says which credential failed. Re-authenticate and retry with valid credentials.429,502,504are transient. Retry with backoff; for429, wait forRetry-After.400,422are caused by the request. Fix the input usingdetailanderrors, then retry.- Always capture
requestIdso Zeam can trace the exact request.