> For the complete documentation index, see [llms.txt](https://docs.vida.id/identity-stack/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.vida.id/identity-stack/verify/liveness/overview/passive-liveness.md).

# Passive Liveness

## Passive Liveness Check

Passive liveness verifies that a selfie comes from a real person who is physically present, and not from a photo, a screen, or a manipulated image. The check runs in the backend using AI and ML image analysis, and returns a selfie score.

## Attack Vendors Covered

<table><thead><tr><th width="327.6171875">Type of Attack Vector</th><th>Examples</th></tr></thead><tbody><tr><td>2D Paper Photo</td><td><div><figure><img src="/files/EQNa1DTz10qMRxqXmPSU" alt="" width="98"><figcaption></figcaption></figure></div></td></tr><tr><td>Paper Cut Photo</td><td><div><figure><img src="/files/ywF3n2x8F3ylCtfHGQpd" alt="" width="124"><figcaption></figcaption></figure></div></td></tr><tr><td>Paper Cut Photo with Property</td><td><div><figure><img src="/files/ZgkPglj1YInr8iU7HXLI" alt="" width="107"><figcaption></figcaption></figure></div></td></tr><tr><td>Paper Mask with Eye-Hole</td><td><div><figure><img src="/files/gSlYT8IVShKbNYEZkQ5R" alt="" width="107"><figcaption></figcaption></figure></div></td></tr><tr><td>Mobile Screen Attack</td><td><div><figure><img src="/files/ylylwtcHKXI79TdQhEa9" alt="" width="127"><figcaption></figcaption></figure></div></td></tr><tr><td>Monitor Screen Attack</td><td><div><figure><img src="/files/Ys0y8eYuVC2rMOuLWcAM" alt="" width="120"><figcaption></figcaption></figure></div></td></tr><tr><td>Black &#x26; White</td><td><div><figure><img src="/files/TKqdWT8wVTqlfJBHSuc0" alt="" width="117"><figcaption></figcaption></figure></div></td></tr></tbody></table>

#### Selfie Score

The selfie score ranges from 0 to 1. A score of 0 means maximum liveness, and 1 means minimum liveness. Whether the check passes or fails depends on the liveness threshold score.

{% hint style="info" %}
**Liveness detection** can be **disabled** if required. Please contact the [<mark style="color:blue;">VIDA support team</mark>](mailto:support@vida.id)<mark style="color:blue;">,</mark> if it  needs to be disabled.
{% endhint %}

### Video Liveness (Passive Liveness with Video Input)

Video Liveness is a capture mode for passive liveness. Instead of sending one selfie, the SDK records a short video, the backend picks the sharpest frame, and the normal liveness check runs on that frame.

The purpose is to reduce rejection of genuine users. With a single capture, the check runs on whatever image the user happened to take — if it is blurred, badly exposed, or taken mid-blink, a real user can be rejected. With video, the backend has several frames to choose from.

The liveness models, the attack types detected, and the threshold logic are the same as single image. Only the following differ:

<table><thead><tr><th width="198.01953125"></th><th width="252.1640625">Single image (default)</th><th>Video input</th></tr></thead><tbody><tr><td>SDK sends</td><td>One selfie image</td><td>A short video</td></tr><tr><td>Available on</td><td>Mobile SDK, Web SDK</td><td>Mobile SDK only (Android 1.9.7+, iOS 1.9.5+)</td></tr><tr><td>How to enable</td><td>Default</td><td>OSS configuration, no client code change</td></tr><tr><td>Review screen</td><td>Supported</td><td>Not supported</td></tr><tr><td>Extra response field</td><td>-</td><td><code>best_frame_for_prediction</code></td></tr></tbody></table>

#### Before you enable it

{% hint style="info" %}
**Important** **Video Liveness and Color Flash cannot be enabled together.** Both are configured through OSS and cannot be active at the same time for one client. If both are switched on, the SDK runs Color Flash, not Video Liveness.
{% endhint %}

Video Liveness is available on the Mobile SDK only (Android 1.9.7+, iOS 1.9.5+). It is not available on the Web SDK.

The review screen is not supported for this capture mode — the verification flow completes without it.

#### How it works

1. **Capture** — the SDK records a short video, uploads it to storage, and sends the reference to the backend.
2. **Frame selection** — the backend selects the best frame. If selection fails, a frame is picked at random so the transaction can still be evaluated.
3. **Evaluation** — the selected frame is checked in parallel by three services: image quality, liveness, and image manipulation (deepfake) detection.
4. **Response** — the API returns the scores and the frame that was used.

#### Response

Video Liveness returns the same score fields as single-image passive liveness, plus the frame that was evaluated. All score values are returned as strings.

<table><thead><tr><th width="285.19921875">Field</th><th>Description</th></tr></thead><tbody><tr><td><code>liveness_scores</code></td><td>Liveness score and the threshold applied</td></tr><tr><td><code>quality_scores</code></td><td>Image quality scores for the selected frame: blurriness, under exposure, over exposure, unnatural colour, eyes closed</td></tr><tr><td><code>image_manipulation_scores</code></td><td>Manipulation (deepfake) score and threshold. Returns 0 when manipulation detection is disabled for the client</td></tr><tr><td><code>best_frame_for_prediction</code></td><td>The frame used for the evaluation, returned as a base64 JPEG resized to 480p</td></tr><tr><td><code>code</code>, <code>message</code></td><td>Result code and message</td></tr></tbody></table>

A transaction is accepted when the liveness score, the manipulation score, and the quality score are all below their thresholds. The default threshold is 0.95 and is configurable per client.

{% hint style="info" %}
The check runs on one frame. The video is only used to select the best frame — the liveness evaluation itself is still performed on a single image.
{% endhint %}

To enable Video Liveness for a client, contact the [<mark style="color:blue;">VIDA support team</mark>](mailto:support@vida.id)<mark style="color:blue;">.</mark>
