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

Person Integration API

API позволяет вашей системе создавать и получать профили Person, менять статус верификации, управлять алиасами и фотографиями. Все операции выполняются на backend вашей системы.

Перед интеграцией ознакомьтесь с назначением Person и работой в Workflow и правилами фотографий и верификации.

Подключение и авторизация

Базовый адрес:

https://kyc.biometric.vision/api/persons

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

Не передавайте ключ организации в браузер или мобильное приложение. В примерах замените <ORGANIZATION_API_KEY>, <PERSON_ID>, <PHOTO_ID> и <ALIAS_ID> своими значениями. Идентификаторы в пути — UUID.

Примеры ответов содержат все поля соответствующей схемы без сокращений. UUID, даты, телефон и URL изображений вымышлены; адрес media.example.com иллюстрирует ссылку на файл, а не адрес хранилища сервиса. Примеры показывают разные состояния профиля и не требуют выполнять все операции подряд.

Все перечисленные операции используют POST, включая чтение и удаление. Сохраняйте завершающий / в URL.

Операция Путь после /api/persons Тело Успех
Создать персону /create/ multipart 201
Список персон /list/ JSON 200
Получить по UUID /{person_id}/ JSON 200
Получить по алиасу /retrieve/ JSON 200
Изменить статус /{person_id}/update/ JSON 200
Добавить алиас /{person_id}/alias/ JSON 201
Удалить алиас /{person_id}/alias/{alias_id}/delete/ JSON 204
Добавить фотографию /{person_id}/photo/ multipart 201
Изменить свойства фотографии /{person_id}/photo/{photo_id}/update/ JSON 200
Удалить фотографию /{person_id}/photo/{photo_id}/delete/ JSON 204

В этом контроллере нет операций удаления Person, редактирования алиаса или замены файла фотографии. Для замены алиаса используйте добавление и удаление; для нового изображения — загрузку отдельной фотографии.

Создание персоны

POST /api/persons/create/, multipart/form-data.

Поле Тип Обязательно Описание
api_key string Да Ключ организации
is_verified boolean Да Начальный статус верификации
photo_type string Да DIGITAL, SCAN, LIVE или OTHER
image file Да Файл с расширением .jpg, .jpeg или .png
aliases Повторяемое поле с JSON-объектом Нет Каждый объект содержит value и type; по умолчанию список пуст

value — строка до 255 символов. Допустимые типы пользовательского алиаса: CUSTOM, PHONE, PERSONAL_NUMBER, DOCUMENT_NUMBER. SYSTEM_ID создаётся автоматически и равен UUID персоны.

curl --request POST \
  --url 'https://kyc.biometric.vision/api/persons/create/' \
  --form-string 'api_key=<ORGANIZATION_API_KEY>' \
  --form-string 'is_verified=false' \
  --form-string 'photo_type=OTHER' \
  --form 'image=@/path/to/photo.jpg' \
  --form-string 'aliases={"value":"customer-1042","type":"CUSTOM"}' \
  --form-string 'aliases={"value":"+77000000000","type":"PHONE"}'

Каждый алиас передаётся отдельным полем aliases с JSON-объектом, а не одним JSON-массивом. Не задавайте multipart Content-Type вручную: cURL добавляет boundary.

Начальная фотография становится основной, постоянной, с источником MANUAL. Параметра expires_at в создании Person нет: временную фотографию добавляют отдельным запросом к уже существующей персоне.

Ответ 201 Created:

