Получение результата¶
Эта страница описывает запросы, общие поля и правила обработки ответа. Поля и примеры отдельных технологий доступны через указатель результатов и меню раздела.
Запрашивайте результат с backend клиентской системы. Момент завершения можно отслеживать через webhook flow.end; после сигнала интерфейса также проверяйте результат серверным запросом. Ответ содержит текущее состояние сессии и доступные результаты, в том числе промежуточные.
API KEY хранится на backend
Эти методы требуют API KEY Workflow. Не передавайте его в браузер или мобильное приложение. Redirect, событие Widget finish и переход WebView на /finished сами по себе не подтверждают успешную проверку.
Полный результат¶
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>"
}'
Облегчённый результат¶
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:
document_recognition_v2_result: JSON-пример.
E-Document без файлов и с повторно использованными датами:
edocument_result: JSON-пример.
Принятая ошибка ГБД ЮЛ и адресная ошибка другого формата:
gbdul_result: JSON-пример.address_result: JSON-пример.
Фото PPS остаётся ссылкой в обоих вариантах, а вопрос с файлом может не иметь value:
pps_result: JSON-пример.questionnaire_results: JSON-пример.
Полученные пустые выдачи KZ Info и ЕРД, завершённое подтверждение OTP:
kz_info_result: JSON-пример.erd_result: JSON-пример.otp_results: JSON-пример.
Остальные форматы документов и сравнения лиц (фрагмент light-ответа; блоки не обязаны встречаться в одной сессии):
face2face_result: JSON-пример.npck_result: JSON-пример.edocument_child_result: JSON-пример.mxdocument_result: JSON-пример.mrz_result: JSON-пример.
{
"document_recognition_result": {
"result": true,
"first_name": "ПРИМЕР",
"last_name": "ПРИМЕРОВ",
"images": {}
}
}
Ожидание ответа реестра и полученные сведения (динамические JSON намеренно не изображены как универсальная схема):
gbdfl_result: JSON-пример.rpn_result: JSON-пример.tunduk_result: JSON-пример.aml_result: JSON-пример.
Идентификация, подписание и IP-проверка:
ds_identifier_result,ds_signer_result: JSON-пример.ip_check_results: JSON-пример.
Обработка ответа¶
- Проверяйте HTTP-статус и связывайте
idответа со своей заявкой и исходнымsession_id. - Учитывайте
statusсессии,flow_session_resultи состояние нужных технологий. Не считайте промежуточныйfalseокончательным отказом. - Различайте отсутствующие поля, пустые контейнеры, пустые строки и явные отрицательные значения.
- Для файлов применяйте таблицу full/light; не пытайтесь декодировать все файловые поля как Base64.
- При повторном запросе учитывайте обновление выбранной записи и появление новых результатов. Не используйте этот ответ как полный журнал попыток.