Перейти к основному содержанию
POST
cURL
Используйте этот эндпоинт, чтобы создавать сценарии через API без самостоятельного построения узлов графа. Передайте массив features в том порядке, в котором пользователи должны проходить проверки. Didit преобразует его во внутренний сценарий на основе узлов и автоматически добавит финальный шаг со статусом. Эндпоинт POST /v3/workflows/ создаёт только простые, линейные сценарии, то есть плоский список features. Для ветвления, условной маршрутизации, Document AI и узлов отказа/решения используйте формат графа с узлами, описанный ниже. Он лежит в основе визуального конструктора в консоли и инструментов сценариев Didit MCP. Все поля config, которые принимает каждая функция, перечислены в разделе Конфигурации функций сценария.

Базовый сценарий KYC

Сценарий с анкетой

Сначала создайте анкету с помощью POST /v3/questionnaires/. Затем используйте возвращённый questionnaire_id как questionnaire_uuid.
Порядок функций важен. Например, OCR должен стоять перед FACE_MATCH, NFC, DATABASE_VALIDATION или проверками AML пользователя, которые зависят от данных документа.

Справочник по конфигурации функций

Каждый элемент features[] имеет такую структуру:
Точный объект config зависит от функции. Полный список полей, значения по умолчанию, обязательные настройки, допустимые диапазоны и примеры см. в разделе Конфигурации функций сценария. Для OCR опустите config.documents_allowed, передайте null или {}, чтобы разрешить все поддерживаемые типы документов. Указывайте этот параметр, только если хотите ограничить сценарий определёнными странами или типами документов. Для QUESTIONNAIRE поле config.questionnaire_uuid обязательно.

Необязательные настройки сценария

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

Ветвления и сценарии на основе графа (граф)

Линейный список features не может выразить «если X, то Y». Для условного ветвления (отклонение по статусу, маршрутизация по извлечённому полю, условие шага по совпадению), шага запроса Document AI или терминальных узлов отклонения/решения сценарии Didit используют граф узлов, то есть ту же структуру, которую создаёт визуальный конструктор в консоли.
Проще всего создать сценарий на основе графа с помощью Didit MCP: попросите агента простыми словами («после верификации личности, если профессия ≈ “Software Engineer”, добавь шаг подтверждения наличия средств»), и он построит, проверит и сохранит граф за вас. Структура ниже соответствует тому, что создают эти инструменты и консоль.

Структура графа

Граф имеет вид { start_node, nodes }. nodes — это словарь «идентификатор узла → узел». Рёбра неявные: каждый узел указывает вперёд через next (безусловно) и/или branches[].goto (условно). start_node должен быть узлом feature. Ветви проверяются по порядку, срабатывает первое совпадение. Пустой rules: [] — это общее правило «иначе» (ставьте его последним). session_status: "Determine" принимает решение автоматически на основе совокупного результата функций.
Каждый узел branch должен иметь явную ветвь else, то есть ветвь с rules: [], которая направляет сессии, не подпадающие ни под одно условие. Не полагайтесь на next узла branch как на запасной вариант: голый next отображается в конструкторе как неоднозначное ребро и его легко пропустить. Если вы отправляете узел branch с next и без ветви else, API преобразует этот next в явную ветвь else автоматически (так, { …, "branches": [<conditions>], "next": "liveness" } сохраняется как branches: [<conditions>, { "id": "else", "rules": [], "goto": "liveness" }]). Создайте else сами, чтобы явно задать поведение: преобразование служит страховкой, а не заменой.

Правила ветвления и операторы

Каждое правило сравнивает поле со значением с помощью оператора:
  • Поля называют результат функции (kyc.status, aml.status, document_ai.status, face_match.score, …) или извлечённое значение (kyc.full_name, kyc.age, kyc.nationality, kyc.extra_fields.profession, поле Document AI document_ai.<key>, expected_details.*). Ветвление может читать поле только в том случае, если соответствующая функция выполнялась на каждом пути, ведущем к этому ветвлению.
  • Операторы: equals, not_equals, greater_than(_or_equals), less_than(_or_equals), contains, not_contains, in, not_in, is_empty, is_not_empty, regex и fuzzy_match (только для строковых полей; требует score от 0 до 100, то есть порог сходства, например: профессия ≥ 80% похожа на «Software Engineer»).

