Face biometrics SDK · v1.0
Face verification
you can actually ship.
Detection, matching, and liveness for Flutter and your backend. Runs on your infrastructure, with models you actually own.
flutter pub add facemetrical
Built on
What you get
Three things, done honestly.
Detection and matching that stay on the device.
On-device face detection and embeddings. 1:1 verification and 1:N identification, with permissively-licensed models. No surprise non-commercial weights buried in your build.
- 128-D embeddings
- 1:1 + 1:N
- Apache / MIT-clean weights

Randomized challenges, then passive detection.
Randomized blink, turn, and nod challenges on the device, backed by server-side presentation-attack detection. Each layer has a job, and we tell you exactly what it stops.
- Active blink / turn / nod
- Server-side PAD
- Honest per-layer limits

Your infra. Your data. No per-check toll.
The core runs on your infra, your data, your models — no per-check toll. Plug in a certified provider only when you need fraud-grade assurance.
- Self-hosted core
- No vendor lock-in
- Swap in certified PAD on demand
How the liveness works
Three layers, each honest about its limits.
Active challenges stop a printed photo. Passive detection stops a screen or replay. For money and identity, add a certified provider.

Active challenge
Stops a printed photo
Randomized blink, turn, and nod prompts on the device. A still image can't follow the prompt.
Passive PAD
Stops a screen or replay
Server-side presentation-attack detection flags screens, masks, and recorded playback.
Certified provider
Handles fraud-grade
Optional. Plug in a certified vendor when money and identity are on the line.
Integration
See the API shape before you commit.
One call on the device, one call on the server. Same verdict object: a match score, a liveness result, and a PAD signal. No SDK ceremony, no callback maze.
- Typed result: match · liveness · pad
- Same contract, Flutter and server
- Bring your own token and endpoint
1import 'package:facemetrical/facemetrical.dart';2 3final fm = Facemetrical();4 5// Detect, embed, and run a random active challenge.6final result = await fm.verify(7 image: frame,8 challenge: Challenge.random(), // blink · turn · nod9);10 11if (result.liveness.passed && result.match.score > 0.82) {12 print('verified');13}What's free vs paid
The core is yours. Certification is opt-in.
Everything you need to ship runs self-hosted, for free. Add a certified provider only when regulation or fraud risk demands it.
| Capability | Core SDKfree · self-hosted | Certified livenessbring your provider |
|---|---|---|
| Face detection & embeddings | ||
| 1:1 verification + 1:N identification | ||
| Active liveness (blink / turn / nod) | ||
| Passive presentation-attack detection | Built-in | Enhanced |
| Runs on your own infrastructure | Optional | |
| Per-check fee | None | Provider-priced |
| iBeta / ISO 30107 certification | — | |
| Fraud-grade assurance & SLA | — |
Get started
Ship face verification this week.
Read the docs or talk to us. The core is free, self-hosted, and honest about what it does.