Skip to main content
GET
Read the outcome
Send Authorization: Bearer hrtc_sk_… from your backend. Read the challenge ID you saved when creating the challenge.
status is pending, passed, contradicted, or not_completed. account_ref repeats the reference your backend supplied. request_id is the original customer probe for a widget challenge, or null for a direct API challenge.

The devices

devices.ceremony is the phone that ran the ritual. devices.desktop is the computer that displayed the QR in a desktop hand-off. Devices are null before they have been measured. Ceremony identifiers are scoped to your tenant. Compare them only within the same identity.scope and identity.version. They use a different namespace from the collector’s site-key-scoped identifiers. Keep the original probe and ceremony records separately. Both identifier tiers are conditional. Equal inputs can produce equal identifiers on distinct devices. Deleting cookies or a passkey does not itself remove the measured inputs; changing those inputs can change the identifiers. Store matches as evidence for your signup policy. A ceremony device’s request ID belongs to the ceremony measurement. Its customer-readable record is this devices block. Use the top-level request_id to read the original customer probe through the verdict API.

What a pass means

A pass requires completed browser measurements, the recorded phone movement and workload, and a verified WebAuthn signature. No conclusive finding can contradict the ceremony. The visitor holds the phone level, keeps it steady during the workload, then holds it upright in landscape orientation. The signature binds the measurements to this challenge. The browser supplies the motion readings. WebAuthn verifies the origin, challenge, and user verification, but does not authenticate the motion sensor. Synthetic readings can satisfy the checks, and passkeys can sync between devices. A pass therefore does not establish a unique person or physical device. The rolling QR establishes a fresh hand-off. A code relayed within its freshness window can still arrive from another location. Network country is an address-range observation, not physical co-presence. A ceremony with observed concealment holds at path-concealed while status remains pending. The visitor can turn off the VPN or relay and retry within the original expiry. A passing ceremony has no detected concealment indicators; an undetected proxy remains possible. concealment.unchecked reports checks that did not run. First use requires two passkey prompts. The visitor creates a passkey, then confirms with it to sign the measurements. Later ceremonies for the same named account use one authentication prompt. Each prompt starts with a tap on Confirm, including inside an embedded widget.

Stops and findings

A pending ceremony expires as not_completed on the next read. Failed credential persistence cannot produce a pass. Probe findings from the required legs are included too. An absolute or composite contradiction is conclusive. A refused required leg ends as not_completed unless the ceremony also contains an invalid signed assertion.

Use the outcome once

A completed outcome remains readable for inspection. Bind it to the pending action and consume its ID once in your own database transaction. Reading passed twice must not create two accounts. See complete the write once.

Status codes

401 means missing or malformed authentication. 404 means an unknown key or a challenge outside your tenant. 429 includes retry-after. 503 means a required store failed; keep the action pending or reject it. When stable rendering was available, each device identity also includes rendering: { version: 1, hash: "<64 hex>", tier: "conditional" }. This hash is scoped to the challenge tenant. It cannot be compared directly with the same device’s site-scoped probe hash. The object is absent when either rendering output is missing or unstable.