Ветвление по причине, по которой NFC не выполнялся

После узла NFC используйте nfc.skip_reason с equals или in, чтобы направлять сессии по причине, по которой чтение чипа не состоялось. Поле имеет семь стабильных значений:
  • USER_SKIPPED
  • DOCUMENT_WITHOUT_CHIP
  • CHIP_CERTIFICATE_UNAVAILABLE
  • DEVICE_WITHOUT_NFC
  • INTEGRATION_WITHOUT_NFC_ACCESS
  • MRZ_KEY_UNAVAILABLE
  • JPKI_UNAVAILABLE
Значение каждого из них описано в разделе Причины пропуска NFC. Когда NFC выполнен успешно, nfc.skip_reason равен null, поэтому ни правило equals, ни правило in для причины пропуска не сработают. Поле также вычисляется для узлов NFC, пропущенных гейтом. Сюда входят случаи, когда отчёта или предупреждения NFC нет, и случаи, когда allow_nfc_skip равен false, но документ или устройство не позволяют NFC запуститься. Поэтому такие сессии можно направлять, не полагаясь на запись в nfc_verifications[].
Сессии, сохранённые до того, как поддержка NFC стала иметь три состояния, могут иметь has_device_nfc_support: false. Поэтому более старая веб-сессия может определяться как DEVICE_WITHOUT_NFC, а не INTEGRATION_WITHOUT_NFC_ACCESS.
В этом графе equals используется для пропуска пользователем, in для пропусков по гейту или возможностям, а явная ветвь else — для успешного NFC. Ветвление идёт после узла NFC, и каждый маршрут ведёт вперёд к терминальному узлу:
Чтобы выразить «NFC не выполнялся ни по одной из известных причин», используйте in со всеми семью значениями. Оставьте явную ветвь else для успешного NFC (nfc.skip_reason: null) и для любого будущего значения, которое ваш граф пока не распознаёт.

Document AI (например, подтверждение наличия средств)

Узел DOCUMENT_AI запрашивает один или несколько документов и извлекает именованные поля:
Каждое настроенное поле становится значением, по которому можно выполнять ветвление: document_ai.<key>, а результатом шага является document_ai.status. Установите "is_full_name": true для поля, в котором содержится полное имя держателя документа. Его извлечённое значение сравнивается с полным именем проверенной личности (имя из OCR или верификации личности либо ожидаемые данные сессии). document_ai_name_mismatch_action определяет, что произойдёт при несовпадении ниже document_ai_name_match_score_threshold. Флаг необязательный: для документа можно не указывать ни одного поля, но не более одного поля в документе может иметь этот флаг. Все поля конфигурации Document AI см. в разделе Конфигурация функций сценария → Document AI.

Эндпоинты и жизненный цикл черновика

Редактирование графа выполняется для каждого приложения и использует эндпоинты консоли и управления (Bearer-токен пользователя + read:workflows/write:workflows). Граф можно редактировать только в черновой версии, поэтому жизненный цикл такой: создать черновик → задать граф → опубликовать.

Предупреждения валидации

Endpoint валидации возвращает { "is_valid": true, "graph": …, "warnings": [] }. Предупреждение носит рекомендательный характер: граф корректен, его можно сохранить и опубликовать, даже если предупреждения есть. Каждая запись содержит узел ветвления и ветку, к которой она относится, чтобы конструктор мог указать на конкретное условие:
Невалидный граф возвращает 400 с errors и списком warnings по возможности. Только errors блокируют сохранение.

Пример: направить инженеров-программистов на подтверждение наличия средств

После верификации личности: если она была отклонена, отклонить сессию; если профессия владельца ≈ “Software Engineer” (сходство ≥80%), запросить документ, подтверждающий наличие средств; затем принять окончательное решение.
Финальный узел использует session_status: "Determine", который автоматически принимает решение (одобрить / отклонить / отправить на проверку) на основе тех функций, которые реально выполнялись в сессии. Поэтому и путь с подтверждением наличия средств, и путь else корректно приводят к решению, без того чтобы какая-либо ветка читала document_ai.status (этого поля нет на пути, где Document AI пропускается). Помните: ветвь может читать только то поле, функция которого выполнялась на каждом пути, ведущем к ней. Отправьте его в виде { "graph": <above> } на endpoint …/workflow-graph/ (сначала выполните валидацию). Чтобы создать новый сценарий с нуля, используйте didit_workflow_set_graph из MCP; чтобы изменить существующий сценарий, используйте didit_workflow_edit_graph (небольшие операции, которые сохраняют существующие узлы и списки разрешённых значений). См. Didit MCP.

