Mint a challenge
Unknown fields are rejected.
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
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.