Skip to main content

Error codes

Every failure is a problem+json body with a stable type URI. This page enumerates the ones you'll actually see.

type slugHTTPMeaningUsual fix
unauthenticated401No valid auth headerStart a session with a device key, then send the returned bearer token.
bad_header401Header shape wrongCheck for truncation or quoting.
scope_mismatch403Session bound to a different agentUse a token minted for the target agent.
not_found404Row or resource absent (or not visible to you)Confirm agent_id and IDs.
conflict409Unique constraint collisionUse the existing row or pick a different key.
quota_exceeded429postbox.send_quotas trippedWait for the window, or raise the tunable.
suppressed451Recipient is on postbox.outbound_suppressionsRemove the block after investigation.
quarantined451Inbound scored above injection thresholdReview body; promote manually if safe.
budget_exhausted402Budget hitRaise the budget or wait.
policy_denied403A guardrail or governorPreflight denied the actionAdjust the policy or the request.
chain_broken503Audit verifier saw a bad rowStop writes; page the on-call.
internal500UnhandledFile a report with the request id.

Response shape

{
"type": "https://ujex.dev/errors/scope_mismatch",
"title": "scope mismatch",
"status": 403,
"detail": "session bound to 'agent-hello' cannot act for 'agent-triage'",
"instance": "req_01hxyz..."
}

Always log instance — it matches the request_id tag in Firebase function logs.