Skip to content

Error codes

Every error SBO3L returns carries a domain code like policy.budget_exceeded. Codes are stable across patch releases; the human-readable message is not. Match on codes, not strings.

Code structure

Domain codes are dotted: <category>.<specific>.

CategoryWhat fires it
schema.*Request body schema validation
protocol.*HTTP-level protocol (auth, idempotency, rate limit)
policy.*Policy decision engine deny
budget.*Budget commit failures
auth.*Authentication / authorisation
audit.*Audit chain integrity
capsule.*Capsule strict-verifier failures
signer.*Signing-key operations

Schema

CodeHTTPWhen
schema.missing_field400required field absent
schema.unknown_field400unknown field present (deny_unknown_fields)
schema.type_mismatch400wrong type for a field
schema.value_out_of_range400numeric range exceeded

Protocol

CodeHTTPWhen
protocol.nonce_replay409APRP nonce already seen
protocol.idempotency_conflict409same Idempotency-Key, different body
protocol.payload_too_large413body > 100 KB
protocol.rate_limited429per-token rate limit exceeded

Auth

CodeHTTPWhen
auth.required401missing Authorization header
auth.invalid_token401malformed / unknown bearer token
auth.token_expired401JWT past exp
auth.scope_mismatch403token lacks the required scope

Policy

CodeHTTPWhen
policy.deny_unknown_provider200 + decision=denysponsor not registered
policy.expiry_in_past200 + decision=denyrequest expiry has passed
policy.risk_class_blocked200 + decision=denyoperator policy blocks risk class
policy.asset_unknown200 + decision=denyasset not in allowed list

Budget

CodeHTTPWhen
policy.budget_exceeded200 + decision=denyany scope insufficient
budget.scope_misconfigured500invalid scope in policy file

Audit

CodeHTTPWhen
audit.tamper_detectedn/a (CLI rc=1)strict verifier hash mismatch
audit.chain_gapn/a (CLI rc=2)missing event in expected sequence
audit.signature_invalidn/a (CLI rc=2)Ed25519 verification failed

Capsule

CodeCLI rcWhen
capsule.request_hash_mismatch2embedded request_hash ≠ recomputed
capsule.live_mode_empty_evidence2live_mode=true but no executor_evidence
capsule.deny_with_execution_ref2decision=deny but execution_ref present
capsule.snapshot_hash_mismatch2embedded snapshot hash ≠ recomputed

Signer

CodeHTTPWhen
signer.kms_unavailable503KMS endpoint down or returning 5xx
signer.key_rotated500configured key id no longer resolvable

See also