Перейти к содержанию

Получение результата

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

Запрашивайте результат с backend клиентской системы. Момент завершения можно отслеживать через webhook flow.end; после сигнала интерфейса также проверяйте результат серверным запросом. Ответ содержит текущее состояние сессии и доступные результаты, в том числе промежуточные.

API KEY хранится на backend

Эти методы требуют API KEY Workflow. Не передавайте его в браузер или мобильное приложение. Redirect, событие Widget finish и переход WebView на /finished сами по себе не подтверждают успешную проверку.

Полный результат

POST https://kyc.biometric.vision/api/flows/sessions/result/
curl --request POST \
  --url 'https://kyc.biometric.vision/api/flows/sessions/result/' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --compressed \
  --data '{
    "session_id": "<SESSION_ID>",
    "api_key": "<FLOW_API_KEY>"
  }'

Облегчённый результат

POST https://kyc.biometric.vision/api/flows/sessions/result/light/
curl --request POST \
  --url 'https://kyc.biometric.vision/api/flows/sessions/result/light/' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --compressed \
  --data '{
    "session_id": "<SESSION_ID>",
    "api_key": "<FLOW_API_KEY>"
  }'

Light — вариант ответа, а не HTTP-метод. Для обоих endpoints выше используется POST с JSON-телом. Query-параметры получения результата этими маршрутами не предусмотрены.

Совместимость с прежними маршрутами

В текущем коде также доступны следующие маршруты прежнего API. Они используют те же выходные схемы, правила исключения null, проверки принадлежности сессии и ограничение частоты.

Метод Путь Обязательные параметры Ответ
GET /api/v1/flows/session/result/ В query: session_id (UUID), flow_api_key (string), оба не null Полный результат
POST /api/v1/flows/session/result/ В JSON-теле: session_id (UUID), api_key (string), оба не null Полный результат
GET /api/v1/flows/session/result/light/ В query: session_id (UUID), flow_api_key (string), оба не null Light-результат

У этих GET-методов ключ Workflow называется flow_api_key, а не api_key. POST для прежнего light-маршрута не объявлен. Для новой интеграции используйте POST-маршруты из примеров выше.

Авторизация и параметры

Авторизация выполняется по api_key в теле запроса: ключ определяет Workflow, а session_id должен принадлежать этому Workflow. Дополнительные Authorization или X-API-Key для этих двух методов не требуются.

Параметр тела Тип Обязательность Назначение
session_id string, UUID Обязателен, не null Идентификатор, полученный при создании сессии. В ответе называется id.
api_key string Обязателен, не null API KEY того Workflow, которому принадлежит сессия.

HTTP-ответы

HTTP-статус Тело / смысл
200 Объект результата без внешней обёртки. Это успешное получение данных, а не обязательный успех проверки.
400 {"detail":"Wrong flow"} — сессия принадлежит другому Workflow.
403 {"detail":"Flow session access forbidden"} — доступ к сессии отклонён.
404 Workflow по ключу или сессия не найдены; тело ошибки содержит detail. Удалённый Workflow по ключу не находится.
422 Ошибка проверки тела запроса: отсутствует обязательное поле, неверный UUID или тип. detail содержит массив описаний ошибок валидации.
429 Превышено ограничение частоты запросов. На обоих методах настроено ограничение 1/s; не рассчитывайте на отдельный лимит для каждого session_id.
5xx Ошибка сервера или формирования ответа, в том числе при чтении файлов. Это не отрицательный результат технологии.

Для больших ответов поддерживается сжатие gzip (Accept-Encoding: gzip; в примерах его запрашивает --compressed).

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

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

  • Обязательное поле присутствует при успешной сериализации соответствующего родительского объекта.
  • При наличии значения означает: поле допускает null в исходных данных, но такой ключ не включается в ответ. Пустая строка, false, 0, {} и [] сами по себе не удаляются.
  • Удаление null из полей схем не означает очистку произвольного JSON. Внутри динамических словарей и массивов null может сохраняться и отличается от отсутствующего ключа.
  • Отсутствие блока не устанавливает причину: проверка могла ещё не начаться, запись могла не создаться или технология могла не участвовать в сессии. Блок может появиться до завершения проверки, иногда как {}.
  • UUID передаётся строкой. ИИН, БИН, номера документов и телефоны — строки: сохраняйте ведущие нули.
  • number — JSON-число; оценки prediction у Liveness, Face2Face и NPCK передаются строками, а не числами.

