Skip to main content
Face biometrics are central to every User entity. Didit captures a face during liveness detection, generates a vector embedding, and stores it for four downstream features: 1:N face search, duplicate detection, blocklist enforcement, and biometric re-authentication.
Stored faces double as the reference for Biometric Authentication: create a biometric-auth session with the user’s vendor_data and omit portrait_image, and Didit reuses the stored face automatically (approved liveness face first, then the ePassport chip photo, then the ID document portrait, then a manually enrolled profile face).

How faces attach to a user

1

Captured during liveness

When a User goes through a session with liveness enabled, Didit captures a selfie, runs passive liveness detection, extracts the largest face, and generates a vector embedding for search.
2

Stored on the user profile

The face is linked to the session and the parent User entity. The portrait URL surfaces on the user profile as portrait_image.
3

Indexed for search

The embedding is added to the search index. Subsequent sessions can run 1:N searches against this index.

Face search (1:N)

Face search lets you find a user by uploading an image and matching it against every enrolled face in your application. Use-cases:
  • Duplicate detection at onboarding — prevent the same person from creating two accounts.
  • Reverse lookup — identify the user behind a CCTV frame or an image in a fraud investigation.
  • Repeat customer recognition — skip KYC for a returning customer.
Face search runs automatically during new sessions when your workflow has duplicate detection enabled. It is also exposed as a standalone API:

Duplicate detection

Every new face can be compared against existing enrolled faces to surface duplicates. Didit assigns each face an approved_duplicate_status: Workflows can be configured to:
  • Decline duplicate-flagged sessions automatically.
  • Flag for review — route to a human analyst.
  • Warn only — allow but add a risk tag.
Configure this in the console at Workflows → [your workflow] → Face Match / Liveness → Duplicate detection.

Face blocklist

When a session is declined (by rule, analyst, or workflow configuration), the associated face is automatically added to the Face Blocklist for your application. Future sessions with a matching face are rejected.

Upload an imported face to a User profile

If you are migrating from another KYC provider, you can create the User first and then attach a trusted face image to that profile. The User is still keyed by your vendor_data, but the face upload endpoint uses Didit’s internal User id (didit_internal_id) so the target is unambiguous.
1

Create or retrieve the User

Call POST /v3/users/create/ with your stable vendor_data, or call GET /v3/users/{vendor_data}/ if the User already exists.
2

Read didit_internal_id

The User response includes didit_internal_id. Keep using vendor_data in your own system; use didit_internal_id only for profile attachment endpoints.
Imported profile faces are enrolled into the same face index used for duplicate detection and face search. They are not automatically blocklisted. To block a known bad actor, upload the face to a face-type list instead.
Only upload faces you are allowed to process under your own privacy notice and migration agreement. Keep source-provider identifiers in metadata or comment only when they are safe to expose to your compliance operators.

How blocklisting happens

Uploading a face to the blocklist

To block a user by face programmatically, upload the face image to a face-type blocklist via the dedicated Upload face to list endpoint. Didit extracts the biometric embedding and inserts it into the matching index — any future session whose liveness selfie matches is auto-declined.
Profile face upload and face blocklist upload are different operations. Use profile upload to attach a trusted imported face to a User for evidence, duplicate detection, and face search. Use the Lists API to block a face so future matching sessions are rejected.

Removing a face from the blocklist

Remove the entry from the console at Blocklist → Faces → row actions → Remove, or use the Delete entry endpoint.

Retained biometric templates after session deletion

Deleting a session deletes the face image and, by default, the face embedding, so the person drops out of duplicate detection and Face Search. If you delete sessions soon after approval but still need to catch repeat sign-ups, enable biometric-template retention on the application, or send retain_face_embeddings: true on the delete call. Didit then deletes the session and all of its data as usual and keeps one separately managed, image-free face biometric template anchored to the User:
  • It contains the numeric face template plus retention metadata only. It never contains the face image, liveness video, document data, extracted identity fields, the decision, or the deleted session’s id.
  • It takes part in duplicate detection, Face Search, biometric authentication, and your face lists exactly like a live session face. Hits are reported with source: "retained_template", the User’s vendor_user_id and vendor_data, and a biometric_template_id.
  • It is biometric data with a finite expires_at. It is purged when the User is deleted, when any session of that User is deleted with deletion_instruction: "privacy_erasure", when it expires, or when you purge it in Lists → Biometric templates or through the Biometric Templates API.
  • A session created without vendor_data has no User to anchor a template to; deleting it reports ineligible_no_vendor_user and the embedding is deleted with the session.
  • Retained templates are never blocklisted. A face blocklist entry created from the deleted session keeps its own independent biometric entry and lifecycle.
Templates anchored to a User appear on the User profile under Biometric templates, with a purge action.

Face lifecycle summary

Upload a face from the console

Compliance operators can upload faces manually:
  1. Navigate to Users → [user] → Actions → Upload face.
  2. Select an image; Didit extracts the largest face and stores a new Face record linked to the user.
  3. The face is enrolled for profile evidence, duplicate detection, and face search. Use the Blocklist area when the goal is to reject future matching sessions.
This is useful when:
  • You have a known portrait of a customer verified through an offline channel.
  • You want to pre-seed a blocklist with known bad actors from your fraud database.

Privacy and retention

  • Face embeddings are numerical vectors, not images. Images themselves are stored in encrypted object storage with signed-URL access. A face embedding is biometric data.
  • Retention follows your application’s data retention policy. Retained biometric templates follow the stricter, finite biometric-template retention period.
  • Deleting a session deletes the image and, by default, the embedding. If your application has opted in to biometric-template retention, deleting a session keeps an image-free template until it expires or is purged.
  • For a GDPR / CCPA right-to-be-forgotten request, delete the person’s sessions with deletion_instruction: "privacy_erasure" or delete the User: both purge every retained template as well. Face blocklist entries you manage stay until you remove them.

Next steps

Face Search

How 1:N face search works.

Liveness

Liveness detection that captures the face.

Blocklist API

Upload a face to a blocklist.

Biometric templates

Templates retained after session deletion.

User blocklist

How blocklisting a user works.