KYC onboarding
End-to-end KYC using Liveness and Face Services.
You run a fintech. A new customer installs your app and taps Open account. Before you let them move money, you need to know three things:
- A real, live human is on the other side of the screen.
- Their face matches the government ID they uploaded.
- They haven't already registered under a different name.
This guide wires all three checks together using iLive's managed liveness sessions and v2 Face Services. Budget thirty minutes.
Architecture
The ID photo your customer uploads stays on your side. iLive only sees it
when you send it in a compare or index call; we do not retain images
by default beyond the scope of the operation.
Step 1 — Liveness verification
Create a managed session in passive mode. Passive is the right choice for onboarding: it's a three-second hold, and it still runs the full anti-spoof stack. Register a webhook so you don't have to poll.
Redirect the user to the returned session_url. When they finish, iLive
POSTs the verdict to your webhook:
See Webhooks for idempotency guidance.
Step 2 — Compare the verified face to the uploaded ID
The managed session yields an ICAO-compliant photo at
GET /api/v1/session/{id}/photo. Feed that (source) and the customer's
ID photo (target) to /api/v2/faces:compare:
A similarity above 0.65 is a solid match for onboarding. Below that,
queue the account for manual review rather than auto-rejecting — poor
lighting on the ID photo is the most common cause of false negatives.
Step 3 — Index the face
Once the applicant is verified and matched, store their face in a
per-tenant collection so you can search it later. Use your internal user
ID as external_face_id:
If the collection doesn't exist yet, create it once up front:
Step 4 — Detect duplicates
Before finalising the account, search the same collection to see if this face already belongs to another user:
Inspect the response:
- If every hit shares the new user's
external_face_id, you're just seeing the face you just indexed — proceed. - If any hit with a different
external_face_idscores higher than0.5, flag for review. That's a strong signal of a duplicate identity attempt.
See the Deduplication guide for thresholds tuned to your false-positive budget.
Pitfalls and tips
- Photo quality matters. Passive-mode responses include a
photo_quality_scorefrom 0–1; treat anything below0.6as a candidate for a retry rather than a hard compare. - Pick thresholds deliberately. The right similarity threshold
depends on your risk appetite and population. Start at
0.65for match and0.5for dedupe, then tune against manual-review outcomes. - Handle
retrygracefully. Aretryverdict means the session was inconclusive, not fraudulent. Offer the user one more attempt before escalating to manual review. - Store the
session_id. Keep it alongside the user record — it's the audit trail for the liveness check.
Related
- Liveness overview — confidence thresholds and verdict semantics.
- Rate limits — what the onboarding path costs against your quota.
- Face attributes — quality signals you can use to gate the compare step.
- Deduplication guide — tuning similarity cutoffs against a growing collection.