Обязательность вложенного поля всегда рассматривается только при наличии его родительского объекта. Для динамического JSON нет закрытого перечня ключей, если это прямо не указано.

Структура ответа

Корневой объект ответа.

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

Поле Тип в JSON Назначение и условия
id string, UUID Обязателен. Идентификатор запрошенной сессии.
status string, enum Обязателен. Статус сессии.
flow_session_result boolean Обязателен. Текущий агрегированный результат; правила вычисления.
validated_at string, date-time При наличии значения. Время успешной валидации сессии перед началом прохождения, ISO 8601 с часовым поясом; не время получения результата.
finished_at string, date-time При наличии значения. Время вызова штатного завершения сессии, ISO 8601 с часовым поясом. Не гарантируется для любого конечного статуса, например при автоматическом истечении срока.
technologies object[] Обязателен, может быть []. Текущие активные технологии Workflow в порядке прохождения; элемент.
request_sessions object[] Обязателен, может быть []. Уникальные наборы сведений об устройстве и запросе; элемент.
flow_session_failure_reasons object[] Обязателен, может быть []. Причины сессии и выбранных результатов технологий; элемент.

Указатель результатов технологий

Одиночные блоки имеют тип object и исключаются, если соответствующей записи нет. Три массива в конце таблицы возвращаются как [], если записей нет. Наличие блоков определяется сохранёнными результатами, а не только текущим списком technologies.

Поле верхнего уровня Результат Коды технологий по умолчанию
liveness_result Liveness LDHP, LDSH, LDD, LDD2, LDPM, LC
face2face_result Face2Face F2F
npck_result Сравнение лица через NPCK / ЦОИД F2F_NPCK
document_recognition_v2_result Document Recognition v2 DR2
edocument_result E-Document ED
edocument_child_result Детский E-Document EDC
mxdocument_result MxDocument MXD
mrz_result MRZ MRZ
pps_result PPS PPS
address_result Адрес ADR, ADR2
gbdfl_result ГБД ФЛ GBDFL, GBDFL2
gbdul_result ГБД ЮЛ GBDUL
kz_info_result KZ Info KZ_INFO
erd_result ЕРД ERD
rpn_result РПН RPN
tunduk_result Tunduk TDK
aml_result AML AML
ds_identifier_result Идентификация для электронной подписи DSI, DSN
ds_signer_result Подписание DSS
questionnaire_results Анкеты, object[] QST
ip_check_results Проверки IP, object[] IP_CHECK
otp_results Подтверждения одноразовым кодом, object[] OTP

Коды в таблице — значения по умолчанию в конфигурации проекта; развёрнутый сервис может использовать переопределённые коды. У разных вариантов одной технологии может быть общий блок. Отдельного persons_result, массива всех попыток Liveness или результатов каждой модели Liveness в этом ответе нет. Метаданные создания сессии, её контекст и срок действия также не входят в этот контракт.

Технологии

Родитель: technologies[].

Список отражает текущую конфигурацию Workflow, а не неизменяемый снимок на момент создания сессии. Отключённые технологии в него не включаются.

Поле Тип в JSON Назначение и условия
code string Обязателен. Код технологии, например LDD или DR2; коды задаются конфигурацией сервиса, это не закрытый enum этой схемы.
name string Обязателен. Отображаемое имя технологии.
description string Обязателен. Описание технологии; может быть пустой строкой.

Сведения об устройствах

Родитель: request_sessions[].

Поля с пометкой «Обязателен» присутствуют всегда внутри этого объекта. Остальные поля — при наличии значения; null исключается из ответа.

Поле Тип в JSON Назначение и условия
ip_address string IP-адрес запроса.
country string Страна, определённая по IP; текущая обработка сохраняет код страны.
browser_family string Название / семейство браузера из User-Agent.
browser_version string Версия браузера.
os_family string Семейство операционной системы.
os_version string Версия ОС.
device_family string Семейство устройства.
device_brand string Производитель устройства.
device_model string Модель устройства.
is_bot boolean Результат определения бота по User-Agent; не итог антифрод-проверки.
device_type string Категория устройства. Текущий обработчик формирует MOBILE (смартфон), TABLET (планшет), TOUCH_CAPABLE (носимое/сенсорное устройство), PC (компьютер), BOT (бот), UNKNOWN (не определено). Поле схемы — свободная строка.

