Person Integration API¶
API позволяет вашей системе создавать и получать профили Person, менять статус верификации, управлять алиасами и фотографиями. Все операции выполняются на backend вашей системы.
Перед интеграцией ознакомьтесь с назначением Person и работой в Workflow и правилами фотографий и верификации.
Подключение и авторизация¶
Базовый адрес:
Для всех операций нужен 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 — число записей до пагинации, 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>"}'
Ответ:
Тело пустое: 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>"}'
Ответ:
Тело пустое: 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. Пример:
| HTTP | Ситуация |
|---|---|
| 400 | Конфликт алиаса, превышение лимита Person, неподходящая подписка, недопустимое расширение файла или нарушение правил фотографии |
| 404 | Неверный ключ организации; персона не найдена в организации; фотография или алиас не принадлежат указанной персоне |
| 422 | Отсутствует обязательное поле, неверный UUID или тип, запрещён SYSTEM_ID, неверный формат даты или дата без часового пояса |
Полный ответ 400 Bad Request при конфликте алиаса:
Полный ответ 404 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; сообщение о преобразовании относится, в частности, к попытке задать срок постоянной фотографии.
Практический сценарий¶
- Найдите Person по алиасу, а при необходимости создайте профиль.
- Загрузите временную фотографию и сохраните её UUID.
- Создайте сессию с тем же алиасом и ключом нужного Workflow, где включено использование фотографии Person.
- Получите результат новой проверки.
- При необходимости измените срок до его наступления либо удалите временную фотографию.
- Снова получите профиль: учитывайте актуальную основную фотографию и
is_verified.
Для замены временной фотографии выполняйте удаление и загрузку последовательно. Если загрузка после удаления не удалась, старый временный эталон уже снят; получите профиль и обработайте это состояние в своей системе.