Skip to main content
POST
/
v3
/
passive-liveness
/
cURL
curl -X POST 'https://verification.didit.me/v3/passive-liveness/' \
  -H 'x-api-key: YOUR_API_KEY' \
  -F 'user_image=@./selfie.jpg' \
  -F 'face_liveness_score_decline_threshold=30' \
  -F 'save_api_request=true' \
  -F 'vendor_data=user-123'
{
  "request_id": "a1b2c3d4-e5f6-7890-1234-567890abcdef",
  "liveness": {
    "status": "Approved",
    "method": "PASSIVE",
    "score": 95,
    "user_image": {
      "entities": [
        {
          "bbox": [
            661,
            728,
            1688,
            2188
          ],
          "confidence": 0.732973,
          "age": 26.91,
          "gender": "male",
          "race": null
        }
      ],
      "best_angle": 0
    },
    "warnings": [],
    "face_quality": 84.21,
    "face_luminance": 50.33
  },
  "vendor_data": "user-123",
  "metadata": null,
  "created_at": "2026-06-12T01:04:42.763237+00:00"
}

Authorizations

x-api-key
string
header
required

Body

multipart/form-data
user_image
file
required

Front-facing face image (e.g. a selfie). Allowed extensions: tiff, jpg, jpeg, png, webp. Maximum upload size: 5 MB (larger files are rejected with 400). Images are automatically compressed to ~0.5 MB before processing, so very high resolutions do not improve accuracy. The image should contain a single subject — when several faces are present, the largest one is evaluated and a MULTIPLE_FACES_DETECTED warning is added.

face_liveness_score_decline_threshold
number<float>
default:30

Liveness score threshold (0–100). A computed score at or below this value emits a LOW_LIVENESS_SCORE warning and sets status to Declined. Default 30; raise it for a stricter anti-spoofing posture. Values outside 0–100 return 400.

Required range: 0 <= x <= 100
Example:

30

rotate_image
boolean
default:false

When true, the service tries 90-degree rotations of the input and uses the orientation that yields the best face detection. Useful when EXIF orientation is missing. Adds latency.

Example:

false

save_api_request
boolean
default:true

When true (default), persists the call as an API-type session, stores the face images, emits a status.updated webhook, and enrolls the detected face into your face search index. When false, the call is one-shot — nothing is stored and the face is not enrolled. Blocklist and duplicate screening run either way.

Example:

true

vendor_data
string

Optional opaque identifier (your user id, email, UUID…) stored on the persisted session and echoed back. Also used to exclude prior sessions with the same vendor_data from the duplicate-face check, so re-verifying the same user does not raise DUPLICATED_FACE.

Example:

"user-123"

metadata
object

Optional JSON object stored with the session (when save_api_request=true) and echoed back. In multipart requests, send it as a JSON-encoded string field — it is parsed into an object.

Example:
{ "flow": "withdrawal" }

Response

Passive liveness completed. liveness.score is the model's 0–100 confidence that the image shows a live person; status is Approved unless an error-severity warning fired. A spoofed or blocklisted face still returns 200 — inspect liveness.status and liveness.warnings, not just the HTTP code. When save_api_request=true, request_id is the persisted session id.

request_id
string<uuid>

Persisted session id when save_api_request=true (usable with GET /v3/session/{sessionId}/decision/); otherwise a transient correlation UUID.

liveness
object
vendor_data
string | null

Echo of the vendor_data you sent, or null.

metadata
object

Echo of the metadata object you sent, or null.

created_at
string<date-time>

ISO 8601 timestamp (UTC) of when the response was generated, e.g. 2026-06-12T01:04:42.763237+00:00.