liveCheck compares a live selfie against an ID photo and confirms a real person is present — blink or head-turn challenges, not just a static photo — then hands you the result. No customer data ever touches a disk or database.
One iframe or WebView, five steps, no server-side session store.
GET /widget?origin=<your origin> in an iframe or WebView.
The widget captures a photo of the user's ID document.
A signed, short-lived JWT assigns a random liveness action: blink, turn left, or turn right.
~5 seconds of webcam frames are captured while the user follows the instruction.
Liveness and face match run in memory; the result is posted back to the host page.
ID photos and selfie frames are decoded into memory, processed, and discarded when the request ends.
Random blink / head-turn prompts via MediaPipe FaceMesh, not a passive photo check.
Compares a face encoding from the ID photo against the best captured selfie frame (face_recognition / dlib).
Embed via <iframe> on the web, or load the same URL in a React Native / native WebView.
The only "session" is a signed, expiring JWT — there is no server-side session store to manage.
ALLOWED_ORIGINS and a frame-ancestors CSP control exactly who can embed the widget.
Get your origin allowlisted by the operator, then drop this in.
The same URL works in a React Native WebView or a native
iOS/Android WebView — the widget detects the runtime and posts the
result via both window.parent.postMessage and
window.ReactNativeWebView.postMessage automatically.
The response shape is the same everywhere:
Typed wrappers around the iframe/WebView + message-bridge boilerplate above — same result shape everywhere.
npm install livecheck-sdk
sdk/web — promise-based LiveCheckWidget, mounts the iframe and checks the sender origin for you.
.package(path: "sdk/ios")
sdk/ios — a LiveCheckView (Swift Package) wrapping the WKWebView + JS bridge.
include(":livecheck-sdk")
sdk/android — a LiveCheckView (Kotlin module) wrapping WebView + JS interface.
All three carry the same limitation as the raw integration: results arrive over a channel the client controls, so they're fine for UX gating but aren't a backend-verifiable receipt.
Start free, pay as you scale, or bring it fully in-house.
$0
up to 100 verifications
$35/month
1,000 verifications / month
$0.04 / face match
No monthly commitment. ~$0.33 per check when bundled into a full KYC identity workflow.
$5,000 – $10,000+
Dedicated mobile or web integration built around a custom neural network for your product.
Talk to sales
Fully self-hosted deployment on your own infrastructure for high-security requirements — no customer data ever leaves your servers.
Know the limits before you rely on this in production.
postMessage result is fine for UX gating
(unlocking a "Continue" button) but is not, on its own, a safe basis for
backend decisions like releasing funds — there is currently no signed,
backend-verifiable receipt. See
INTEGRATE.md for the full guidance.