---
title: "Complete explicit action confirmation"
method: POST
path: "/api/v1/challenges/{challenge_id}/complete"
tags: ["canonical"]
---

# Complete explicit action confirmation

`POST /api/v1/challenges/{challenge_id}/complete`

## Request

- Base URL: `https://app.graypass.org` (the document declares no server; this is the origin it was published from)
- URL: `https://app.graypass.org/api/v1/challenges/{challenge_id}/complete`
- Auth: HTTP bearer

Verify an offered challenge method and reevaluate the immutable original request into a child authorization.

## Path parameters

- `challenge_id` string, required

## Request body

- ChallengeCompleteRequest: Complete an action-bound challenge using one of its permitted methods.
  - `assertion` object, nullable: WebAuthn authentication assertion produced for this challenge’s options when method is passkey. Omit for sandbox_confirm.
  - `method` 'passkey' | 'sandbox_confirm', required: Chosen challenge method; use only a method offered by this challenge.

## Response `200`

Scoped browser callers receive ChallengeCompletionReceipt; server callers receive AuthorizeResponse.

- union
  - AuthorizeResponse: Immediate policy result. Only an enforce-mode allow can include a compact Proof of Agency.
    - `action` string, required: Registered action key, such as payout.destination.change.
    - `action_hash` string, required: SHA-256 digest binding the canonical authorization material. Compare it with the hash computed from the original server-held request.
    - `assurance` AssuranceProfile, required: Server assessment of available evidence for one subject and session. It contains no calibrated confidence score.
      - `active_seconds` number: Duration of accepted active evidence in seconds.
      - `assessed_at` string, required: Assessment time as an ISO 8601 timestamp.
      - `claims` AssuranceClaim[], required: Individual assurance claims with their own status and limitations.
        - `claim` string, required: Claim name, such as operator_continuity or human_presence. Capability availability is separately reported by metadata.
        - `coverage` 'none' | 'sparse' | 'partial' | 'sufficient', required: Evidence-coverage category: none, sparse, partial or sufficient. Describes the amount and variety of accepted evidence.
        - `evidence_refs` string[]: Opaque references to the evidence supporting this claim.
        - `freshness_ms` integer, nullable: Age of the relevant evidence in milliseconds; null when freshness cannot be established.
        - `limitations` string[]: Applicable limitations that must accompany interpretation of the result.
        - `reason_codes` string[]: Stable reason identifiers explaining acceptance, limitations or a decision; resolve them in the reason-code catalog.
        - `status` 'confirmed' | 'likely' | 'uncertain' | 'not_confirmed' | 'detected' | 'not_detected' | 'not_present' | 'insufficient_evidence' | 'unsupported', required: Permitted statuses for a named assurance claim. Read the status with the claim definition, coverage, freshness, and assessment context.
      - `coverage` 'none' | 'sparse' | 'partial' | 'sufficient', required: Evidence-coverage category: none, sparse, partial or sufficient. Describes the amount and variety of accepted evidence.
      - `evidence_windows` integer: Number of accepted, non-overlapping evidence windows accounted for in this session or profile.
      - `feature_schema_version` string, required: Version identifier for the feature representation used by the session or assessment.
      - `freshness_ms` integer, nullable: Age of the relevant evidence in milliseconds; null when freshness cannot be established.
      - `id` string, required: Identifier of this record. Treat it as opaque and retain it for subsequent operations.
      - `insufficient_evidence` boolean, required: True when evidence is insufficient for the assessment’s supported claims.
      - `limitations` string[]: Applicable limitations that must accompany interpretation of the result.
      - `modalities_present` string[]: Names of observed evidence modalities included in coverage accounting.
      - `model_version` string, required: Version identifier for the model used in this assessment. Retain it when comparing assessment results.
      - `rule_version` string, required: Version identifier for the assurance rules used in this assessment.
      - `session` string, nullable: Observation or enrollment session identifier, as required by the operation.
      - `subject` string, required: Pseudonymous subject identifier in the authenticated tenant and environment.
    - `challenge` ChallengeDescriptor: Challenge offered by an authorization decision, including methods and expiry.
      - `expires_at` string, required: Expiry time as an ISO 8601 timestamp. Use the capability before this time; obtain a fresh one afterward.
      - `id` string, required: Identifier of this record. Treat it as opaque and retain it for subsequent operations.
      - `methods` string[], required: Permitted challenge methods. sandbox_confirm is a simulated ceremony restricted to the sandbox.
    - `decided_at` string, required: Decision time as an ISO 8601 timestamp.
    - `decision` 'allow' | 'challenge' | 'hold' | 'deny', required: Policy result: allow, challenge, hold or deny. Inspect mode and proof requirements before performing any business mutation.
    - `environment` string, required: Environment identifier that scopes this record; sandbox and live resources are separate.
    - `human_readable` HumanReadable, required: Customer-display wording explaining a decision; stable reason codes carry the programmatic meaning.
      - `detail` string, required: Human-readable explanation. Use stable codes and typed decision fields for application branching.
      - `status` string, required: Short display label for the decision; use reason codes for stable programmatic behavior.
    - `id` string, required: Identifier of this record. Treat it as opaque and retain it for subsequent operations.
    - `latency_ms` integer, required: Server-recorded decision latency in milliseconds.
    - `mode` 'test' | 'shadow' | 'enforce', required: Action evaluation mode. Test and shadow return decisions without enforceable proofs. An eligible enforce-mode allow can carry a proof.
    - `policy_version` integer, required: Immutable policy version number evaluated for this decision.
    - `proof` string, nullable: Compact signed JWS, or null. Require enforce-mode allow, trusted binding checks and successful online consumption before execution.
    - `proof_id` string, nullable: Proof identifier (jti), or null when no proof was issued.
    - `reason_codes` string[], required: Stable reason identifiers explaining acceptance, limitations or a decision; resolve them in the reason-code catalog.
    - `trace_id` string, required: Identifier to retain for authorization trace lookup and operational diagnosis.
  - ChallengeCompletionReceipt: Browser-safe completion receipt. The backend must retrieve and validate the referenced child authorization.
    - `authorization` string, required: Authorization identifier associated with this receipt. Resolve it on the backend and verify the bound proof before execution.
    - `challenge` string, required: Completed challenge identifier.
    - `method` 'passkey' | 'sandbox_confirm', required: Chosen challenge method; use only a method offered by this challenge.
    - `status` 'completed', required: Lifecycle state of this record; use the operation-specific values listed in the schema.

## Other responses

- `422`: The canonical handler returns a Problem for invalid input; correct the request before retrying.

---

[API](https://skmtc.dev/graypass/apis/graypass-api.md) - [All operations](https://skmtc.dev/graypass/apis/graypass-api/llms.txt) - [OpenAPI document](https://skmtc.dev/graypass/apis/graypass-api/revisions/5f9ab64fdfdb?raw)