{
  "id": "c1572b7e-86cc-4cd4-92bb-c222f18dad1d",
  "is_verified": false,
  "created_at": "2026-09-15T10:00:00.000",
  "updated_at": "2026-09-15T10:00:00.000",
  "aliases": [
    {
      "id": "43183343-b019-4f90-9037-3cc795361582",
      "value": "c1572b7e-86cc-4cd4-92bb-c222f18dad1d",
      "type": "SYSTEM_ID",
      "is_expired": false,
      "expired_at": null,
      "expiration_reason": null,
      "source_technology_code": "SYSTEM"
    },
    {
      "id": "91b0d786-a980-4ed2-95ef-94a9f3f228f1",
      "value": "customer-1042",
      "type": "CUSTOM",
      "is_expired": false,
      "expired_at": null,
      "expiration_reason": null,
      "source_technology_code": "MANUAL"
    },
    {
      "id": "de48cfd8-2e62-4807-a6a1-e7d6407ee2c9",
      "value": "+77000000000",
      "type": "PHONE",
      "is_expired": false,
      "expired_at": null,
      "expiration_reason": null,
      "source_technology_code": "MANUAL"
    }
  ],
  "photos": [
    {
      "id": "08694897-00d0-47e7-b950-b03e03f1ddf2",
      "type": "OTHER",
      "content": "https://media.example.com/persons/reference.jpg",
      "is_uploaded": true,
      "is_default": true,
      "expires_at": null,
      "is_expired": false,
      "expired_at": null,
      "expiration_reason": null,
      "source_technology_code": "MANUAL"
    }
  ]
}

Структуры вложенных объектов описаны ниже. Сохраните id для следующих операций. При конфликте алиасов создание откатывается; профиль частично не создаётся.

Получение персоны

По UUID

curl --request POST \
  --url 'https://kyc.biometric.vision/api/persons/<PERSON_ID>/' \
  --header 'Content-Type: application/json' \
  --data '{"api_key":"<ORGANIZATION_API_KEY>"}'

Ответ 200 OK для профиля после успешной сессии:

{
  "id": "c1572b7e-86cc-4cd4-92bb-c222f18dad1d",
  "is_verified": true,
  "created_at": "2026-09-15T10:00:00.000",
  "updated_at": "2026-09-15T10:15:00.000",
  "aliases": [
    {
      "id": "43183343-b019-4f90-9037-3cc795361582",
      "value": "c1572b7e-86cc-4cd4-92bb-c222f18dad1d",
      "type": "SYSTEM_ID",
      "is_expired": false,
      "expired_at": null,
      "expiration_reason": null,
      "source_technology_code": "SYSTEM"
    },
    {
      "id": "91b0d786-a980-4ed2-95ef-94a9f3f228f1",
      "value": "customer-1042",
      "type": "CUSTOM",
      "is_expired": false,
      "expired_at": null,
      "expiration_reason": null,
      "source_technology_code": "MANUAL"
    },
    {
      "id": "de48cfd8-2e62-4807-a6a1-e7d6407ee2c9",
      "value": "+77000000000",
      "type": "PHONE",
      "is_expired": false,
      "expired_at": null,
      "expiration_reason": null,
      "source_technology_code": "MANUAL"
    }
  ],
  "photos": [
    {
      "id": "08694897-00d0-47e7-b950-b03e03f1ddf2",
      "type": "OTHER",
      "content": "https://media.example.com/persons/reference.jpg",
      "is_uploaded": true,
      "is_default": true,
      "expires_at": null,
      "is_expired": false,
      "expired_at": null,
      "expiration_reason": null,
      "source_technology_code": "MANUAL"
    }
  ],
  "flow_sessions": [
    {
      "id": "fa688ecc-8a47-4d33-aabf-ad4755ca5b99",
      "created_at": "2026-09-15T10:05:00.000",
      "finished_at": "2026-09-15T10:15:00.000",
      "flow": {
        "id": "1a0ca936-53e0-41e4-b99e-e9f80574a70b",
        "name": "returning-customer",
        "display_name": "Повторная проверка",
        "created_at": "2026-09-01T09:00:00.000",
        "updated_at": "2026-09-01T09:00:00.000",
        "technologies": [
          "PS",
          "LC",
          "PPS",
          "F2F"
        ]
      }
    }
  ],
  "actions": [
    {
      "type": "VERIFY_PERSON",
      "created_by": "FLOW",
      "created_at": "2026-09-15T10:15:00.000"
    },
    {
      "type": "ADD_ALIAS",
      "created_by": "API",
      "created_at": "2026-09-15T10:00:00.000"
    },
    {
      "type": "ADD_ALIAS",
      "created_by": "API",
      "created_at": "2026-09-15T10:00:00.000"
    },
    {
      "type": "ADD_PHOTO",
      "created_by": "API",
      "created_at": "2026-09-15T10:00:00.000"
    },
    {
      "type": "CREATE_PERSON",
      "created_by": "API",
      "created_at": "2026-09-15T10:00:00.000"
    }
  ]
}