Одинаковые наборы всех перечисленных значений объединяются; полностью пустые записи исключаются. Это не хронология запросов и не количество попыток. Порядок элементов не следует использовать как порядок посещений.

Статус, итог и ошибки сессии

Статус сессии, булев итог и данные отдельных проверок отвечают на разные вопросы.

Поле: status.

Допустимые значения регистра и написания приведены точно.

Поле Тип в JSON Назначение и условия
CREATED string Сессия создана.
QR string Этап перехода к прохождению по QR.
PROGRESS string Прохождение в процессе.
FINISHED string Штатное завершение сессии.
FAILED string Сессия завершилась неуспешно, в том числе по истечении срока.
IN_REVIEW string Ожидается решение по ручному рассмотрению.
APPROVED string Сессия одобрена при рассмотрении.
DECLINED string Сессия отклонена при рассмотрении.

flow_session_result возвращает false для любого статуса, кроме FINISHED и APPROVED. Для этих двух статусов дополнительно проверяются связанные результаты технологий Workflow, кроме технологии персон:

  • отсутствующая ожидаемая связь с результатом приводит к false;
  • записанная причина отказа или явный result: false у выбранного результата приводят к false;
  • отсутствие значения result само по себе не равно false; для связи с несколькими записями отсутствие записей также не является самостоятельным отрицательным условием этого расчёта.

Проверка итога использует технологии Workflow без того же фильтра активности, который применяется к technologies. Поэтому flow_session_result нельзя самостоятельно восстановить простым логическим AND всех видимых result. APPROVED также не гарантирует flow_session_result: true.

result технологии отражает её правила и конфигурацию. Например, AML может быть принят при найденном совпадении, если отказ по совпадению отключён; некоторые проверки могут принять недоступность сервиса. При этом причина ошибки иногда сохраняется, и общий итог остаётся отрицательным. У KZ Info и ЕРД отдельного result вообще нет: смотрите статус получения, данные и ошибку.

Причины отказа

Родители: *.failure_reason (кроме адреса) и flow_session_failure_reasons[].

Для адреса предусмотрено исключение: address_result.failure_reason — строковый UUID, см. раздел адреса.

Поле Тип в JSON Назначение и условия
type string Обязателен. Категория ошибки, перечень ниже.
detail string При наличии значения. Описание конкретной причины, до 512 символов; может отсутствовать. Это диагностический текст, не закрытый enum.

Значения failure_reason.type.

flow_session_failure_reasons[].type имеет тип свободной строки и объединяет категории технологий с категориями сессии (OTHER, EXPIRED).

Поле Тип в JSON Назначение и условия
TIMEOUT string Истекло время ожидания.
NO_CAM string Камера отсутствует или недоступна.
CALC_RESULT string Проверка не пройдена по результатам вычислений.
SERVICE_ERROR string Ошибка сервиса или внешнего поставщика.
REQUEST_ERROR string Ошибка формирования или обработки запроса.
CLIENT string Причина на стороне прохождения: входные данные, действия пользователя, ограничения сценария.
OTHER string Иная причина.
DIFFERENT_FACES string В кадрах обнаружены разные лица.
VR_CAM string Обнаружена виртуальная камера.
EXPIRED string Истёк срок сессии; это категория общей ошибки сессии, а не enum объекта ошибки технологии.

Общий массив ошибок содержит ошибки сессии, затем ошибки выбранных результатов технологий в порядке Workflow. Он не является полным журналом повторных попыток; в элементах нет кода технологии, UUID ошибки или времени. Возможны повторы. Для привязки причины к проверке используйте её собственный блок.

Примеры диагностических сочетаний приведены в справочнике причин отказа. Не принимайте решение только по тексту detail. result: false не гарантирует наличие failure_reason, а наличие result: true не гарантирует отсутствие ошибки.

Незавершённые сессии и повторные попытки

Получение результата не требует конечного статуса. Во время прохождения доступны частичные данные, пустые массивы и блоки без result; flow_session_result: false в этот момент не означает окончательный отказ. Статусы и даты могут обновляться при следующем запросе.

