Skip to content

Errors

Every non-2xx response follows a consistent JSON envelope. The HTTP status is derived from the domain exception class name by convention — no bespoke error catalog to consult.

{
"statusCode": 404,
"error": "ResourceNotFoundException",
"message": "Resource not found: abc-123",
"timestamp": "2026-01-15T10:30:00.000Z",
"path": "/spaces/space-1/resources/abc-123"
}
FieldDescription
statusCodeHTTP status code
errorException class name (e.g. ResourceNotFoundException), or InternalServerError for infrastructure failures
messageHuman-readable message. Generic for infrastructure failures (technical details are logged server-side, never exposed)
timestampISO 8601 timestamp
pathRequest URL

Domain exception class names map to HTTP status via a simple suffix convention:

SuffixHTTP statusExample
*NotFoundException404 Not FoundResourceNotFoundException, SpaceNotFoundException
*AlreadyExistsException409 ConflictSpaceAlreadyExistsException
*ConstraintException409 ConflictSameSpaceConstraintException
*PermissionsException403 ForbiddenInsufficientPermissionsException
Other domain exceptions422 Unprocessable EntityTypeMismatchException, InvalidDateRangeException

Authentication errors follow the standard OAuth2 semantics:

StatusWhen
401 UnauthorizedMissing, invalid, or expired access token
403 ForbiddenValid token but the user has no access to the requested Space, or insufficient permissions for the operation

Input validation failures (missing required fields, type mismatches, payload too large, etc.) return 400 Bad Request with a message describing the first failing field.

Database connectivity issues, external service outages, and other infrastructure failures always return 500 Internal Server Error. The response body does not leak implementation details — check the generic message and retry later, or report the timestamp and path to support.