По точному значению алиаса

curl --request POST \
  --url 'https://kyc.biometric.vision/api/persons/retrieve/' \
  --header 'Content-Type: application/json' \
  --data '{"api_key":"<ORGANIZATION_API_KEY>","alias":"customer-1042"}'

alias — обязательная строка. Поиск использует активное значение алиаса внутри организации. Тип не передаётся.

Ответ 200 OK содержит тот же полный профиль, что и получение по UUID:

{
  "id": "c1572b7e-86cc-4cd4-92bb-c222f18dad1d",
  "is_verified": true,
  "created_at": "2026-09-15T10:00:00.000",
  "updated_at": "2026-09-15T10:15:00.000",
  "aliases": [
    {
      "id": "43183343-b019-4f90-9037-3cc795361582",
      "value": "c1572b7e-86cc-4cd4-92bb-c222f18dad1d",
      "type": "SYSTEM_ID",
      "is_expired": false,
      "expired_at": null,
      "expiration_reason": null,
      "source_technology_code": "SYSTEM"
    },
    {
      "id": "91b0d786-a980-4ed2-95ef-94a9f3f228f1",
      "value": "customer-1042",
      "type": "CUSTOM",
      "is_expired": false,
      "expired_at": null,
      "expiration_reason": null,
      "source_technology_code": "MANUAL"
    },
    {
      "id": "de48cfd8-2e62-4807-a6a1-e7d6407ee2c9",
      "value": "+77000000000",
      "type": "PHONE",
      "is_expired": false,
      "expired_at": null,
      "expiration_reason": null,
      "source_technology_code": "MANUAL"
    }
  ],
  "photos": [
    {
      "id": "08694897-00d0-47e7-b950-b03e03f1ddf2",
      "type": "OTHER",
      "content": "https://media.example.com/persons/reference.jpg",
      "is_uploaded": true,
      "is_default": true,
      "expires_at": null,
      "is_expired": false,
      "expired_at": null,
      "expiration_reason": null,
      "source_technology_code": "MANUAL"
    }
  ],
  "flow_sessions": [
    {
      "id": "fa688ecc-8a47-4d33-aabf-ad4755ca5b99",
      "created_at": "2026-09-15T10:05:00.000",
      "finished_at": "2026-09-15T10:15:00.000",
      "flow": {
        "id": "1a0ca936-53e0-41e4-b99e-e9f80574a70b",
        "name": "returning-customer",
        "display_name": "Повторная проверка",
        "created_at": "2026-09-01T09:00:00.000",
        "updated_at": "2026-09-01T09:00:00.000",
        "technologies": [
          "PS",
          "LC",
          "PPS",
          "F2F"
        ]
      }
    }
  ],
  "actions": [
    {
      "type": "VERIFY_PERSON",
      "created_by": "FLOW",
      "created_at": "2026-09-15T10:15:00.000"
    },
    {
      "type": "ADD_ALIAS",
      "created_by": "API",
      "created_at": "2026-09-15T10:00:00.000"
    },
    {
      "type": "ADD_ALIAS",
      "created_by": "API",
      "created_at": "2026-09-15T10:00:00.000"
    },
    {
      "type": "ADD_PHOTO",
      "created_by": "API",
      "created_at": "2026-09-15T10:00:00.000"
    },
    {
      "type": "CREATE_PERSON",
      "created_by": "API",
      "created_at": "2026-09-15T10:00:00.000"
    }
  ]
}

Для чтения истории добавьте ?include_expired=true к URL любого из этих методов. По умолчанию значение false: устаревшие алиасы и фотографии скрыты. Удалённые фотографии не возвращаются в обоих случаях.

include_expired=true не разрешает точный поиск по устаревшему алиасу. Используйте UUID или другой активный алиас.

Список и фильтры

POST /api/persons/list/ принимает в JSON только api_key; фильтры и пагинация передаются в query string.