Блоки Выбор записи
Liveness, обе версии Document Recognition, адрес, ГБД ФЛ, ГБД ЮЛ, MxDocument, Tunduk, MRZ, PPS, РПН Одна самая новая запись по времени создания, а не последняя успешная. При равном времени дополнительный порядок не закреплён.
edocument_result, edocument_child_result Самая новая запись отдельно для обычной и детской технологии E-Document.
Face2Face, NPCK, KZ Info, ЕРД, AML, идентификация и подписание ЭП Один связанный результат сессии; изменения этой записи отражаются в следующем ответе.
ip_check_results, questionnaire_results, otp_results Все связанные записи. OTP отсортированы от новых к старым; для IP и анкет порядок не закреплён.

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

Результаты E-Document, Document Recognition v2 и PPS могут быть скопированы из предыдущей сессии при настроенном повторном использовании данных персоны. На это указывают status: "COPIED" и source_session. Это не новое получение документа или фотографии. Возможность копирования зависит от настроек срока актуальности и проверок пригодности исходного результата.

Файлы в полном и light-ответе

Поле Полный ответ Light
liveness_result.face_photo Base64 Ссылка
document_recognition_result.images.* Base64 Ссылка
document_recognition_v2_result.images[].content Base64 Ссылка
edocument_result.face_photo, barcode, qrcode, document_image, document_pdf Base64 Ссылка
edocument_child_result.face_photo, barcode, qrcode, document_image, document_pdf Base64 Base64
mxdocument_result.frontside_image, backside_image, face_photo Base64 Ссылка
tunduk_result.photo Base64 Ссылка
mrz_result.photo, pps_result.photos[].photo, questionnaire_results[].answers[].content Ссылка Ссылка
Данные внутри динамического JSON Как сохранены Без специальной замены вложенных значений

Base64 содержит байты файла без префикса data:...;base64,. Для document_pdf это байты PDF; тип и расширение изображений нельзя определять только по названию поля. Light сохраняет имена и структуру полей, меняя значение на строку URL только в перечисленных местах.

Файловое поле доступно, если файл связан с результатом. При отсутствии файла поле исключается; словарь images старого Document Recognition может остаться {}, а массив изображений v2 — []. Некоторые файлы появляются позже остальных данных или не формируются в выбранном сценарии.

Ссылки формируются хранилищем; для S3 используется подписанный доступ. Срок действия не входит в ответ и не закреплён этим API. Не сохраняйте URL как постоянный адрес: при необходимости запросите свежий результат. Наличие URL не гарантирует, что файл не был удалён; полный ответ дополнительно требует успешного чтения файлов при формировании Base64.

Статусы запросов реестров

Эта таблица объясняет общие обозначения. Каждый раздел ниже задаёт свой допустимый набор: не все технологии используют все значения.

Значения поля status для адреса, ГБД ФЛ, ГБД ЮЛ, PPS и РПН.

В enum результата сохраняется регистр, приведённый в таблице.

Поле Тип в JSON Назначение и условия
UNAPPROVED string Согласие / разрешение на получение данных ещё не подтверждено.
PENDING string Ожидание ответа / выполнения запроса.
VALID string Положительный статус подтверждения доступа к данным; сам по себе не гарантирует заполненность всех полей.
INVALID string Отрицательный статус подтверждения доступа.
TIMEOUT string Истекло время ожидания подтверждения / ответа.
NOT_FOUND string Запрашиваемые данные или субъект не найдены.
FAILED string Ошибка получения / обработки.
ERROR_ACCEPTED string Ошибка принята согласно конфигурации продолжения сценария; это не подтверждение получения данных.
COPIED string Результат скопирован из предыдущей сессии.
SUCCESS string Успешное получение данных.
REQUEST_RATE_LIMIT_EXCEEDED_ERROR string Превышено ограничение частоты запросов к сервису адреса.

Успешный результат

Ниже два целостных ответа для одной условной сессии с Liveness. Дополнительные метрики не сформированы, поэтому их полей нет. В Base64-примере использовано маленькое синтетическое PNG, а не фотография человека; URL в light вымышленный.

Полный ответ

