KYC · API reference

Face workflows

Identity Verification

POST/v1/identity/verifyidentity.verify

One 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

selfiestringrequired

Selfie. The image as base64 (JPEG or PNG). The SDKs also take a file path or the file bytes.

referencestringrequired

Reference 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 strings

Quality checks.

thresholdnumber

Threshold. Match threshold.

tagstring

Tag. Any text you want echoed back in the response.

Returns

The check ran.

Show the IdentityVerifyResponse fields
okbooleanrequired

true: the result is in data.

request_idstring
latency_msnumber

How long the check took, in milliseconds.

dataobjectrequired

The answer of Identity Verification.

Show 9 fields
codenumber
msgstring
verifiedboolean
liveboolean
qualityOkboolean
similaritynumber
stepsobject
Show 3 fields
livenessobject
Show 3 fields
liveboolean
statusnumber
reasonCodenumber
qualityobject
Show 3 fields
okboolean
failedarray of strings
checkedarray of strings
matchobject
Show 4 fields
similaritynumber
scorenumber
matchboolean
thresholdnumber
elapsedTimenumber
metadataobject
Show 2 fields
serverTimestring
ctxobject
Show 1 fields
userIpstring
warningsarray of strings
errorany

Empty 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: wait Retry-After seconds. Nothing was charged.
  • 5XXThe check could not run. Nothing was charged.
Request
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
  }'
Response · 200
{
  "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

POST/v1/auth/loginfaceLogin.authenticate

Passwordless 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

selfiestringrequired

Selfie. The image as base64 (JPEG or PNG). The SDKs also take a file path or the file bytes.

galleryarray of objectsrequired

Enrolled users. 1 to 10 faces, each with your own id.

Show 2 fields
imagestringrequired

The image as base64 (JPEG or PNG). The SDKs also take a file path or the file bytes.

idstring

Your id for this face (the SDKs fill in face-1, face-2, ... when left out).

thresholdnumber

Threshold. Login at or above this similarity.

tagstring

Tag. Any text you want echoed back in the response.

Returns

The check ran.

Show the FaceLoginAuthenticateResponse fields
okbooleanrequired

true: the result is in data.

request_idstring
latency_msnumber

How long the check took, in milliseconds.

dataobjectrequired

The answer of Face Login.

Show 8 fields
codenumber
msgstring
authenticatedboolean
userIdany
similaritynumber
liveboolean
elapsedTimenumber
metadataobject
Show 2 fields
serverTimestring
ctxobject
Show 1 fields
userIpstring
warningsarray of strings
errorany

Empty 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: wait Retry-After seconds. Nothing was charged.
  • 5XXThe check could not run. Nothing was charged.
Request
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
  }'
Response · 200
{
  "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

POST/v1/fraud/signup-checkfraud.signupCheck

At 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

selfiestringrequired

Selfie. The image as base64 (JPEG or PNG). The SDKs also take a file path or the file bytes.

existingarray of objectsrequired

Existing users. 1 to 10 faces, each with your own id.

Show 2 fields
imagestringrequired

The image as base64 (JPEG or PNG). The SDKs also take a file path or the file bytes.

idstring

Your id for this face (the SDKs fill in face-1, face-2, ... when left out).

tagstring

Tag. Any text you want echoed back in the response.

Returns

The check ran.

Show the FraudSignupCheckResponse fields
okbooleanrequired

true: the result is in data.

request_idstring
latency_msnumber

How long the check took, in milliseconds.

dataobjectrequired

The answer of Sign-up Fraud Check.

Show 8 fields
codenumber
msgstring
allowboolean
reasonstring
matchedIdstring
liveboolean
elapsedTimenumber
metadataobject
Show 2 fields
serverTimestring
ctxobject
Show 1 fields
userIpstring
warningsarray of strings
errorany

Empty 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: wait Retry-After seconds. Nothing was charged.
  • 5XXThe check could not run. Nothing was charged.
Request
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"
      }
    ]
  }'
Response · 200
{
  "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

POST/v1/proctor/checkproctor.check

One 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

framestringrequired

Webcam frame. The image as base64 (JPEG or PNG). The SDKs also take a file path or the file bytes.

tagstring

Tag. Any text you want echoed back in the response.

Returns

The check ran.

Show the ProctorCheckResponse fields
okbooleanrequired

true: the result is in data.

request_idstring
latency_msnumber

How long the check took, in milliseconds.

dataobjectrequired

The answer of Proctoring Check.

Show 10 fields
codenumber
msgstring
okboolean
liveboolean
faceCountnumber
offGazenumber
lookingAwayboolean
maskWornboolean
elapsedTimenumber
metadataobject
Show 2 fields
serverTimestring
ctxobject
Show 1 fields
userIpstring
warningsarray of strings
errorany

Empty 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: wait Retry-After seconds. Nothing was charged.
  • 5XXThe check could not run. Nothing was charged.
Request
curl -X POST https://verisec.dev/v1/proctor/check \
  -H "Authorization: Bearer $VERISEC_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "frame": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPhfDwAChwGA60e6kgAAAABJRU5ErkJggg=="
  }'
Response · 200
{
  "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

POST/v1/age-gate/checkoutageGate.checkout

Age 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

selfiestringrequired

Selfie. The image as base64 (JPEG or PNG). The SDKs also take a file path or the file bytes.

minAgeinteger

Minimum age.

tagstring

Tag. Any text you want echoed back in the response.

Returns

The check ran.

Show the AgeGateCheckoutResponse fields
okbooleanrequired

true: the result is in data.

request_idstring
latency_msnumber

How long the check took, in milliseconds.

dataobjectrequired

The answer of Age-gated Checkout.

Show 7 fields
codenumber
msgstring
allowedboolean
agearray of numbers
liveboolean
elapsedTimenumber
metadataobject
Show 2 fields
serverTimestring
ctxobject
Show 1 fields
userIpstring
warningsarray of strings
errorany

Empty 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: wait Retry-After seconds. Nothing was charged.
  • 5XXThe check could not run. Nothing was charged.
Request
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
  }'
Response · 200
{
  "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

POST/v1/kiosk/photokiosk.photo

A 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

imagestringrequired

Portrait. The image as base64 (JPEG or PNG). The SDKs also take a file path or the file bytes.

standardstring

Standard.

ICAOVisaSchengenVisaUSAFull
aspectstring

Shape.

3:44:52:31:1
backgroundColorarray of integers

Background.

tagstring

Tag. Any text you want echoed back in the response.

Returns

The check ran.

Show the KioskPhotoResponse fields
okbooleanrequired

true: the result is in data.

request_idstring
latency_msnumber

How long the check took, in milliseconds.

dataobjectrequired

The answer of Photo Kiosk.

Show 8 fields
codenumber
msgstring
compliantboolean
nonCompliantarray of anys
fixedImagestring
printReadyboolean
elapsedTimenumber
metadataobject
Show 2 fields
serverTimestring
ctxobject
Show 1 fields
userIpstring
warningsarray of strings
errorany

Empty 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: wait Retry-After seconds. Nothing was charged.
  • 5XXThe check could not run. Nothing was charged.
Request
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
    ]
  }'
Response · 200
{
  "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
}