Query-параметр Тип Назначение
limit integer Размер страницы
offset integer Смещение от начала списка
is_verified boolean Фильтр по актуальному статусу, включая последствия истечения временной фотографии
alias string Поиск по вхождению без учёта регистра
flow_session_id string Фильтр по связанной сессии
from_date datetime Дата создания персоны не раньше указанной
to_date datetime Дата создания персоны не позже указанной
include_expired boolean Возвращать устаревшие данные внутри профилей; по умолчанию false
curl --request POST \
  --url 'https://kyc.biometric.vision/api/persons/list/?limit=20&offset=0&is_verified=true' \
  --header 'Content-Type: application/json' \
  --data '{"api_key":"<ORGANIZATION_API_KEY>"}'

Ответ 200 OK с одной персоной:

{
  "count": 1,
  "items": [
    {
      "id": "c1572b7e-86cc-4cd4-92bb-c222f18dad1d",
      "is_verified": true,
      "created_at": "2026-09-15T10:00:00.000",
      "updated_at": "2026-09-15T10:15:00.000",
      "aliases": [
        {
          "id": "43183343-b019-4f90-9037-3cc795361582",
          "value": "c1572b7e-86cc-4cd4-92bb-c222f18dad1d",
          "type": "SYSTEM_ID",
          "is_expired": false,
          "expired_at": null,
          "expiration_reason": null,
          "source_technology_code": "SYSTEM"
        },
        {
          "id": "91b0d786-a980-4ed2-95ef-94a9f3f228f1",
          "value": "customer-1042",
          "type": "CUSTOM",
          "is_expired": false,
          "expired_at": null,
          "expiration_reason": null,
          "source_technology_code": "MANUAL"
        },
        {
          "id": "de48cfd8-2e62-4807-a6a1-e7d6407ee2c9",
          "value": "+77000000000",
          "type": "PHONE",
          "is_expired": false,
          "expired_at": null,
          "expiration_reason": null,
          "source_technology_code": "MANUAL"
        }
      ],
      "photo": "https://media.example.com/persons/reference.jpg"
    }
  ]
}

Для пустой выборки:

{
  "count": 0,
  "items": []
}

count — число записей до пагинации, items — текущая страница. photo — URL фотографии либо null. По умолчанию новые профили идут первыми.

Фильтр списка alias отличается от точного поиска: он может найти профиль по устаревшему алиасу, даже если этот алиас скрыт в ответе. Совпадение нескольких алиасов одной персоны может повторить её в выдаче. Для однозначного получения профиля используйте /retrieve/ или UUID.

Изменение статуса верификации

POST /api/persons/{person_id}/update/.

Обязательные поля JSON: api_key (string) и is_verified (boolean).

curl --request POST \
  --url 'https://kyc.biometric.vision/api/persons/<PERSON_ID>/update/' \
  --header 'Content-Type: application/json' \
  --data '{"api_key":"<ORGANIZATION_API_KEY>","is_verified":false}'

Ответ 200 OK:

{
  "id": "c1572b7e-86cc-4cd4-92bb-c222f18dad1d",
  "is_verified": false,
  "created_at": "2026-09-15T10:00:00.000",
  "updated_at": "2026-09-15T10:20:00.000"
}

Установка true — явное решение организации, а не запуск проверки лица. Возвращаемый статус учитывает истечение временной фотографии.

Алиасы

Добавить

POST /api/persons/{person_id}/alias/.

Обязательные поля JSON: api_key, value (string, до 255 символов) и type (один из четырёх пользовательских типов из раздела создания).

curl --request POST \
  --url 'https://kyc.biometric.vision/api/persons/<PERSON_ID>/alias/' \
  --header 'Content-Type: application/json' \
  --data '{"api_key":"<ORGANIZATION_API_KEY>","value":"customer-1042","type":"CUSTOM"}'

Ответ 201 Created для профиля, которому этот алиас ещё не назначен:

{
  "id": "91b0d786-a980-4ed2-95ef-94a9f3f228f1",
  "value": "customer-1042",
  "type": "CUSTOM",
  "is_expired": false,
  "expired_at": null,
  "expiration_reason": null,
  "source_technology_code": "MANUAL"
}

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

Удалить

curl --request POST \
  --url 'https://kyc.biometric.vision/api/persons/<PERSON_ID>/alias/<ALIAS_ID>/delete/' \
  --header 'Content-Type: application/json' \
  --data '{"api_key":"<ORGANIZATION_API_KEY>"}'

