Skip to main content
The challenge widget is the drop-in path. This is the backend-orchestrated path underneath it: your server mints a ceremony, hands the visitor its URL, and polls for the outcome. Heretic reports what it measured; where to place the challenge and how to act on the outcome is entirely your policy. All three endpoints take your secret key as a bearer token.

Mint a challenge

Unknown fields are rejected.
Send the visitor to url. The URL carries a page capability independent of the challenge id: knowing one grants nothing about the other.

Read the outcome

status is exactly pending, passed, contradicted, or not_completed. There is no “unsupported” state and no fallback route. A device that cannot or will not complete a step is not_completed, and step_reached names the step: motion-permission (motion access declined), motion-idle (no motion reported), tilt-timeout, rotate-timeout, evidence-measured (the measurement session could not be taken), and the passkey stops bytes-issued, ceremony, ceremony-excluded (credential already registered elsewhere), assertion-received. A challenge still pending at expires_at becomes not_completed on the next read. findings carry stable id and tier values under the same algebra as verdict signals: an absolute or composite finding sets contradicted on its own; a conditional finding is reported and never conclusive. Treat prose fields as prose. The ceremony holds the device to a signed measurement: the passkey challenge bytes are derived from the hash of the results the device submitted, so the signature covers the measurements. Results the signature does not cover are ceremony.results-unsigned, absolute. An assertion returned faster than a person can complete a passkey prompt is ceremony.instant-assertion, conditional.

Status codes

Challenges are incompatible with zero-data-retention sessions: the ceremony’s evidence must persist for the outcome to be provable.

Usage

Counts are for the current UTC calendar month. A probe is counted when the sensor opens a session for one of your sites; a challenge when a ceremony is minted, by this API or by the widget. limit is null on an unmetered plan. blocked is true only on a plan that stops at its limit: until the month turns, the sensor opens no sessions for your sites and no ceremony is minted. See pricing.