Face check API

Quick start

Sign in with a work Google account to get a key. Then send a photo of the person (an ID document or any clear picture of their face) and a selfie:

curl -s https://face.unbackoffice.com/v1/face/verify \
  -H "X-API-Key: $FACE_KEY" \
  -F [email protected] \
  -F [email protected]

Auth

Send your key in the X-API-Key header on every request. Keep it on your server. Never put it in a browser or mobile app. Base URL: https://face.unbackoffice.com.

A key can call POST /v1/face/verify and POST /v1/face/flash. Nothing else.

Request · POST /v1/face/verify

A multipart/form-data body:

FieldTypeRequiredNotes
referenceimage fileyesThe photo to match against: an ID document page or a clear face photo. JPEG, PNG or WebP, up to 12 MB.
selfieimage fileyesA selfie of the person, taken now. JPEG, PNG or WebP, up to 12 MB.
clipvideo filenoA live capture clip (WebM, up to 15 s) recorded with the capture script below. Needs consent=granted.
challengeJSON stringnoThe capture script's result for that clip.
consentstringwith a clipgranted: the person agreed to the live capture.

Two images give a face match and a spoof check on the selfie. A live capture adds the action check, the screen-flash check, the pulse read and the device checks. To run it in your own page, load https://face.unbackoffice.com/static/liveness.js, get a flash challenge from POST /v1/face/flash (free, single use, 2 minutes) from your server, and post the clip, the still it returns and the challenge result to /v1/face/verify.

Response

{
  "result": {
    "status": "verified",
    "verified": true,
    "reasons": [],
    "match": {"assessment": "match", "similarity": 0.86, "confidence": 0.8,
               "consistent_features": ["eye spacing", "nose bridge"], "discrepancies": []},
    "integrity": {"verdict": "authentic", "confidence": 0.8, "attack_signals": []},
    "engine": {"match": {"decision": "match", "score": 0.61},
                "pad": {"decision": "live", "live_score": 0.97}},
    "liveness": null,
    "checked_at": "2026-10-11T09:30:00Z"
  }
}

Trimmed. Real responses carry more detail per check.

Status

  • verified: the faces match and the selfie looks like a genuine live capture, on every check that ran.
  • review: something was inconclusive. reasons says what. Send it to a person.
  • failed: the faces look like different people, or the selfie shows signs of a photo, screen, mask or synthetic face.

Key fields

  • match: the face comparison: assessment (match, likely_match, inconclusive, likely_mismatch, mismatch), the features that agree and those that differ.
  • integrity: the capture review: verdict (authentic, review, suspect) and any attack signals.
  • engine: the face model's match score and the spoof model's live score, with their decisions.
  • liveness: with a live capture only: actions, screen flash, pulse and device results.

A result supports a human decision. It is not a certified biometric or liveness system. Review every review and failed result before you act on it.

Errors

StatusMeaning
400A file is missing, or a clip was sent without consent.
401Missing or invalid key, or the key was revoked.
402No checks left on this key. The body says how to get more (below).
403This key can't call that endpoint.
413A file is too large.
429Too many requests per minute, for this key or from this IP. Wait and retry.
502 / 503The check could not run. The check is given back (up to 3 times a day per key). Retry shortly.

Quota

  • Your first key has 2 free checks. They don't expire or reset.
  • One check is one call to /v1/face/verify, with or without a live capture.
  • Invalid requests are not charged. A check that could not run is given back, up to 3 times a day per key. Flash challenges are free.
  • Get 5 more checks on your key for each new colleague who signs up through your referral link (on your key page).
  • For more, request a tier. We contact you and add the checks to your key.

When a key runs out, you get 402:

{
  "detail": {
    "error": "quota_exhausted",
    "message": "This key has no checks left. Share your referral link: ...",
    "checks_remaining": 0,
    "referral_url": "https://face.unbackoffice.com/?ref=yourcode",
    "upgrade_url": "https://face.unbackoffice.com/tiers"
  }
}

Your data

We delete the images and clips you send within 24 hours of the check. We keep the outcome (no images) for 12 months. You need a lawful basis, and usually the person's explicit consent, to send us their face. See the terms and the privacy notice.

Machine-readable spec: /openapi.json

Terms·Privacy·API docs
Created with love by Daertho.com