Ответ:

HTTP/1.1 204 No Content

Тело пустое: JSON не возвращается. SYSTEM_ID удалить нельзя. Удаление алиаса удаляет саму запись; это не перевод в историю через is_expired.

Добавление фотографии

POST /api/persons/{person_id}/photo/, multipart/form-data.

Поле Тип Обязательно Описание
api_key string Да Ключ организации
image file Да .jpg, .jpeg или .png
photo_type string Да DIGITAL, SCAN, LIVE, OTHER
is_default boolean Да Назначить основной; временная фотография становится основной независимо от значения
expires_at datetime с часовым поясом Нет Будущая дата окончания действия; без поля фотография постоянная

Пример временной фотографии:

curl --request POST \
  --url 'https://kyc.biometric.vision/api/persons/<PERSON_ID>/photo/' \
  --form-string 'api_key=<ORGANIZATION_API_KEY>' \
  --form-string 'photo_type=OTHER' \
  --form-string 'is_default=true' \
  --form-string 'expires_at=2030-10-01T12:00:00+05:00' \
  --form 'image=@/path/to/current-photo.jpg'

Выбирайте актуальную будущую дату. Для постоянной фотографии исключите поле expires_at.

Ответ 201:

{
  "id": "095d4c86-bb7b-4347-a1db-ec62618bc7e2",
  "type": "OTHER",
  "is_default": true,
  "is_uploaded": true,
  "expires_at": "2030-10-01T12:00:00+05:00",
  "created_at": "2026-09-15T10:00:00.000",
  "updated_at": "2026-09-15T10:00:00.000"
}

Ответ загрузки не содержит URL файла или полей истории. Для них получите профиль. Правила назначения и восстановления — в статье «Фотографии и верификация».

Изменение фотографии и продление срока

POST /api/persons/{person_id}/photo/{photo_id}/update/, JSON.

Поле Тип Обязательно Описание
api_key string Да Ключ организации
type string или null Нет Новый тип; null игнорируется
is_default boolean или null Нет Назначение основной; null игнорируется
expires_at datetime с часовым поясом Нет Новый будущий срок действующей временной фотографии; явный null запрещён

При обновлении поле называется type, а при загрузке — photo_type. Пропущенные поля не меняются. Файл изображения этот метод не принимает.

curl --request POST \
  --url 'https://kyc.biometric.vision/api/persons/<PERSON_ID>/photo/<PHOTO_ID>/update/' \
  --header 'Content-Type: application/json' \
  --data '{
    "api_key":"<ORGANIZATION_API_KEY>",
    "expires_at":"2030-11-01T12:00:00+05:00"
  }'

Ответ 200 OK после изменения срока:

{
  "id": "095d4c86-bb7b-4347-a1db-ec62618bc7e2",
  "type": "OTHER",
  "is_default": true,
  "is_uploaded": true,
  "expires_at": "2030-11-01T12:00:00+05:00",
  "created_at": "2026-09-15T10:00:00.000",
  "updated_at": "2026-09-15T10:30:00.000"
}

Чтобы назначить постоянную фотографию основной, передайте is_default=true; это возможно, если нет действующей временной фотографии и выбранная фотография не устарела и не удалена.

Удаление фотографии

curl --request POST \
  --url 'https://kyc.biometric.vision/api/persons/<PERSON_ID>/photo/<PHOTO_ID>/delete/' \
  --header 'Content-Type: application/json' \
  --data '{"api_key":"<ORGANIZATION_API_KEY>"}'

Ответ:

HTTP/1.1 204 No Content

Тело пустое: JSON не возвращается. Постоянную основную фотографию удалить нельзя. Временную основную удалить можно; после удаления система восстанавливает постоянную фотографию.

Поля ответов

Полный профиль

Поле Тип Описание
id UUID Идентификатор Person
is_verified boolean Актуальный статус верификации
created_at, updated_at datetime Даты создания и изменения
aliases array Алиасы с учётом include_expired
photos array Фотографии с учётом срока и include_expired
flow_sessions array Связанные сессии
actions array История действий

