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 | This session lacks sufficient fresh, template-backed evidence for continuity assessment. |
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 | There is not enough fresh evidence to compare current activity with the session's operator baseline. |
operator_change.not_detected | No shift from the session baseline was detected. |
operator_change.uncertain | Reserved for an inconclusive change assessment. Current assessments use operator_change.insufficient_evidence when a comparison cannot be made. |
automation.detected | An indicator flagged timing or movement patterns consistent with automation or replay; this does not establish general bot detection. |
automation.insufficient_evidence | The evidence does not support an automation conclusion. Absence of an indicator is not proof of human origin. |
automation.not_detected | Reserved for an assessment with no detected automation indicator. Current assessments use automation.insufficient_evidence when no indicator fires; absence does not establish human origin. |
human_presence.unsupported | Derived interaction activity does not establish human presence or liveness. |
explicit_action_approval.confirmed | This exact request has approval from a completed bound challenge or an authorized manual review. Check the approval method and final decision. |
explicit_action_approval.not_present | No action-bound approval exists for this request. |
device_integrity.unsupported | Current assurance does not establish device integrity. |
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 | This assessment provides no assurance of agent-mandate validity. |
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 accepted evidence windows are available. |
coverage.partial | Accepted activity provides partial coverage below the sufficient category. The policy's required coverage is evaluated separately. |
coverage.sparse | Accepted activity is sparse in windows, active time, or observed modalities. The policy's required coverage is evaluated separately. |
coverage.sufficient | Accepted activity meets the sufficient coverage category. This does not by itself satisfy the policy's other requirements. |
freshness.stale | Fresh template-backed evidence is absent or too old for the applicable freshness requirement. |
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 | Automatic updates to the subject's Brainprint from new observations are disabled. Freezing does not delete an existing template or stop evidence collection. |
limitation.compromised_endpoint_not_detectable | A fully compromised device can fabricate evidence. |
limitation.enrollment_unanchored | Enrollment declared no anchor or only a customer-session anchor; GrayPass did not independently verify the original enrollee. |
limitation.experimental_assessment | Behavioral categories summarize observed patterns, not verified identity or calibrated accuracy. Apply the stated coverage, freshness and policy requirements. |
limitation.legacy_enrollment | This enrollment uses an earlier contract; re-enrollment may be required for current features. |
limitation.no_calibrated_confidence | Interpret claim statuses with their coverage, freshness and limitations, rather than as identity probabilities. |
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 | Explicit approval satisfied the evaluated policy. Inspect the approval method to distinguish a bound challenge from an authorized manual review. |
decision.deny_condition | A deny condition in the policy matched. |
decision.hold_condition | A hold condition in the policy matched. |
decision.insufficient_evidence | Required coverage, freshness, or continuity evidence is missing or insufficient. Follow the returned decision for the next step. |
decision.manual_review_approved | An authorized reviewer explicitly approved this exact held request; behavioral limitations remain unchanged. |
decision.manual_review_rejected | Reserved for rejection of an exact held request by an authorized reviewer. Current rejections are recorded in review state and the manually_rejected outcome rather than emitting this code. |
decision.manual_review_superseded | The review did not override a deny condition or attack indicator; no enforceable 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 | Reserved for an archived action. Current authorization requests for archived actions return error.action_not_registered. |
error.action_not_registered | No active registered action with this key is available in the environment; the action may be missing or archived. |
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 permitted for this action or request chain. |
error.challenge_expired | The challenge has expired or is no longer pending for this operation. Retrieve its current state before continuing. |
error.challenge_mismatch | The challenge or passkey ceremony could not be validated for the intended subject and request. Read the problem detail for the failed prerequisite or validation. |
error.commercial_access_unavailable | Confirm commercial access for this tenant and environment with GrayPass, then request fresh authorization for the pending operation. |
error.companion_unavailable | Optional companion evidence is unavailable. No comparison result was returned. |
error.context_invalid | A request field, context, or operation prerequisite is invalid. Read the problem detail to identify the required correction. |
error.enforcement_not_approved | The requested mode requires an eligible environment configuration. Retain the effective action mode and contact support with the environment and trace ID. |
error.environment_mismatch | The credential's environment does not match the resource. |
error.idempotency_conflict | The request conflicts with an existing operation or its current state, including reuse of an idempotency key with a different payload. Inspect the existing record before retrying. |
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 | The current action or policy state conflicts with this request or continuation. Retrieve the current state before starting a fresh authorization. |
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 | Obtain a valid proof before proceeding with this enforce-mode request. Keep the operation pending while you resolve the proof response. |
error.rate_limited | The caller reached the request rate limit for this operation. |
error.request_in_progress | Another request with this idempotency key is still being decided. |
error.request_stale | The request timestamp or evidence-window bounds are missing, invalid, or 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. |