> ## Documentation Index
> Fetch the complete documentation index at: https://docs.didit.me/llms.txt
> Use this file to discover all available pages before exploring further.

# Проверка живости: предупреждения и коды ошибок

> Все предупреждения модуля проверки живости Didit: атаки, триггеры качества, совпадения со списком блокировки, их причины и способы устранения.

## Обзор

Предупреждения в отчёте о проверке живости фиксируют каждое условие, выявленное Didit при выполнении проверки живости. Они попадают в массив `warnings[]` для каждого элемента `liveness_checks[]` (см. [Отчёт о проверке живости](https://docs.didit.me/ru/core-technology/liveness/report-liveness.md)) со значением `feature`, равным `"LIVENESS"`. Каждая запись имеет стандартную структуру [объекта предупреждения](https://docs.didit.me/ru/reference/data-models.md#объект-предупреждения): `feature`, `risk`, `additional_data`, `log_type`, `short_description`, `long_description`, `node_id`.

Каждое предупреждение имеет три уровня:

1. **Код `risk`** — стабильный идентификатор, по которому можно выполнять сопоставление в коде (список кодов приведён ниже).
2. **Тип `log_type`** — одно из значений: `information`, `warning` или `error`. Риски с автоматическим отклонением всегда содержат `error`. Для настраиваемых рисков он определяется настроенным действием: **Без действия** → `information`, **Проверка** → `warning`, **Отклонить** → `error`. Для рисков на основе порогов (`LOW_LIVENESS_SCORE`, `LOW_FACE_QUALITY`) устанавливается `error`, если значение пересекает порог отклонения, и `warning`, если оно пересекает только порог проверки.
3. **Влияние на решение** — та же маршрутизация определяет `status` отчёта о проверке живости: действие «Проверка» переводит его в `In Review`, действие «Отклонить» (или любой риск автоматического отклонения) переводит в `Declined`, а «Без действия» оставляет его без изменений.

Некоторые риски формируются только в том случае, если метод проверки живости имеет значение `PASSIVE` (проверки количества лиц, качества и яркости). В таблицах ниже приведён полный набор кодов рисков проверки живости и уровни их критичности — других кодов рисков проверки живости не существует.

## Условия автоматического отклонения

Следующие риски всегда переводят отчёт о проверке живости (и сессию) в статус `Declined` с `log_type: "error"`:

| Риск | Триггер |
| - | - |
| `NO_FACE_DETECTED` | Во время захвата живости лицо не обнаружено либо пользователь исчерпал повторные попытки. |
| `LIVENESS_FACE_ATTACK` | Модель обнаружила атаку предъявления (маска, воспроизведение с экрана, спуфинг с использованием дипфейка). |
| `FACE_IN_BLOCKLIST` | Лицо совпало с записью в списке блокировки лиц вашего приложения. |
| `AGE_BELOW_MINIMUM` | Расчётный возраст ниже настроенного минимума. Формируется только в адаптивных сценариях проверки возраста и узлах `AGE_ESTIMATION`. |
| `AGE_NOT_DETECTED` | Не удалось оценить возраст. Формируется только в сценариях оценки возраста с отключённым переходом к верификации личности. |

При срабатывании `NO_FACE_DETECTED` риск `LOW_LIVENESS_SCORE` подавляется (лицо для оценки отсутствует).

## Настраиваемые параметры верификации

В консоли Didit риски проверки живости сгруппированы по следующим настройкам сценария:

| Группа | Риски | Настройка |
| - | - | - |
| **Пороги оценки живости** | `LOW_LIVENESS_SCORE` | Порог проверки + порог отклонения для `score`. На уровне или ниже порога проверки → `In Review`; на уровне или ниже порога отклонения → `Declined`. |
| **Действие при дубликате лица** | `DUPLICATED_FACE`, `POSSIBLE_DUPLICATED_FACE` | Одна общая настройка: Без действия (по умолчанию) / Проверка / Отклонить. Полностью пропускается, если совпадающее лицо находится в вашем списке разрешённых лиц. |
| **Несовпадение имени при дубликате лица** | `DUPLICATED_FACE_NAME_MISMATCH` | Отдельная настройка (`face_liveness_duplicated_face_name_mismatch_action`): Без действия / Проверка (по умолчанию) / Отклонить. Оценивается только в том случае, если также срабатывает `DUPLICATED_FACE` — см. ниже. |
| **Сопоставление лица при атаке на проверку живости** | `FACE_MATCHES_LIVENESS_ATTACK` | Отдельная настройка (`face_liveness_attack_face_match_action`): Без действия (по умолчанию) / Проверка. Выбранное здесь действие «Отклонить» принимается, но применяется как «Проверка». Также доступно в узле «Оценка возраста». |
| **Возможное совпадение лица со списком блокировки** | `POSSIBLE_FACE_IN_BLOCKLIST` | Не настраивается в сценариях — всегда направляется на проверку (`log_type: "warning"`). |
| **Действие при нескольких лицах** *(только для пассивного метода)* | `MULTIPLE_FACES_DETECTED` | Без действия (по умолчанию) / Проверка / Отклонить. |
| **Пороги качества лица** *(только для пассивного метода)* | `LOW_FACE_QUALITY` | Порог проверки (по умолчанию 15) + порог отклонения (по умолчанию 0, т. е. отклонение отключено). |
| **Яркость лица** *(только для пассивного метода)* | `LOW_FACE_LUMINANCE`, `HIGH_FACE_LUMINANCE` | Минимальный и максимальный пороги (по умолчанию 20 / 80 по нормализованной шкале 0–100) + действие для каждого направления (по умолчанию Проверка). |
| **Пороги возраста** *(адаптивные сценарии / узел `AGE_ESTIMATION`)* | `AGE_BELOW_MINIMUM`, `AGE_NOT_DETECTED` | Пороги минимального и пограничного возраста; оба риска автоматически отклоняют шаг проверки живости. При включённом переходе к верификации личности сценарий направляет пользователя на проверку документа вместо завершения сессии. |

## Сформированные предупреждения

### Основные проверки живости

| Риск | Причина | Серьёзность | Влияет на статус? | Устранение |
| - | - | - | - | - |
| `NO_FACE_DETECTED` | Лицо не обнаружено во время съёмки, либо пользователь исчерпал лимит попыток (`MAX_ATTEMPTS_REACHED`). | `error` | **Автоматическое отклонение** | Повторите съёмку при лучшем освещении; убедитесь, что лицо находится по центру. |
| `LIVENESS_FACE_ATTACK` | Модель обнаружила атаку предъявления. | `error` | **Автоматическое отклонение** | Рассматривать как мошенничество. Сессия автоматически отклоняется. |
| `LOW_LIVENESS_SCORE` | Значение `score` находится на уровне или ниже порога отправки на проверку в сценарии. Подавляется, если также присутствует `NO_FACE_DETECTED`. | `warning`; повышается до `error`, когда оценка находится на уровне или ниже порога отклонения | Настраивается (пороги проверки / отклонения) | Повторите съёмку; скорректируйте пороги, если наблюдаются ложные срабатывания. |

### Целостность канала съёмки

Сигналы инъекционных атак, передаваемые клиентом во время съёмки. В отличие от атак предъявления (артефакт перед реальной камерой), они указывают на то, что сам видеопоток с камеры был подменён или перехвачен.

Каждый сигнал настраивается индивидуально для сценария и по умолчанию имеет значение **отсутствие действия**, поэтому включение этой функции не влияет на решения, пока вы явно её не настроите.

| Риск | Причина | Ключ конфигурации | По умолчанию |
| - | - | - | - |
| `VIRTUAL_CAMERA_DETECTED` | Устройство съёмки было определено как программная виртуальная камера (OBS, ManyCam, Snap Camera, DroidCam и аналогичные), а не физическая камера. | `virtual_camera_action` | `NO_ACTION` |
| `EXTERNAL_CAPTURE_DEVICE_DETECTED` | Устройство съёмки представляло собой внешнюю камеру или карту видеозахвата, а не встроенную камеру. | `external_capture_device_action` | `NO_ACTION` |
| `FRAME_INJECTION_SUSPECTED` | Снятые кадры содержат признаки программного композитинга или инъекции в пайплайн камеры вместо подлинной съёмки в реальном времени, **или** съёмка выполнялась на эмулированном или виртуализированном оборудовании (эмулятор Android или виртуальная машина на ПК), где отсутствует физический сенсор камеры, а каждый кадр передаётся хостом. | `frame_injection_action` | `NO_ACTION` |
| `INJECTION_ATTACK_DETECTED` | Съёмка была внедрена путём инъекции, а не снята собственной камерой устройства: программная виртуальная камера, видеопоток, сгенерированный страницей или средствами автоматизации браузера, перехваченная камера (hooked camera) или инструмент для инструментирования, подключённый к приложению. В `additional_data.reasons` перечисляются только те причины, которые доказывают это. Сигналы, которые может вызвать реальный человек, никогда не приводят к этому срабатыванию. В проверке живости и сравнении лиц этот сигнал следует правилу `frame_injection_action`, поэтому решения по селфи не меняются. | `frame_injection_action` | `NO_ACTION` |
| `SCREEN_CAPTURE_DURING_CAPTURE` | Во время биометрической съёмки на устройстве была активна запись экрана или демонстрация экрана. | `screen_capture_action` | `NO_ACTION` |

> [!NOTE]
>
> Браузеры не предоставляют вендорам аттестацию источника камеры на уровне ОС, поэтому в веб-среде эти сигналы служат косвенными подтверждениями, а не неопровержимым доказательством. В вебе вердикт `null` означает **не определено** (метки устройств недоступны до предоставления разрешения на доступ к камере) и никогда не инициирует риск.

Виртуальная камера идентифицируется по имени устройства, поэтому камера, которую операционная система отображает под обычным именем, не распознаётся как виртуальная. Внутри эмулятора Android переназначенная камера помечена как встроенная, поэтому случай с эмулированным оборудованием передаётся через `FRAME_INJECTION_SUSPECTED`: он определяется по окружению устройства (стеку рендеринга и модели устройства, указанной в агенте пользователя), а не по названию камеры. Результаты, выявленные на основе окружения устройства, содержат `additional_data.reason: "emulated_capture_device"`, что отличает их от собственного покадрового анализа модели проверки живости.

> [!NOTE]
>
> Определение параметров системы из браузера является лишь косвенным свидетельством, а не аттестацией, и подготовленный злоумышленник может повлиять на эти данные. Нативные мобильные SDK передают более надёжные сигналы целостности на уровне операционной системы, которые браузер увидеть не может (эмулятор, устройство с root-доступом или джейлбрейком, перехват вызовов во время выполнения, подключённый отладчик). Для каждого из них предусмотрено собственное настраиваемое действие в разделе [Целостность устройства и среды выполнения](https://docs.didit.me/ru/core-technology/ip-analysis/warnings-ip-analysis.md#целостность-устройства-и-среды-выполнения). Эти сигналы существенно повышают затраты злоумышленника, но сами по себе не доказывают, что съёмка была выполнена с подлинного устройства. Сигналы целостности устройства не зависят от метода проверки живости, поэтому они сочетаются с любым из методов: Passive, 3D Flash или 3D Action & Flash.

### Криминалистический анализ видеозаписи

`LIVENESS_VIDEO_ANOMALY` вычисляется **на стороне сервера по сохранённой видеозаписи проверки живости**, независимо от модели проверки живости. Механизм выявляет повторяющуюся последовательность движений в течение нескольких циклов, характерную для зацикленного видеопотока.

| Риск | Причина | Ключ конфигурации | По умолчанию |
| - | - | - | - |
| `LIVENESS_VIDEO_ANOMALY` | Запись содержит повторяющуюся последовательность движений. Зависания камеры, повторяющиеся статичные кадры, тёмные начальные кадры и медленная доставка кадров сами по себе не вызывают срабатывания этого сигнала. | `face_liveness_video_anomaly_action` | `NO_ACTION` |

Задайте действие в вашем узле Проверки живости или Оценки возраста: `NO_ACTION` фиксирует информационное событие, `REVIEW` может перевести верификацию с вынесенным решением в статус «на проверке», а `DECLINE` может перевести её в статус «отклонена». Проверка выполняется асинхронно, поэтому изменение статуса на более строгий может произойти после получения первоначального результата. Более строгое существующее решение не понижается, а решения ручной проверки сохраняются.

Результаты версии 2 включают `forensics_version: 2`, доказательства `repeated_sequence` и значение `repeated_moving_sequence` в `anomaly_reasons`. Параметры доставки, такие как `unique_frame_ratio`, `static_pair_ratio`, `decoded_fps_ratio` и `max_frame_gap_seconds`, остаются диагностическими данными; они не могут подтвердить факт воспроизведения записи сами по себе. Более ранние результаты содержат описание версии детектора, использовавшейся на тот момент, и не подлежат ретроактивной реклассификации.

> [!NOTE]
>
> Это консервативный дополнительный сигнал, а не исчерпывающий механизм обнаружения синтетического медиаконтента или инъецированного видео. Запись без аномалий не является гарантированным подтверждением живости. Короткие или неоднозначные съёмки, а также съёмки без пригодных доказательств повторного воспроизведения не помечаются этой проверкой. Отсутствующие или нечитаемые записи не приводят к обнаружению в рамках этой проверки; остальные проверки верификации продолжают действовать.

### Межсессионное сравнение лиц

| Риск | Причина | Дополнительные данные | Уровень серьезности |
| - | - | - | - |
| `FACE_IN_BLOCKLIST` | Лицо совпало с лицом из списка блокировки. | `blocklisted_session_id`, `blocklisted_session_number`, `api_service` | `error` — **автоматическое отклонение** |
| `POSSIBLE_FACE_IN_BLOCKLIST` | Лицо совпало с лицом из списка блокировки в диапазоне более низкой уверенности. | `blocklisted_session_id`, `blocklisted_session_number`, `api_service` | `warning` — в сценариях всегда направляется на ручную проверку |
| `FACE_IN_ALLOWLIST` | Лицо совпало с лицом из списка разрешений. | `allowlisted_session_id`, `allowlisted_session_number`, `api_service` | `information` — действие для дубликата лица пропускается |
| `POSSIBLE_FACE_IN_ALLOWLIST` | Лицо совпало с лицом из списка разрешений в диапазоне более низкой уверенности. | `allowlisted_session_id`, `allowlisted_session_number`, `api_service` | `information` — действие для возможного дубликата лица пропускается |
| `DUPLICATED_FACE` | Лицо совпало с ранее одобренным лицом другого пользователя (сессия со статусом `Approved` с другими `vendor_data` или лицо, импортированное для одного из ваших пользователей вендора). | `duplicated_session_id`, `duplicated_session_number`, `api_service` | Настраивается — по умолчанию `information` |
| `POSSIBLE_DUPLICATED_FACE` | Лицо совпало с другим одобренным или импортированным лицом в диапазоне более низкой уверенности. | `duplicated_session_id`, `duplicated_session_number`, `api_service` | Настраивается — по умолчанию `information` |
| `DUPLICATED_FACE_NAME_MISMATCH` | Выдается вместе с `DUPLICATED_FACE`, если данные о личности из совпавшей сессии не соответствуют имени, определённому для текущей сессии (в документе, удостоверяющем личность, в `expected_details` или у связанного пользователя вендора), используя тот же скоринг совпадения имени и порог, что и верификация личности. Повторное использование лица под другим именем представляет собой более сильный сигнал мошенничества, чем простой дубликат, поэтому для него предусмотрено собственное настраиваемое действие. | `duplicated_session_id`, `duplicated_session_number`, `api_service`, `name_match_score` | Настраивается — по умолчанию `warning`. Никогда не смягчает настроенный результат для `DUPLICATED_FACE`, только эскалирует его. |
| `DUPLICATED_FACE_DOCUMENT_MISMATCH` | Выдается вместе с `DUPLICATED_FACE`, если в документе, удостоверяющем личность совпавшего пользователя, указана дата рождения, отличная от даты рождения в документе текущей сессии. Если один и тот же человек предъявляет другой документ (например, паспорт после ID-карты) или перевыпущенный документ, флаг не выставляется; две сессии с одинаковым номером документа одной страны также никогда не помечаются. | `duplicated_session_id`, `duplicated_session_number`, `api_service`, `mismatch_dimensions` | Настраивается (`face_liveness_duplicated_face_document_mismatch_action`) - по умолчанию `Review`. Никогда не смягчает настроенный результат для `DUPLICATED_FACE`, только эскалирует его. |
| `FACE_MATCHES_LIVENESS_ATTACK` | Лицо совпадает с лицом из более ранней сессии этого приложения у другого пользователя, чья собственная проверка живости была с высокой уверенностью признана атакой. Служит материалом для проверки, а не доказательством атаки. | `liveness_attack_session_id`, `liveness_attack_session_number`, `similarity_percentage`, `liveness_attack_sessions_count` | Настраивается - по умолчанию `information` (без действия) |

При совпадениях с импортированными лицами или записями из списков (у которых нет сессии) значения `*_session_id`, `*_session_number` и `api_service` в `additional_data` равны `null`.

Лица, принадлежащие одному и тому же пользователю (одинаковые `vendor_data` или один и тот же пользователь вендора при наличии), исключаются из **всего** поиска по индексу — как из обнаружения дубликатов, так и из проверки по спискам блокировки. Приоритет совпадений следующий: точное совпадение со списком блокировки → точное совпадение со списком разрешений → точный дубликат → возможное совпадение со списком блокировки → возможное совпадение со списком разрешений → возможный дубликат — в одном отчете появляется только один из этих шести взаимоисключающих кодов. `DUPLICATED_FACE_NAME_MISMATCH` не входит в эту группу приоритетов: это дополнительный код, который выдается **поверх** `DUPLICATED_FACE`, если проверка личности также не прошла, и никогда вместо него. В `additional_data.name_match_score` никогда не передаются сравниваемые имена — только идентификаторы и оценка, поэтому персональные данные (PII) не попадают в payload предупреждения.

Имя, написанное в разной системе письма на каждом документе (например, на иврите в одном и латиницей в другом), может получить оценку ниже пороговой, даже если обе сессии принадлежат одному человеку. В этом единственном случае `DUPLICATED_FACE_NAME_MISMATCH` не выдается, если документы, удостоверяющие личность, из обеих сессий подтверждают друг друга по всем следующим пунктам:

* В обоих документах указана одна и та же страна выдачи.
* Идентификатор в обоих документах точно совпадает. Поля `document_number` и `personal_number` взаимозаменяемы, так как один и тот же национальный номер может находиться в любом из них в зависимости от типа документа.
* Если в обоих документах указана дата рождения, она совпадает.

Если имена указаны в одной системе письма, если идентификатор или страна выдачи различаются либо отсутствуют, или если даты рождения противоречат друг другу, предупреждение выдается, как описано выше.

### Качество пассивной проверки живости (только при `method = "PASSIVE"`)

| Риск | Причина | Уровень серьезности | Способ устранения |
| - | - | - | - |
| `MULTIPLE_FACES_DETECTED` | Во время захвата в кадре было видно более одного лица. Для скоринга и сопоставления всегда используется самое крупное лицо. | Настраивается — по умолчанию `information` | Повторите съемку в одиночку. |
| `LOW_FACE_QUALITY` | Качество лица ниже порога ручной проверки (по умолчанию 15). | `warning`; `error` при значении ниже порога отклонения (по умолчанию 0 — отклонение отключено) | Лучше сфокусируйте камеру / не закрывайте лицо / расположите лицо по центру. |
| `LOW_FACE_LUMINANCE` | Нормализованная яркость ниже минимального порога (по умолчанию 20). | Настраивается — по умолчанию `warning` (действие по умолчанию: ручная проверка) | Улучшите освещение. |
| `HIGH_FACE_LUMINANCE` | Нормализованная яркость выше максимального порога (по умолчанию 80). | Настраивается — по умолчанию `warning` (действие по умолчанию: ручная проверка) | Уменьшите освещение; избегайте контрового света. |

`LOW_FACE_LUMINANCE` и `HIGH_FACE_LUMINANCE` взаимоисключают друг друга — яркость находится либо ниже минимума, либо выше максимума, но никогда одновременно.

### Оценка возраста (адаптивные сценарии и узлы `AGE_ESTIMATION`)

| Риск | Причина | Серьёзность | Устранение |
| - | - | - | - |
| `AGE_BELOW_MINIMUM` | Оценочный возраст ниже настроенного минимума (или пограничного порога, когда включен резервный переход к верификации личности). | `error` | Сценарий переходит к верификации личности при соответствующей настройке. |
| `AGE_NOT_DETECTED` | Возраст не удалось оценить, а резервный переход к верификации личности отключен. | `error` | Включите резервный переход или выполните повторную съемку. |

## Точные строки описания

API возвращает следующие точные строки `short_description` и `long_description` для каждого риска:

| `risk` | `short_description` | `long_description` |
| - | - | - |
| `NO_FACE_DETECTED` | Лицо не обнаружено при проверке живости | Системе не удалось распознать лицо во время проверки живости, что может быть связано с низким качеством изображения, неправильным положением или техническими неполадками. |
| `LIVENESS_FACE_ATTACK` | Атака на проверку живости лица | Система обнаружила потенциальную попытку обойти проверку живости. |
| `LOW_LIVENESS_SCORE` | Низкая оценка живости | Проверка живости вернула низкую оценку, что указывает на возможное использование неживого изображения лица или низкое качество биометрических данных. |
| `LIVENESS_VIDEO_ANOMALY` | Аномалия видеопотока проверки живости | Записанное видео проверки живости содержит повторяющуюся последовательность движений, характерную для зацикленного видеопотока. Зависания камеры, повторяющиеся статичные кадры и медленная передача кадров сами по себе не вызывают данный сигнал. Это независимая проверка записи, а не полная оценка того, проводится ли съемка в реальном времени. |
| `FACE_IN_BLOCKLIST` | Лицо в списке блокировки | Система обнаружила лицо в списке блокировки, что означает запрет на прохождение верификации. |
| `POSSIBLE_FACE_IN_BLOCKLIST` | Возможное лицо в списке блокировки | Система обнаружила возможное совпадение лица со списком блокировки, что означает запрет на прохождение верификации. |
| `FACE_IN_ALLOWLIST` | Лицо в списке разрешенных | Лицо совпало со списком разрешенных лиц приложения, поэтому действия по обработке дубликатов лиц для этого сигнала были пропущены. |
| `POSSIBLE_FACE_IN_ALLOWLIST` | Возможное лицо в списке разрешенных | Лицо предположительно совпало со списком разрешенных лиц приложения, поэтому действия по обработке возможных дубликатов лиц для этого сигнала были пропущены. |
| `DUPLICATED_FACE` | Дубликат лица из другой одобренной сессии | Система обнаружила дубликат лица из другой одобренной сессии, что требует дополнительной проверки. |
| `POSSIBLE_DUPLICATED_FACE` | Возможный дубликат лица из другой одобренной сессии | Система обнаружила возможный дубликат лица из другой одобренной сессии, что требует дополнительной проверки. |
| `DUPLICATED_FACE_NAME_MISMATCH` | Дубликат лица под другим именем | То же самое лицо уже было одобрено в другой сессии, но под другим именем. Личность, которой принадлежит дубликат, не совпадает с личностью, заявленной в этой сессии, что является серьезным признаком мошенничества с идентификационными данными. |
| `FACE_MATCHES_LIVENESS_ATTACK` | Лицо совпадает с атакой на проверку живости | Лицо на этом снимке проверки живости совпадает с лицом из более ранней сессии этого приложения, съемка которого была определена модулем проверки живости как атака с высокой степенью уверенности в сессии другого пользователя. Подлинный пользователь может быть отклонен по ошибке, поэтому данный сигнал предназначен для проверки, а не является доказательством атаки. |
| `MULTIPLE_FACES_DETECTED` | Обнаружено несколько лиц | На снимке проверки живости обнаружено несколько лиц. Система использует самое крупное лицо для проверки живости и сравнения лиц, однако наличие нескольких лиц может потребовать дополнительной проверки. |
| `LOW_FACE_QUALITY` | Низкое качество изображения лица | Качество изображения лица ниже допустимого порога, что может повлиять на надежность проверки живости. Это может быть связано с разрешением камеры, фокусировкой или артефактами сжатия. |
| `LOW_FACE_LUMINANCE` | Низкая яркость лица | Изображение лица слишком темное, что может повлиять на точность проверки живости. Рекомендуются более благоприятные условия освещения. |
| `HIGH_FACE_LUMINANCE` | Высокая яркость лица | Изображение лица слишком яркое или переэкспонированное, что может повлиять на точность проверки живости. Рекомендуется уменьшить освещение или избегать прямого света. |
| `AGE_BELOW_MINIMUM` | Возраст ниже минимального | Возраст лица ниже минимального возрастного порога, установленного для приложения. |
| `AGE_NOT_DETECTED` | Возраст не определен | Системе не удалось определить возраст лица, необходимый для верификации документов. |

## Отдельный API пассивной проверки живости

Отдельный [API проверки живости](https://docs.didit.me/ru/standalone-apis/passive-liveness.md) повторно использует те же коды рисков со следующими отличиями в поведении:

* `NO_FACE_DETECTED` и `LOW_LIVENESS_SCORE` взаимно исключают друг друга — проверка оценки живости выполняется только тогда, когда лицо было найдено. `LOW_LIVENESS_SCORE` срабатывает в соответствии со значением `face_liveness_score_decline_threshold` из запроса (по умолчанию 30) и всегда сопровождается `log_type: "error"`.
* `POSSIBLE_FACE_IN_BLOCKLIST` обрабатывается как отклонение (`log_type: "error"`), а не отправка на проверку.
* `MULTIPLE_FACES_DETECTED` сопровождается `log_type: "warning"`, в то время как риски дублирования лица остаются информационными. Только предупреждения уровня `error` переводят `status` в ответе отдельного API в `Declined`.
* Записи предупреждений в отдельном API содержат `feature`, но не содержат `node_id`.

## Примеры

### Автоматическое отклонение при обнаружении атаки

```json theme={null}
"warnings": [
  {
    "feature": "LIVENESS",
    "risk": "LIVENESS_FACE_ATTACK",
    "additional_data": null,
    "log_type": "error",
    "short_description": "Liveness Face Attack",
    "long_description": "The system detected a potential attempt to bypass the liveness check.",
    "node_id": "liveness_primary"
  }
]
```

### Настраиваемые предупреждения при пассивной съемке

```json theme={null}
"warnings": [
  {
    "feature": "LIVENESS",
    "risk": "LOW_FACE_QUALITY",
    "additional_data": null,
    "log_type": "warning",
    "short_description": "Low face quality",
    "long_description": "The facial image quality is below the acceptable threshold, which may affect the reliability of liveness detection. This could be due to camera resolution, focus, or compression artifacts.",
    "node_id": "liveness_primary"
  },
  {
    "feature": "LIVENESS",
    "risk": "LOW_FACE_LUMINANCE",
    "additional_data": null,
    "log_type": "warning",
    "short_description": "Low face luminance",
    "long_description": "The facial image is too dark, which may affect the accuracy of liveness detection. Better lighting conditions are recommended.",
    "node_id": "liveness_primary"
  },
  {
    "feature": "LIVENESS",
    "risk": "MULTIPLE_FACES_DETECTED",
    "additional_data": null,
    "log_type": "information",
    "short_description": "Multiple faces detected",
    "long_description": "Multiple faces were detected in the liveness image. The system uses the largest face for liveness verification and face comparison, but the presence of multiple faces may require additional review.",
    "node_id": "liveness_primary"
  }
]
```

### Дубликат лица с payload

```json theme={null}
"warnings": [
  {
    "feature": "LIVENESS",
    "risk": "DUPLICATED_FACE",
    "additional_data": {
      "duplicated_session_id": "8d2f1c4e-6b7a-4c8d-9e0f-1a2b3c4d5e6f",
      "duplicated_session_number": 123,
      "api_service": null
    },
    "log_type": "warning",
    "short_description": "Duplicated face from other approved session",
    "long_description": "The system identified a duplicated face from another approved session, requiring further investigation.",
    "node_id": "liveness_primary"
  }
]
```

Здесь для действия при обнаружении дубликата лица установлено значение Review, поэтому предупреждение содержит `log_type: "warning"`, а статус отчёта о проверке живости имеет значение `In Review`. При значении по умолчанию (No action) оно содержало бы `log_type: "information"`. Поле `api_service` имеет значение `null`, поскольку совпавшее лицо было получено из сессии сценария, а не из отдельного вызова API.

### Дубликат лица под другим именем

```json theme={null}
"warnings": [
  {
    "feature": "LIVENESS",
    "risk": "DUPLICATED_FACE",
    "additional_data": {
      "duplicated_session_id": "8d2f1c4e-6b7a-4c8d-9e0f-1a2b3c4d5e6f",
      "duplicated_session_number": 123,
      "api_service": null
    },
    "log_type": "information",
    "short_description": "Duplicated face from other approved session",
    "long_description": "The system identified a duplicated face from another approved session, requiring further investigation.",
    "node_id": "liveness_primary"
  },
  {
    "feature": "LIVENESS",
    "risk": "DUPLICATED_FACE_NAME_MISMATCH",
    "additional_data": {
      "duplicated_session_id": "8d2f1c4e-6b7a-4c8d-9e0f-1a2b3c4d5e6f",
      "duplicated_session_number": 123,
      "api_service": null,
      "name_match_score": 42.5
    },
    "log_type": "warning",
    "short_description": "Duplicated face under a different name",
    "long_description": "The same face was already approved on another session, but under a different name. The identity behind the duplicate does not match the identity declared on this session, which is a strong indicator of identity fraud.",
    "node_id": "liveness_primary"
  }
]
```

Для `DUPLICATED_FACE` сохраняется собственное настроенное действие (здесь No action — `log_type: "information"`), тогда как `DUPLICATED_FACE_NAME_MISMATCH` имеет отдельное действие, по умолчанию Review (`log_type: "warning"`). Статус отчёта о проверке живости определяется наиболее строгим из двух: здесь `In Review`, даже если одна лишь базовая настройка дубликата лица не привела бы к выставлению флага.

### Аномалия целостности записи с измерениями

```json theme={null}
"warnings": [
  {
    "feature": "LIVENESS",
    "risk": "LIVENESS_VIDEO_ANOMALY",
    "additional_data": {
      "forensics_version": 2,
      "duration_seconds": 6.0,
      "repeated_sequence": {
        "period_frames": 6,
        "cycles": 3,
        "matched_pairs": 12
      },
      "anomaly_reasons": ["repeated_moving_sequence"]
    },
    "log_type": "information",
    "short_description": "Liveness video stream anomaly",
    "long_description": "The recorded liveness video contains a repeated moving sequence consistent with a looped feed. Camera stalls, repeated still frames and slow frame delivery alone do not raise this signal. This is an independent recording check, not a complete assessment of whether the capture is live.",
    "node_id": "liveness_primary"
  }
]
```

В этом примере показаны признаки воспроизведения из записи, содержащей три копии движущейся последовательности. Поле `log_type` имеет значение `information`, так как настроенным действием является `NO_ACTION`. Диагностические данные доставки кадров, опущенные в этом примере для краткости, не приводят к обнаружению этой аномалии.

## Типы предупреждений

Каждому риску присваивается уровень критичности в зависимости от конфигурации вашего приложения. Существует три уровня критичности:

## Связанные разделы

* [Отчёт о проверке живости](https://docs.didit.me/ru/core-technology/liveness/report-liveness.md) — полная схема отчёта и статусы.
* [Предупреждения при сравнении лиц](https://docs.didit.me/ru/core-technology/face-match/warnings-face-match.md) — сопутствующие предупреждения при сравнении лиц 1:1.
* [webhook](https://docs.didit.me/ru/integration/webhooks.md) — событие `session.status.updated` передаёт предупреждения сразу после завершения шага проверки живости.
* [Модели данных — Проверка живости](https://docs.didit.me/ru/reference/data-models.md#проверка-живости) — каноническая схема со всеми полями.
* [Модели данных — Объект предупреждения](https://docs.didit.me/ru/reference/data-models.md#объект-предупреждения) — структура каждого элемента в `warnings[]`.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.