Reference

Error codes

Every error code Bedrock can return, with the recovery action for each.

Error envelope

Every error response uses the same flat shape:

json
{
  "statusCode": 403,
  "error": "VULNERABILITY_SPECIALIST_REQUIRED",
  "message": "This case is flagged as vulnerable and requires a specialist reviewer or lead reviewer (FCA FG21/1)",
  "requestId": "3c1fa2d4-b1c4-4f7e-9c83-29e7f9a23b7b",
  "timestamp": "2026-04-08T12:31:04.219Z"
}
  • statusCode — mirrors the HTTP status line for easy access in code.
  • error — the specific machine-readable code. Match on this, not on the HTTP status alone; the same 403 can mean several different things.
  • message — a short human-readable description of what went wrong.
  • requestId — the server-assigned correlation id. Include this when raising support tickets.
  • timestamp — ISO 8601 server time of the failure.
  • details — optional, operation-specific structured context (present on some validation errors).

Codes

Grouped by HTTP status, then by specificity. Generic codes (BAD_REQUEST, UNAUTHORIZED, etc.) are the fallback when no more specific code applies — handle them as a safety net, match the specific codes first.

HTTPCodeDescription
400BAD_REQUESTThe request body or parameters are malformed. Generic 400 — fix the request and retry.
401UNAUTHORIZEDMissing or unrecognised credentials. Generic 401.
401API_KEY_MISSINGNo X-Bedrock-Key header was sent.
401API_KEY_INVALIDThe X-Bedrock-Key header does not resolve to a known firm key.
401API_KEY_REVOKEDThe key exists but has been revoked.
401TOKEN_INVALIDA JWT (NextAuth session token) failed verification.
403FORBIDDENCredentials are valid but the scope is insufficient. Generic 403.
403PLAN_INSUFFICIENTThe firm’s plan does not include the attempted operation (e.g. Principal-only on a Ledger-only subscription).
403VULNERABILITY_SPECIALIST_REQUIREDA reviewer without the FG21/1 specialist flag attempted to pick up a job carrying vulnerability flags. Only specialist or lead reviewers can handle flagged cases.
403SENIOR_SIGN_OFF_REQUIREDA reviewer without LEAD_REVIEWER or FIRM_ADMIN role attempted to complete a job flagged as requiring senior sign-off.
404NOT_FOUNDNo resource found for the given identifier. Generic 404.
404USER_NOT_FOUNDThe user ID or email does not exist inside the firm.
404ADMIN_NOT_FOUNDThe Bedrock staff account does not exist. Used by the admin app only.
404DOCUMENT_NOT_FOUNDThe uploaded advice document could not be read from storage. Upload the document first before submitting the job.
409CONFLICTThe request collides with current server state. Usually a uniqueness violation — see the message for which field.
409IMPACT_ASSESSMENT_REQUIREDPOST /v1/principal/jobs supplied a modelProvider/modelVersion with no matching APPROVED impact assessment on file. Applies only when the firm has the enforceImpactAssessments gate on (default).
422CHECKLIST_INCOMPLETEA reviewer attempted to submit a decision before completing all mandatory checklist items.
429RATE_LIMITEDPer-key rate limit exceeded. Honour the Retry-After header.
500INTERNAL_ERRORUnexpected server-side failure. Reported internally; see requestId in the response for correlation.
503CHAIN_INTEGRITY_FAILEDThe firm chain failed an integrity check; writes are paused until resolved.

Retry guidance

  • 4xx — fix the request and retry. Don't loop blindly.
  • 429 — sleep for the value of Retry-After, then retry.
  • 5xx — exponential backoff with jitter, capped at 1 minute, capped at 5 attempts.