Biometrics

Prembly's Biometrics channels answer a question that no registry lookup can: is the person presenting this identity the person it belongs to, and are they physically present?

A record lookup confirms that an identifier exists and returns the demographics attached to it. Biometrics binds that record to a live human being — comparing a submitted selfie against a registry photo or document portrait, and scoring whether the submitted image came from a real face rather than a printout, a screen, or a mask.


1. Three Surfaces

Biometrics is delivered through three surfaces. They differ most importantly in whether Prembly stores anything on your behalf.

SurfaceWhat it doesStores a face?
Stateless channelsCompare two images, or score whether one image came from a live personNo
Face-bound verificationPerforms a registry or document lookup and a face match in a single billed callNo
Face GalleryEnrols faces into your own private gallery, then authenticates (1:1) or identifies (1:N) against itYes, until you erase it

The first two are covered in Verification Channels; the third in Face Gallery.

Underneath them sit four primitives:

OperationWhat it answersWhere
Face Comparison (1:1)Are these two images the same person?image_comparison
Liveness DetectionWas this image captured from a live person?liveliness_check
Face-Bound VerificationDoes this registry or document record belong to the person in this selfie?bvn_w_face, nin_w_face, document_w_face
Gallery Search (1:N)Who, among the faces I have enrolled, is this?Face Gallery identify

2. Choosing a Surface

If you need to…Use
Confirm a returning user matches a reference photo you already holdimage_comparison
Prove a capture came from a live person, with no reference photoliveliness_check
Onboard a Nigerian customer against the banking registrybvn_w_face
Onboard a Nigerian customer against the national ID registrynin_w_face
Onboard in a market without registry access, or against a passportdocument_w_face
Re-authenticate a known customer repeatedly over timeFace Gallery enroll, then verify
Recognise someone who has not told you who they areFace Gallery identify

A typical onboarding flow chains two of these: run liveliness_check on the captured selfie to reject spoofs before spending a billed registry call, then pass the same image to bvn_w_face, nin_w_face, or document_w_face for the bound lookup.

If you expect to re-authenticate the same person later — a returning app login, a branch visit, a high-value transfer — enrol them into a gallery during onboarding. Every subsequent check is then a single verify call against a face you already trust, with no registry lookup to pay for.

To screen a face against prior fraud reports rather than against your own records, see the Fraud Lens guide.


3. Interpreting Scores

Biometric operations return scores rather than pass/fail verdicts, and the normalisation differs between them. Read the field, not the magnitude.

FieldRangeProduced by
confidenceVaries by channel — some 0–1, some 0–100Face comparison, face-bound channels, gallery verify
confidence_in_percentage0–100liveliness_check
similarity0–1Gallery identify, from the vector search

The gallery distinction catches people out: in an identify response, similarity is how close the search found a candidate, while confidence is the result of re-comparing that candidate against its enrolled image. They are different measurements on different scales, and the second is the one to trust. See Face Gallery.

Set thresholds against your own risk posture

There is no universal cut-off. A high-value lending flow and a low-value wallet top-up warrant different thresholds on the same channel. Before going live, run a sample of your real capture conditions through sandbox, plot the score distribution for known-good and known-bad pairs, and pick the threshold that lands your false-accept and false-reject rates where your risk team wants them.

Route borderline scores to manual review rather than auto-rejecting them. Biometric capture quality varies with lighting, camera hardware, and user behaviour, and a rejected genuine customer is a churn event.


4. Billing and Error Handling

Biometric operations are billed per call, and a face mismatch is a successful verification, not a failure. A call that returns "message": "No Match", or a gallery verify that returns is_match: false, has done its job and is billed accordingly. Only transport errors and rejected requests are not billed.

CodeMeaningRecommended Action
200Verification completed — read face_data, confidence, or is_match for the result.Apply your threshold and decide.
400Invalid request data — malformed base64, unsupported image format, unreachable URL, or a field failing its pattern.Validate the image client-side before submitting; surface a re-capture prompt.
401Invalid or missing API key.Check the X-API-Key header and that the key matches the environment.
402Insufficient wallet balance. Nothing was done or charged.Top up; see Billing.
422Image problem — no face detected, unreadable image, or a failed liveness check.Prompt for a re-capture.

Image payloads are substantially larger than the identifier-only channels. Set a generous client timeout, compress captures before encoding, and prefer URL submission over inline base64 for images above roughly 1 MB.


5. Capturing Images in Your App

You do not have to build the capture flow yourself. The Prembly SDK ships a hosted verification interface with face capture and liveness built in, including optional gesture-based liveness, and returns the result to your backend.

Reach for the API directly when you control the capture surface yourself and need the raw scores.

On this page

Prembly Slack Community

Join our developer Slack channel for real-time integration support, engineering updates, and direct Q&A with the Prembly team.

Join Slack Channel