> ## 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.

# Конфигурации функций сценария: справочник API

> Справочник полей конфигурации Didit для POST и PATCH /v3/workflows/ при создании линейных сценариев через массив features.

Используйте эти поля `config` внутри каждого элемента массива `features` для [`POST /v3/workflows/`](https://docs.didit.me/ru/management-api/workflows/create) и [`PATCH /v3/workflows/{settings_uuid}/`](https://docs.didit.me/ru/management-api/workflows/update).

```json theme={null}
{
  "workflow_label": "Standard KYC",
  "features": [
    {
      "feature": "OCR",
      "config": {
        "documents_allowed": {
          "USA": {
            "DL": {
              "enabled": 1,
              "sides": 2
            }
          }
        }
      }
    }
  ]
}
```

API сценариев v3 строит линейный сценарий на основе узлов из упорядоченного массива `features`. Передавайте функции строго в порядке их выполнения.

> [!NOTE]
>
> Выбор движка, который выполняет функцию (собственного движка Didit или стороннего провайдера), не входит в число полей config, перечисленных ниже. Это настраивается в консоли в разделе [Marketplace](https://docs.didit.me/ru/console/marketplace.md), который сам задаёт `provider_key` и `fallback_to_native` в объекте `config` функции.

## Правила валидации

* `OCR` по умолчанию использует все поддерживаемые страны и типы документов, если `config.documents_allowed` не передан, равен `null` или `{}`. Если вы передаёте собственный объект `documents_allowed`, он должен содержать хотя бы одну допустимую страну и хотя бы один включённый тип документа. Каждая конфигурация документа может задавать `sides`: `1` для захвата только лицевой стороны или `2` для захвата лицевой и оборотной стороны.
* `QUESTIONNAIRE` требует `config.questionnaire_uuid`.
* `KYB_DOCUMENTS` требует `config.kyb_required_document_groups`.
* `SIGNATURE` возвращает ошибку `qes_not_available` при `signature_level: "qes"`, пока квалифицированные подписи не станут доступны, и ошибку `aes_not_available` для нового шага с `signature_level: "aes"`, пока `signature_availability.aes` имеет значение `false` в сценарии. Документы для этой функции должны существовать к моменту создания сессии: если `signature_documents_source` равен `workflow`, шагу нужны документы, загруженные в консоли; шаг без документов может остаться черновиком, но не может быть переведён в работу. Если указано `session`, каждый запрос на создание должен передавать `sign.documents`.
* `FACE_MATCH` должен идти после `OCR` в запросах для простых сценариев.
* `NFC` и `DATABASE_VALIDATION` требуют `OCR`, если они присутствуют в одном сценарии. Перед `AML` должна стоять одна из функций: `OCR`, `KYB_REGISTRY` или `DOCUMENT_AI`. Если перед ним стоит только `DOCUMENT_AI`, поле `full_name`, по которому выполняется скрининг, должно быть заполняемым: либо из поля Document AI, уже имеющего ключ `full_name` (оно сопоставляется автоматически), либо из явной записи `config.aml_field_sources` (см. [AML](#aml)).
* Подфункции KYB, такие как `KYB_DOCUMENTS` и `KYB_KEY_PEOPLE`, требуют, чтобы `KYB_REGISTRY` стоял раньше в сценарии.
* Сценарий является либо KYC-сценарием для физических лиц, либо KYB-сценарием для компаний, но не может быть и тем и другим. Сценарий, который использует любую функцию KYB (`KYB_REGISTRY`, `KYB_DOCUMENTS`, `KYB_KEY_PEOPLE`), может сочетать её только с `AML`, `DOCUMENT_AI`, `QUESTIONNAIRE`, `PHONE_VERIFICATION`, `EMAIL_VERIFICATION`, `IP_ANALYSIS` и `SIGNATURE`. Он не может включать функции только для физических лиц, такие как `OCR`, `LIVENESS`, `FACE_MATCH`, `NFC`, `PROOF_OF_ADDRESS`, `DATABASE_VALIDATION` или `AGE_ESTIMATION`, а KYC-сценарий не может включать функции KYB. В KYB-сценарии `DOCUMENT_AI` сравнивает любое поле с пометкой `is_full_name` с проверенной компанией, а не с человеком. Чтобы проверить людей, стоящих за компанией, создайте отдельный KYC-сценарий и укажите его в функции `KYB_KEY_PEOPLE` через `kyb_ubo_verification_workflow`, `kyb_officer_verification_workflow` или `kyb_shareholder_verification_workflow`.
* Поля действий принимают `DECLINE`, `REVIEW` или `NO_ACTION`, если в описании поля не указано иное.
* Поля оценок и порогов принимают числа от `0` до `100`, если не указан более узкий диапазон.

## Общие правила статусов

Каждая функция поддерживает необязательный массив `status_rules`. Используйте его, чтобы переопределить статус функции, когда выполняется условие для поля.

```json theme={null}
{
  "status_rules": [
    {
      "field": "kyc.issuing_state",
      "operator": "in",
      "value": ["VEN", "IRN"],
      "status": "In Review",
      "value_type": "literal"
    },
    {
      "field": "kyc.extra_fields.profession",
      "operator": "fuzzy_match",
      "value": "Soft. Engineer",
      "score": 80,
      "status": "Declined",
      "value_type": "literal"
    },
    {
      "field": "kyc.extra_fields.dl_class_code_b_to",
      "operator": "less_than",
      "value": "2030-01-01",
      "status": "In Review",
      "value_type": "literal"
    },
    {
      "field": "kyc.extra_fields.dl_class_code_b_from",
      "operator": "less_than",
      "value": { "direction": "past", "amount": 3, "unit": "years" },
      "status": "Declined",
      "value_type": "relative_date"
    }
  ]
}
```

| Поле | Тип | Описание |
| - | - | - |
| `field` | string | Путь к полю для проверки, например `kyc.issuing_state` или `kyc.document_type`. |
| `operator` | string | Один из операторов: `equals`, `not_equals`, `greater_than`, `greater_than_or_equals`, `less_than`, `less_than_or_equals`, `contains`, `not_contains`, `in`, `not_in`, `is_empty`, `is_not_empty`, `regex` или `fuzzy_match`. |
| `value` | any | Значение для сравнения. Не указывайте или передайте `null` для операторов, которым значение не нужно. |
| `status` | string | Один из статусов: `Approved`, `Declined`, `In Review` или `No Action`. |
| `value_type` | string | Необязательное поле. По умолчанию `literal`. Используйте `field`, чтобы сравнить с другим полем, `list`, чтобы определить UUID списка Didit во время выполнения, или `relative_date`, чтобы сравнить поле даты с сегодняшним днём плюс или минус заданный период. |
| `score` | number | Обязательно для `fuzzy_match`. Минимальная оценка сходства от `0` до `100`. Правило срабатывает, когда вычисленное сходство больше или равно этому значению (`similarity >= score`). Например, `Software Engineer` совпадает с `Soft. Engineer`, если сходство не ниже `80`. |

Пример выше читается так: `kyc.extra_fields.profession` нечётко совпадает с `Soft. Engineer` с минимальной оценкой `80`, и тогда статус функции устанавливается в `Declined`.

Для верификации личности указывайте извлечённые значения из `extra_fields`, например `kyc.extra_fields.profession`, даты действия классов водительского удостоверения, такие как `kyc.extra_fields.dl_class_code_b_from` и `kyc.extra_fields.dl_class_code_b_to`, или коды ограничений и сведений по каждому классу, например `kyc.extra_fields.dl_class_code_b_notes` (столбец 12 британских водительских удостоверений). Эти значения берутся из объекта `extra_fields` результата OCR; они не входят в `expected_details`.

> [!NOTE]
>
> Поля `dl_class_code_*_from` и `dl_class_code_*_to` всегда содержат либо корректную дату в формате ISO, либо отсутствуют в `extra_fields`. Didit никогда не возвращает нечитаемый текст OCR в поле даты. Если ячейку в таблице классов не удалось прочитать, поле пропускается, а не передаётся как необработанная строка. Поэтому для маршрутизации дат классов, которые не удалось прочитать, используйте оператор `is_empty`, а не исходите из того, что поле всегда присутствует.

Для полей дат используйте `value_type: "relative_date"` со значением в виде объекта `{ "direction": "past" | "future", "amount": number, "unit": "days" | "months" | "years" }`. Например, `operator: "less_than"` с `{ "direction": "past", "amount": 3, "unit": "years" }` совпадает с датами, которые были более чем на три года раньше сегодняшней даты.

### Сравнение с конкретным шагом

Граф сценария может запускать одну и ту же функцию несколько раз, например три шага верификации личности.
При `value_type: "field"` добавьте к значению суффикс `@<node_id>`, чтобы считать значение с одного конкретного шага.
Указанный узел должен быть шагом функции, который всегда выполняется до шага правила на каждом пути, ведущем к шагу правила, либо самим шагом правила.
Значение без суффикса считывается с шага, к которому относится правило.

```json theme={null}
{
  "status_rules": [
    {
      "field": "kyc.full_name",
      "operator": "fuzzy_match",
      "value": "kyc.full_name@ocr_1",
      "value_type": "field",
      "score": 80,
      "status": "Declined"
    }
  ]
}
```

Это правило, заданное на третьем шаге верификации личности, читается так: `kyc.full_name` этого шага нечётко совпадает с полным именем, извлечённым на шаге `ocr_1`, с минимальной оценкой `80`, и тогда статус функции устанавливается в `Declined`.
В консоли селектор переменных показывает каждый подходящий шаг по его номеру на холсте и сохраняет суффикс за вас.

## OCR / Верификация личности

Значение функции: `OCR`.

| Поле конфигурации | Тип | Описание |
| - | - | - |
| `documents_allowed` | object | Необязательный параметр. Чтобы разрешить все поддерживаемые страны и типы документов, опустите его, отправьте `null` или `{}`. Передайте код страны в формате ISO3 с конфигурацией типа документа, только если нужно ограничить допустимые документы. Хотя бы один пользовательский документ должен иметь `enabled: 1`. Конфигурации документов могут содержать `sides: 1` для съёмки только лицевой стороны или `sides: 2` для съёмки обеих сторон. Типы документов включают `P`, `ID`, `DL`, `RP`, `HIC`, `TC`, `SSC` и другие значения, поддерживаемые страной. |
| `methods` | object | Какими из трёх [методов верификации личности](https://docs.didit.me/ru/core-technology/id-verification/verification-methods.md) может пользоваться каждая страна: захват документа, поиск без документа в государственном или другом авторитетном источнике и цифровые кошельки ID. Если опустить ключ, страну или метод внутри страны, для этой страны будет доступен только захват документа. Каждый метод и кошелёк должен быть помечен как доступный для страны в каталоге возможностей, иначе сохранение будет отклонено. См. [Методы по странам](#методы-по-странам) ниже. |
| `document_blur_fields_by_country` | object | Код страны ISO3 и имена полей для размытия, которые нужно скрыть на изображениях документов. |
| `image_capture_methods_allowed` | string\[] | Разрешённые способы съёмки. Значения включают `CAMERA_SCAN` и `UPLOAD`. |
| `duplicated_user_action` | action | Действие для дублирующегося пользователя. |
| `is_age_restrictions_enabled` | boolean | Включает проверки минимального и максимального возраста. |
| `age_restrictions_by_country` | object | Код страны ISO3 и конфигурация возраста с `minimum_age`, необязательным `maximum_age` и необязательным `states`. |
| `minimum_age` | integer | Глобальный минимальный возраст, от `1` до `120`. |
| `minimum_age_action` | action | Действие, если возраст пользователя ниже `minimum_age`. |
| `maximum_age` | integer | Глобальный максимальный возраст, от `1` до `120`. |
| `maximum_age_action` | action | Действие, если возраст пользователя выше `maximum_age`. |
| `expiration_date_not_detected_action` | action | Действие, если срок действия документа отсутствует. |
| `invalid_code_action` | action | Действие, если штрихкод или машиночитаемый код недействителен. |
| `invalid_mrz_action` | action | Действие, если MRZ-зона недействительна. |
| `inconsistent_data_action` | action | Действие, если извлечённые поля документа противоречат друг другу. |
| `invalid_validation_action` | action | Действие, если проверка документа не пройдена. |
| `expected_details_mismatch_action` | action | Действие, если ожидаемые данные пользователя не совпадают с данными документа. |
| `image_too_blurry_action` | action | Действие для размытых изображений документов. |
| `image_too_dark_action` | action | Действие для тёмных изображений документов. |
| `image_too_bright_action` | action | Действие для переэкспонированных изображений документов. |
| `unparsed_address_action` | action | Действие, если адрес в документе не удаётся разобрать. |
| `address_validation_enabled` | boolean | Проверяет адрес, который считывает этот шаг (напечатанный в удостоверении личности), по справочным данным почтовых адресов: подтверждает, что адрес существует, и приводит его к стандартному виду, но никогда не связывает его с человеком. Результат попадает в объект `address_validation` шага в решении. **Списывается \$0.10 за каждый проверенный адрес**; проверка, которая не смогла выполниться (`unavailable`), бесплатна. По умолчанию выключено. |
| `address_not_verified_action` | action | Действие, если Валидация адреса не смогла подтвердить адрес до уровня здания (`ADDRESS_NOT_VERIFIED`: `partially_verified` или `not_verified`). Применяется только при включённом `address_validation_enabled`. По умолчанию `NO_ACTION`, то есть только фиксируется предупреждение. |
| `document_or_personal_number_format_mismatch_action` | action | Действие, если формат номера документа или личного номера не соответствует ожидаемому шаблону. |
| `critical_field_occlusion_action` | action | Действие, если проверка перекрытия показывает, что критически важное напечатанное поле (идентификационный номер, имя, дата рождения или срок действия) закрыто на снятом документе. Закрытие идентификационного номера является признаком вмешательства в документ, а не проблемой качества съёмки, поэтому по умолчанию стоит `REVIEW`. Значение, считанное из закрытого поля, в любом случае исключается из извлечённых данных. Повысьте до `DECLINE`, если документ с замазанными данными ни в коем случае не должен попадать к проверяющему. |
| `document_without_portrait_action` | action | Действие, если распознанный тип документа никогда не содержит фотографии ни на одной стороне (некоторые виды на жительство, медицинские карты, свидетельства о регистрации и другие известные каталогу семейства документов без портрета). По умолчанию `REVIEW`. Рассмотрите `DECLINE`, если Сравнение лиц служит основой проверки личности в сценарии. |
| `is_document_selfie_portrait_match_enabled` | boolean | Включает сравнение портрета из документа с селфи. |
| `document_selfie_portrait_match_decline_threshold` | integer | Порог отклонения для сравнения портрета из документа с селфи. |
| `document_selfie_portrait_match_review_threshold` | integer | Порог проверки для сравнения портрета из документа с селфи. |
| `document_selfie_face_search_enabled` | boolean | Запускает [Поиск по лицу 1:N](https://docs.didit.me/ru/core-technology/face-search/overview.md#селфи-сделанное-во-время-захвата-документа) по селфи, сделанному при съёмке документа (требует `is_document_selfie_portrait_match_enabled`): сравнивает его со списком блокировки лиц и ранее верифицированными пользователями. Селфи только сравнивается, его шаблон никогда не сохраняется. По умолчанию включено. Значение `false` пропускает поиск, и действия для дублирующихся лиц по селфи из документа не получают данных для обработки. `face_search_enabled: false` на шаге Проверки живости тоже пропускает поиск, поскольку этот отказ распространяется на все селфи в сессии. |
| `document_selfie_duplicated_face_action` | action | Вердикт, если селфи при съёмке документа совпадает или, возможно, совпадает с лицом пользователя, уже верифицированного в этом приложении. По умолчанию `NO_ACTION`. |
| `document_selfie_duplicated_face_name_mismatch_action` | action | Вердикт, если селфи при съёмке документа совпадает с пользователем, уже верифицированным под другим именем. Может только ужесточить `document_selfie_duplicated_face_action`. По умолчанию `REVIEW`. |
| `document_selfie_duplicated_face_document_mismatch_action` | action | Вердикт, если селфи при съёмке документа совпадает с пользователем, уже верифицированным с другой датой рождения в его удостоверении личности. Тот же человек с другим или перевыпущенным документом не помечается. Может только ужесточить `document_selfie_duplicated_face_action`. По умолчанию `REVIEW`. |
| `id_verification_name_match_score_threshold` | integer | Порог совпадения имён при нескольких верификациях личности. |
| `id_verification_max_retry_attempts` | integer | Лимит повторных попыток верификации личности, от `2` до `5`. |
| `id_document_quality_threshold` | integer | Минимальная оценка качества снимка (от `0` до `100`), которую должно набрать изображение документа, чтобы его приняли. Проверка качества выполняется всегда, настраивается только этот порог. По умолчанию `20`: порог подобран так, что размытые и пограничные снимки (размытие, смаз, нечитаемый текст) отклоняются, а читаемые документы проходят. Для более строгих требований к снимку увеличьте значение. Консоль показывает это значение на перцептивном ползунке, где значение по умолчанию `20` отображается как сбалансированное значение: 50%. |
| `cross_org_fraud_document_action` | действие | Вердикт, если этот документ был помечен другой организацией в сети как поддельный. |
| `document_audio_recording_enabled` | boolean | Записывать звук с микрофона во время съёмки документа, чтобы проверяющий мог слышать сессию. По умолчанию выключено. |
| `document_liveness_portrait_replace_decline_threshold` | integer | Оценка замены портрета (от `0` до `100`, чем выше, тем вероятнее подлинность), ниже которой сессия отклоняется. По умолчанию `35`. См. [пороги проверки живости документа](https://docs.didit.me/ru/core-technology/id-verification/warnings-id-verification.md#настройка-порогов-проверки-живости-документа). |
| `document_liveness_portrait_replace_review_threshold` | integer | Оценка замены портрета, ниже которой сессия переходит в статус «На проверке», если она уже не отклонена. При `100` почти каждая сессия удерживается на проверке. По умолчанию `70`. См. [пороги проверки живости документа](https://docs.didit.me/ru/core-technology/id-verification/warnings-id-verification.md#настройка-порогов-проверки-живости-документа). |
| `document_liveness_printed_copy_decline_threshold` | integer | Оценка распечатанной копии (от `0` до `100`, чем выше, тем вероятнее подлинность), ниже которой сессия отклоняется. По умолчанию `35`. См. [пороги проверки живости документа](https://docs.didit.me/ru/core-technology/id-verification/warnings-id-verification.md#настройка-порогов-проверки-живости-документа). |
| `document_liveness_printed_copy_review_threshold` | integer | Оценка распечатанной копии, ниже которой сессия переходит в статус «На проверке», если она уже не отклонена. При `100` почти каждая сессия удерживается на проверке. По умолчанию `77`. См. [пороги проверки живости документа](https://docs.didit.me/ru/core-technology/id-verification/warnings-id-verification.md#настройка-порогов-проверки-живости-документа). |
| `document_liveness_screen_replay_decline_threshold` | integer | Оценка захвата экрана (от `0` до `100`, чем выше, тем вероятнее подлинность), ниже которой сессия отклоняется. По умолчанию `30`. См. [пороги проверки живости документа](https://docs.didit.me/ru/core-technology/id-verification/warnings-id-verification.md#настройка-порогов-проверки-живости-документа). |
| `document_liveness_screen_replay_review_threshold` | integer | Оценка захвата экрана, ниже которой сессия переходит в статус «На проверке», если она уже не отклонена. При `100` почти каждая сессия удерживается на проверке. По умолчанию `70`. См. [пороги проверки живости документа](https://docs.didit.me/ru/core-technology/id-verification/warnings-id-verification.md#настройка-порогов-проверки-живости-документа). |
| `id_verification_injection_attack_action` | действие | Вердикт, если документ или селфи, сделанное для проверки личности, было внедрено, а не снято собственной камерой устройства (`INJECTION_ATTACK_DETECTED`): программная виртуальная камера, поток камеры, сгенерированный самой страницей или браузерной автоматизацией, перехваченная камера или инструмент инструментирования, подключённый к приложению. Значения: `DECLINE`, `REVIEW`, `NO_ACTION`. По умолчанию `DECLINE`. Сигналы, которые может создать реальный человек, никогда не приводят к этому вердикту. Для проверки живости и сравнения лиц риск определяется `frame_injection_action`. |
| `image_quality_too_low_action` | действие | Вердикт, если общее качество изображения документа ниже допустимого уровня. |
| `is_image_capture_review_screen_enabled` | boolean | Показывать пользователю экран проверки после каждого снимка документа, позволяя переснять фото до отправки. По умолчанию выключено. |
| `is_ocr_id_verification_data_review_enabled` | boolean | Позволять пользователю проверить и исправить извлечённые данные личности до завершения шага. По умолчанию выключено. Исправление сверяется с `ocr_id_verification_data_review_critical_fields`, а при расхождении применяется критическое или незначительное действие соответственно. Проверка выполняется и тогда, когда сценарий включает NFC: последующее чтение чипа просто заменяет её результат. |
| `ocr_id_verification_data_review_critical_fields` | string\[] | Какие извлечённые поля личности считаются критическими, когда пользователь редактирует результат OCR, чтобы расхождение применяло критическое действие, а не незначительное. Формат: `["first_name" \| "last_name" \| "date_of_birth" \| ...]`. |
| `ocr_id_verification_data_review_critical_mismatch_action` | ограниченное действие | Вердикт, если правка пользователя расходится с OCR по критическому полю. |
| `ocr_id_verification_data_review_minor_mismatch_action` | действие | Вердикт, если правка пользователя расходится с OCR по некритическому полю. |
| `status_rules` | array | Необязательные пользовательские правила статусов. |

> [!NOTE]
>
> Проверка живости документа настраивается шестью порогами `document_liveness_*` выше, а не полями действий для каждого сигнала. `portrait_replacement_action`, `printed_copy_action` и `screen_capture_action` являются настройками уровня аккаунта и **не** принимаются в конфигурации функций сценария: API удаляет неизвестные ключи конфигурации при сохранении, поэтому их отправка там не имеет эффекта. Для каждого сигнала есть порог отклонения и порог проверки по шкале от `0` до `100`, где более высокая оценка означает, что документ с большей вероятностью является подлинным.

Пример:

```json theme={null}
{
  "feature": "OCR",
  "config": {
    "documents_allowed": {
      "USA": {
        "DL": {
          "enabled": 1,
          "sides": 2
        }
      }
    },
    "duplicated_user_action": "REVIEW",
    "image_capture_methods_allowed": ["CAMERA_SCAN", "UPLOAD"]
  }
}
```

### Методы по странам

`methods` задаётся по коду страны [ISO 3166-1 alpha-3](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-3). Для каждой страны указывается до трёх объектов методов. Всё, что вы не укажете, получает значение по умолчанию.

```json theme={null}
{
  "feature": "OCR",
  "config": {
    "methods": {
      "ZAF": {
        "document": { "enabled": true },
        "id_lookup": {
          "enabled": true,
          "max_attempts": 2,
          "skip_liveness_and_face_match": true,
          "on_partial_match": "fallback_to_document",
          "on_no_match": "fallback_to_document",
          "on_provider_error": "fallback_to_document"
        },
        "wallet": { "enabled": false, "providers": [], "on_failure": "fallback_to_document" }
      },
      "DNK": {
        "document": { "enabled": true },
        "id_lookup": { "enabled": true, "on_no_match": "decline" }
      }
    }
  }
}
```

`wallet.on_failure` может принимать значения `fallback_to_document`, `decline` или `retry`. `retry` (только для кошелька, когда захват документа отключён для страны) оставляет пользователю, чей вход не завершился на шаге кошелька, возможность попробовать снова. Сессия никогда не отклоняется по этой причине и остаётся открытой, пока пользователь не завершит шаг или она не истечёт. Переключатели id\_lookup принимают только `fallback_to_document` или `decline`.

Чтобы не показывать документы на первом экране и предлагать их, только если кошелёк или поиск не сработали, задайте `document.fallback_only`. В примере используется Финляндия, где сначала идёт Finnish Trust Network, а захват документа служит запасным вариантом. Для Финляндии также нужно включить типы документов в `documents_allowed` (например, паспорт и ID-карту), чтобы у запасного варианта были документы для предложения.

```json theme={null}
{
  "FIN": {
    "document": { "enabled": true, "fallback_only": true },
    "wallet": { "enabled": true, "providers": ["ftn"], "on_failure": "fallback_to_document" }
  }
}
```

Обе проверки выше имеют статус `available` в текущем каталоге, поэтому эта конфигурация сохраняется как написано. Блок кошелька намеренно опущен в этом примере: конфигурация кошелька сохраняется только для страны, где каталог помечает его как `available`. Значение `wallet.enabled: true` в любой другой стране отклоняется и отменяет всё сохранение, включая конфигурацию поиска. Если каталог помечает кошелёк как `available` в нужной вам стране, добавьте его для этой страны:

```json theme={null}
{
  "DNK": {
    "document": { "enabled": true },
    "wallet": { "enabled": true, "providers": ["mitid"], "on_failure": "fallback_to_document" }
  }
}
```

| Ключ | Тип | По умолчанию | Описание |
| - | - | - | - |
| `<ISO3>.document.enabled` | boolean | `true` | Принимается ли в этой стране сфотографированный документ. Какие документы принимаются, по-прежнему задаётся в `documents_allowed`. |
| `<ISO3>.document.fallback_only` | boolean | `false` | Оставить съёмку документа включённой, но не предлагать её на первом экране. Пользователи начинают с кошелька или проверки по реестру страны, и к съёмке документа переходят только те, у кого вход через кошелёк не удался, был отменён или истёк срок ожидания, или чья проверка по реестру не совпала (при значении `fallback_to_document` в переключателях `on_failure`, `on_partial_match`, `on_no_match` и `on_provider_error`). Если кошелёк один, пользователь сразу попадает на него. Если кошелька нет, кошелёк или проверка по реестру показываются рядом со съёмкой документа. Отклоняется с HTTP 400, если `document.enabled` не равно `true` или ни один кошелёк и ни одна проверка по реестру в стране не переходит к съёмке документа. |
| `<ISO3>.id_lookup.enabled` | boolean | `false` | Предлагать проверку без документа по государственному или другому авторитетному источнику этой страны. Отклоняется, если в каталоге источник страны не помечен как `available`. |
| `<ISO3>.id_lookup.max_attempts` | integer | `1` | От `1` до `5`. Сколько **получивших ответ** проверок по реестру пользователь может выполнить до срабатывания переключателя перехода к документу. Число, которое не проходит проверку формата на стороне клиента, не доходит до реестра, поэтому не учитывается и не тарифицируется. |
| `<ISO3>.id_lookup.skip_liveness_and_face_match` | boolean | `true` | После совпадения с реестром, который возвращает портрет, пропускать собственные шаги сценария «Проверка живости» и «Сравнение лиц». Проверка по реестру уже выполнила пассивную проверку живости селфи и сверила его с этим портретом. При сохранении для источника, который не возвращает портрет, значение принудительно становится `false`, так как переключатель в этом случае не имеет смысла. |
| `<ISO3>.id_lookup.on_partial_match` | `fallback_to_document` \| `decline` | `fallback_to_document` | Что происходит, когда реестр ответил, но некоторые поля не совпали. |
| `<ISO3>.id_lookup.on_no_match` | `fallback_to_document` \| `decline` | `fallback_to_document` | Что происходит, когда реестр ответил и не содержит подходящей записи. |
| `<ISO3>.id_lookup.on_provider_error` | `fallback_to_document` \| `decline` | `fallback_to_document` | Что происходит, когда связаться с реестром не удалось. Никогда не тарифицируется. |
| `<ISO3>.id_lookup.response_fields` | string\[] \| null | `null` | Необязательное подмножество ключей полей ответа источника. Неизвестные ключи отклоняются, а обязательные поля источника всегда добавляются обратно, поэтому сохранённое значение всегда является допустимым выбором. Текущая реализация в тестовой среде применяет этот выбор к результатам сравнения, необязательному полю «пол» и сохраняемым портретам из реестра. Обязательные поля идентификации остаются. См. примечание о развёртывании и хранении ниже. |
| `<ISO3>.wallet.enabled` | boolean | `false` | Предлагать вход через цифровой кошелёк удостоверения личности в этой стране. |
| `<ISO3>.wallet.providers` | string\[] | `[]` | Идентификаторы кошельков из каталога, которые принимает эта страна. Это список допустимых, а не рейтинг. Порядок, который вы передаёте, приводится к порядку каталога. Если `enabled` равно `true`, требуется хотя бы один кошелёк. Кошелёк, который не предлагается в этой стране или который ещё «скоро появится», отклоняется. |
| `<ISO3>.wallet.on_failure` | `fallback_to_document` \| `decline` \| `retry` | `fallback_to_document` | Что происходит, когда вход отменён, истёк срок ожидания или не удался. `retry` оставляет пользователя на шаге кошелька для повторной попытки (только для кошелька). Оно не допускается вместе с `document.fallback_only`. |

Правила валидации, которые API применяет при сохранении:

* Неизвестный код страны, неизвестный ключ внутри страны или неизвестный ключ внутри метода отклоняются. Ничего не отбрасывается молча.
* Страна, в которой не включён ни один метод, отклоняется: там никто не сможет пройти верификацию.
* Кошелёк или проверка по реестру могут перейти к съёмке документа только тогда, когда съёмка документа включена для этой страны. Значение `fallback_to_document` в стране, где `document.enabled` равно `false`, приводит к отказу во время выполнения, потому что переходить некуда.
* `document.fallback_only: true` отклоняется с HTTP 400, если `document.enabled` не равно `true` или ни один кошелёк и ни одна проверка по реестру в этой стране не переходит к съёмке документа.

> [!WARNING]
>
> Текущая реализация в тестовой среде применяет `id_lookup.response_fields` к результатам сравнения, необязательному полю «пол» и сохраняемым портретам из реестра. Обязательные поля идентификации остаются частью записи о верификации. Это не гарантия того, что каждый промежуточный payload провайдера исключается из обработки. Развёртывание этого изменения в продакшн не проверялось. Перед тем как полагаться на выбор полей для требований к хранению данных, убедитесь в поведении в целевой среде.

Перед тем как писать `methods`, изучите каталог возможностей: во вкладке **Страны** консоли или с помощью MCP-инструмента [`didit_workflow_get_id_verification_methods_catalog`](https://docs.didit.me/ru/integration/mcp/tools). Поведение, покрытие и биллинг описаны на странице [Методы верификации личности](https://docs.didit.me/ru/core-technology/id-verification/verification-methods.md).

## NFC / ePassport

Значение функции: `NFC`.

| Поле конфигурации | Тип | Описание |
| - | - | - |
| `allow_nfc_skip` | boolean | Разрешает пользователям пропускать NFC, если их документ поддерживает считывание чипа. |
| `skip_nfc_action` | action | Действие, когда пользователь пропускает NFC. |
| `unverified_chip_action` | action | Действие, когда проверка чипа не проходит. |
| `trust_anchor_missing_action` | action | Решение, когда хэши групп данных чипа не нарушены, но цепочку сертификатов проверить нельзя, так как не загружен доверенный корневой сертификат CSCA для страны выдачи. |
| `jpki_request_attributes` | boolean | Японская карта My Number ([JPKI](https://docs.didit.me/ru/core-technology/nfc-verification/overview.md#карта-my-number-в-японии-jpki), только нативные SDK): также считывает сертификат подписи, для которого нужен PIN-код подписи карты и который содержит имя, дату рождения, пол и адрес владельца; они сравниваются с данными верификации личности. По умолчанию `true`. При `false` считывается только сертификат аутентификации пользователя (PIN-код из 4 цифр), который подтверждает карту и PIN-код, но не содержит данных владельца. |
| `jpki_certificate_invalid_action` | action | Решение, когда сертификат карты My Number не образует цепочку до центра сертификации JPKI, находится вне срока действия или не является сертификатом карты запрошенного типа (`JPKI_CERTIFICATE_INVALID`). По умолчанию `DECLINE`. |
| `jpki_signature_invalid_action` | action | Решение, когда подпись карты My Number для одноразового вызова не проходит проверку, поэтому владение картой и знание её PIN-кода не подтверждены (`JPKI_SIGNATURE_INVALID`). По умолчанию `DECLINE`. |
| `jpki_certificate_revoked_action` | action | Решение, когда проверка отзыва сообщает, что сертификат карты My Number отозван (`JPKI_CERTIFICATE_REVOKED`). По умолчанию `DECLINE`. |
| `jpki_revocation_unchecked_action` | action | Решение, когда карта My Number проверена, но ответ о статусе отзыва получить не удалось, поэтому нельзя исключить, что карта отозвана (`JPKI_REVOCATION_UNCHECKED`). По умолчанию `REVIEW`. |
| `jpki_inconsistent_data_action` | action | Решение, когда имя, дата рождения, пол или адрес в сертификате подписи карты My Number отличаются от данных верификации личности по той же карте (`JPKI_AND_OCR_DATA_NOT_SAME`). По умолчанию `REVIEW`. |
| `status_rules` | array | Необязательные пользовательские правила статусов. |

## Liveness

Значение функции: `LIVENESS`.

| Поле конфигурации | Тип | Описание |
| - | - | - |
| `face_liveness_method` | string | Один из: `ACTIVE_3D`, `FLASHING` или `PASSIVE`. |
| `face_liveness_mode` | string | Переопределение режима проверки живости. |
| `face_liveness_flash_mode` | string | Режим вспышки для методов `ACTIVE_3D` и `FLASHING`. `"0"` (не строгий, по умолчанию) проверяет, что цвета, показанные на экране, отражаются на лице пользователя; `"1"` (строгий) дополнительно требует, чтобы отражения совпадали с точной последовательностью показанных цветов. Такой режим надёжнее защищает от атак повтором и инъекцией видео, но при нём выше вероятность ложных отказов. |
| `face_liveness_score_decline_threshold` | integer | Порог отклонения. |
| `face_liveness_score_review_threshold` | integer | Порог проверки вручную. |
| `face_liveness_possible_duplicated_face_action` | action | Действие при возможном дублировании лица. |
| `face_liveness_multiple_faces_action` | action | Действие, если обнаружено несколько лиц. |
| `face_liveness_video_anomaly_action` | action | Действие, если в сохранённой записи найдена повторяющаяся последовательность движений. По умолчанию `NO_ACTION`; `REVIEW` и `DECLINE` могут асинхронно изменить уже принятое решение по верификации. Разреженные или повторяющиеся неподвижные кадры сами по себе не запускают его. |
| `face_liveness_attack_face_match_action` | action | Действие, если лицо при проверке живости совпадает с лицом из более ранней сессии этого приложения другого пользователя, попытка которого с высокой степенью уверенности признана атакой на проверку живости (предупреждение `FACE_MATCHES_LIVENESS_ATTACK`). Принимает `NO_ACTION` или `REVIEW`; `DECLINE` принимается, но применяется как `REVIEW`, поскольку настоящий пользователь может по ошибке получить отказ один раз и затем пройти проверку. По умолчанию `NO_ACTION`. |
| `race_map_similarity_thresholds` | object | Пороги сходства для отдельных демографических групп. |
| `face_privacy_mode_enabled` | boolean | Включает режим конфиденциальности для материалов, связанных с лицом. |
| `face_quality_review_threshold` | integer | Порог проверки вручную для качества изображения лица. |
| `face_quality_decline_threshold` | integer | Порог отклонения для качества изображения лица. Должен быть меньше или равен порогу проверки вручную. |
| `face_luminance_min_threshold` | integer | Минимальный порог яркости. Должен быть меньше `face_luminance_max_threshold`. |
| `face_luminance_min_action` | action | Действие, если яркость слишком низкая. |
| `face_luminance_max_threshold` | integer | Максимальный порог яркости. |
| `face_luminance_max_action` | action | Действие, если яркость слишком высокая. |
| `face_liveness_max_attempts` | integer | Общее число отправок для проверки живости за сессию, от `1` до `3`. Значение `3` по умолчанию означает первую попытку и две повторные. Значение `1` не отключает повторы при ошибках качества съёмки: если все предупреждения в попытке связаны с условиями окружающей среды (`LOW_FACE_LUMINANCE`, `HIGH_FACE_LUMINANCE`, `LOW_FACE_QUALITY`, `HIGH_FACE_OCCLUSION`, `NO_FACE_DETECTED`), пользователь всегда получает вторую попытку с понятными подсказками. |
| `cross_org_fraud_face_action` | action | **Устарело и больше не применяется.** Оно рассматривало лицо так, будто с ним связано решение о мошенничестве, которое не может быть присуще стабильной биометрической идентичности. Всё ещё принимается, чтобы существующие сценарии продолжали проходить валидацию. Используйте `cross_org_identity_claim_pattern_action`. |
| `cross_org_identity_claim_pattern_action` | action | Решение, если другие организации в сети зафиксировали события, в которых этот человек заявлял о своей личности, но заявленная личность не совпадала. Только проверка вручную или без действия: отклонение, заданное здесь, понижается до проверки вручную. См. [Перекрёстные заявления личности между организациями](https://docs.didit.me/ru/core-technology/liveness/cross-organization-identity-claims.md). |
| `external_capture_device_action` | action | Решение, если обнаружено внешнее устройство захвата. |
| `face_audio_recording_enabled` | boolean | Записывает звук с микрофона во время съёмки селфи, чтобы проверяющий мог прослушать сессию. По умолчанию выключено. |
| `face_search_enabled` | boolean | Запускает автоматический [Поиск по лицу 1:N](https://docs.didit.me/ru/core-technology/face-search/overview.md#отключение-автоматического-поиска-по-лицу) для селфи: сравнивает его с ранее верифицированными пользователями, со списком блокировки и списком разрешённых лиц и сохраняет его биометрический шаблон для последующих сравнений. По умолчанию включено. Значение `false` пропускает поиск, не сохраняет шаблон лица для этого шага и поэтому действия при дублировании лица не к чему применять. |
| `face_liveness_uncertain_retry_enabled` | boolean | Только для активной проверки живости в нативном SDK. Если включено, снимок, оценка живости которого строго находится между `face_liveness_score_decline_threshold` и `face_liveness_score_review_threshold`, никогда не получает решение, какой бы вердикт ни присвоил ему движок: пользователю сообщают, что результат неясен, и просят повторить съёмку, каждый раз, и это не учитывается в бюджете `face_liveness_max_attempts` (который по-прежнему применяется к снимкам, которые движок не смог оценить). По умолчанию выключено; веб-сценарий это поле игнорирует. |
| `face_liveness_duplicated_face_name_mismatch_action` | action | Решение, если дублирующее лицо найдено под другим именем. |
| `face_liveness_duplicated_face_document_mismatch_action` | action | Решение, если дублирующее лицо найдено, а в документе удостоверения личности сопоставленного пользователя указана другая дата рождения. Тот же человек с другим или переоформленным документом не помечается. По умолчанию `REVIEW`. |
| `frame_injection_action` | action | Решение, если обнаружены внедрённые кадры видео. |
| `screen_capture_action` | action | Решение, если селфи является фотографией экрана. |
| `virtual_camera_action` | action | Решение, если обнаружен поток виртуальной камеры. |
| `status_rules` | array | Необязательные пользовательские правила статуса. |

## Сравнение лиц

Значение функции: `FACE_MATCH`.

| Поле конфигурации | Тип | Описание |
| - | - | - |
| `face_match_score_decline_threshold` | целое число | Порог отклонения. |
| `face_match_score_review_threshold` | целое число | Порог проверки. |
| `face_match_max_attempts` | целое число | Общее число отправок для сравнения лиц за сессию, от `1` до `3`. Значение по умолчанию `3` означает одну первичную попытку и две повторные. |
| `face_match_not_computed_action` | ограниченное действие | Решение, если не удалось получить оценку сравнения лиц (отсутствует портрет или селфи). |
| `face_match_eyes_covered_action` | действие | Решение, если область глаз закрыта на селфи. По умолчанию `NO_ACTION`: доказательство фиксируется, но результат сравнения лиц не меняется. Этот сигнал всё ещё калибруется, поэтому он работает только в теневом режиме, пока область не получит статус откалиброванной. Если установить `REVIEW` или `DECLINE` сейчас, он начнёт действовать с этого момента. |
| `face_match_mouth_covered_action` | действие | Решение, если область рта закрыта на селфи. Значение по умолчанию то же, `NO_ACTION`, и действует то же предупреждение о калибровке, что и для `face_match_eyes_covered_action`. |
| `face_match_face_covered_action` | действие | Решение, если лицо целиком закрыто на селфи. Значение по умолчанию то же, `NO_ACTION`, и действует то же предупреждение о калибровке, что и для `face_match_eyes_covered_action`. |
| `status_rules` | массив | Необязательные пользовательские правила статусов. |

## Оценка возраста

Значение функции: `AGE_ESTIMATION`.

| Поле конфигурации | Тип | Описание |
| - | - | - |
| `enable_id_verification_fallback` | boolean | Запускает верификацию личности, если оценка возраста попадает в пограничный диапазон. |
| `minimum_age_threshold` | integer | Минимальный допустимый возраст, от `1` до `100`. |
| `borderline_minimum_age_threshold` | integer | Нижняя граница пограничного диапазона, от `1` до `100`. |
| `borderline_maximum_age_threshold` | integer | Верхняя граница пограничного диапазона, от `1` до `100`. |
| `face_liveness_method` | string | Одно из значений: `ACTIVE_3D`, `FLASHING` или `PASSIVE`. |
| `face_liveness_flash_mode` | string | Режим вспышки для методов `ACTIVE_3D` и `FLASHING`. `"0"` (не строгий, по умолчанию) проверяет, что цвета, показанные на экране, отражаются на лице пользователя; `"1"` (строгий) дополнительно требует, чтобы отражения совпадали с точной последовательностью показанных цветов. |
| `face_liveness_score_decline_threshold` | number | Порог отклонения для проверки живости, которая используется при оценке возраста. |
| `face_liveness_score_review_threshold` | number | Порог проверки для проверки живости, которая используется при оценке возраста. |
| `face_liveness_possible_duplicated_face_action` | action | Действие, если лицо может быть дубликатом. |
| `face_liveness_multiple_faces_action` | action | Действие, если обнаружено несколько лиц. |
| `face_liveness_video_anomaly_action` | action | Действие, если в сохранённой записи обнаружена повторяющаяся последовательность движений. По умолчанию `NO_ACTION`; `REVIEW` и `DECLINE` могут асинхронно изменить уже принятое решение по верификации. Редкие или повторяющиеся статичные кадры сами по себе это действие не запускают. |
| `face_liveness_attack_face_match_action` | action | Действие, если лицо при проверке живости совпадает с лицом из более ранней сессии этого приложения другого пользователя, съёмка которого с высокой степенью уверенности была признана атакой на проверку живости (предупреждение `FACE_MATCHES_LIVENESS_ATTACK`). Принимает `NO_ACTION` или `REVIEW`; `DECLINE` принимается, но применяется как `REVIEW`, поскольку настоящий пользователь может быть ошибочно отклонён один раз, а затем пройти проверку. По умолчанию `NO_ACTION`. |
| `face_privacy_mode_enabled` | boolean | Включает режим конфиденциальности для данных о лице. |
| `face_quality_review_threshold` | integer | Порог проверки для качества лица. |
| `face_quality_decline_threshold` | integer | Порог отклонения для качества лица. |
| `face_luminance_min_threshold` | integer | Минимальный порог яркости. |
| `face_luminance_min_action` | action | Действие, если яркость слишком низкая. |
| `face_luminance_max_threshold` | integer | Максимальный порог яркости. |
| `face_luminance_max_action` | action | Действие, если яркость слишком высокая. |
| `face_liveness_max_attempts` | integer | Общее число отправок проверки живости за сессию, от `1` до `3`. Значение `3` по умолчанию означает первую попытку и две повторные. Значение `1` не отключает повторные попытки при ошибках качества съёмки: если все предупреждения попытки связаны с условиями среды (`LOW_FACE_LUMINANCE`, `HIGH_FACE_LUMINANCE`, `LOW_FACE_QUALITY`, `HIGH_FACE_OCCLUSION`, `NO_FACE_DETECTED`), пользователь всегда получает вторую попытку с понятными рекомендациями. |
| `external_capture_device_action` | action | Решение, если обнаружено внешнее устройство съёмки. |
| `face_audio_recording_enabled` | boolean | Записывает микрофон во время съёмки селфи, чтобы проверяющий мог прослушать сессию. По умолчанию выключено. |
| `face_search_enabled` | boolean | Запускает автоматический [Поиск по лицу 1:N](https://docs.didit.me/ru/core-technology/face-search/overview.md#отключение-автоматического-поиска-по-лицу) по селфи: сопоставляет его с ранее верифицированными пользователями, списком блокировки и списком разрешённых лиц, а также сохраняет его биометрический шаблон для последующих сравнений. По умолчанию включено. Значение `false` пропускает поиск, не сохраняет шаблон лица для этого шага, и действия при обнаружении дубликата лица не получают данных для обработки. |
| `face_liveness_uncertain_retry_enabled` | boolean | Только для нативного SDK с активной проверкой живости. Если включено, съёмка, оценка живости которой строго находится между `face_liveness_score_decline_threshold` и `face_liveness_score_review_threshold`, никогда не получает решения, независимо от того, какой вердикт присвоил ей движок: пользователю сообщают, что результат был неясен, и каждый раз просят снять повторно, вне бюджета `face_liveness_max_attempts` (который по-прежнему применяется к съёмкам, которые движок не смог оценить). По умолчанию выключено; веб-поток его не использует. |
| `face_liveness_duplicated_face_name_mismatch_action` | action | Решение, если дубликат лица найден под другим именем. |
| `face_liveness_duplicated_face_document_mismatch_action` | action | Решение, если дубликат лица найден, а в удостоверении личности сопоставленного пользователя указана другая дата рождения. Тот же человек с другим или перевыпущенным документом не помечается. По умолчанию `REVIEW`. |
| `frame_injection_action` | action | Решение, если обнаружены внедрённые видеокадры. |
| `screen_capture_action` | action | Решение, если селфи является фотографией экрана. |
| `virtual_camera_action` | action | Решение, если обнаружен поток виртуальной камеры. |
| `status_rules` | array | Необязательные пользовательские правила статусов. |

## Проверка телефона

Значение функции: `PHONE_VERIFICATION`.

| Поле конфигурации | Тип | Описание |
| - | - | - |
| `code_size` | целое число | Длина OTP-кода, от `4` до `8`. |
| `phone_max_retries` | целое число | Максимальное количество повторных отправок, от `1` до `5`. |
| `phone_max_check_attempts` | целое число | Максимальное количество попыток проверки OTP-кода, от `1` до `5`. |
| `phone_verification_countries` | объект | Соответствие ISO2-кода страны настройкам канала. Пример: `{ "US": { "sms": { "enabled": true } } }`. |
| `disposable_number_action` | действие | Действие для одноразовых номеров. |
| `voip_number_action` | действие | Действие для VoIP-номеров. |
| `duplicated_phone_number_action` | действие | Действие для повторяющихся номеров телефона. |
| `high_risk_phone_action` | действие | Действие, когда провайдер доставки блокирует отправку OTP-кода. Только `DECLINE` или `REVIEW`; по умолчанию `DECLINE`. Применяется, только если каждая блокировка на шаге содержит `risk_factors` ровно из `["device_attribute"]`. Любой другой фактор риска, любая комбинация, включающая его, или отсутствие факторов риска приводят к отклонению независимо от этой настройки. |
| `phone_shared_device_mode` | логическое значение | Разрешает режим проверки телефона на общем устройстве. |
| `phone_enrichment_enabled` | логическое значение | Включает обогащение данными о телефоне (риск типа линии, индекс доверия, оператор, история переноса номера и SIM-swap, оценка риска мошенничества). **Стоимость: \$0.05 за верификацию** сверх стоимости проверки телефона. |
| `phone_intelligence_score_action` | действие | Действие, когда оценка риска мошенничества для телефона равна или выше `phone_intelligence_score_threshold`. |
| `phone_intelligence_score_threshold` | целое число | Оценка риска мошенничества (`0`–`100`, чем выше, тем рискованнее), при которой срабатывает `phone_intelligence_score_action`. По умолчанию `80`. |
| `phone_type_risk_action` | действие | Действие, когда номер помечен как тип телефона, связанный с высоким риском. |
| `recent_port_action` | действие | Действие, когда номер недавно был перенесен (сигнал SIM-swap или переноса номера). |
| `low_phone_trust_action` | действие | Действие, когда индекс доверия к телефону равен или ниже `phone_trust_index_threshold`. |
| `phone_trust_index_threshold` | целое число | Индекс доверия (`0`–`100`, чем ниже, тем рискованнее), при котором или ниже которого применяется `low_phone_trust_action`. По умолчанию `30`. |
| `phone_social_enabled` | логическое значение | Включает проверку социального следа: в каких мессенджерах, социальных сетях, на платформах электронной коммерции и профессиональных платформах зарегистрирован проверенный номер. **Стоимость: \$0.05 за верификацию** сверх стоимости проверки телефона; не зависит от `phone_enrichment_enabled`. |
| `phone_no_social_presence_action` | действие | Действие, когда проверка социального следа не находит номер ни на одной из охватываемых платформ. Это распространённый признак синтетической личности. По умолчанию `NO_ACTION`. |
| `cross_org_fraud_phone_action` | действие | Решение, когда этот номер был помечен как мошеннический другой организацией в сети. |
| `status_rules` | массив | Необязательные пользовательские правила статусов. |

Проверка телефона отключена, пока организация не выполнит первое пополнение баланса.

> [!NOTE]
>
> Обогащение данными о телефоне – необязательная надстройка. Когда `phone_enrichment_enabled` имеет значение `true`, каждая завершенная проверка телефона обогащается данными о телефоне, и за каждый запрос взимается плата в размере **\$0.05** сверх стандартной стоимости проверки телефона. Действия на основе оценки срабатывают только после того, как оценка обогащения станет доступна; действия по индексу доверия, типу телефона и переносу номера применяются сразу после запуска обогащения.
>
> Проверка социального следа является второй, отдельной надстройкой. Когда `phone_social_enabled` имеет значение `true`, каждая завершенная проверка телефона также сообщает, на каких онлайн-платформах зарегистрирован номер: мессенджеры, социальные сети, электронная коммерция и профессиональные сервисы. За нее взимается **\$0.05 за запрос**. Ее можно включить с `phone_enrichment_enabled` или без него: две надстройки оплачиваются и тарифицируются независимо. Запрос, который не находит номер ни на одной из охватываемых платформ, является корректным и оплачиваемым результатом и запускает `phone_no_social_presence_action`. Чтобы ветвить сценарий в графе сценария по результату, используйте `phone.social_profiles_registered` (количество платформ, на которых зарегистрирован номер).

## Проверка электронной почты

Значение функции: `EMAIL_VERIFICATION`.

| Поле конфигурации | Тип | Описание |
| - | - | - |
| `email_code_size` | integer | Размер OTP, от `4` до `8`. |
| `email_max_retries` | integer | Максимальное число повторных отправок, от `1` до `5`. |
| `email_max_check_attempts` | integer | Максимальное число попыток проверки OTP, от `1` до `5`. |
| `email_alphanumeric_code` | boolean | Использует буквенно-цифровые коды для email. |
| `breached_email_action` | action | Действие для адресов из утечек данных. |
| `disposable_email_action` | action | Действие для одноразовых адресов электронной почты. |
| `duplicated_email_action` | action | Действие для дублирующихся адресов электронной почты. |
| `only_corporate_emails_allowed` | boolean | Отклоняет некорпоративные адреса электронной почты. |
| `email_enrichment_enabled` | boolean | Включает обогащение email-данными (доставляемость, репутация домена, наличие в утечках данных, оценка риска мошенничества). **Тарификация: \$0.05 за верификацию** сверх стоимости проверки электронной почты. |
| `email_intelligence_score_action` | action | Действие, когда оценка риска мошенничества для email равна или превышает `email_intelligence_score_threshold`. |
| `email_intelligence_score_threshold` | integer | Оценка риска мошенничества (от `0` до `100`, чем выше, тем рискованнее), при которой срабатывает `email_intelligence_score_action`. По умолчанию `80`. |
| `recent_email_breach_action` | action | Действие, когда адрес электронной почты обнаружен в недавней известной утечке данных. |
| `frequent_email_breach_action` | action | Действие, когда адрес электронной почты обнаружен во многих известных утечках данных. |
| `email_social_enabled` | boolean | Включает проверку цифрового следа в соцсетях: на каких email-сервисах, социальных, профессиональных, e-commerce и развлекательных платформах зарегистрирован проверенный адрес. **Тарификация: \$0.05 за верификацию** сверх стоимости проверки электронной почты, независимо от `email_enrichment_enabled`. |
| `email_no_social_presence_action` | action | Действие, когда проверка цифрового следа не находит адрес ни на одной из охватываемых платформ, что является распространённым признаком синтетической личности. По умолчанию `NO_ACTION`. |
| `cross_org_fraud_email_action` | action | Вердикт, когда этот адрес был помечен другой организацией в сети как связанный с мошенничеством. |
| `status_rules` | array | Необязательные пользовательские правила статусов. |

> [!NOTE]
>
> Обогащение email-данными является необязательной дополнительной опцией. Когда `email_enrichment_enabled` имеет значение `true`, каждая завершённая проверка электронной почты обогащается email-данными, и за каждый запрос **взимается плата \$0.05** сверх стандартной стоимости проверки электронной почты. Действие на основе оценки применяется, как только оценка обогащения становится доступна; действия при утечках применяются сразу после запуска обогащения.
>
> Проверка цифрового следа в соцсетях является второй, отдельной дополнительной опцией. Когда `email_social_enabled` имеет значение `true`, каждая завершённая проверка электронной почты также сообщает, на каких онлайн-платформах зарегистрирован адрес: почтовые сервисы, социальные сети, профессиональные, e-commerce и развлекательные сервисы. За это **взимается \$0.05 за запрос**. Её можно включить как с `email_enrichment_enabled`, так и без него: обе дополнительные опции тарифицируются и оплачиваются независимо друг от друга. Если проверка не находит адрес ни на одной из охватываемых платформ, это корректный и оплачиваемый результат, и он запускает `email_no_social_presence_action`. Используйте `email.social_profiles_registered` (количество платформ, на которых зарегистрирован адрес), чтобы ветвить сценарий по результату в графе сценария.

## Проверка по базам данных

Значение функции: `DATABASE_VALIDATION`.

| Поле конфигурации | Тип | Описание |
| - | - | - |
| `database_validation_countries` | object | Соответствие кода страны ISO3 объекту `{ "services": ["service_id"] }`. Используйте ID сервисов из каталога «Проверка по базам данных». |
| `database_validation_partial_match_action` | action | Действие, которое выполняется, когда проверка по базам данных возвращает частичное совпадение. |
| `database_validation_no_match_action` | action | Действие, которое выполняется, когда проверка по базам данных не находит совпадений. |
| `database_validation_not_applicable_action` | action | Действие, которое выполняется, когда проверку по базам данных невозможно провести, потому что в документе нет идентификатора, требуемого настроенными сервисами (например, в паспорте нет номера национального ID). По умолчанию `NO_ACTION`. |
| `database_validation_field_sources` | object | Откуда считывать входные данные для проверки по базам данных, которые не может заполнить ни один предыдущий шаг в графе. `source` указывает источник, а `key` указывает значение внутри него: ключ поля Document AI для `document_ai`, id узла анкеты для `questionnaire` и `expected_details.<field>` или `metadata.<key>` для `expected_data`. Точные совпадения ключей с вышестоящими шагами определяются автоматически и намеренно не сохраняются, поэтому переименование поля Document AI не приводит к сохранению устаревшего сопоставления в конфигурации. Некорректная запись отклоняется с кодом `400`, в ответе указывается её входное поле. Формат: `{"<db_validation_input_field>": {"source": "document_ai"\|"questionnaire"\|"expected_data", "key": "<docai field key>\|<questionnaire node id>\|expected_details.<field>\|metadata.<key>"}}`. |
| `status_rules` | array | Необязательные пользовательские правила статуса. |

Пример:

```json theme={null}
{
  "feature": "DATABASE_VALIDATION",
  "config": {
    "database_validation_countries": {
      "BRA": {
        "services": ["SERVICE_ID_FROM_CATALOG"]
      }
    },
    "database_validation_field_sources": {
      "tax_id": {
        "source": "expected_data",
        "key": "expected_details.document_number"
      }
    },
    "database_validation_no_match_action": "REVIEW",
    "database_validation_partial_match_action": "REVIEW"
  }
}
```

> [!WARNING]
>
> `database_validation_countries` определяет, выполняет ли этот шаг какие-либо действия. Функция `DATABASE_VALIDATION`, сохранённая без этого поля, принимается, но проверки при этом не выполняются вовсе, поэтому всегда передавайте хотя бы одну страну с хотя бы одним ID сервиса.

Если сервис не может быть выполнен на этом шаге, запрос отклоняется с кодом `400`, в ответе указывается этот сервис и причина, а сценарий не сохраняется.
Это относится к ID, которого нет в каталоге, к ID, принадлежащему другой стране, к сервису, который пока недоступен, и к сервису, доступному только через отдельный эндпоинт [`POST /v3/database-validation/`](https://docs.didit.me/ru/core-technology/database-validation/overview).
Сервис, входные данные которого не предоставляет ни один предыдущий шаг, отклоняется так же, а в ответе перечисляются недостающие входные данные.
Сервис, который уже есть в сохранённом сценарии, но больше не может быть выполнен, удаляется при повторном сохранении.

Например, этот сценарий для Аргентины считывает номер DNI и пол из Верификации личности и проверяет их по RENAPER без селфи:

```json theme={null}
{
  "workflow_label": "Argentina DNI check",
  "features": [
    {"feature": "OCR"},
    {
      "feature": "DATABASE_VALIDATION",
      "config": {"database_validation_countries": {"ARG": {"services": ["arg_renaper_data"]}}}
    }
  ]
}
```

Используйте вместо него `arg_renaper` после шага `LIVENESS`, чтобы дополнительно сравнить селфи с фотографией, которая хранится в RENAPER.
Оценку совпадения лиц и порог для RENAPER см. в разделе [RENAPER](https://docs.didit.me/ru/api-reference/database-validation/argentina/renaper.md).

## Верификация банка

Значение функции: `BANK_VERIFICATION`.

Пользователь верифицирует банковский счёт, и имя владельца счёта, которое сообщает банк, сравнивается с данными личности, установленными предыдущим шагом сценария. Пользователь делает это одним из двух способов: вход в банк (`open_banking`), когда он входит в свой банк, или проверка счёта (`account_lookup`), когда он вводит реквизиты счёта, а банк подтверждает имя владельца. `bank_method_order` и `methods` каждой страны определяют, какие способы предлагает страна и какой из них идёт первым; см. [Способы верификации банка](https://docs.didit.me/ru/core-technology/bank-verification/verification-methods.md). Шаг формирует доказательства: оценку совпадения имени владельца, сравнение, которое её дало, и коды причин. Ключи `bank_*_action` превращают эти доказательства в статус.

Два условия определяют, выполняет ли узел вообще какое-либо действие. `bank_countries` является белым списком, поэтому пустая карта не предлагает ни одного банка и не выполняет проверку. Владельцу нужно с чем сравниваться: поставьте перед узлом шаг `OCR`, `DATABASE_VALIDATION` или `QUESTIONNAIRE`, передайте `expected_details` при создании сессии или сопоставьте поля самостоятельно через `bank_field_sources`. Если ни одного из этого нет, принадлежность может быть только `unknown`, и решает это `bank_reference_identity_missing_action`.

> [!NOTE]
>
> Верификация банка всё ещё внедряется, поэтому узел `BANK_VERIFICATION` принимается только для аккаунта, где он включён. В остальных случаях сохранение отклоняется, и система сообщает об этом. Какой маршрут выполняет шаг, здесь тоже не настраивается: это пара `provider_key` и `fallback_to_native`, которую за вас задаёт [Маркетплейс](https://docs.didit.me/ru/console/marketplace.md) в консоли.

### Подключение счёта

| Поле конфигурации | Тип | Описание |
| - | - | - |
| `bank_countries` | object | В каких странах пользователь может подключить банк. Это белый список: пустая карта означает, что узел не предлагает ничего и ничего не выполняет. `institutions` сужает выбор до конкретных ID банков, `"all"` предлагает каждый банк страны, поддерживающий верификацию личности. Страна, которую не обслуживает ни один маршрут узла, сохраняется: она предлагает только свои резервные варианты и кнопку «Продолжить без банка», см. [Когда человек не может верифицировать банк](https://docs.didit.me/ru/core-technology/bank-verification/fallbacks.md). Код, который не называет страну, отклоняется при сохранении. `methods` задаёт, какие способы, вход в банк (`open_banking`) и проверка счёта (`account_lookup`), предлагает страна и в каком порядке, с приоритетом над `bank_method_order`: пользователь начинает с первого и получает второй как резервный. Включённая страна, у которой в `methods` указан способ, не обслуживаемый ни одним маршрутом узла в этой стране, отклоняется при сохранении, так же как страна, которую обслуживает маршрут, но для которой в `methods` не осталось ни одного способа. Форма: `{"<ISO3>": {"enabled": true\|false, "institutions": ["<institution_id>", ...]\|"all", "methods"?: ["open_banking"\|"account_lookup", ...]}}`. |
| `bank_method_order` | string\[] | Какие из двух способов предлагает шаг и в каком порядке в каждой стране, которая не задаёт собственный `methods`: `open_banking` (вход в банк: пользователь входит в свой банк, и только этот способ читает балансы, транзакции и доходы) и `account_lookup` (проверка счёта: без входа, только принадлежность). В каждой стране пользователь начинает с первого способа, который там обслуживает маршрут, а другой предлагается как резервный; способ, который в стране не обслуживает ни один маршрут, там пропускается. Нужен минимум один способ. Если при сохранении способы не переданы, устанавливается `["open_banking", "account_lookup"]`, если только не переданы `bank_open_banking_enabled` или `bank_account_lookup_enabled`: тогда они задают его. |
| `bank_scopes` | object | На передачу каких данных пользователь дает согласие. `ownership` это признак, который проверяет продукт, и его нельзя отключить. `identifiers` раскрывает IBAN или номер счёта; `balances`, `transactions` и `income` читают реальные финансовые данные, тарифицируются отдельно и отклоняются при сохранении, если в вашем приложении нет права на финансовые данные. Данные считываются только при входе в банк: страна, которая предлагает проверку счёта, не отклоняется, а пользователь, прошедший проверку счёта, проходит без этих данных, и результат перечисляет их в `financial_data.not_collected`. Отключённый параметр никогда не запрашивается, поэтому банк не показывает его на экране согласия. По умолчанию только `ownership`. Форма: `{"ownership": true, "identifiers": true\|false, "balances": true\|false, "transactions": true\|false, "income": true\|false}`. |
| `bank_eligible_account_types` | string\[] | Какие типы счетов может выбрать пользователь: `checking`, `current`, `savings`, `business` или `other`. Кредитные карты, кредиты и инвестиционные счета никогда не подходят: они не устанавливают структуру владения платёжным счётом. По умолчанию: текущие и расчётные счета. |
| `bank_account_selection` | string | `user` позволяет пользователю выбрать, какой из подключённых счетов проверяется; `auto` берёт первый подходящий. |
| `bank_require_oauth_only` | boolean | Предлагать только банки, доступные через OAuth или при взаимодействии между приложениями, и никогда не показывать устаревший экран с запросом учётных данных. На рынках, где открытый банкинг уже делает OAuth единственным способом, это ничего не меняет. |
| `bank_max_attempts` | integer | Сколько попыток входа в банк получает пользователь, от `1` до `5`; микродепозит или загрузка выписки также расходуют одну попытку. У проверки счёта своё значение, `bank_account_check_max_attempts`. Когда все способы верифицировать пользователя, включая загрузку выписки, израсходовали попытки без успешного подключения, решение принимает `bank_attempts_exhausted_action`. |
| `bank_connection_timeout_minutes` | integer | Сколько начатое подключение остаётся открытым до того, как попытка прерывается, от `5` до `60` минут. |
| `bank_allow_skip` | boolean | Выведен из употребления в пользу `bank_continue_without_bank`: пользователь теперь всегда может продолжить без банка. В течение одного релиза читается из сохранения, которое не передаёт `bank_continue_without_bank`: `true` задаёт `from_start`, любое другое значение задаёт `when_needed`. Каждое сохранение записывает его обратно: `true` для `from_start`, `false` для `when_needed`. |

### Когда пользователь не может верифицировать

Пользователь всегда может продолжить без банка, и шаг никогда не оставляет его в тупике. См. [Когда человек не может верифицировать банк](https://docs.didit.me/ru/core-technology/bank-verification/fallbacks.md).

| Поле конфигурации | Тип | Описание |
| - | - | - |
| `bank_continue_without_bank` | string | Когда шаг показывает **Продолжить без вашего банка**. `when_needed`, значение по умолчанию, показывает её, когда ни один способ не работает для страны или банка пользователя, когда банк недоступен и никакой другой способ не смог подтвердить пользователя, например потому что проверка счёта тоже не смогла связаться с банком, или когда пользователь сообщает, что у него нет интернет-банкинга. `from_start` также показывает её на первом экране. Отключить её нельзя. Если при сохранении не передан ни этот ключ, ни `bank_allow_skip`, применяется `when_needed`. |
| `bank_statement_standalone_enabled` | boolean | С включённым `bank_statement_enabled` также предлагать загрузку выписки, если попытки использовать банк не было, в любой стране, включая страну, которую не обслуживает ни один маршрут входа в банк или проверки счёта. Тогда она тарифицируется отдельно как `bank_statement_upload` по базовой цене USD 0.20 за проверенную выписку, до применения вашей контрактной ставки или специальной цены: см. [Цены](https://docs.didit.me/ru/core-technology/bank-verification/fallbacks.md#цены). Сессии в песочнице можно тестировать без оплаты. Включено по умолчанию. |

Что для сессии означает продолжение, определяют `bank_unsupported_action`, `bank_attempts_exhausted_action` или `bank_skipped_action` в зависимости от причины, по которой пользователь продолжил, если только предыдущая попытка уже не определила шаг: см. [Действия по вердикту](#действия-по-решению).

### Сравнение владельца счёта

| Поле конфигурации | Тип | Описание |
| - | - | - |
| `bank_reference_identity` | string | Какой предыдущий шаг предоставляет идентификационные данные, с которыми сравнивается владелец счёта: `kyc` (Верификация личности), `database_validation`, `expected_details` (данные, переданные при создании сессии), `questionnaire` или `auto`, чтобы использовать тот вариант, который был сформирован сценарием. Шаг, который фактически предоставил эти идентификационные данные, возвращается в результате как `reference_identity_source`. |
| `bank_field_sources` | object | Откуда читать поле идентификационных данных, используемых для сравнения, если ни один предыдущий шаг графа не может его заполнить. Ключом словаря (KEY) является одно из значений: `full_name`, `first_name`, `last_name`, `address`; `source` указывает источник, а `key` указывает значение внутри него: ключ поля Document AI для `document_ai`, ID узла анкеты для `questionnaire`, а для `expected_data` это `expected_details.<field>` или `metadata.<key>`. Значение под `expected_details.` может ссылаться только на поле, которое действительно передаётся в payload создания сессии: `address`, `country`, `date_of_birth`, `first_name`, `gender`, `id_country`, `identification_number`, `ip_address`, `last_name`, `nationality` или `poa_country`. Некорректная запись отклоняется при сохранении, а не отбрасывается. Формат: `{"full_name"\|"first_name"\|"last_name"\|"address": {"source": "document_ai"\|"questionnaire"\|"expected_data", "key": "<docai field key>\|<questionnaire node id>\|expected_details.<field>\|metadata.<key>"}}`. |
| `bank_name_match_threshold` | integer | При этой оценке или выше имя владельца считается совпадением. От `50` до `100`, по умолчанию `85`. |
| `bank_partial_match_floor` | integer | Ниже этой оценки имя владельца считается несовпадением. От `0` до `99`, по умолчанию `70`. Диапазон между нижней границей и порогом соответствует частичному совпадению, поэтому нижняя граница должна быть строго ниже порога, иначе сохранение отклоняется. Явное значение `null` здесь означает «использовать значение по умолчанию», поэтому порог `50` без нижней границы отклоняется: он проверяется как `50` относительно нижней границы по умолчанию `70`. |
| `bank_require_address_match` | boolean | Также требовать совпадения адреса владельца. Имя, которое достигло порога, но адрес которого получил оценку ниже порога, переводится в частичное совпадение. Если учреждение не возвращает адрес, это требование не применяется; если у самой сессии нет адреса для сравнения, требование не снимается, и результат становится частичным совпадением. По умолчанию выключено. |
| `bank_use_provider_score` | boolean | Также учитывать собственную оценку совпадения имени владельца у банка и использовать её, если она выше оценки Didit или если у Didit не было имени владельца для оценки. Результат, принятый таким образом, указывает `provider_only` как метод совпадения, а если подключение не вернуло такую оценку, записывается предупреждение `provider_score_unavailable`. Включено по умолчанию. |
| `bank_show_match_result_to_user` | boolean | Показывать результат проверки владения пользователю внутри потока верификации. Если выключено, результат записывается в сессии, но пользователю никогда не показывается. |

### Проверка счёта

Эти ключи применяются только к проверке счёта. Для входа в банк сохраняется обработка близких совпадений и собственный `bank_max_attempts`.

| Поле конфигурации | Тип | Описание |
| - | - | - |
| `bank_account_check_accept_close_match` | boolean | Если включено (по умолчанию), имя, которое банк оценивает между `bank_partial_match_floor` и `bank_name_match_threshold`, считается близким совпадением: пользователь подтверждает имя, которое хранит банк, когда включено `bank_suggest_holder_name`, а решение принимает `bank_partial_match_action`. Если выключено, такое близкое совпадение считается несовпадением (`OWNER_NAME_MISMATCH`, решение по `bank_no_match_action`) и расходует попытку. |
| `bank_account_check_max_attempts` | integer | Сколько проверок счёта получает пользователь, от `1` до `5`, по умолчанию `3`: сколько раз он может ввести реквизиты счёта для проверки, на которую банк дал ответ. Это отдельный счётчик, не связанный с `bank_max_attempts`. Проверка, отклонённая в том виде, в котором была введена (например, неверный IBAN), или проверка, на которую банк не смог ответить, попытку не расходует. |

### Финансовые данные

`bank_expected_currencies` работает с одним лишь согласием `ownership` по умолчанию. Остальные три ключа читают реальные финансовые данные, поэтому каждому из них нужна соответствующая область согласия в `bank_scopes`, без неё сохранение отклоняется.

| Поле конфигурации | Тип | Описание |
| - | - | - |
| `bank_expected_currencies` | string\[] | Валюты ISO 4217, в которых ожидается счёт. Пустое значение означает любую валюту; несоответствие передаётся через `bank_currency_mismatch_action`. |
| `bank_min_balance` | number | Минимальный доступный баланс в валюте самого счёта. Ниже этого значения срабатывает `bank_low_balance_action`. Требует область `balances`. Значение `0` задаёт действительный порог и не равнозначно отсутствию ключа: для счёта с овердрафтом срабатывает это действие. По умолчанию это действие имеет значение `NO_ACTION`, которое не меняет вердикт, поэтому для отклонения счёта с овердрафтом также нужно задать `bank_low_balance_action: "DECLINE"`. |
| `bank_transactions_history_days` | целое число | Насколько далеко в прошлое читается история транзакций: от `30` до `365` дней. По умолчанию `90`. Требуется разрешение `transactions`. |
| `bank_refresh_enabled` | логическое значение | Повторно получать финансовые данные счёта после того, как шаг уже принял решение, пока действует согласие банка. Требуется хотя бы одно из разрешений: `balances`, `transactions` или `income`. Если согласие истекает позже, применяется `bank_consent_expired_action`. |

### Что сохраняется

| Поле конфигурации | Тип | Описание |
| - | - | - |
| `bank_store_full_identifiers` | логическое значение | Сохранять идентификаторы счёта в незамаскированном виде, а не в замаскированном. Требуется разрешение `identifiers`. Даже в этом случае незамаскированный вид возвращается только вызывающей стороне, у которой есть разрешение на чтение данных проверки банка. |
| `bank_store_raw_owner_data` | логическое значение | Хранить данные владельца, которые вернуло учреждение, рядом с доказательствами владения. Если выключено, сохраняется только само сравнение: оценки, метод сопоставления и коды причин. |

### Действия по решению

Каждый ключ здесь принимает `DECLINE`, `REVIEW` или `NO_ACTION`, если он не помечен как ограниченный. Если вы не передали ключ или передали `null`, применяется значение по умолчанию, указанное ниже. Ничто, что не является подтверждением владения, не одобряется по умолчанию, и отклонение возможно только при наличии явного доказательства против пользователя.

| Поле конфигурации | Тип | Описание |
| - | - | - |
| `bank_no_match_action` | ограниченное действие | Решение, когда владелец счёта явно не является проверенным лицом: лучшая оценка совпадения имени ниже `bank_partial_match_floor`. Используйте `DECLINE` или `REVIEW`. По умолчанию `DECLINE`. |
| `bank_partial_match_action` | действие | Решение, когда совпадение имени владельца находится между `bank_partial_match_floor` и `bank_name_match_threshold`. По умолчанию `REVIEW`, и по умолчанию никогда не одобряется. |
| `bank_not_verifiable_action` | действие | Решение, когда учреждение подключилось, но не вернуло данных о владельце для сравнения. По умолчанию `REVIEW`. |
| `bank_unknown_action` | действие | Решение, когда доказательства не удалось получить после повторных попыток, то есть из-за временного сбоя. По умолчанию `REVIEW`. |
| `bank_reference_identity_missing_action` | действие | Решение, когда ни один предыдущий шаг не создал личность для сравнения с владельцем, поэтому владение может быть только `unknown`. По умолчанию `REVIEW`. |
| `bank_joint_account_action` | действие | Решение, когда у счёта больше одного владельца. По умолчанию `NO_ACTION`. |
| `bank_business_account_action` | действие | Решение, когда банк указывает владельца как компанию, а не как человека. По умолчанию `REVIEW` в сценарии для физического лица и `NO_ACTION` в сценарии для бизнеса (KYB), где сессия ожидает найти владельца-компанию. |
| `bank_unsupported_action` | действие | Решение, когда пользователь продолжает без банка, потому что ни один способ не смог проверить его страну или банк: ни вход в банк, ни маршрут проверки счёта не работает для страны, либо выбранный банк нельзя использовать на этом шаге. В результате `continued_without_bank` равно true, а в кодах причин есть `NOT_COVERED`. По умолчанию `REVIEW`. |
| `bank_skipped_action` | ограниченное действие | Решение, когда пользователь выбрал «Продолжить без вашего банка», хотя способ проверки был доступен. В результате `continued_without_bank` равно true, а в кодах причин есть `SKIPPED`. Используйте `DECLINE` или `REVIEW`. По умолчанию `REVIEW`. |
| `bank_attempts_exhausted_action` | ограниченное действие | Решение, когда пользователь исчерпал попытки каждого способа проверки, который ему ещё предлагается, включая загрузку выписки (`bank_max_attempts`, а также `bank_account_check_max_attempts`, если страна предлагает проверку счёта), так и не подключив банк успешно. Сюда же относится случай, когда пользователь затем продолжает без банка. Используйте `DECLINE` или `REVIEW`. По умолчанию `DECLINE`. |
| `bank_consent_expired_action` | действие | Решение, когда согласие на доступ к банку истекает после того, как шаг уже принял решение. Имеет смысл только с `bank_refresh_enabled`. По умолчанию `NO_ACTION`. |
| `bank_currency_mismatch_action` | действие | Решение, когда валюта счёта не входит в `bank_expected_currencies`. По умолчанию `NO_ACTION`. |
| `bank_country_mismatch_action` | действие | Решение, когда страна банка отличается от ожидаемой страны или страны документа. По умолчанию `NO_ACTION`. |
| `bank_low_balance_action` | действие | Решение, когда доступный баланс ниже `bank_min_balance`. Требуется разрешение `balances`. По умолчанию `NO_ACTION`. |
| `status_rules` | массив | Необязательные пользовательские правила статусов. |

### Дополнительные настройки

Эти ключи необязательны. Каждый ключ действия принимает `DECLINE`, `REVIEW` или `NO_ACTION`.

| Поле конфигурации | Тип | Описание |
| - | - | - |
| `bank_abandoned_action` | действие | Решение, когда шаг завершается без совпадения, потому что человек покинул банк и не вернулся (попытка истекла по времени). |
| `bank_account_age_action` | действие | Решение, когда счёт открыт позже, чем `bank_account_age_days` дней назад. Это типичная схема использования счёта в качестве дропа. |
| `bank_account_age_days` | целое число | Счёт, история которого начинается позже, чем это количество дней назад, считается новым. Допустимо от 1 до 365, по умолчанию 30. Берётся из истории транзакций, поэтому только при наличии разрешения `transactions`. |
| `bank_account_lookup_enabled` | логическое значение | Устарело: используйте `bank_method_order` и `bank_countries.<ISO3>.methods`. В течение одного релиза читается из сохранения, которое не передаёт `bank_method_order`: при включённом `bank_open_banking_enabled` задаёт порядок, где проверка счёта выполняется после входа в банк, если она включена; при выключенном или не заданном значении не учитывается. Каждое сохранение записывает обратно признак того, предлагает ли какая-либо страна проверку счёта. |
| `bank_account_type_action` | действие | Решение, когда проверенный счёт является сберегательным. |
| `bank_address_match_threshold` | целое число | При оценке не ниже этого порога адрес владельца считается совпадающим. Допустимо от 50 до 100, по умолчанию 70. Учитывается только при включённом `bank_require_address_match`. |
| `bank_address_mismatch_action` | действие | Решение, когда адрес владельца отличается, и совпадение становится частичным. Только с `bank_require_address_match`. |
| `bank_auto_add_countries` | логическое значение | Предлагать каждую страну, которую может обслуживать маршрут этого узла, включая страны, добавленные после сохранения узла, за исключением стран, отключённых в `bank_countries`. Если ключа нет, значение считается выключенным, поэтому существующий узел сам по себе не расширяется. |
| `bank_cash_flow_action` | action | Вердикт, когда деньги поступают и сразу выводятся обратно или приходит много мелких переводов (транзитный денежный поток). Требует область доступа `transactions`. |
| `bank_dob_match_enabled` | boolean | Сравнивает дату рождения держателя счёта, если банк её передаёт, с подтверждённой датой. Несовпадение никогда не меняет результат проверки владения: оно запускает `bank_dob_mismatch_action`. Включено по умолчанию. |
| `bank_dob_match_threshold` | integer | При этой оценке или выше дата рождения считается совпадающей. Диапазон от 50 до 100, по умолчанию 70. Дата либо совпадает в точности, либо нет, поэтому она получает оценку 100 или 0. |
| `bank_dob_mismatch_action` | action | Вердикт, когда дата рождения держателя счёта отличается. Работает только при включённом `bank_dob_match_enabled`. |
| `bank_email_match_enabled` | boolean | Сравнивает адрес электронной почты, указанный в банке, с подтверждённым в сессии адресом. Несовпадение запускает `bank_email_mismatch_action`. Выключено по умолчанию. |
| `bank_email_match_threshold` | integer | При этой оценке или выше адрес электронной почты считается совпадающим. Диапазон от 50 до 100, по умолчанию 70. |
| `bank_email_mismatch_action` | action | Вердикт, когда адрес электронной почты держателя счёта отличается. Работает только при включённом `bank_email_match_enabled`. |
| `bank_evidence_retention_days` | integer | Удаляет доказательства из банка через указанное число дней после вердикта: 30, 90, 365 или 1825. Значение null означает, что они хранятся вместе с сессией. Удаляются: данные держателя счёта, идентификационные данные, с которыми их сравнивали, идентификаторы счетов, финансовые данные и загруженная выписка. Действующее подключение отзывается. Вердикт, оценки и коды причин сохраняются. Удаление сессии удаляет всё, в зависимости от того, что произойдёт раньше. |
| `bank_fallback_used_action` | action | Вердикт, когда счёт подтверждён через микродепозиты или загрузку выписки. |
| `bank_match_any_holder` | boolean | Для совместного счёта или счёта с несколькими владельцами достаточно совпадения ЛЮБОГО из перечисленных держателей с человеком. Если выключено, совпасть может только первый держатель, которого называет банк. Включено по умолчанию. |
| `bank_microdeposits_enabled` | boolean | Предлагает микродепозиты как резервный способ: на счёт приходят два небольших платежа, и человек вводит их суммы. Предлагается только в стране, где маршрут способен их отправить, и только после платной попытки Bank Verification в той же сессии. Включено без дополнительной платы: клиент платит за маршрут один раз. В песочнице сессии можно протестировать без списания. Держателем считается имя, подтверждённое в сессии, которое человек указывает как владельца счёта, поэтому для подтверждённого счёта записывается предупреждение `holder_declared`. Включено по умолчанию. |
| `bank_mule_score_action` | action | Вердикт, когда оценка риска счёта-мула равна `bank_mule_score_threshold` или выше. |
| `bank_mule_score_threshold` | integer | При оценке риска счёта-мула на уровне порога или выше (от 0 до 100) срабатывает `bank_mule_score_action`. По умолчанию 70. Оценка учитывает новый счёт, транзитный денежный поток, опустошённый баланс и множество мелких входящих переводов. Данные берутся из истории транзакций (область доступа `transactions`). |
| `bank_open_banking_enabled` | boolean | Устарело: используйте `bank_method_order` и `bank_countries.<ISO3>.methods`. В течение одного релиза значение считывается при сохранении, если `bank_method_order` не передан: при включённом `bank_account_lookup_enabled` он задаёт порядок, вход через банк включается, если значение включено или не задано. При каждом сохранении записывается обратно как признак того, предлагает ли какая-либо страна вход через банк. |
| `bank_phone_match_enabled` | boolean | Сравнивает телефон, указанный в банке, с подтверждённым в сессии телефоном. Несовпадение запускает `bank_phone_mismatch_action`. Выключено по умолчанию. |
| `bank_phone_match_threshold` | integer | При этой оценке или выше телефон считается совпадающим. Диапазон от 50 до 100, по умолчанию 70. |
| `bank_phone_mismatch_action` | action | Вердикт, когда телефон держателя счёта отличается. Работает только при включённом `bank_phone_match_enabled`. |
| `bank_popular_mode` | string | `auto` (по умолчанию) упорядочивает популярные банки по тому, к каким подключаются чаще всего в стране; `manual` вместо этого показывает `popular_institutions` каждой страны из `bank_countries` в заданном в них порядке. |
| `bank_statement_document_checks_action` | action | Вердикт, когда в загруженной выписке есть признаки редактирования или подделки. По умолчанию `REVIEW`. |
| `bank_statement_enabled` | boolean | Предлагает загрузку банковской выписки как резервный способ: выписка за последние 3 месяца проверяется на подделку, а имя держателя сверяется так же, как для банка. Включено без дополнительной платы после платной попытки Bank Verification в той же сессии. При включённом `bank_statement_standalone_enabled` выписка предлагается также без предшествующей попытки через банк, в любой стране, и тогда тарифицируется отдельно. В песочнице сессии можно протестировать без списания. Выключено по умолчанию. |
| `bank_suggest_holder_name` | boolean | При близком совпадении показывает человеку имя, под которым банк ведёт счёт, и просит подтвердить, что это его имя, либо подключить другой счёт. Ответ записывается как `holder_confirmation`; подтверждение завершает шаг с результатом `bank_partial_match_action`. Включено по умолчанию. |
| `fallback_to_native` | boolean | Нужно ли переходить на нативный маршрут Didit, если подключение маркетплейс-провайдера установить не удалось. Выключено по умолчанию: тихий переход потратит ваш баланс Didit на сессию, которую вы рассчитывали провести по договору с собственным провайдером. Резервное подключение записывается как `credential_source = native` и тарифицируется по нативной цене. |
| `provider_key` | string | Какой маршрут выполняет шаг. Пустое значение (по умолчанию) означает нативный продукт Didit Bank Verification, не зависящий от провайдера, который Didit направляет к региональному вендору открытого банкинга, обслуживающему страну и финансовое учреждение пользователя, по договорам и тарифам Didit. Значение задаёт маркетплейс-провайдера, чьи учётные данные это приложение уже подключило: тогда сессия выполняется, тарифицируется и отзывается в вашем аккаунте у провайдера, а Didit взимает только комиссию платформы маркетплейса. Неподключённый провайдер отклоняется при сохранении. |

Пример объекта `config` для аккаунта, где включена Bank Verification и выбранный маршрут охватывает указанную страну:

```json theme={null}
{
  "bank_method_order": ["open_banking", "account_lookup"],
  "bank_countries": {
    "ESP": { "enabled": true, "institutions": "all" }
  },
  "bank_scopes": { "ownership": true },
  "bank_eligible_account_types": ["checking", "current"],
  "bank_name_match_threshold": 85,
  "bank_partial_match_floor": 70,
  "bank_partial_match_action": "REVIEW",
  "bank_no_match_action": "DECLINE"
}
```

> [!WARNING]
>
> Именно `bank_countries` активирует этот шаг, и проверяется он по маршруту, на котором выполняется узел, а не по общему списку. Страна, в которой этот маршрут не может установить владение счётом, отклоняется при сохранении, и её название указано в ошибке. Читайте ошибку, а не предполагайте, что страна принята и будет пропущена во время выполнения.

## AML

Значение функции: `AML`.

Для скрининга физического лица (KYC) используйте следующие поля:

| Поле конфигурации | Тип | Описание |
| - | - | - |
| `is_aml_ongoing_monitoring_enabled` | boolean | Включает постоянный AML-мониторинг. |
| `aml_score_approve_threshold` | integer | Порог одобрения. |
| `aml_score_review_threshold` | integer | Порог проверки. |
| `aml_match_score_threshold` | integer | Порог оценки совпадения для возможных совпадений. |
| `aml_name_weight` | integer | Вес имени. Если передан любой вес AML, веса имени, даты рождения и страны должны в сумме давать `100`. |
| `aml_dob_weight` | integer | Вес даты рождения. |
| `aml_country_weight` | integer | Вес страны. |
| `create_cases_on_hit` | boolean | Автоматически открывает кейс, когда скрининг возвращает срабатывание, вместо того чтобы оставлять срабатывание для разбора в сессии. По умолчанию выключено. |
| `case_blueprint` | uuid | Шаблон кейса, по которому создаётся кейс автоматически. Имеет смысл только вместе с `create_cases_on_hit`; если не задан, используется шаблон по умолчанию для аккаунта. |
| `status_rules` | array | Необязательные пользовательские правила статуса. |

Для скрининга компании (KYB) используйте следующие поля:

| Поле конфигурации | Тип | Описание |
| - | - | - |
| `kyb_score_approve_threshold` | integer | Порог одобрения AML для компании. |
| `kyb_score_review_threshold` | integer | Порог проверки AML для компании. |
| `kyb_enable_ongoing_monitoring` | boolean | Включает постоянный AML-мониторинг KYB. |
| `kyb_company_aml_match_score_threshold` | integer | Порог оценки совпадения AML для компании. |
| `kyb_company_aml_name_weight` | integer | Вес названия компании. Если переданы веса AML для компании, в сумме они должны давать `100`. |
| `kyb_company_aml_dob_weight` | integer | Вес даты регистрации или даты рождения. |
| `kyb_company_aml_country_weight` | integer | Вес страны. |

### Проверка сущности, извлечённой шагом Document AI

Шаг AML обычно берёт данные о проверяемом лице из шага `OCR` (физическое лицо) или из шага `KYB_REGISTRY` (компания). В сценарии, единственный шаг извлечения которого - `DOCUMENT_AI` (нестандартизированные документы, например налоговая справка или учредительный документ), ни одного из этих шагов нет, поэтому сценарий должен явно указать, откуда берётся каждый входной параметр скрининга.

| Поле конфигурации | Тип | Описание |
| - | - | - |
| `aml_field_sources` | object | Откуда брать сущность, которую проверяет этот шаг. `source` указывает источник, а `key` задаёт значение внутри него: ключ поля Document AI для `document_ai`, идентификатор узла анкеты для `questionnaire`, а для `expected_data` - `expected_details.<field>` или `metadata.<key>`. КЛЮЧ карты - один из четырёх входных параметров скрининга: `full_name`, `date_of_birth`, `nationality`, `document_number`. Для компании они означают юридическое название, дату регистрации, страну и регистрационный номер. Поле Document AI, которое уже обозначено одним из этих четырёх ключей, сопоставляется автоматически и намеренно не сохраняется, поэтому переименование такого поля никогда не закрепляет устаревшее сопоставление. Явное сопоставление имеет приоритет над автоматическим сопоставлением и над документом, удостоверяющим личность. Если во время выполнения сопоставление не даёт результата, входной параметр остаётся пустым и не заменяется другим значением. В KYB-сценарии компания, возвращённая шагом `KYB_REGISTRY`, является источником истины: только явное сопоставление переопределяет один из её входных параметров, автоматическое сопоставление поверх записи реестра не применяется, а при отсутствии шага реестра сопоставление полностью определяет идентичность. Формат: `{"full_name"\|"date_of_birth"\|"nationality"\|"document_number": {"source": "document_ai"\|"questionnaire"\|"expected_data", "key": "<docai field key>\|<questionnaire node id>\|expected_details.<field>\|metadata.<key>"}}`. |
| `aml_entity_type` | string | `person` или `company`. По умолчанию `person` в сценарии для физических лиц (KYC) и `company` в KYB-сценарии. Укажите `company`, чтобы проверить компанию, названную в загруженном документе, без шага `KYB_REGISTRY`: провайдер ищет записи о компаниях, а оценка совпадения рассчитывается как для компании. |
| `aml_incomplete_data_action` | action | Вердикт, когда скрининг выполнен не на полных данных личности (имя, дата рождения и страна). По умолчанию `REVIEW`. `NO_ACTION` продолжает обработку на сокращённых данных для сценария, в котором заведомо есть только имя. Скрининг выполняется в любом случае, и журнал неполных данных записывается в любом случае. Этот параметр определяет только то, как это повлияет на статус. |

Пример: скрининг компании, названной в мексиканской *acta constitutiva*, в сценарии нет ни одного документа, удостоверяющего личность:

```json theme={null}
{
  "feature": "AML",
  "config": {
    "aml_entity_type": "company",
    "aml_field_sources": {
      "full_name": { "source": "document_ai", "key": "razon_social" },
      "document_number": { "source": "document_ai", "key": "rfc" },
      "date_of_birth": { "source": "document_ai", "key": "fecha_constitucion" },
      "nationality": { "source": "document_ai", "key": "pais" }
    },
    "aml_incomplete_data_action": "REVIEW"
  }
}
```

> [!WARNING]
>
> Если перед ним нет шагов `OCR` и `KYB_REGISTRY`, шаг `AML` должен иметь возможность заполнить
> `full_name`: без имени поиск у провайдера невозможен. Сценарий, который ничего не сопоставляет
> или сопоставляет ключ Document AI, который ни один предыдущий шаг не извлекает, отклоняется при
> сохранении, а не сохраняется с пустым скринингом. Точность AML напрямую зависит от количества
> передаваемых идентификаторов: скрининг только по имени даёт большой объём ложных срабатываний.

## Анализ устройства и IP

Значение функции: `IP_ANALYSIS`.

| Поле конфигурации | Тип | Описание |
| - | - | - |
| `ip_mismatch_action` | действие | Действие, если геолокация адреса не совпадает с ожидаемыми данными. |
| `ip_location_not_determined_action` | действие | Вердикт, если не был зафиксирован адрес, который идентифицирует конечного пользователя, поэтому у сессии нет местоположения по IP: страна, город, провайдер, координаты и часовой пояс недоступны, а `ip_geofencing_by_country`, сравнение со страной документа и проверки VPN и дата-центров не выполняются. По умолчанию `NO_ACTION`: предупреждение `IP_LOCATION_NOT_DETERMINED` остаётся видимым в сессии, но вердикт не меняется. Установите `REVIEW` или `DECLINE`, если сессия без определённого местоположения не должна проходить. |
| `vpn_detection_action` | действие | Действие, если обнаружено использование VPN или прокси. |
| `expected_ip_mismatch_action` | действие | Действие, если адрес не совпадает с ожидаемым адресом. |
| `duplicated_ip_action` | действие | Действие, если адрес подозрительно используется повторно. |
| `duplicated_device_action` | действие | Действие, если один и тот же постоянный отпечаток устройства повторно используется в сессиях с разными значениями `vendor_data`. |
| `recovered_device_action` | действие | Действие, если после изменения постоянного идентификатора устройства восстановление отпечатка v2 с высокой степенью достоверности связывает сессию с ранее виденным устройством. |
| `is_ip_geofencing_enabled` | boolean | Включает ограничения геофенсинга по IP. При значении `false` `ip_geofencing_by_country` сохраняется, но не применяется. |
| `ip_geofencing_by_country` | объект | Правила определения местоположения по IP для каждой страны с ключом по трёхбуквенному коду страны ISO-3: `{"USA": {"allowed": true, "states": {"California": {"allowed": false}}}}`. Записи для штатов и регионов переопределяют флаг страны; страны, которых нет в списке, разрешены. |
| `ip_geofencing_action` | действие | Действие, если адрес сессии находится в стране или штате/регионе, которые не разрешены. По умолчанию `DECLINE`. |
| `automation_detected_action` | действие | Вердикт, если сессией, по всей видимости, управляет автоматизация, а не человек. |
| `cross_org_fraud_device_action` | действие | Вердикт, если это устройство помечено как мошенническое другой организацией в сети. |
| `cross_org_fraud_ip_action` | действие | Вердикт, если этот адрес помечен как мошеннический другой организацией в сети. |
| `device_app_tampered_action` | действие | Вердикт, если бинарный файл приложения-хоста похож на модифицированный. |
| `device_blocklist_action` | действие | Вердикт, если устройство находится в списке блокировки организации. |
| `device_debugger_action` | действие | Вердикт, если к приложению-хосту подключён отладчик. |
| `device_emulator_action` | действие | Вердикт, если устройство является эмулятором, а не физическим устройством. |
| `device_hooking_action` | действие | Вердикт, если обнаружен хукинг во время выполнения или инструментирование. |
| `device_integrity_missing_action` | действие | Вердикт, если платформа не вернула аттестацию целостности устройства. |
| `device_rooted_action` | действие | Вердикт, если устройство имеет root-доступ или джейлбрейк. |
| `multiple_devices_action` | действие | Вердикт, если сессия проводилась с более чем одного устройства. |
| `device_liveness_attack_history_action` | действие | Действие, если то же устройство (сопоставляется по постоянному идентификатору устройства) использовалось в более ранней сессии другого пользователя, в которой проверка живости была признана атакой (предупреждение `DEVICE_LINKED_TO_LIVENESS_ATTACK`). По умолчанию `NO_ACTION`. |
| `device_model_inconsistency_action` | действие | Действие, если то же устройство (сопоставляется по постоянному идентификатору устройства) в более ранней сессии было указано как устройство другой модели (предупреждение `DEVICE_MODEL_INCONSISTENT`). По умолчанию `NO_ACTION`. |
| `status_rules` | массив | Необязательные пользовательские правила статусов. |

Пример:

```json theme={null}
{
  "feature": "IP_ANALYSIS",
  "config": {
    "vpn_detection_action": "REVIEW",
    "duplicated_device_action": "REVIEW",
    "recovered_device_action": "REVIEW",
    "is_ip_geofencing_enabled": true,
    "ip_geofencing_by_country": {
      "USA": { "allowed": true, "states": { "California": { "allowed": false } } },
      "RUS": { "allowed": false, "states": null }
    },
    "ip_geofencing_action": "DECLINE"
  }
}
```

Используйте `recovered_device_action` отдельно от `duplicated_device_action`, если хотите отслеживать устройства, идентифицированные при восстановлении отпечатка с высокой степенью уверенности, прежде чем автоматически их отклонять. Это полезно на этапе внедрения: совпадения восстановленных устройств предназначены для выявления мошеннических групп, но их всё равно нужно откалибровать по вашему собственному трафику.

## Верификация местоположения

Значение функции: `GEOLOCATION`.

Проверяет, где находится человек во время верификации, по позиции устройства или по местоположению IP-адреса подключения, сравнивая её с разрешёнными и заблокированными зонами, местоположением IP и адресом в документе.
Как ведёт себя этот шаг, см. в разделе [Верификация местоположения](https://docs.didit.me/ru/core-technology/location-verification/overview.md), а поля решения описаны в [его отчёте](https://docs.didit.me/ru/core-technology/location-verification/report-location-verification.md).
Если нужно измерять расстояние до адреса в документе, размещайте шаг после Верификации личности или Подтверждения адреса: расстояние измеряется, только если адрес уже указан в системе.
Если `geolocation_position_source` не задан, расстояние до местоположения по IP требует шага Анализ устройства и IP в том же сценарии.
Все ключи необязательны: шаг с пустым `config` запрашивает у устройства позицию с точностью до 250 м, не старше 120 секунд, даёт человеку 3 попытки и не применяет правил для зон.

У каждого результата проверки есть свой ключ действия. Если ключ действия не задан, он получает значение по умолчанию из выбранного `geolocation_preset`, а если пресет не выбран, то значение по умолчанию для этого ключа, указанное ниже.
Неопределённое местоположение или отказ в его предоставлении по умолчанию приводят к `REVIEW`, но никогда к `DECLINE`, потому что отказ в разрешении или широкий радиус не являются доказательством мошенничества.
Явно заданное действие всегда имеет приоритет над пресетом.
Повторно использованный запрос (`LOCATION_REPLAY_DETECTED`) и неуспешная аттестация устройства (`LOCATION_INTEGRITY_FAILED`) всегда приводят к отклонению и не имеют ключа действия.

| Поле конфигурации | Тип | Описание |
| - | - | - |
| `geolocation_position_source` | string | Откуда берётся позиция. `device_and_ip` запрашивает позицию устройства и сравнивает её с местоположением IP-адреса подключения, с которого она отправлена (если этот IP ещё не закеширован, выполняется запрос к сервису IP-аналитики). Если значение не задано (по умолчанию), запрашивается позиция устройства, и, как и до появления этого ключа, она сравнивается с местоположением IP, которое зафиксировал шаг Анализ устройства и IP в сессии. Поэтому без этого шага расстояния нет, и подключение никогда не запрашивается отдельно. Исключение: узел, который действует по результату VPN, прокси или Tor (собственное действие или его пресет), проверяет подключение по этому результату и сравнивает устройство с ним, точно так же, как `device_and_ip`. `device_only` никогда не сравнивает позицию с местоположением IP и запрашивает данные о подключении только для таких результатов. `ip_only` никогда не запрашивает позицию у человека и оценивает местоположение IP подключения на уровне города с радиусом 50 км, без правил точности, свежести и приблизительного разрешения. При `geolocation_areas` прибрежный город оценивается внутри своей страны, если в пределах этого радиуса нет другой страны. На узле, который запрашивает устройство, попытка без позиции устройства оценивается как отказ или сбой, чем она и является: местоположение IP никогда её не заменяет. |
| `geolocation_preset` | string | Значения по умолчанию для каждого незаданного действия этого узла. `licensing`: вне зоны, в заблокированной зоне, при VPN, Tor или эмуляторе выполняется отклонение, прокси и остальные результаты отправляются на проверку, а отсутствие аттестации устройства остаётся без действия. `fraud_screening`: то же самое, но то, что Licensing отклоняет, отправляется на проверку. Null сохраняет давние значения по умолчанию. Явно заданное действие всегда имеет приоритет. |
| `geolocation_accuracy_mode` | string | Что запрашивается у устройства. `precise` запрашивает у операционной системы точную позицию. Если человек разрешает только приблизительную, его просят повторить, пока остаются попытки, а затем решение принимает `geolocation_approximate_action`. `approximate_allowed` принимает приблизительное разрешение без такого решения. `geolocation_max_accuracy_radius_m` применяется в любом случае. По умолчанию `precise`. |
| `geolocation_max_accuracy_radius_m` | integer | Наибольший радиус неопределённости в метрах, при котором позиция устройства ещё засчитывается. От 10 до 50000 метров; если не задано, 250. Более широкая позиция или позиция без радиуса обрабатывается согласно `geolocation_low_accuracy_behavior` и оценивается по `geolocation_low_accuracy_action`. Узел `ip_only` не имеет радиуса устройства и никогда его не применяет. |
| `geolocation_max_accuracy_radius_unit` | string | Единица, в которой консоль показывает `geolocation_max_accuracy_radius_m`. Только для отображения: значение всегда хранится в метрах, ни одно правило от него не зависит, а данные шага лишь передают его, чтобы клиент мог показать ту же единицу. |
| `geolocation_low_accuracy_behavior` | string | Что происходит с позицией шире `geolocation_max_accuracy_radius_m` или без радиуса: `ask_again` (по умолчанию) просит человека повторить попытку, пока остаются попытки; `fail` завершает шаг при первой такой позиции. |
| `geolocation_max_age_seconds` | integer | Насколько старой, в секундах, может быть позиция устройства, когда сервер её получает. От 5 до 3600 секунд; если не задано, 120. Более старая позиция запрашивается повторно, пока остаются попытки, а затем оценивается по `geolocation_stale_fix_action`. |
| `geolocation_timeout_seconds` | integer | Сколько секунд клиент даёт устройству на поиск позиции в каждой попытке. Сервер передаёт это значение в данных шага и сам ничего не контролирует. От 5 до 120 секунд; если не задано, 20. Попытка, в которой позиция не найдена вовремя, отправляется как `timeout`; человека просят повторить попытку, пока остаются попытки, а затем оценивается по `geolocation_unavailable_action`. |
| `geolocation_max_attempts` | integer | Сколько попыток получает человек на этом узле. От 1 до 5; если не задано, 3. Если результат попытки человек ещё может изменить (отказ, позиция с большим радиусом, устаревшая или приблизительная позиция либо результат по зоне или анонимайзеру, на который действует узел), человека просят повторить попытку, пока остаются попытки, а последняя попытка определяет результат шага. Подменённая позиция или эмулятор, на который действует узел, завершают шаг на той попытке, в которой они были зафиксированы. |
| `geolocation_allow_qr_handoff` | boolean | Предлагать продолжить на телефоне по QR-коду, пока шаг открыт (`allow_qr_handoff` в данных шага, `can_handoff` в ответе на каждую отправку). Нативные SDK уже работают на телефоне и никогда не показывают код. Включено по умолчанию. |
| `geolocation_allow_skip` | boolean | Позволяет человеку продолжить без местоположения в любой момент, с вступительного экрана или экрана повторной попытки (`skipped: true`). Пропуск завершает шаг и оценивается по `geolocation_unavailable_action`, кроме случая, когда пропуск отвечает на отказ при `geolocation_refusal_path` со значением `continue_without_location`: тогда он фиксируется как этот отказ. По умолчанию выключено. |
| `geolocation_deep_link_enabled` | boolean | Передаётся клиенту как `deep_link_enabled` в данных шага: предлагает вместо этого открыть собственное приложение конечного пользователя. Сервер не применяет к этому параметру никаких правил. По умолчанию выключен. |
| `geolocation_refusal_path` | string | Порядок действий, который предлагается, если доступ к геолокации отклонён. `retry_then_handoff` (по умолчанию) снова запрашивает доступ, пока остаются попытки, и предлагает перейти к проверке по телефону; `continue_without_location` позволяет пользователю продолжить, фиксируя отказ; `end_session` завершает шаг и сессию при первом отказе и требует, чтобы `geolocation_permission_denied_action` было Review или Decline, а сценарий имел завершение с решением Declined, In Review или Final. Решение по сессии принимается на основе выполненных шагов и никогда не бывает Approved: в сценарии, который не может завершиться этим решением, выбирается другое завершающее решение, не являющееся одобрением (Declined для In Review, In Review для Declined). |
| `is_geolocation_geofencing_enabled` | boolean | Включает правила зон: `geolocation_areas` или более старый `geolocation_geofencing_by_country` применяются только при значении true, и только тогда данные шага содержат `available_areas`. По умолчанию выключено. Когда геофенсинг включён, список `geolocation_areas` должен содержать хотя бы одну разрешённую зону. |
| `geolocation_areas` | array | Разрешённые и заблокированные зоны, применяются, пока `is_geolocation_geofencing_enabled` равно true. Пройти проверку может только местоположение внутри разрешённой зоны, а заблокированная зона всегда важнее разрешённой. Местоположение учитывается по всему кругу точности: если круг пересекает границу, которая определяет результат, ответ не определён, но никогда не означает «вне зоны». Страна или регион заканчиваются там, где начинается другая суша, а не на береговой линии. Если по контурам позиция не попадает ни на какую сушу (набережная или пирс, которые упрощённая береговая линия исключила), результат не определён для любой страны или региона в пределах её радиуса плюс 12 морских миль. `id` задаёт то, на что ссылаются правила ветвей и `geolocation.inside_areas` / `geolocation.blocked_areas`. `kind` задаёт форму: вся страна `country` (ISO 3166-1 alpha-3 с опубликованным контуром; территория, которую контуры показывают как регион другой страны, задаётся как `region`, например Реюньон как `FR-RE` для Франции или Бонэйр, Синт-Эстатиус и Саба как `NL-BQ1` до `NL-BQ3`), `region` (коды ISO 3166-2 одной страны с опубликованными границами), `circle` (от 1 до 500 км) или `polygon` (от 3 до 200 точек, кольцо, рёбра которого никогда не пересекаются и не касаются друг друга). Не более 50 зон, id уникальны, и при включённом геофенсинге должна быть хотя бы одна разрешённая зона. Нельзя использовать вместе с `geolocation_geofencing_by_country`. |
| `geolocation_geofencing_by_country` | object | Правила разрешения и запрета по странам и регионам для собственного местоположения устройства, применяются только при значении true у `is_geolocation_geofencing_enabled`. Той же структуры, что и `ip_geofencing_by_country` в Анализе IP, за исключением того, что ключи `states` являются кодами ISO 3166-2 (`US-NJ`), а не названиями штатов, поскольку местоположение определяется по субъекту, а не по названию города от поставщика. Страна, которой нет в списке, разрешена. Правило для региона страны без опубликованных границ ISO 3166-2 отклоняется, а не молча игнорируется. |
| `geolocation_ip_distance_km` | integer | Насколько далеко друг от друга, в километрах, могут находиться местоположение устройства и местоположение по IP после вычитания обоих радиусов неопределённости, прежде чем применится `geolocation_ip_distance_action`. Если ключ не указан, используется 200; null выключает сравнение. Сравнение выполняется только для узла, у которого `geolocation_position_source` равно `device_and_ip` или не задан; этот ключ определяет, с каким местоположением по IP сравнивается. |
| `geolocation_ip_distance_unit` | string | Единица, в которой консоль показывает `geolocation_ip_distance_km`. Только для отображения: значение всегда хранится в километрах, и ни одно правило от него не зависит. |
| `geolocation_document_distance_km` | integer | Насколько далеко, в километрах, позиция (местоположение по IP для узла `ip_only`) может находиться от адреса, названного в `geolocation_document_distance_basis`, прежде чем применится `geolocation_document_distance_action`. Не задано или null (по умолчанию): выключено. |
| `geolocation_document_distance_unit` | string | Единица, в которой консоль показывает `geolocation_document_distance_km`. Только для отображения: значение всегда хранится в километрах, и ни одно правило от него не зависит. |
| `geolocation_document_distance_basis` | string | Какой адрес используется для измерения `geolocation_document_distance_km`: `document` (по умолчанию: адрес из удостоверяющего личность документа, затем адрес из подтверждения адреса), только `proof_of_address` или `declared` (`expected_details.address`, переданный при создании сессии, с геокодированием). |
| `geolocation_travel_tolerance_enabled` | boolean | Допускает расстояние от адреса, если того же человека (тот же `vendor_data`) видели в пределах `geolocation_travel_usual_area_km` от этого адреса за последние `geolocation_travel_max_days` дней. Никогда не допускает VPN, подменённую позицию, заблокированную зону или нахождение вне разрешённых зон. Считать, что человек находился в этом месте, можно только по позиции, которую измерило устройство: поддельное или смоделированное определение, эмулятор или непройденная аттестация никогда не учитываются. |
| `geolocation_travel_usual_area_km` | integer | Радиус вокруг адреса, который считается обычной зоной человека. От 10 до 500 км; если не задан, 100 км. |
| `geolocation_travel_max_days` | integer | Как долго после того, как человека видели в обычной зоне, удалённая позиция ещё считается поездкой. От 1 до 90 дней; если не задано, 14 дней. |
| `geolocation_consecutive_mismatch_count` | integer | Выставлять LOCATION\_CONSECUTIVE\_MISMATCHES, когда эта проверка и предыдущие проверки того же человека (тот же `vendor_data`) оказались вне разрешённых зон, в заблокированной зоне или слишком далеко от адреса столько раз подряд. Проверка, которая ничего не сравнивала, не продлевает и не прерывает серию; так же и позиция, которую устройство не измерило (поддельное или смоделированное определение, эмулятор, непройденная аттестация). От 2 до 10; null (по умолчанию): выключено. |
| `geolocation_approximate_action` | action | Вердикт, когда пользователь предоставил приблизительное местоположение, а `geolocation_accuracy_mode` требует точного местоположения. По умолчанию `REVIEW`. |
| `geolocation_blocked_area_action` | action | Вердикт, когда позиция и весь её круг точности попадают в заблокированную зону из `geolocation_areas`. По умолчанию: Decline. |
| `geolocation_consecutive_mismatch_action` | действие | Вердикт, который выносится, когда достигнуто `geolocation_consecutive_mismatch_count` несовпадений подряд. По умолчанию Review. |
| `geolocation_document_distance_action` | действие | Вердикт, который выносится, когда местоположение устройства находится дальше от адреса в документе, чем `geolocation_document_distance_km`. Адрес геокодируется грубо, поэтому это слабый сигнал. По умолчанию `REVIEW`. |
| `geolocation_emulator_action` | действие | Вердикт, который выносится, когда приложение, передавшее местоположение, сообщает, что работает на эмуляторе. Браузеры не могут сообщить об этом. Если значение не No action, шаг завершается на этой попытке: повторная проверка не может изменить устройство. По умолчанию No action, если не задано иное или не указано в пресете. |
| `geolocation_geofence_undetermined_action` | действие | Вердикт, который выносится, когда местоположение нельзя отнести внутрь или наружу геозоны, так как круг точности касается границы. Неопределённость никогда не трактуется как нахождение за пределами геозоны. По умолчанию `REVIEW`. |
| `geolocation_geofencing_action` | действие | Вердикт, который выносится, когда местоположение устройства и весь его круг неопределённости находятся за пределами `geolocation_geofencing_by_country`. По умолчанию `DECLINE`. |
| `geolocation_integrity_missing_action` | действие | Вердикт, который выносится, когда нативный клиент передал местоположение без токена аттестации устройства. По умолчанию No action. Веб-клиенты фиксируются как неподдерживаемые, а не как отсутствующие, потому что ни один браузер не может пройти аттестацию. |
| `geolocation_ip_distance_action` | действие | Вердикт, который выносится, когда местоположение устройства и местоположение сессии по IP находятся дальше друг от друга, чем `geolocation_ip_distance_km`, после вычитания обоих радиусов неопределённости. По умолчанию `REVIEW`. |
| `geolocation_low_accuracy_action` | действие | Вердикт, который выносится, когда ни одна попытка не обеспечила требуемую точность: у лучшего местоположения радиус неопределённости превышает `geolocation_max_accuracy_radius_m` или радиус не был передан вовсе. Местоположение без радиуса никогда не считается соответствующим ограничению. По умолчанию `REVIEW`. |
| `geolocation_mock_location_action` | действие | Вердикт, который выносится, когда операционная система сообщила, что местоположение смоделировано, а не измерено (mock-провайдер Android, программно смоделированное местоположение в iOS). По умолчанию `REVIEW`. |
| `geolocation_permission_denied_action` | действие | Вердикт, который выносится, когда пользователь отклонил или закрыл запрос доступа к местоположению во всех разрешённых попытках. По умолчанию Review: отказ является выбором пользователя, а не признаком мошенничества. |
| `geolocation_proxy_action` | действие | Вердикт, который выносится, когда соединение, передавшее местоположение, идёт через открытый или анонимный прокси либо прокси частной ретрансляции. По умолчанию No action, если не задано иное или не указано в пресете. |
| `geolocation_stale_fix_action` | действие | Вердикт, который выносится, когда местоположение было измерено более чем за `geolocation_max_age_seconds` до того, как сервер его получил. По умолчанию `REVIEW`. |
| `geolocation_tor_action` | действие | Вердикт, который выносится, когда соединение, передавшее местоположение, проходит через выходной узел Tor. По умолчанию No action, если не задано иное или не указано в пресете. |
| `geolocation_unavailable_action` | действие | Вердикт, который выносится, когда местоположение получить не удалось: службы геолокации выключены или ограничены, система позиционирования ничего не вернула, попытка истекла по времени, пользователь пропустил шаг или клиент слишком старый для поддержки этой функции. По умолчанию `REVIEW`. |
| `geolocation_vpn_action` | действие | Вердикт, который выносится, когда соединение, передавшее местоположение, идёт через коммерческий VPN. Если значение не No action, пользователя просят выключить VPN и проверить снова, пока остаются попытки. По умолчанию No action, если не задано иное или не указано в пресете. |
| `status_rules` | массив | Необязательные пользовательские правила статусов. Можно использовать поля `geolocation.*`, перечисленные в [Отчёт о проверке местоположения](https://docs.didit.me/ru/core-technology/location-verification/report-location-verification.md#поля-для-правил-статуса-и-ветвей). |

### Формы областей

Каждый элемент `geolocation_areas` имеет `id` (от 1 до 64 символов из `A-Z a-z 0-9 _ -`, уникальный в списке), необязательную `label` (до 80 символов), `type` со значением `allowed` или `blocked` и `kind`, который определяет форму.

| `kind` | Дополнительные поля | Значение |
| - | - | - |
| `country` | `country` (ISO 3166-1 alpha-3) | Вся страна, для которой опубликован контур. |
| `region` | `country`, `regions` (коды ISO 3166-2 этой страны) | Одна или несколько административных единиц одной страны с опубликованными границами. |
| `circle` | `center` (`latitude`, `longitude`), `radius_km` (от 1 до 500) | Каждая точка в пределах радиуса от центра. |
| `polygon` | `points` (от 3 до 200 элементов `latitude`, `longitude`) | Замкнутый контур, рёбра которого никогда не пересекаются и не касаются друг друга. |

Список содержит не более 50 областей и требует хотя бы одной области `allowed`, пока `is_geolocation_geofencing_enabled` равно `true`.
`geolocation_areas` и `geolocation_geofencing_by_country` нельзя передавать вместе, а `geolocation_refusal_path: "end_session"` требует, чтобы `geolocation_permission_denied_action` было `REVIEW` или `DECLINE`.
API отклоняет область, которая никогда не сможет совпасть, например регион страны без опубликованных границ, и не сохраняет её.

Пример:

```json theme={null}
{
  "feature": "GEOLOCATION",
  "config": {
    "geolocation_position_source": "device_and_ip",
    "geolocation_preset": "licensing",
    "geolocation_max_accuracy_radius_m": 250,
    "geolocation_max_attempts": 3,
    "is_geolocation_geofencing_enabled": true,
    "geolocation_areas": [
      { "id": "spain", "label": "Spain", "type": "allowed", "kind": "country", "country": "ESP" },
      { "id": "ceuta-melilla", "type": "blocked", "kind": "region", "country": "ESP", "regions": ["ES-CE", "ES-ML"] }
    ],
    "geolocation_ip_distance_km": 200,
    "geolocation_ip_distance_action": "REVIEW",
    "geolocation_vpn_action": "DECLINE"
  }
}
```

## Подтверждение адреса

Значение функции: `PROOF_OF_ADDRESS`.

| Поле конфигурации | Тип | Описание |
| - | - | - |
| `poa_documents_allowed` | object | Конфигурация типа документа для подтверждения адреса по коду страны ISO3. Должен быть включён хотя бы один допустимый тип документа. |
| `poa_languages_allowed` | object | Код языка ISO 639-1 и значение `0` или `1`. Должен быть включён хотя бы один язык. |
| `poa_name_or_address_mismatch_action` | действие | Действие, если имя или адрес не совпадают с ожидаемыми данными. |
| `poa_document_issues_action` | действие | Действие, если у документа есть проблемы с качеством или извлечением данных. |
| `poa_max_attempts_exceeded_action` | ограниченное действие | Действие, если пользователь превысил лимит повторных попыток. Используйте `DECLINE` или `REVIEW`. |
| `poa_document_authenticity_action` | ограниченное действие | Действие, если проверки подлинности не пройдены. Используйте `DECLINE` или `REVIEW`. |
| `poa_document_unproven_text_replacement_action` | действие | Действие, если текстовое поле было очищено и заново набрано другим шрифтом, а файл не содержит доказательств того, изменилось ли его содержимое (`POA_DOCUMENT_UNPROVEN_TEXT_REPLACEMENT`). |
| `poa_unsupported_document_type_action` | действие | Действие, если тип документа не поддерживается. |
| `poa_unsupported_language_action` | действие | Действие, если язык документа не поддерживается. |
| `poa_issuer_not_identified_action` | действие | Действие, если эмитент документа не определён. |
| `poa_issue_date_not_detected_action` | действие | Действие, если дата выдачи отсутствует. |
| `poa_unparsable_or_invalid_address_action` | действие | Действие, если адрес недействителен или не может быть разобран. |
| `address_validation_enabled` | boolean | Проверяет адрес, который считывает этот шаг (напечатанный на подтверждении адреса; проверяется только загрузка, прошедшая проверки документа), по почтовым справочным данным: подтверждает, что адрес существует, и нормализует его, но никогда не связывает его с человеком. Результат попадает в объект `address_validation` шага в решении. **Оплачивается \$0.10 за каждый проверенный адрес**; проверка, которую не удалось выполнить (`unavailable`), бесплатна. По умолчанию выключено. |
| `address_not_verified_action` | действие | Действие, если проверка адреса не смогла подтвердить адрес на уровне здания (`ADDRESS_NOT_VERIFIED`: `partially_verified` или `not_verified`). Применяется только при включённом `address_validation_enabled`. По умолчанию используется `NO_ACTION`, которое только фиксирует предупреждение. |
| `poa_name_match_score_threshold` | integer | Порог совпадения имени. |
| `poa_max_retry_attempts` | integer | Лимит повторных попыток, от `2` до `5`. |
| `status_rules` | array | Необязательные пользовательские правила статуса. |

## Анкеты

Значение функции: `QUESTIONNAIRE`.

| Поле конфигурации | Тип | Описание |
| - | - | - |
| `questionnaire_uuid` | UUID | Обязательно. Используйте `questionnaire_id`, возвращаемый `POST /v3/questionnaires/`. |
| `review_questionnaire_manually` | boolean | Отправляет ответы на анкету на ручную проверку. |
| `status_rules` | array | Необязательные пользовательские правила статуса. Можно указывать поля `questionnaire.answers.<question_id>`. |

## Реестр KYB

Значение функции: `KYB_REGISTRY`.

| Поле конфигурации | Тип | Описание |
| - | - | - |
| `kyb_accepted_countries` | object | Устаревший список разрешённых стран ISO3 для поиска в реестре компаний. Заменён `kyb_registry_countries_config`; по-прежнему читается и для существующих сценариев вычисляется из него, но новые сценарии через него больше не настраиваются. |
| `kyb_manual_company_action` | действие | Действие, если компания требует ручной обработки. |
| `kyb_registry_fields_config` | object | Видимость и обязательность каждого поля формы реестра в размещённом процессе. См. ниже. |
| `kyb_registry_countries_config` | object | Маршрутизация реестра по странам в виде `{"<ISO2>": {"enabled": bool, "tier": "basic" \| "shareholders" \| "ubo"}}`. Для каждой включённой страны выбирается уровень данных, который тарифицируется при выборе компании (`basic` соответствует тарифу Lite). Включить можно только те уровни, которые [endpoint цен](https://docs.didit.me/ru/getting-started/kyb-registry-pricing.md) отмечает как доступные для этой страны. Должна быть включена хотя бы одна страна: проверка в реестре, которая не ищет ни в одной стране, отклоняется. Компании, введённые вручную, оплачиваются отдельно и не используют эту конфигурацию. |
| `kyb_registry_monitoring_enabled` | boolean | Оставляет запись компании в реестре под непрерывным мониторингом после результата Shareholders или UBO: изменение статуса, руководителей, структуры владения или адреса возвращает сессию на проверку и отправляет webhook. Доступно только там, где поставщик реестра предлагает мониторинг. USD 2.00 за компанию в год, отменить можно в любой момент. По умолчанию выключено. |
| `kyb_vat_invalid_action` | действие | Действие, если VAT-номер компании не прошёл проверку EU VIES. По умолчанию `REVIEW`. |
| `kyb_vat_unverified_action` | действие | Действие, если VAT-номер не удалось проверить, потому что VIES был недоступен. По умолчанию `NO_ACTION`. |
| `status_rules` | array | Необязательные пользовательские правила статуса. |

`kyb_registry_fields_config` сопоставляет каждый настраиваемый ключ поля с `{"enabled": bool, "required": bool}`. `enabled: false` скрывает поле, `enabled: true, required: false` показывает его как необязательное, а `enabled: true, required: true` делает его обязательным при отправке. `company_name`, `country_code` и `region` всегда показываются и обязательны, их нельзя настроить. Если объект опущен, равен `null` или `{}`, применяется значение по умолчанию: обязательно только `incorporation_date`, все остальные поля необязательны.

```json theme={null}
{
  "kyb_registry_fields_config": {
    "registration_number": { "enabled": true, "required": true },
    "incorporation_date": { "enabled": true, "required": true },
    "vat_number": { "enabled": true, "required": false },
    "control_scheme": { "enabled": false, "required": false }
  }
}
```

Настраиваемые ключи полей: `registration_number`, `incorporation_date`, `legal_address`, `vat_number`, `alternative_names`, `tax_number`, `company_type`, `legal_entity_identifier`, `location_of_registration`, `nature_of_business`, `registered_capital_amount`, `registered_capital_currency`, `website`, `email`, `phone`, `control_scheme`. Поведение для конечного пользователя см. в разделе [настраиваемые поля формы реестра](https://docs.didit.me/ru/business-verification/company-data.md#настраиваемые-поля-формы-реестра), а о том, как проверяются `vat_number` и `tax_number`, см. в разделе [проверка VAT и налогового номера](https://docs.didit.me/ru/business-verification/company-data.md#vat-и-проверка-налогового-номера).

## Документы KYB

Значение функции: `KYB_DOCUMENTS`.

| Поле конфигурации | Тип | Описание |
| - | - | - |
| `kyb_required_document_groups` | объект или массив | Обязательно. Обязательные группы документов KYB. |
| `kyb_document_subtype_config` | объект | Включение подтипов документов и конфигурация возраста для каждого документа. |
| `kyb_document_tampering_action` | ограниченное действие | Действие при обнаружении подделки. Используйте `DECLINE` или `REVIEW`. |
| `kyb_document_unproven_text_replacement_action` | действие | Действие, когда текстовое поле документа компании было очищено и набрано заново другим шрифтом, а файл не содержит доказательств того, изменилось ли его содержимое (`KYB_DOCUMENT_UNPROVEN_TEXT_REPLACEMENT`). |
| `kyb_document_critical_mismatch_action` | ограниченное действие | Действие при критических расхождениях в документах. Используйте `DECLINE` или `REVIEW`. |
| `kyb_document_non_critical_mismatch_action` | действие | Действие при некритических расхождениях в документах. |
| `kyb_document_age_action` | действие | Действие, когда правила возраста документа не выполняются. |
| `kyb_document_max_retry_attempts` | целое число | Лимит повторных попыток для документов KYB. |
| `kyb_document_max_attempts_exceeded_action` | ограниченное действие | Действие при превышении максимального числа попыток. Используйте `DECLINE` или `REVIEW`. |
| `status_rules` | массив | Необязательные пользовательские правила статусов. |

## Ключевые лица KYB

Значение функции: `KYB_KEY_PEOPLE`.

| Поле конфигурации | Тип | Описание |
| - | - | - |
| `kyb_ubo_ownership_threshold` | целое число | Порог владения UBO, от `0` до `100`. |
| `kyb_shareholder_ownership_threshold` | целое число | Порог владения акционера, от `0` до `100`. Он не может быть выше `kyb_ubo_ownership_threshold`. |
| `kyb_key_people_ownership_required` | логическое значение | Требует указания доли владения для каждого отправляемого ключевого лица. Проверяется при отправке и отображается в размещённом интерфейсе, где поле помечается как обязательное. По умолчанию `false`. |
| `kyb_require_ubo_kyc` | логическое значение | Требует, чтобы UBO прошли сценарий верификации физического лица. |
| `kyb_ubo_verification_workflow` | UUID | Обязательно, если `kyb_require_ubo_kyc` равно `true`. Должен ссылаться на сценарий, не являющийся KYB, в том же приложении. |
| `kyb_require_officer_kyc` | логическое значение | Требует, чтобы должностные лица прошли верификацию физического лица. |
| `kyb_shareholder_verification_workflow` | UUID | Сценарий верификации физического лица для акционеров. |
| `kyb_officer_verification_workflow` | UUID | Сценарий верификации физического лица для должностных лиц. |
| `kyb_require_corporate_ubo_kyb` | логическое значение | Требует, чтобы корпоративные UBO прошли KYB. |
| `kyb_corporate_ubo_verification_workflow` | UUID | Обязательно, если `kyb_require_corporate_ubo_kyb` равно `true`. Должен ссылаться на сценарий KYB в том же приложении. |
| `kyb_reject_if_ubo_rejected` | логическое значение | Отклоняет компанию, если обязательная верификация UBO отклонена. |
| `kyb_wait_for_all_ubos` | логическое значение | Ожидает завершения всех обязательных верификаций UBO перед принятием решения по сессии KYB. |
| `kyb_role_config` | объект или массив | Конфигурация по ролям. Каждая обязательная роль KYC должна включать `verification_workflow`. |
| `kyb_reuse_verified_individuals` | логическое значение | Повторно использует уже верифицированных физических лиц, когда это возможно. |
| `kyb_notify_parties_by_email` | логическое значение | Отправляет уведомления по электронной почте приглашённым ключевым лицам. |
| `kyb_key_people_company_fields` | объект | Какие данные компании собираются для ключевого лица типа CORPORATE. Та же структура списка дескрипторов и те же правила, что и у `kyb_key_people_person_fields`. Структура: `[{"key": "<field key>", "label": "<label>", "type": "text"\|"number"\|"date"\|"phone"\|"email", "required": true\|false, "custom": true\|false}]`. |
| `kyb_key_people_document_mismatch_action` | действие | Вердикт, когда документ ключевого лица не соответствует данным, указанным для него. |
| `kyb_key_people_person_fields` | объект | Какие личные данные собираются для ключевого лица, являющегося физическим лицом, в виде УПОРЯДОЧЕННОГО СПИСКА дескрипторов полей (а не словаря). `key` обязателен и не может быть пустым; `type` должен быть одним из: text, number, date, phone или email; `custom` отмечает поле, добавленное клиентом, а не одно из встроенных. Структура: `[{"key": "<field key>", "label": "<label>", "type": "text"\|"number"\|"date"\|"phone"\|"email", "required": true\|false, "custom": true\|false}]`. |
| `kyb_key_people_prefill_from_registry` | логическое значение | Предзаполняет список ключевых лиц данными из результата запроса к реестру компаний, чтобы клиент подтверждал и исправлял их, а не вводил каждого должностного лица и акционера вручную. |
| `status_rules` | массив | Необязательные пользовательские правила статусов. |

## Document AI

Значение функции: `DOCUMENT_AI`.

Запрашивает у пользователя один или несколько документов и извлекает заданные вами поля с помощью модели компьютерного зрения. Каждое настроенное поле становится значением для ветвления `document_ai.<key>`, а результатом шага является `document_ai.status`.

| Поле конфигурации | Тип | Описание |
| - | - | - |
| `document_ai_documents` | массив | Обязательно. Документы, которые нужно запросить (не более `3`). Каждый элемент является объектом документа (см. ниже). |
| `document_ai_unreadable_document_action` | действие | Действие, если документ не удаётся прочитать или из него не удаётся извлечь данные. |
| `document_ai_missing_required_fields_action` | действие | Действие, если обязательное поле не удаётся извлечь. |
| `document_ai_document_tampering_action` | ограниченное действие | Действие, если документ содержит признаки манипуляции или вмешательства. Используйте `DECLINE` или `REVIEW`. |
| `document_ai_name_mismatch_action` | действие | Действие, если извлечённое полное имя не совпадает с подтверждённой личностью. Требует поля, помеченного `is_full_name`. |
| `document_ai_unsupported_file_action` | действие | Действие, если загруженный файл имеет неподдерживаемый тип. |
| `document_ai_max_attempts_exceeded_action` | ограниченное действие | Действие, если пользователь превышает количество попыток. Используйте `DECLINE` или `REVIEW`. |
| `document_ai_name_match_score_threshold` | целое число | Минимальная оценка (`0`–`100`), при которой извлечённое полное имя считается совпадающим с подтверждённой личностью. Если оценка ниже, применяется `document_ai_name_mismatch_action`. |
| `document_ai_max_retry_attempts` | целое число | Лимит повторных попыток: от `2` до `5`. |
| `status_rules` | массив | Необязательно. Пользовательские правила статуса. Можно обращаться к полям `document_ai.<key>`. |

Каждый элемент `document_ai_documents` является документом:

| Поле документа | Тип | Описание |
| - | - | - |
| `document_key` | строка | Обязательно. Стабильный идентификатор документа, уникальный в пределах шага. |
| `title` | строка | Обязательно. Заголовок, который видит пользователь. |
| `description` | строка | Обязательно. Инструкция для пользователя о том, что нужно загрузить. |
| `title_i18n` | объект | Необязательно. Код локали и переведённый заголовок (например, `{ "es": "Comprobante de fondos" }`). |
| `description_i18n` | объект | Необязательно. Код локали и переведённое описание. |
| `fields` | массив | Обязательно. Поля для извлечения (не менее одного). Ключи полей должны быть уникальными в пределах документа. |

Каждый элемент `fields` документа является полем:

| Поле | Тип | Описание |
| - | - | - |
| `key` | строка | Обязательно. Стабильный JSON-ключ извлечённого значения, уникальный в пределах документа. Для ветвления используйте `document_ai.<key>`. |
| `name` | строка | Обязательно. Понятная человеку подпись поля. |
| `name_i18n` | объект | Необязательно. Код локали и переведённое название поля. |
| `instruction` | строка | Необязательно. Инструкция, которая точно указывает модели, что извлечь для этого поля. |
| `type` | строка | Тип поля: `text`, `number` или `date`. По умолчанию: `text`. |
| `required` | логическое значение | Должно ли поле присутствовать. По умолчанию: `false`. Если `true` и значение отсутствует, применяется `document_ai_missing_required_fields_action`. |
| `is_full_name` | логическое значение | Необязательно, по умолчанию `false`. Помечает поле, значение которого является полным именем владельца документа; оно сравнивается с подтверждённой личностью (имя из верификации личности или ожидаемые данные сессии). **Не более одного поля в документе** может иметь значение `true`, и это **необязательно**: в документе может не быть ни одного отмеченного поля, и тогда сравнение полного имени для этого документа не выполняется. Полным именем может быть только поле типа `text`. |

Пример:

```json theme={null}
{
  "feature": "DOCUMENT_AI",
  "config": {
    "document_ai_documents": [
      {
        "document_key": "proof_of_funds",
        "title": "Proof of Funds",
        "description": "Upload a recent bank statement.",
        "title_i18n": { "es": "Comprobante de fondos" },
        "fields": [
          {
            "key": "account_holder",
            "name": "Account holder",
            "instruction": "The full name of the account holder as printed on the statement.",
            "type": "text",
            "required": true,
            "is_full_name": true
          },
          {
            "key": "closing_balance",
            "name": "Closing balance",
            "instruction": "The closing balance amount.",
            "type": "number",
            "required": false
          }
        ]
      }
    ],
    "document_ai_missing_required_fields_action": "REVIEW",
    "document_ai_name_mismatch_action": "REVIEW",
    "document_ai_name_match_score_threshold": 80
  }
}
```

## Электронная подпись

Значение функции: `SIGNATURE`.

Позволяет верифицированному лицу или ключевым лицам компании подписывать документы на уровне Simple (по умолчанию) или Advanced (AES). Размещайте этот шаг после шагов, которые проверяют подписанта: Верификация личности и Проверка электронной почты или телефона для одноразового кода. См. [Электронная подпись](https://docs.didit.me/ru/core-technology/electronic-signature/overview.md).

| Поле конфигурации | Тип | Описание |
| - | - | - |
| `signature_documents` | array | Документы, загруженные в этот сценарий в консоли, в порядке, в котором их видит подписант, в виде `[{"uuid", "title", "file_name", "pages", "size_bytes"}]`. Читаются только значения `uuid` и их порядок, остальное берётся из сохранённых файлов. Не более 20 документов и 50 МБ суммарно. По умолчанию `[]`. |
| `signature_documents_source` | string | Откуда берутся документы: `workflow` (по умолчанию), `session` (`sign.documents` при [создании сессии](https://docs.didit.me/ru/sessions-api/create-session.md#документы-для-электронной-подписи)) или `both` (сначала документы сценария). |
| `signature_require_read_to_end` | boolean | Подписант должен дойти до конца каждого документа без полей, прежде чем согласиться с ним. По умолчанию `true`. |
| `signature_consent_per_document` | boolean | Подписант соглашается с каждым документом без полей отдельно. Для документов с полями отдельное согласие заменяют поля с пошаговым заполнением и итоговое согласие. По умолчанию `true`. |
| `signature_signer` | string | Кто подписывает: `verified_person` (по умолчанию, KYC) или для KYB `legal_representative` (ключевые лица с ролью `representative` или `authorized_signatory`) либо `key_people` (каждое физическое ключевое лицо с сессией KYC). |
| `signature_level` | string | `simple` (по умолчанию): без верификации личности, электронной почты, телефона и кода, подписант вводит своё имя и подписывает по ссылке сессии. `aes`: требует одобренной верификации личности, подтверждённой электронной почты или телефона и одноразового кода. `simple` не допускается для подписантов `legal_representative` и `key_people` и возвращает `signature_simple_requires_verified_person`. Пока `signature_availability.aes` имеет значение `false` в сценарии, сохранение нового шага `aes` возвращает `400` с `aes_not_available`. `qes` скоро появится: его сохранение возвращает `400` с `qes_not_available`. |
| `signature_format` | string | `pades` (по умолчанию). Для AES значения `xades` и `cades` не допускаются и возвращают `signature_format_not_supported`. |
| `signature_otp_channel` | string | Куда отправляется одноразовый код: `email` (по умолчанию) или `sms`. Код отправляется только на контакт, проверенный ранее в сессии. |
| `signature_email_signed_copy` | boolean | Отправлять подписанту по электронной почте копию подписанных документов. Требует подтверждённой электронной почты. По умолчанию `true`. |
| `signature_evidence_page` | boolean | Добавлять страницу с доказательствами в конец каждого подписанного PDF. По умолчанию `true`. |
| `signature_link_validity_days` | integer | Срок действия ссылки для подписи, от `1` до `30` дней с момента создания сессии. По умолчанию `7`. |
| `signature_declined_action` | action | Решение, если подписант отказывается. Плата не взимается. По умолчанию `REVIEW`. |
| `signature_otp_failed_action` | action | Решение после 3 неверных кодов или более 5 запрошенных кодов. По умолчанию `DECLINE`. |
| `signature_name_mismatch_action` | action | Решение, если заявленное имя ключевого лица не совпадает с его верифицированным именем. По умолчанию `DECLINE`. |
| `signature_identity_not_verified_action` | action | Решение, если у подписанта нет одобренного подтверждения личности. По умолчанию `DECLINE`. |
| `signature_document_changed_action` | action | Решение, если документ больше не соответствует SHA-256, записанному при его показе. По умолчанию `DECLINE`. |
| `status_rules` | array | Необязательные пользовательские правила статусов. Можно задавать `signature.status`, `signature.level` и `signature.format`. |

Поля в документе сценария задаются в редакторе шаблонов консоли. Для документов сессии передавайте поля в `sign.documents[].fields`, а значения полей `api.<key>` передавайте в `sign.field_values`. См. [Создание сессии](https://docs.didit.me/ru/sessions-api/create-session.md#документы-для-электронной-подписи).

Пример для документов, которые передаются с каждой сессией:

```json theme={null}
{
  "feature": "SIGNATURE",
  "config": {
    "signature_documents_source": "session",
    "signature_signer": "verified_person",
    "signature_level": "aes",
    "signature_otp_channel": "email",
    "signature_link_validity_days": 14,
    "signature_declined_action": "REVIEW"
  }
}
```


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