Skip to main content
When you’re verifying a live user — onboarding, KYC, step-up auth — don’t accept an image from the client and forward it yourself. A fraudster’s client can send anything. Verification sessions move capture into a trusted SDK and keep every decision server-side, so the only signal your logic ever acts on comes from SpoofSense, not from the user’s device.

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. Only status: "complete" and decision: "real" means verified. Everything else — "spoof", "failed", "expired", or anything relayed by the client — is not verified. See Results & Media.
The client’s “I’m done” callback is a hint, not proof — a tampered client can claim anything. The only trustworthy decision is the one your backend reads with the secret key.

Session Options

All fields on create are optional:

Session 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 the enforce 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.

Web SDK

React, vanilla JS, or a CDN script tag — camera capture in the browser

Android SDK

Native CameraX capture with Play Integrity signals

Hosted Page

Zero frontend code — redirect or embed our capture page