Авторизации

x-api-key
string
header
обязательно

API-ключ вашего приложения из раздела «Разработчикам» -> «API-ключи» в Business Console. Основной ключ имеет полный доступ. Именованный ключ может иметь ограниченную область действия: без доступа, чтение или запись для каждого ресурса, ограничение определенными сценариями или одобренными сессиями, списком IP-адресов и сроком действия. 401 означает, что ключ неверен, отозван или его срок действия истек; 403 означает, что ключ не был передан, у ключа нет доступа к этому ресурсу или действию, либо запрос поступил с адреса вне его списка IP-адресов; 404 на маршруте сессии означает, что сессия не входит в сценарии или статусы ключа. Ключ без доступа к медиа получает URL изображений, видео и PDF как null, а ключ без прав на запись сессий получает ссылки на сессии и токены как null. См. https://docs.didit.me/console/api-keys.

Тело

application/json

Создайте простой линейный сценарий. API преобразует этот список функций во внутренний граф сценария на основе узлов. СТРОГИЙ белый список полей: любой ключ, не указанный здесь (включая workflow_type), отклоняется с кодом 400.

features
object[]
обязательно

Функции верификации в порядке выполнения. API связывает каждый элемент со следующим и автоматически добавляет один финальный узел статуса.

Minimum array length: 1
workflow_label
string
по умолчанию:ID Verification

Отображаемое имя для сценария (максимум 50 символов). По умолчанию "ID Verification", если параметр опущен — всегда задавайте его, чтобы сценарии оставались различимыми.

Maximum string length: 50
Пример:

"Standard KYC"

is_default
boolean

Установить этот сценарий по умолчанию для новых сессий.

status
enum<string>

Опустите это поле, чтобы создать опубликованный сценарий, готовый к запуску сессий. Используйте draft, только если хотите сохранить без публикации.

Доступные опции:
draft,
published
is_white_label_enabled
boolean
по умолчанию:false

Включить кастомизацию White label для сессий, созданных с этим сценарием.

is_desktop_allowed
boolean
по умолчанию:false

Разрешить запуск сценария верификации в браузерах на десктопе.

max_retry_attempts
integer
по умолчанию:3

Максимальное количество повторных попыток после отклонения верификации. 0 блокирует пользователя после первого отклонения.

Требуемый диапазон: 0 <= x <= 10
retry_window_days
integer | null
по умолчанию:7

Скользящее окно в днях для подсчёта повторных попыток. null устанавливает лимит за всё время.

Требуемый диапазон: 1 <= x <= 365
face_liveness_max_attempts
integer
по умолчанию:3

Максимальное количество попыток проверки живости за сессию. По умолчанию 3: одна начальная попытка плюс две повторные попытки. Это значение также копируется в сгенерированные узлы проверки живости и оценки возраста в сценарии, если только оно не переопределено в конфигурации на уровне функции.

Требуемый диапазон: 1 <= x <= 3
face_match_max_attempts
integer
по умолчанию:3

Максимальное количество попыток сравнения лиц за сессию. По умолчанию 3: одна начальная попытка плюс две повторные попытки. Это значение также копируется в сгенерированные узлы сравнения лиц в сценарии, если только оно не переопределено в конфигурации на уровне функции.

Требуемый диапазон: 1 <= x <= 3
session_expiration_time
integer
по умолчанию:604800

Количество секунд до истечения срока незавершённой сессии. Минимум 1 час (3600), максимум 4 недели (2419200).

Требуемый диапазон: 3600 <= x <= 2419200

Ответ

