KYC · API reference
Face workflows
Identity Verification
/v1/identity/verifyidentity.verifyOne call that runs liveness, a quality gate and a 1:1 match against your reference face, and returns each step plus a single verified verdict.
**Returns**
- verified: true only if live, quality passed and the faces matched
- live / qualityOk / similarity: each step's own result
- steps: the full detail of liveness, quality and match
**Limits**
- Match threshold 0 to 1. Pass the ID portrait from Document Portrait as the reference.
Price: 0.42 credits per successful call.
Body parameters
selfiestringrequiredSelfie. The image as base64 (JPEG or PNG). The SDKs also take a file path or the file bytes.
referencestringrequiredReference face. For example the portrait from the ID document. The image as base64 (JPEG or PNG). The SDKs also take a file path or the file bytes.
minQualityarray of stringsQuality checks.
thresholdnumberThreshold. Match threshold.
tagstringTag. Any text you want echoed back in the response.
Returns
The check ran.
Show the IdentityVerifyResponse fieldsHide fields
okbooleanrequiredtrue: the result is in
data.request_idstringlatency_msnumberHow long the check took, in milliseconds.
dataobjectrequiredThe answer of Identity Verification.
Show 9 fieldsHide fields
codenumbermsgstringverifiedbooleanlivebooleanqualityOkbooleansimilaritynumberstepsobjectShow 3 fieldsHide fields
livenessobjectShow 3 fieldsHide fields
livebooleanstatusnumberreasonCodenumber
qualityobjectShow 3 fieldsHide fields
okbooleanfailedarray of stringscheckedarray of strings
matchobjectShow 4 fieldsHide fields
similaritynumberscorenumbermatchbooleanthresholdnumber
elapsedTimenumbermetadataobjectShow 2 fieldsHide fields
serverTimestringctxobjectShow 1 fieldsHide fields
userIpstring
warningsarray of stringserroranyEmpty on success.
Errors
400A field is missing or not valid.401No API key, or the key is not valid, expired or revoked.402Not enough credits for this call (insufficient_credits), or the key reached its spend cap. Nothing was charged.403The key may not call this API (permission, environment or IP allow-list). Nothing was charged.413The image or the request is too large.429Too many requests for this key: waitRetry-Afterseconds. Nothing was charged.5XXThe check could not run. Nothing was charged.
curl -X POST https://verisec.dev/v1/identity/verify \
-H "Authorization: Bearer $VERISEC_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"selfie": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPhfDwAChwGA60e6kgAAAABJRU5ErkJggg==",
"reference": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPhfDwAChwGA60e6kgAAAABJRU5ErkJggg==",
"minQuality": [
"BlurLevel",
"OffGaze"
],
"threshold": 0.8
}'{
"ok": true,
"request_id": "req_fc01263073ba4975bd08",
"latency_ms": 3876,
"data": {
"code": 0,
"msg": "OK",
"verified": false,
"live": false,
"qualityOk": false,
"similarity": 0.9983906745910645,
"steps": {
"liveness": {
"live": false,
"status": 1,
"reasonCode": 244
},
"quality": {
"ok": false,
"failed": [
"BlurLevel"
],
"checked": [
"BlurLevel",
"OffGaze"
]
},
"match": {
"similarity": 0.9983906745910645,
"score": 0.23992152512073517,
"match": true,
"threshold": 0.8
}
},
"elapsedTime": 3.876,
"metadata": {
"serverTime": "2026-10-05T05:35:49.270Z",
"ctx": {
"userIp": "203.0.113.7"
}
}
},
"warnings": [],
"error": null
}Face Login
/v1/auth/loginfaceLogin.authenticatePasswordless login: a live selfie searched against your enrolled users. Authenticated only when the face is live and matches someone above the threshold.
**Returns**
- authenticated: true if live and matched
- userId: who it matched, or null
- similarity: the best similarity
- live: the liveness result
**Limits**
- 1 to 10 enrolled users.
Price: 0.5 credits per successful call.
Body parameters
selfiestringrequiredSelfie. The image as base64 (JPEG or PNG). The SDKs also take a file path or the file bytes.
galleryarray of objectsrequiredEnrolled users. 1 to 10 faces, each with your own id.
Show 2 fieldsHide fields
imagestringrequiredThe image as base64 (JPEG or PNG). The SDKs also take a file path or the file bytes.
idstringYour id for this face (the SDKs fill in face-1, face-2, ... when left out).
thresholdnumberThreshold. Login at or above this similarity.
tagstringTag. Any text you want echoed back in the response.
Returns
The check ran.
Show the FaceLoginAuthenticateResponse fieldsHide fields
okbooleanrequiredtrue: the result is in
data.request_idstringlatency_msnumberHow long the check took, in milliseconds.
dataobjectrequiredThe answer of Face Login.
Show 8 fieldsHide fields
codenumbermsgstringauthenticatedbooleanuserIdanysimilaritynumberlivebooleanelapsedTimenumbermetadataobjectShow 2 fieldsHide fields
serverTimestringctxobjectShow 1 fieldsHide fields
userIpstring
warningsarray of stringserroranyEmpty on success.
Errors
400A field is missing or not valid.401No API key, or the key is not valid, expired or revoked.402Not enough credits for this call (insufficient_credits), or the key reached its spend cap. Nothing was charged.403The key may not call this API (permission, environment or IP allow-list). Nothing was charged.413The image or the request is too large.429Too many requests for this key: waitRetry-Afterseconds. Nothing was charged.5XXThe check could not run. Nothing was charged.
curl -X POST https://verisec.dev/v1/auth/login \
-H "Authorization: Bearer $VERISEC_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"selfie": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPhfDwAChwGA60e6kgAAAABJRU5ErkJggg==",
"gallery": [
{
"image": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPhfDwAChwGA60e6kgAAAABJRU5ErkJggg==",
"id": "face-1"
}
],
"threshold": 0.8
}'{
"ok": true,
"request_id": "req_435e3880ed8749ab9f25",
"latency_ms": 5955,
"data": {
"code": 0,
"msg": "OK",
"authenticated": false,
"userId": null,
"similarity": 0.9983906745910645,
"live": false,
"elapsedTime": 5.956,
"metadata": {
"serverTime": "2026-10-05T05:35:55.737Z",
"ctx": {
"userIp": "203.0.113.7"
}
}
},
"warnings": [],
"error": null
}Sign-up Fraud Check
/v1/fraud/signup-checkfraud.signupCheckAt sign-up: is the face live, and has it signed up before? Blocks a duplicate (similarity 0.8+) or a non-live face.
**Returns**
- allow: true only if live and not a duplicate
- reason: duplicate, not_live, or null
- matchedId: the duplicate's id, if any
- live: the liveness result
**Limits**
- 1 to 10 existing users.
Price: 0.5 credits per successful call.
Body parameters
selfiestringrequiredSelfie. The image as base64 (JPEG or PNG). The SDKs also take a file path or the file bytes.
existingarray of objectsrequiredExisting users. 1 to 10 faces, each with your own id.
Show 2 fieldsHide fields
imagestringrequiredThe image as base64 (JPEG or PNG). The SDKs also take a file path or the file bytes.
idstringYour id for this face (the SDKs fill in face-1, face-2, ... when left out).
tagstringTag. Any text you want echoed back in the response.
Returns
The check ran.
Show the FraudSignupCheckResponse fieldsHide fields
okbooleanrequiredtrue: the result is in
data.request_idstringlatency_msnumberHow long the check took, in milliseconds.
dataobjectrequiredThe answer of Sign-up Fraud Check.
Show 8 fieldsHide fields
codenumbermsgstringallowbooleanreasonstringmatchedIdstringlivebooleanelapsedTimenumbermetadataobjectShow 2 fieldsHide fields
serverTimestringctxobjectShow 1 fieldsHide fields
userIpstring
warningsarray of stringserroranyEmpty on success.
Errors
400A field is missing or not valid.401No API key, or the key is not valid, expired or revoked.402Not enough credits for this call (insufficient_credits), or the key reached its spend cap. Nothing was charged.403The key may not call this API (permission, environment or IP allow-list). Nothing was charged.413The image or the request is too large.429Too many requests for this key: waitRetry-Afterseconds. Nothing was charged.5XXThe check could not run. Nothing was charged.
curl -X POST https://verisec.dev/v1/fraud/signup-check \
-H "Authorization: Bearer $VERISEC_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"selfie": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPhfDwAChwGA60e6kgAAAABJRU5ErkJggg==",
"existing": [
{
"image": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPhfDwAChwGA60e6kgAAAABJRU5ErkJggg==",
"id": "face-1"
}
]
}'{
"ok": true,
"request_id": "req_620d02ed48054f388f2c",
"latency_ms": 6459,
"data": {
"code": 0,
"msg": "OK",
"allow": false,
"reason": "duplicate",
"matchedId": "u1",
"live": false,
"elapsedTime": 6.46,
"metadata": {
"serverTime": "2026-10-05T05:36:03.854Z",
"ctx": {
"userIp": "203.0.113.7"
}
}
},
"warnings": [],
"error": null
}Proctoring Check
/v1/proctor/checkproctor.checkOne webcam frame judged for exam proctoring: live, exactly one face, looking at the screen, and no mask.
**Returns**
- ok: true when all four conditions hold
- live / faceCount / lookingAway / maskWorn: each condition
- offGaze: the gaze-off-camera value
Price: 0.26 credits per successful call.
Body parameters
framestringrequiredWebcam frame. The image as base64 (JPEG or PNG). The SDKs also take a file path or the file bytes.
tagstringTag. Any text you want echoed back in the response.
Returns
The check ran.
Show the ProctorCheckResponse fieldsHide fields
okbooleanrequiredtrue: the result is in
data.request_idstringlatency_msnumberHow long the check took, in milliseconds.
dataobjectrequiredThe answer of Proctoring Check.
Show 10 fieldsHide fields
codenumbermsgstringokbooleanlivebooleanfaceCountnumberoffGazenumberlookingAwaybooleanmaskWornbooleanelapsedTimenumbermetadataobjectShow 2 fieldsHide fields
serverTimestringctxobjectShow 1 fieldsHide fields
userIpstring
warningsarray of stringserroranyEmpty on success.
Errors
400A field is missing or not valid.401No API key, or the key is not valid, expired or revoked.402Not enough credits for this call (insufficient_credits), or the key reached its spend cap. Nothing was charged.403The key may not call this API (permission, environment or IP allow-list). Nothing was charged.413The image or the request is too large.429Too many requests for this key: waitRetry-Afterseconds. Nothing was charged.5XXThe check could not run. Nothing was charged.
curl -X POST https://verisec.dev/v1/proctor/check \
-H "Authorization: Bearer $VERISEC_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"frame": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPhfDwAChwGA60e6kgAAAABJRU5ErkJggg=="
}'{
"ok": true,
"request_id": "req_5500b8375080404eb849",
"latency_ms": 3782,
"data": {
"code": 0,
"msg": "OK",
"ok": false,
"live": false,
"faceCount": 1,
"offGaze": 0.16723337769508362,
"lookingAway": false,
"maskWorn": false,
"elapsedTime": 3.783,
"metadata": {
"serverTime": "2026-10-05T05:36:04.807Z",
"ctx": {
"userIp": "203.0.113.7"
}
}
},
"warnings": [],
"error": null
}Age-gated Checkout
/v1/age-gate/checkoutageGate.checkoutAge and liveness together for an age-restricted sale: allowed only when old enough and live.
**Returns**
- allowed: true only if old enough and live
- age: the estimated band
- live: the liveness result
**Limits**
- Minimum age 0 to 120.
Price: 0.25 credits per successful call.
Body parameters
selfiestringrequiredSelfie. The image as base64 (JPEG or PNG). The SDKs also take a file path or the file bytes.
minAgeintegerMinimum age.
tagstringTag. Any text you want echoed back in the response.
Returns
The check ran.
Show the AgeGateCheckoutResponse fieldsHide fields
okbooleanrequiredtrue: the result is in
data.request_idstringlatency_msnumberHow long the check took, in milliseconds.
dataobjectrequiredThe answer of Age-gated Checkout.
Show 7 fieldsHide fields
codenumbermsgstringallowedbooleanagearray of numberslivebooleanelapsedTimenumbermetadataobjectShow 2 fieldsHide fields
serverTimestringctxobjectShow 1 fieldsHide fields
userIpstring
warningsarray of stringserroranyEmpty on success.
Errors
400A field is missing or not valid.401No API key, or the key is not valid, expired or revoked.402Not enough credits for this call (insufficient_credits), or the key reached its spend cap. Nothing was charged.403The key may not call this API (permission, environment or IP allow-list). Nothing was charged.413The image or the request is too large.429Too many requests for this key: waitRetry-Afterseconds. Nothing was charged.5XXThe check could not run. Nothing was charged.
curl -X POST https://verisec.dev/v1/age-gate/checkout \
-H "Authorization: Bearer $VERISEC_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"selfie": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPhfDwAChwGA60e6kgAAAABJRU5ErkJggg==",
"minAge": 18
}'{
"ok": true,
"request_id": "req_5555da2743524f36b13c",
"latency_ms": 3266,
"data": {
"code": 0,
"msg": "OK",
"allowed": false,
"age": [
29,
31
],
"live": false,
"elapsedTime": 3.266,
"metadata": {
"serverTime": "2026-10-05T05:36:08.655Z",
"ctx": {
"userIp": "203.0.113.7"
}
}
},
"warnings": [],
"error": null
}Photo Kiosk
/v1/kiosk/photokiosk.photoA passport/visa photo booth in one call: compliance against a standard, an auto-fixed version, and whether the fixed photo is ready to print.
**Returns**
- compliant: whether the original passed
- nonCompliant[]: what failed
- fixedImage: the cropped, re-backgrounded photo
- printReady: true if the fixed photo passes the standard
**Limits**
- Standards: ICAO, VisaSchengen, VisaUSA, Full.
Price: 0.06 credits per successful call.
Body parameters
imagestringrequiredPortrait. The image as base64 (JPEG or PNG). The SDKs also take a file path or the file bytes.
standardstringStandard.
ICAOVisaSchengenVisaUSAFullaspectstringShape.
3:44:52:31:1backgroundColorarray of integersBackground.
tagstringTag. Any text you want echoed back in the response.
Returns
The check ran.
Show the KioskPhotoResponse fieldsHide fields
okbooleanrequiredtrue: the result is in
data.request_idstringlatency_msnumberHow long the check took, in milliseconds.
dataobjectrequiredThe answer of Photo Kiosk.
Show 8 fieldsHide fields
codenumbermsgstringcompliantbooleannonCompliantarray of anysfixedImagestringprintReadybooleanelapsedTimenumbermetadataobjectShow 2 fieldsHide fields
serverTimestringctxobjectShow 1 fieldsHide fields
userIpstring
warningsarray of stringserroranyEmpty on success.
Errors
400A field is missing or not valid.401No API key, or the key is not valid, expired or revoked.402Not enough credits for this call (insufficient_credits), or the key reached its spend cap. Nothing was charged.403The key may not call this API (permission, environment or IP allow-list). Nothing was charged.413The image or the request is too large.429Too many requests for this key: waitRetry-Afterseconds. Nothing was charged.5XXThe check could not run. Nothing was charged.
curl -X POST https://verisec.dev/v1/kiosk/photo \
-H "Authorization: Bearer $VERISEC_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"image": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPhfDwAChwGA60e6kgAAAABJRU5ErkJggg==",
"standard": "ICAO",
"aspect": "3:4",
"backgroundColor": [
255,
255,
255
]
}'{
"ok": true,
"request_id": "req_445569c7528c42a0985a",
"latency_ms": 3228,
"data": {
"code": 0,
"msg": "OK",
"compliant": true,
"nonCompliant": [],
"fixedImage": "<base64 image>",
"printReady": true,
"elapsedTime": 3.229,
"metadata": {
"serverTime": "2026-10-05T05:36:12.536Z",
"ctx": {
"userIp": "203.0.113.7"
}
}
},
"warnings": [],
"error": null
}