Report a funnel-progress snapshot (GET-87)
Best-effort telemetry from the hosted-capture screen — powers “know when/where someone abandons a verification”. Same trust model as /captures//answers: the path’s token is the credential.
Sent via navigator.sendBeacon (so it can fire from an unload handler) or fetch with keepalive; beacons default to Content-Type: text/plain, which the server parses as JSON regardless.
Semantics: each call is the LATEST snapshot of the funnel — it OVERWRITES the previous one (not an event log). When kind: 'abandoned', the server additionally attempts to flip status to abandoned; the transition only applies from pending/partially_captured — on any other current status (including expired) the snapshot still lands and the call still succeeds, the transition is just silently skipped. A later capture on an abandoned verification resurrects it to partially_captured like any other.
Privacy: only the declared fields are ever stored; unknown extra keys are dropped silently, never a 400.
Returns: 204 — no body.
Authorizations
Possession of the verification id in the URL path (/v1/verifications/:token/...) authenticates the SPA capture flow. No header — the id is the credential. ULIDs are large enough that existence-by-id is not a meaningful leak. Used for POST /captures/upload-url, POST /captures, GET /v1/verify/:token.
Path Parameters
^vfy_[0-9A-HJKMNP-TV-Z]{26}$"vfy_01HXYZABCDEFGHJKMNPQRSTVWX"
Body
1 step_reached, camera_permission, abandoned landing, ready, capturing, reviewing, uploading, camera_blocked, success x >= 0x >= 0granted, denied, unavailable, unknown Response
Snapshot stored (and, when applicable, status flipped to abandoned).