flow_sessions и actions есть в детальном чтении; создание возвращает профиль без этих двух массивов. Обновление статуса возвращает только четыре скалярных поля.

Алиас

id (UUID), value (string), type (string), is_expired (boolean), expired_at (datetime или null), expiration_reason (string или null), source_technology_code (string).

Фотография внутри профиля

id (UUID), type (string), content (URL или null), is_uploaded (boolean), is_default (boolean), expires_at (datetime или null), is_expired (boolean), expired_at (datetime или null), expiration_reason (string или null), source_technology_code (string).

content — ссылка на файл, а не Base64. Значения срока и признаков активности описаны в истории фотографий. Ответ загрузки или обновления фотографии отличается: включает created_at и updated_at, но не включает content, is_expired, expired_at, expiration_reason и source_technology_code.

Сессия и действие

Сессия содержит id, created_at, finished_at (может быть null) и flow. Объект flow содержит id, name, display_name, created_at, updated_at, technologies — список кодов. Для результатов технологий используйте API результата сессии.

Действие содержит type, created_by, created_at. Типы: CREATE_PERSON, ADD_PHOTO, ADD_ALIAS, DELETE_PERSON, DELETE_PHOTO, DELETE_ALIAS, VERIFY_PERSON, UNVERIFY_PERSON, UPDATE_PHOTO, UPDATE_ALIAS, EXPIRE_PHOTO, EXPIRE_ALIAS, DEDUPLICATE_PHOTO, DEDUPLICATE_ALIAS. Источник действия: SYSTEM, FLOW_METADATA, FLOW, API или CABINET. История может включать действия из других интерфейсов, даже если соответствующей операции нет в Integration API.

Ошибки

Для ошибок бизнес-правил ответ обычно содержит строку detail. Пример:

{
  "detail": "Delete the active temporary photo or wait until it expires"
}
HTTP Ситуация
400 Конфликт алиаса, превышение лимита Person, неподходящая подписка, недопустимое расширение файла или нарушение правил фотографии
404 Неверный ключ организации; персона не найдена в организации; фотография или алиас не принадлежат указанной персоне
422 Отсутствует обязательное поле, неверный UUID или тип, запрещён SYSTEM_ID, неверный формат даты или дата без часового пояса

Полный ответ 400 Bad Request при конфликте алиаса:

{
  "detail": "Alias 'customer-1042' already exists",
  "conflicts": [
    "customer-1042"
  ]
}

Полный ответ 404 Not Found, если персона не найдена в организации:

{
  "detail": "Person not found"
}

Полный ответ 422 Unprocessable Entity при передаче expires_at:null в обновлении фотографии:

{
  "detail": [
    {
      "type": "datetime_type",
      "loc": [
        "body",
        "input_data",
        "expires_at"
      ],
      "msg": "Input should be a valid datetime"
    }
  ]
}

Для ошибок валидации detail содержит список ошибок полей. При конфликте алиасов conflicts перечисляет конфликтующие значения.

Сообщение detail для фотографии (HTTP 400) Что сделать
expires_at must be a future datetime with a timezone Передать будущую дату; отсутствие часового пояса отсекается ещё валидацией с 422
Delete the active temporary photo or wait until it expires Удалить текущую временную фотографию или дождаться истечения
Cannot change default while a temporary photo is active Не переключать основную фотографию при действующей временной
Cannot extend an expired or deleted temporary photo Загрузить новую временную фотографию
Cannot convert permanent and temporary photos Создать новую фотографию нужного вида
Cannot delete default person photo Перед удалением постоянной основной назначить другую
Cannot set expired or deleted person photo as default Выбрать активную фотографию

В Integration API явный expires_at:null при обновлении возвращает 422; сообщение о преобразовании относится, в частности, к попытке задать срок постоянной фотографии.

Практический сценарий

  1. Найдите Person по алиасу, а при необходимости создайте профиль.
  2. Загрузите временную фотографию и сохраните её UUID.
  3. Создайте сессию с тем же алиасом и ключом нужного Workflow, где включено использование фотографии Person.
  4. Получите результат новой проверки.
  5. При необходимости измените срок до его наступления либо удалите временную фотографию.
  6. Снова получите профиль: учитывайте актуальную основную фотографию и is_verified.

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