Сценарий создан. Тело ответа представляет собой ПОЛНУЮ конфигурацию сценария — ту же исходную сериализацию VerificationSettings, возвращаемую GET /v3/workflows/{settings_uuid}/ (~190 полей: переключатель каждой функции, порог, действие и сгенерированный workflow_graph), а не компактный элемент списка. Сохраните uuid (также доступный как workflow_id), чтобы ссылаться на него в последующих вызовах создания сессий. Примечание: features представляет собой строку, объединённую с помощью " + ", а цены являются числами JSON.

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

uuid
string<uuid>

Идентификатор конкретной версии (settings_uuid). Каждая версия сценария имеет собственный идентификатор.

workflow_id
string<uuid>

Постоянный идентификатор, общий для всех версий сценария. Созданные с его помощью сессии используют последнюю опубликованную версию.

workflow_label
string

Отображаемое имя сценария.

workflow_type
enum<string> | null

Шаблон сценария. null для графовых сценариев, созданных без шаблона.

Доступные опции:
kyc,
kyb,
adaptive_age_verification,
biometric_authentication,
address_verification,
questionnaire_verification,
email_verification,
phone_verification,
null
is_default
boolean

Является ли этот сценарий сценарием по умолчанию для приложения.

is_archived
boolean

Архивные сценарии не могут запускать новые сессии.

version
integer

Номер версии внутри сценария.

status
enum<string>

Черновые версии можно редактировать; опубликованные версии неизменяемы и используются для новых сессий.

Доступные опции:
draft,
published
published_at
string<date-time> | null

Когда была опубликована эта версия. null для черновиков.

is_simple_workflow
boolean

true, если сценарий не имеет пользовательского workflow_graph.

is_editable
boolean

true только для версий со статусом draft.

workflow_url
string<uri>

Публичный URL для запуска сессии с этим сценарием.

workflow_graph
object | null

Структура графа сценария (узлы и рёбра). null для простых сценариев.

features
string

Включенные функции, объединенные через " + ", например "OCR + LIVENESS".

total_price
number | null

Цена за сессию; для графовых сценариев это самый дорогой путь.

min_price
number | null

Цена самого дешёвого пути в сценарии.

max_price
number | null

Цена самого дорогого пути в сценарии.

special_add_on_prices
object | null

Специальные цены на дополнения для организации или null, если они не заданы.

max_retry_attempts
integer

Количество повторных попыток, разрешенных после отклоненной верификации.

retry_window_days
integer | null

Количество дней, в течение которых разрешены повторные попытки.

session_expiration_time
integer

Количество секунд до истечения срока незавершённой сессии.

questionnaire
object | null

Анкета, прикрепленная к сценарию, или null.

kyb_role_settings
object[]

Настройки верификации по ролям для ключевых лиц KYB.

created_at
string<date-time>
updated_at
string<date-time>
signature_availability
object

Какие уровни Электронной подписи доступны для подписания прямо сейчас. Проверьте это перед установкой signature_level. Возвращается в сценариях kyc, kyb и графовых сценариях.

is_bank_verification_enabled
boolean

Выполняется ли в простом сценарии KYC или KYB верификация банка. Она выполняется после шагов контакта (и верификации местоположения) и перед проверкой по базам данных, AML и анализом IP. Верификация банка пока не является общедоступной: её включение отклоняется везде, где она не активирована.

bank_verification_config
object

Настройки верификации банковских счетов простого сценария с теми же ключами, которые принимает узел BANK_VERIFICATION (например, bank_countries и bank_method_order). Неизвестные ключи отбрасываются. Каждый ключ необязателен, а отсутствующий ключ сохраняет значение по умолчанию, поэтому {} означает использование всех значений по умолчанию. См. раздел Настройки верификации счетов.

Пример:
is_geolocation_enabled
boolean

Выполняется ли в простом сценарии KYC верификация местоположения. Она выполняется после шагов контакта и перед верификацией банка и проверкой по базам данных. В сценариях верификации бизнеса (KYB) этот шаг недоступен.

geolocation_config
object

Настройки верификации местоположения для простого сценария с теми же ключами, которые принимает узел GEOLOCATION (например, is_geolocation_geofencing_enabled и geolocation_max_attempts). Неизвестные ключи отбрасываются. Каждый ключ необязателен; отсутствующий ключ сохраняет значение по умолчанию, поэтому {} означает использование всех значений по умолчанию.

Пример:
Последнее изменение 7 ноября 2026 г.