Search a face against every verified user in your population. Catch duplicate accounts, blocklisted faces, and fraud rings in sub-2 seconds. Free forever on every plan.
Catch repeat fraudsters across your user base. Free as part of the KYC bundle.
Vector index of biometric templates, sub-2-second match against millions.
How it works
From sign-up to verified user in four steps.
Step 01
Create the workflow
Pick the checks you want — ID, liveness, face match, sanctions, address, age, phone, email, custom questions. Drag them into a flow in the dashboard, or post the same flow to our API. Branch on conditions, run A/B tests, no code required.
Step 02
Integrate
Embed natively with our Web, iOS, Android, React Native, or Flutter SDK. Redirect to a hosted page. Or just send your user a link — by email, SMS, WhatsApp, anywhere. Pick what fits your stack.
Step 03
User goes through the flow
Didit hosts the camera, the lighting cues, the mobile hand-off, and accessibility. While the user is in the flow, we score 200+ fraud signals in real time and verify every field against authoritative data sources. Result in under two seconds.
Step 04
You receive the results
Real-time signed webhooks keep your database in sync the moment a user is approved, declined, or sent to review. Poll the API on demand. Or open the console to inspect every session, every signal, and manage cases your way.
Built for developers · Built against fraud · Open by design
Six capabilities. One feature flag. FACE_SEARCH.
Every capability below is a toggle on the same module. No upsell tiers, no separate SKUs, no add-on calls. Switch them on per workflow, or pass them inline when you call the standalone endpoint.
Face Search runs automatically every time a user completes a liveness check. Their face is compared against every previously verified user — duplicates surface as warnings, blocklisted faces auto-decline. No extra endpoint, no separate billing, no code path to integrate.
Search audit log
Auto-fired inside every Liveness check
Live
1,892
Searches today
4
Possible dup
1
Auto declined
Webhook fired · usr_4f01b8e · FACE_DUPLICATE3s ago
Nusr_8c02f41Liveness · 0 matchesClean
Lusr_4f01b8eLiveness · 1 match · 92%Match
Rusr_9a76d20Liveness · blocklist hitBlocked
02 · Watchlist & blocklist
Block a known fraudster the moment they try again.
Blocklist a face once and every future verification across every application gets checked against it. A match auto-declines the session — Didit enforces it regardless of your workflow settings. Add and remove blocklist entries through the API or directly in the console.
Watchlist match
FACE_IN_BLOCKLIST · auto-decline
Blocked
Live selfie
Blocklist
Similarity 96%
Face indexed in blocklist
Embedding match · 96%
FACE_IN_BLOCKLIST fired
Session auto-declined
03 · Sub-2s at scale
One million faces. Sub-2-second p99.
Vector index plus edge-served inference. Tested in production at one-million-face indexes with sub-2-second p99. Larger indexes available on Enterprise — same architecture, dedicated compute. No SDK to bundle, no model to download.
1:N ranked match
Reference vector · 1 of 1,000,000
6 matches
1M+
Index size
<2s
p99 inference
200ms
Model only
#1
94%
#2
88%
#3
81%
#4
76%
#5
62%
#6
48%
04 · Tunable thresholds
Strict for sign-up. Lenient for review.
Similarity threshold per application (default 70). Three documented bands — 90+ strong match, 70–89 possible match, below 70 different person — wire decline / review / approve per workflow. Toggle multi-face capture when your pipeline can legitimately see more than one person.
Risk policy
similarity_threshold · default 70
3 bands
Similarity bandAction
Strong match
Decline
Possible match
Review
Different person
Approve
Multiple faces off
Decline
05 · Free forever
Zero per-call fee. On every plan.
Face Search is unmetered on every Didit plan, automatically bundled into every liveness check, and the standalone endpoint costs nothing. No commit, no minimum, no enterprise paywall. Run 1:N defence against your entire population without spinning up a procurement cycle.
Billing
Unmetered · no commit
Free
Standalone face searchPOST /v3/face-search/
$0.00
Bundled inside LivenessAutomatic on every check
$0.00
Free monthly tierEvery account · forever
500
Platform feeNo minimum
$0
Usage · 18,402 searches · billed $0.00this month
06 · Privacy by design
Hashed templates. Signed-URL expiry. EU by default.
Your biometric index stores hashed face templates — never raw photos. Encrypted at rest. EU residency by default; specific-region or in-country on Enterprise. Match image URLs are signed and expire after 60 minutes — leaked links die fast. Aligned with GDPR and the EU AI Act out of the box.
Biometric index policy
EU-region · category-3 data
On
0
Raw photos
AES-256
At rest
60m
Signed URL
Hashed templates onlyOn
EU-region AWSeu-west
match_image_url expiry60 minutes
GDPR Art. 9 · AI ActAligned
Integrate
Two endpoints. Same JSON. Free either way.
Create a session when you want Face Search to run automatically inside every liveness check, or call the standalone endpoint to search a reference face on demand. Both return the same face_search report, both are free.
Standalone, on-demand, unmetered — every call free.docs →
Agent-ready integration
Ship Face Search 1:N in one prompt.
Paste the block below into Claude Code, Cursor, Codex, Devin, Aider, or Replit Agent. Fill in the my_stack placeholder with your framework, language, and use case. The agent provisions Didit, builds the workflow with Face Search enabled, wires the webhook, and ships.
didit-integration-prompt.md
# Didit Face Search 1:N — integrate in 5 minutes
You are integrating Didit's Face Search 1:N (one-to-many biometric search)
module into my_stack. Follow these steps exactly. Every URL, header, and
enum value below is canonical — do not paraphrase or "improve" them.
Face Search 1:N searches a reference face against your entire database of
previously verified users to detect duplicate accounts, blocklisted faces,
and fraud rings. Free forever on every plan — no per-call fee, no minimum.
## 1. Provision an account
- Sign up: https://business.didit.me (no credit card required).
- Or provision programmatically: POST https://apx.didit.me/auth/v2/programmatic/register/
(returns an API key bound to the workspace + application).
## 2. Two integration paths — pick one
### Path A — Workflow Builder (automatic, inside every liveness check)
Best when you want Face Search to run automatically every time a user
verifies. Face Search 1:N is automatically performed during liveness
checks in verification sessions to detect duplicate users and check
against blocklisted faces. No extra wiring needed.
1. Create a workflow that contains the LIVENESS feature:
POST https://verification.didit.me/v3/workflows/
Authorization header: x-api-key: your-api-key
Body: workflow_label, features array with the single entry
the JSON object containing feature equal to "LIVENESS"
(UPPERCASE — strict enum). Face Search runs automatically.
2. Create a verification session for an end user:
POST https://verification.didit.me/v3/session/
Body: workflow_id (from step 1), vendor_data (your own user id).
Response: session_url — redirect the user to it.
3. Listen for the session webhook (see "Webhooks" below). The face_search
block is included in the session report under decision.face_search.
### Path B — Standalone server-to-server API
Best when you want to search a face on demand — fraud investigation,
manual review tooling, watchlist scan, identity re-auth.
POST https://verification.didit.me/v3/face-search/
Content-Type: multipart/form-data
Body fields:
- image (required, file — single reference face)
- vendor_data (optional string, your search id)
- similarity_threshold (optional int 0-100, default 70)
- allow_multiple_faces (optional bool, default false)
Response: JSON report with matches array, similarity percentages,
blocklist flags, and the standard warnings array.
## 3. Webhooks (Path A only — Path B returns synchronously)
- Register a webhook destination once via
POST https://verification.didit.me/v3/webhook/destinations/
Body: url, subscribed_events: ["session.verified", "session.review_started",
"session.declined"]
- Response includes secret_shared_key — store it.
- Every webhook delivery carries an X-Signature-V2 header you MUST verify
before trusting the payload. HMAC-SHA256 verification MUST run against the raw body bytes (the raw payload as Didit sent it) BEFORE any JSON parsing — re-serialising the parsed body changes whitespace and key order, which invalidates the signature.Algorithm:
1. sortKeys(payload) recursively
2. shortenFloats (truncate trailing zeros after the decimal point)
3. JSON.stringify the result
4. HMAC-SHA256 with the secret_shared_key
5. Hex-encode, compare to the X-Signature-V2 header.
## 4. Reading the report (both paths return the same shape)
The face_search object includes:
- status: "Approved" | "Declined" | "In Review"
- total_matches: integer (0 when no match crossed the threshold)
- matches: array of match objects, each with:
- session_id UUID of the matching session
- session_number integer
- similarity_percentage number 0-100
- vendor_data your reference data from the original verification
- verification_date ISO 8601 timestamp
- user_details name, document_type, document_number (masked)
- match_image_url signed URL, expires in 60 minutes
- status "Approved" | "Declined" | "In Review"
- is_blocklisted boolean
- user_image:
- entities array (bbox, confidence, age, gender per detected face)
- best_angle (0 | 90 | 180 | 270) if rotate_image enabled
- warnings: Array of risk, log_type, short_description, long_description
Similarity bands documented:
90+ Strong match — very likely the same person
70 – 89 Possible match — may require manual review
Below 70 Likely different individuals
Auto-decline risks (always enforced by Didit, not configurable):
- NO_FACE_DETECTED no face in the reference image
- FACE_IN_BLOCKLIST the reference face matches your face blocklist
Configurable warning:
- MULTIPLE_FACES_DETECTED tune allow_multiple_faces per application
## 5. Hard rules — do not change
- Base URL for /v3/* endpoints is verification.didit.me (NOT apx.didit.me).
- Feature enum is UPPERCASE: FACE_SEARCH, LIVENESS, ID_VERIFICATION, FACE_MATCH.
- Auth header is x-api-key (lowercase, hyphenated).
- Webhook signature header is X-Signature-V2 (NOT X-Signature).
- Always verify webhook signatures before trusting payload data.
- Status casing matches exactly: "Approved", "Declined", "In Review"
(title-cased, space-separated).
- match_image_url is signed and expires after 60 minutes — do not cache it,
re-fetch from the session if you need it again.
## 6. Pricing reference (public)
- Face Search 1:N is FREE FOREVER on every Didit plan.
- No per-call fee for the standalone POST /v3/face-search/ endpoint.
- No surcharge when bundled inside a LIVENESS workflow.
- 500 free Didit verifications every month on top of that.
- Templates only — your biometric index stores hashed embeddings, never raw
photos. Encrypted at rest in EU-region AWS.
## 7. Verify your integration
- Sandbox starts on signup at https://business.didit.me — no separate flag.
- Test images: deterministic synthetic faces returned in sandbox (Approved
by default; trigger Declined by sending a known-blocklisted test face).
- Switch to live: flip the application's environment toggle in console.
When in doubt: https://docs.didit.me/core-technology/face-search/overview
Open a new country in one click. We do the hard work.
We open the local subsidiaries, secure the licenses, run the penetration tests, earn the certifications, and align with every new regulation. To ship verifications in a new country, flip a toggle. 220+ countries live, audited and pen-tested every quarter — the only identity provider an EU member-state government has formally called safer than in-person verification.
Faces per index, tested in production with sub-2s p99.
<0s
End-to-end inference per 1:N search.
0
Raw photos stored — hashed templates only, EU by default.
Three tiers, one price list
Start free. Pay per usage. Scale to Enterprise.
500 free verifications every month, forever. Pay-as-you-go for production. Custom contracts, data residency, and SLAs (Service Level Agreements) on Enterprise.
Free
Free
$0 / month. No credit card required.
Free KYC bundle (ID Verification + Passive Liveness + Face Match + Device & IP Analysis) — 500 / month, every month
Blocklisted Users
Duplicate Detection
200+ fraud signals on every session
Reusable KYC across the Didit network
Case Management Platform
Workflow Builder
Public docs, sandbox, SDKs, MCP (Model Context Protocol) server