For agents

Decisions, challenges, and review

Every successful authorization response contains exactly one of four decisions. An HTTP success confirms that the decision was computed. Select the application path using the decision, mode, proof, and account permissions.

Decision Meaning Safe application response
allow The active policy permits this bound request In enforce mode, verify and consume its proof before execution
challenge An action-bound approval step is required Keep the request pending and present the approved challenge
hold The operation needs review Pause execution and route to an attributed reviewer
deny The request is refused Do not execute; explain the permissible recovery path

The Assurance Profile and reason codes explain the decision. Use the authorization decision to select the next application step.

Passkey registration and confirmation

Before using a passkey challenge, your backend may create a one-time registration grant for its authenticated subject with createPasskeyRegistrationGrant(subjectId). Send that grant only through your authenticated application flow and call observer.registerPasskey(grant.token) in the browser. Authorize grant issuance through your account-recovery and reauthentication rules for the signed-in subject.

For a returned challenge, obtain the saved pending intent from your authenticated backend along with the challenge ID. Present that immutable intent alongside the browser SDK's challenge details in an explicit confirmation callback:

TypeScript
const receipt = await observer.completeChallenge(challenge.id, {
  confirm: async (details) => {
    return showAndConfirmExactAction({
      intent: pendingIntent, // Saved by the backend for this pending request.
      assurance: details.display,
    });
  },
});

showAndConfirmExactAction is your application's accessible confirmation UI. GrayPass's details.display contains action and consequence information, audience, and resource/context digests. Display it alongside the exact destination and intent fields saved by your backend for that pending request. Use the immutable saved values throughout confirmation. Clearly name the operation and provide explicit confirm and cancel controls.

The browser receives a completion receipt identifying the resulting authorization. Your backend must fetch that authorization, associate it with the original pending request, and perform proof verification. Use the verified authorization and proof to determine execution. See Integration.

Sandbox confirmation

sandbox_confirm is a labeled integration-test method available only in sandbox when permitted by policy. Use it to simulate the confirmation step in an integration test. Use a passkey ceremony for authenticator-backed approval. To show a confirmation screen for this method, first fetch observer.challengeDetails(id) and display the backend’s saved intent. Only after the user confirms should you call observer.completeChallenge(id, { method: 'sandbox_confirm' }). This method uses your preceding confirmation UI; the confirm callback belongs to the passkey path.

Use Capabilities to check the supported challenge methods for your integration.

Expiry, cancellation, and changed requests

Challenges expire; the response includes expires_at. Treat cancellation, expiry, unavailable credentials, and failed ceremonies as non-execution. Request fresh authorization when necessary. If the user changes the business request, create a new logical request and authorization. Do not resume the old challenge with new parameters.

The challenge reruns the original authorization with the relevant detector and policy conditions preserved. Inspect the resulting child decision, including any continuing hold.

Manual review

A hold can be reviewed in Console Activity by a security reviewer, administrator, or owner. For API-based review, use an admin credential. The review operation records an attributed approve or reject resolution and may produce a child authorization. Fetch that child and apply the same independently stored action binding and proof requirements before execution. Preserve the original subject, account, resource, and destination throughout review.

Your organization must define who can review, what evidence the reviewer sees, when another channel of confirmation is required, and how conflicts of interest are handled. GrayPass records the attributed review decision; your review process establishes the supporting evidence and decision criteria.

Outcomes and user messages

Tell the person what happened in operational language: approved, verify again, paused for review, or blocked. Avoid displaying numeric identity certainty. Offer a route to support or your account recovery process when applicable.

Report what actually happened using the outcome API. If your business system did not execute despite an allow, report not_executed. If a reviewer or customer used a separate authorized override process, use the relevant attributed outcome. If the final result is uncertain, reconcile the operation before assigning a terminal outcome.