{
  "id": "11111111-1111-4111-8111-111111111111",
  "status": "FINISHED",
  "validated_at": "2026-09-01T10:00:00Z",
  "finished_at": "2026-09-01T10:01:00Z",
  "flow_session_result": true,
  "technologies": [
    {
      "code": "LDD",
      "name": "Проверка живости",
      "description": "Проверка лица при изменении расстояния"
    }
  ],
  "liveness_result": {
    "result": true,
    "prediction": "0.9800",
    "face_photo": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAwMCAO+aWQAAAABJRU5ErkJggg=="
  },
  "request_sessions": [],
  "flow_session_failure_reasons": [],
  "ip_check_results": [],
  "questionnaire_results": [],
  "otp_results": []
}

Light-ответ

{
  "id": "11111111-1111-4111-8111-111111111111",
  "status": "FINISHED",
  "validated_at": "2026-09-01T10:00:00Z",
  "finished_at": "2026-09-01T10:01:00Z",
  "flow_session_result": true,
  "technologies": [
    {
      "code": "LDD",
      "name": "Проверка живости",
      "description": "Проверка лица при изменении расстояния"
    }
  ],
  "liveness_result": {
    "result": true,
    "prediction": "0.9800",
    "face_photo": "https://files.example.invalid/liveness/face.png?signature=EXAMPLE"
  },
  "request_sessions": [],
  "flow_session_failure_reasons": [],
  "ip_check_results": [],
  "questionnaire_results": [],
  "otp_results": []
}

Неуспешный результат

Целостный ответ с отрицательным Liveness. 200 от метода получения такого JSON не отменяет flow_session_result: false.

{
  "id": "22222222-2222-4222-8222-222222222222",
  "status": "FAILED",
  "flow_session_result": false,
  "technologies": [
    {
      "code": "LDD",
      "name": "Проверка живости",
      "description": "Проверка лица при изменении расстояния"
    }
  ],
  "liveness_result": {
    "result": false,
    "failure_reason": {
      "type": "CALC_RESULT",
      "detail": "Low overall prediction"
    }
  },
  "request_sessions": [],
  "flow_session_failure_reasons": [
    {
      "type": "CALC_RESULT",
      "detail": "Low overall prediction"
    }
  ],
  "ip_check_results": [],
  "questionnaire_results": [],
  "otp_results": []
}

Промежуточный ответ

Целостный ответ до начала проверки. Отсутствие блока Liveness здесь ожидаемо.

{
  "id": "33333333-3333-4333-8333-333333333333",
  "status": "CREATED",
  "flow_session_result": false,
  "technologies": [
    {
      "code": "LDD",
      "name": "Проверка живости",
      "description": "Проверка лица при изменении расстояния"
    }
  ],
  "request_sessions": [],
  "flow_session_failure_reasons": [],
  "ip_check_results": [],
  "questionnaire_results": [],
  "otp_results": []
}

Фрагменты результатов

JSON-примеры на страницах технологий — фрагменты корневого объекта, а не целостные ответы. Все номера и имена условные; примеры не предназначены для отправки в API запуска проверок.

Скопированный результат распознавания v2 в light; динамический текст может содержать null:

E-Document без файлов и с повторно использованными датами:

Принятая ошибка ГБД ЮЛ и адресная ошибка другого формата:

Фото PPS остаётся ссылкой в обоих вариантах, а вопрос с файлом может не иметь value:

Полученные пустые выдачи KZ Info и ЕРД, завершённое подтверждение OTP:

Остальные форматы документов и сравнения лиц (фрагмент light-ответа; блоки не обязаны встречаться в одной сессии):

{
  "document_recognition_result": {
    "result": true,
    "first_name": "ПРИМЕР",
    "last_name": "ПРИМЕРОВ",
    "images": {}
  }
}

Ожидание ответа реестра и полученные сведения (динамические JSON намеренно не изображены как универсальная схема):

Идентификация, подписание и IP-проверка:

Обработка ответа

  1. Проверяйте HTTP-статус и связывайте id ответа со своей заявкой и исходным session_id.
  2. Учитывайте status сессии, flow_session_result и состояние нужных технологий. Не считайте промежуточный false окончательным отказом.
  3. Различайте отсутствующие поля, пустые контейнеры, пустые строки и явные отрицательные значения.
  4. Для файлов применяйте таблицу full/light; не пытайтесь декодировать все файловые поля как Base64.
  5. При повторном запросе учитывайте обновление выбранной записи и появление новых результатов. Не используйте этот ответ как полный журнал попыток.