Reference
Reason codes
Stable identifiers returned on assurance claims, decisions, evidence acknowledgements, and errors. Adding a code is a contract change; removing one requires a new API version. Match on the code, never on the human-readable text.
Claim statuses
Each Assurance Profile claim carries one of these statuses. Unsupported statuses are reported so a policy can never depend on a claim GrayPass does not make.
| Code | Meaning |
|---|---|
operator_continuity.insufficient_evidence | Not enough template-backed evidence in this session. |
operator_continuity.likely | Current behavior is consistent with the enrolled operator's Brainprint. |
operator_continuity.not_confirmed | Behavior diverged from the enrolled operator. |
operator_continuity.uncertain | Behavior is only partly consistent with the enrolled operator. |
operator_change.detected | The change detector flagged a shift from the session's own operator baseline. |
operator_change.insufficient_evidence | The change detector is not armed with enough fresh, identity-bearing baseline evidence. |
operator_change.not_detected | No shift from the session baseline was detected. |
operator_change.uncertain | The session was idle or too sparse to evaluate change. |
automation.detected | Interaction timing or kinematics matched scripted or replayed input. |
automation.insufficient_evidence | No calibrated automation conclusion is available from this evidence. |
automation.not_detected | No automation or replay indicator fired. |
human_presence.unsupported | Derived interaction activity does not establish human presence or liveness. |
explicit_action_approval.confirmed | An action-bound challenge was completed for this exact request. |
explicit_action_approval.not_present | No action-bound approval exists for this request. |
device_integrity.unsupported | No device attestation evidence is accepted in this deployment. |
identity_anchor_validity.unsupported | GrayPass did not verify the identity anchor declared at enrollment. |
personhood.unsupported | GrayPass does not assess personhood. |
agent_mandate_validity.unsupported | Agent mandates are not available. |
approval_method.manual_review | Approval used an attributed manual review; behavioral limitations remain in the profile. |
approval_method.passkey | Approval used a phishing-resistant WebAuthn passkey with user verification. |
approval_method.sandbox_confirm | Approval used a labeled sandbox-only confirmation, not a passkey. |
Coverage, freshness, and evidence
Coverage and freshness describe the evidence behind a claim. Evidence codes explain why a submitted window was not counted.
| Code | Meaning |
|---|---|
coverage.none | No evidence windows. |
coverage.partial | Some evidence, below the sufficient threshold. |
coverage.sparse | Fewer windows or active seconds than the policy minimum. |
coverage.sufficient | Enough evidence for the policy. |
freshness.stale | The newest template-backed evidence is older than the policy allows. |
evidence.rejected_quality | The evidence window failed integrity or quality checks and was not counted. |
evidence.rejected_replay | The evidence window repeated, overlapped, or predated already counted evidence and was not counted. |
evidence.rejected_unsigned | The evidence window carried no valid frame signature and was not counted. |
Limitations
Limitations travel with the profile and remain visible in the decision trace. A challenge never removes them.
| Code | Meaning |
|---|---|
limitation.adaptation_frozen | Template adaptation is disabled for this subject. |
limitation.compromised_endpoint_not_detectable | A fully compromised device can fabricate evidence. |
limitation.enrollment_unanchored | Enrollment relied only on the customer's session; the original enrollee was not independently verified. |
limitation.experimental_assessment | Behavioral claim statuses are experimental and are not approved for live enforcement. |
limitation.legacy_enrollment | The Brainprint was created under the frozen legacy contract. |
limitation.no_calibrated_confidence | No real-human calibration exists; confidence values are not emitted. |
limitation.single_modality | Only one behavioral modality contributed. |
Decision reasons
Every decision carries at least one reason code explaining which policy branch produced it.
| Code | Meaning |
|---|---|
decision.challenge_completed | A completed challenge satisfied the explicit approval requirement. |
decision.deny_condition | A deny condition in the policy matched. |
decision.hold_condition | A hold condition in the policy matched. |
decision.insufficient_evidence | Coverage or freshness below the policy minimum. |
decision.manual_review_approved | An authorized reviewer explicitly approved this exact held request; behavioral limitations remain unchanged. |
decision.manual_review_rejected | An authorized reviewer explicitly rejected this exact held request. |
decision.manual_review_superseded | An authorized reviewer approved this held request, but a policy deny condition or hard attack indicator was firing at approval time, so the evaluated decision stands and no enforcement proof was issued. |
decision.policy_satisfied | All policy requirements were met. |
decision.requirement_unmet | A required claim status was not reached. |
decision.session_missing | No active session for the subject. |
decision.shadow_mode | The action is in shadow mode; no enforceable proof was issued. |
decision.subject_revoked | The subject is revoked. |
decision.test_mode | The action is in test mode inside a sandbox environment. |
Errors
Errors are returned as RFC 9457 problem details with the code in the code field. See the troubleshooting guide for the usual causes.
| Code | Meaning |
|---|---|
error.action_archived | The action is archived. |
error.action_not_registered | The action key is not registered in this environment. |
error.audience_not_allowed | The audience is not permitted for this action. |
error.browser_credential_not_allowed | Browser credentials cannot perform this operation. |
error.caller_not_allowed | The authenticated credential is not registered for this action or request chain. |
error.challenge_expired | The challenge expired. |
error.challenge_mismatch | The challenge is bound to a different request. |
error.context_invalid | The context did not match the action's context schema. |
error.enforcement_not_approved | Live enforcement is blocked until a real-human validation and calibration release is approved. |
error.environment_mismatch | The credential's environment does not match the resource. |
error.idempotency_conflict | The idempotency key was reused with a different request. |
error.idempotency_stale | A stored idempotent result is no longer safe after subject, action, or policy state changed. |
error.nonce_reused | The nonce was already used in this environment. |
error.not_found | The resource does not exist in this environment. Returned identically for a resource owned by another tenant. |
error.policy_conflict | A concurrent policy change conflicted with this request. |
error.policy_inactive | The action has no active policy version. |
error.policy_integrity | Immutable policy content did not match its recorded digest. |
error.proof_unavailable | The signing service is unavailable; no proof was issued. |
error.rate_limited | The caller exceeded the bounded request rate for this surface. |
error.request_in_progress | Another request with this idempotency key is still being decided. |
error.request_stale | The authorization request timestamp is outside the accepted freshness window. |
error.subject_not_enrolled | The operation requires an enrolled subject and enrollment has not completed. |
error.subject_not_found | The subject does not exist in this environment. |
Generated from the API contract in contracts/ and the source in docs/. The build fails if this page disagrees with the running API.