Error envelope
Every error response follows the same shape:type- a machine-readable error code (e.g.,"VALIDATION_ERROR"). Use this for programmatic error handling.message- a human-readable description of what went wrong.request_id- a unique identifier for this request. Quote this in support requests so the team can trace your issue.
Response headers
Every response (success or error) includes:| Header | Description |
|---|---|
X-Request-ID | Same value as error.request_id |
API-Version | Current API version (e.g., 1.0) |
Content-Type enforcement
All non-GET requests must includeContent-Type: application/json. Requests with a
different content type receive a 415 UNSUPPORTED_MEDIA_TYPE error before reaching the
route handler.
Error codes
| Code | HTTP Status | When it happens |
|---|---|---|
VALIDATION_ERROR | 400 | Request body or query params failed schema validation |
AUTHENTICATION_ERROR | 401 | Missing, invalid, or revoked API key |
AUTHORIZATION_ERROR | 403 | Valid key but insufficient permissions |
NOT_FOUND | 404 | Entity, mapping, or resource does not exist |
CONFLICT_ERROR | 409 | Operation conflicts with existing state |
UNSUPPORTED_MEDIA_TYPE | 415 | Request Content-Type is not application/json |
TRANSFORM_ERROR | 422 | Data transformation failed (e.g., missing mapper context) |
RATE_LIMIT_ERROR | 429 | Too many requests - currently only on POST /demo/session |
INTERNAL_ERROR | 500 | Unexpected server error - the team is notified |
EXTERNAL_SERVICE_ERROR | 502 | Upstream service (database) failed |