Verify that a selfie and a document photo belong to the same person via a single API call
POST /api/kyc/validations): Full flow with hosted URL, live selfie, liveness, and document capture. Best for onboarding and regulated flows.POST /api/kyc/face-match): You send two base64 images; you get back match + score. Best for validating document + selfie you already have (e.g. from your own app).data:image/...;base64, prefix. Formats: JPEG, PNG, WebP, TIFF. Max 5MB per image.documentImage.| Field | Type | Description |
|---|---|---|
match | boolean | Whether the faces were considered a match (score ≥ threshold). |
score | number | Similarity score 0–100. |
status | string | "approved" | "declined" | "in_review". |
verificationId | string | ID of the audit record in face_match_verifications (for support and listing). |
scoreDeclineThreshold | number | The threshold (0–100) that was used for this verification (from org settings). |
requestId | string (optional) | Internal request ID (for support). |
warnings | string[] (optional) | Warnings from the verification. |
| Code | HTTP | Meaning |
|---|---|---|
NOT_CONFIGURED | 403 | Face Match credentials not set in organization KYC settings. |
NOT_ENABLED | 403 | Face Match integration is not enabled for this organization. |
INVALID_REQUEST | 400 | Invalid or missing images (e.g. format/size). |
UNAUTHORIZED | 401 | Invalid or missing API/verification credentials. |
QUOTA_EXCEEDED | 403 | Verification could not be completed (e.g. quota/credits). |
SERVICE_UNAVAILABLE | 503 | Verification service temporarily unavailable. |
VERIFICATION_FAILED | 500 | Generic failure; retry or try other images. |
face_match_verifications for audit and compliance. The response includes verificationId (the audit record ID). Each stored record also saves the threshold that was used at the time of the call (so you can show it in history even if the org threshold changes later).
| Parameter | Type | Description |
|---|---|---|
entityId | string (UUID) | Optional. Filter by person entity. |
status | string | Optional. Filter by status (approved, declined, in_review, failed). |
limit | number | Max items (default 50, max 100). |
offset | number | Pagination offset. |
{ "verifications": [ ... ], "scoreDeclineThreshold": 30, "pagination": { "limit", "offset", "total" } }. Each verification includes id, entityId, status, match, score, threshold (the value used for that run), createdAt, and optional image paths for audit.
verificationId (returned in the POST response or in the list).
id — UUID of the verification (same as verificationId from the POST or list).
Response (200): One verification object with the same fields as each item in the list: id, organizationId, entityId, status, match, score, requestId, vendorData, errorMessage, triggeredByUserId, createdAt, documentStoragePath, selfieStoragePath, storageProvider, threshold.
Errors: 404 NOT_FOUND if the ID does not exist or belongs to another organization; 401 UNAUTHORIZED if not authenticated.
kyc_validations record, sends the user to a hosted URL, and updates status via webhooks. The stored decision includes document, liveness, and face match from the live session.face_match_verifications and returns the result in the same request. It does not create a kyc_validations record. Use it when you need a one-off check (e.g. “are these two images the same person?”) without a hosted session.