Skip to content

Error Responses ​

All four APIs return errors in JSON:API error format.

json
{
  "errors": [
    {
      "status": "404",
      "code": "not_found",
      "detail": "Resource not found: posts/missing"
    }
  ]
}

Error Codes ​

400 Bad Request ​

CodeDescription
invalid_dataRequest body failed schema validation
bad_requestMalformed request or unsupported operation
validation_errorField-level validation failure (Assets API)

401 Unauthenticated / Upstream Credential Rejected ​

Picking between the three auth-adjacent errors:

  • unauthenticated — the caller has not proven who they are: absent, malformed, or rejected credentials. Re-authenticate and retry.
  • unauthorized — an upstream server (e.g. a git host) rejected this server's own credential. The caller is authenticated; the problem is the server's token, not theirs. Do not prompt the end-user to re-authenticate.
  • forbidden (403) — the caller is authenticated but not permitted to perform this action.
CodeDescription
unauthenticatedCaller has not proven who they are — missing or rejected credential
unauthorizedAn upstream server rejected this server's credential (not the caller's)

403 Forbidden ​

CodeDescription
forbiddenAuthenticated but not permitted to perform this action
dir_instead_of_fileExpected a file at the given key but found a directory
file_instead_of_dirExpected a directory at the given key but found a file
permission_deniedAccess to the backing storage medium was refused or revoked — user must grant access again
permission_prompt_requiredAccess must be re-requested (e.g. a file handle whose permission lapsed to 'prompt') — recoverable by prompting inside a user gesture

404 Not Found ​

CodeDescription
not_foundResource does not exist

409 Conflict ​

CodeDescription
version_mismatchThe record was modified by another writer since last read
entry_already_existsAn object or folder already exists at the requested key
conflictGeneric conflict — the operation cannot proceed in the current state

410 Gone ​

CodeDescription
stale_handleA stored handle no longer connects to its underlying resource — the target was deleted or moved; select it again

413 Payload Too Large ​

CodeDescription
file_too_largeUploaded file exceeds size limit

415 Unsupported Media Type ​

CodeDescription
unsupported_file_typeFile type is not permitted by the backend's allow-list
dangerous_file_typeFile type is blocked because it is potentially dangerous

422 Unprocessable Entity ​

CodeDescription
corrupted_fileFile content could not be parsed or is structurally invalid
embedded_contentFile contains disallowed embedded content (e.g. macros, scripts)

423 Locked ​

CodeDescription
lock_conflictA document is held by a lock the caller does not own — retry after the lock is released (see ADR-007; deliberately 423 not 409 so clients branch on status alone)

429 Too Many Requests ​

CodeDescription
too_many_requestsRate limit exceeded — retry later

500 Internal Server Error ​

CodeDescription
internal_errorUnexpected server error
illegal_stateThe server reached an impossible internal state
unknown_errorError of unrecognised origin
authorizer_failureAPI Gateway authorizer failed — infrastructure-level auth error

501 Not Implemented ​

CodeDescription
not_implementedThe operation is not supported by this backend

503 / 504 Upstream Errors ​

HTTPCodeDescription
503service_unavailableA required upstream service is temporarily down
504gateway_timeoutAn upstream request timed out

507 Insufficient Storage ​

CodeDescription
quota_exceededThe backing storage medium is full or over its allotted quota — write was refused

Released under the MIT License.