Skip to main content
All errors use standard HTTP status codes and a consistent JSON body:
Some responses add extra top-level fields. For example, a rate-limited evaluate or verify call carries retry_after_ms:
Previous error shape removed. The { error: { code, details } } nested envelope and the bare { code, details } shape are no longer returned by any endpoint. All error paths use { error, message, status }.
A policy denial is not an HTTP error. When /v1/evaluate reaches a deny, hold, or escalate decision, it returns HTTP 200 with the decision, deny_code, and deny_reason in the body — see Deny codes. Likewise, /v1-verify-permit reports an expired, revoked, already-consumed, or mismatched permit in its response body (valid: false with a verify_error_code such as PERMIT_EXPIRED or PERMIT_ALREADY_USED). In both cases the protected action must not run.

Code reference

Fail-closed rule

If you get 5xx or a network error from /v1/evaluate, your agent must treat the call as deny — never as “allow by default.” This is non-negotiable for regulated deployments.

Handling in the SDKs