The flow
1
Your backend creates a session
POST /v1/verification_sessions with your secret key. You choose the products and thresholds here, server-side — the client can never downgrade them. The response contains a single-use client token (sst_…), returned exactly once.2
The client captures and submits
Mount the Web SDK, launch the Android SDK, or use the hosted page with the client token. The SDK captures a frame from the live camera (no file uploads), attaches anti-injection signals, and submits it. The submit response is deliberately minimal — the client never sees scores or the decision, so it can’t be used as an oracle.
3
Your backend reads the result
When the client reports completion, fetch the session by id with your secret key and act on it. Treat anything other than
status: "complete" and decision: "real" as not verified. See Results & media.Session options
All fields on create are optional:Lifecycle
- 3 capture attempts per session — a blurry or faceless capture (
422) lets the user retry; see which errors consume an attempt. - Creating a session pre-checks your credit balance, so you never hand out a token that can’t succeed. The charge itself happens when a capture is scored.
- The
sst_token is stored hashed, expires with the session, and can never read decisions or media.
Injection protection
Presentation attacks (photos, screens) are caught by the models. Injection attacks — virtual cameras feeding a synthetic stream — can look perfectly genuine, so the SDKs collect integrity signals at capture time. Under theenforce policy (console setting), a high-confidence signal such as a known virtual-camera device forces decision: "spoof" even when the image itself scores as real. The client is never told this happened; the reason appears only on your server-side result read.