# API-запросы
# Введение
Прежде чем начать работу с API IDnGO, все клиенты должны пройти аутентификацию, как это описано в разделе Начало работы.
Все несовместимые изменения в API будут сопровождаться новой версией и не повлияют на существующие эндпоинты. Однако мы можем добавлять новые поля в JSON-ответы без предварительного уведомления или изменения версии API. Поэтому не рекомендуется использовать мапперы объектов в коде интеграции, так как они не смогут обработать неизвестные свойства.
Внимание:
- Все запросы к API должны выполняться через HTTPS — обычный HTTP отклоняется.
- Ответы API возвращаются в формате JSON (если не указано иное). Когда необходимо передать данные, они должны быть предоставлены в формате корректного JSON (если не указано иное) с установленным заголовком
Content-Type: application/json.
# Аутентификация
# POST Генерация токена доступа
При инициализации SDK необходимо использовать токен доступа accessToken. Для его получения нужно отправить запрос:
POST /resources/accessTokens?userId={userId}&levelName={levelName}
Токен доступа для верификации пользователя имеет ограниченный доступ к API, например, он действителен только для одного пользователя и не может быть использован для других.
При инициализации SDK убедитесь, что для заголовков авторизации запроса используется пара appToken и secretKey, созданная в правильном окружении (Тестовое или Основное):
- Для тестирования используйте пару
appTokenиsecretKey, созданную в Тестовом окружении (Sandbox); - Для реальных проверок пару
appTokenиsecretKey, созданную в Основном окружении (Production).
Query-параметры
| Название | Тип | Обязательно | Описание |
|---|---|---|---|
userId | String | Да | Внешний идентификатор пользователя, который будет привязан к токену. Он соответствует externalUserId анкеты пользователя. |
levelName | String | Да | Название уровня верификации. |
ttlInSecs | Integer | Нет | Срок действия токена в секундах (по умолчанию — 600 секунд). |
externalActionId | String | Нет | Внешний идентификатор действия пользователя (actions), который будет привязан к токену. |
Параметр запроса userId должен быть уникальным и осмысленным. Это может быть внешний идентификатор пользователя в вашей системе или адрес электронной почты. Не генерируйте эти идентификаторы случайным образом, если только вы не проводите тестирование.
Внимание:
Если ваш userId или levelName содержит зарезервированные символы (например, «@», «+»), его следует закодировать в URL, иначе вы можете столкнуться с несоответствием подписи.
Ответ
| Название | Тип | Описание |
|---|---|---|
token | String | Сгенерированный токен доступа для верификации пользователя. |
Пример
curl -X POST \
'https://api.cyberity.ru/resources/accessTokens?userId=JamesBond007&levelName=basic-kyc-level&ttlInSecs=600' \
-H 'Accept: application/json'
{
"token": "_act-b8ebfb63-5f24-4b89-9c08-5bbabeec986e",
"userId": "JamesBond007"
}
# Ошибки
# GET Проверка состояния API и обработка ошибок
Вы можете проверить рабочее состояние сервиса с помощью запроса, приведённого ниже. Ответ с HTTP-статусом 200 подтверждает доступность API.
Запрос должен быть авторизован с использованием заголовков, описанных в разделе Аутентификация.
GET /resources/status/api
Ответ
При ошибках API возвращает стандартные коды HTTP-статусов.
Внимание:
У нас есть ограничение на количество запросов к API, которые вы можете отправить. Если от вас поступит слишком много запросов, мы будем выдавать код ошибки 429 Too Many Requests. Если вам необходимо отправлять большое количество запросов за короткий промежуток времени, пожалуйста, свяжитесь с нами.
Ответ содержит тело в формате JSON с дополнительной информацией об ошибке.
Тело ответа
| Название | Тип | Обязательно | Описание |
|---|---|---|---|
description | String | Да | Человекочитаемое описание ошибки. |
code | Integer | Да | HTTP-код ошибки. |
correlationId | String | Да | Уникальный идентификатор ошибки. Отправьте его нам при обращении в поддержку. |
errorCode | Integer | Нет | Код конкретной ошибки. |
errorName | String | Нет | Название ошибки. Всегда присутствует, если указан errorCode. |
Пример
curl -X GET \
'https://api.cyberity.ru/resources/status/api'
{
"description": "Error analyzing file, unsupported format or corrupted file",
"code": 400,
"correlationId": "req-5fd59b09-7f5e-41cd-a86b-38a4e6d57e08",
"errorCode": 1004, // Может отсутствовать
"errorName": "corrupted-file" // Может отсутствовать
}
# Коды ошибок
Не все ошибки содержат errorCode и errorName. Со временем мы будем добавлять коды для новых типов ошибок.
| Код | Название | Описание |
|---|---|---|
1000 | duplicate-document | Загружен дубликат документа (изображения или видео). Учитывается полное совпадение. |
1001 | too-many-documents | Анкета пользователя содержит слишком много документов. Добавление новых запрещено. |
1002 | file-too-big | Загруженный файл слишком велик (более 64 МБ). |
1003 | empty-file | Загруженный файл пуст (0 байт). |
1004 | corrupted-file | Файл повреждён или имеет некорректный формат. |
1005 | unsupported-file-format | Неподдерживаемый формат файла (например, .TIFF). |
1006 | no-upload-verification-in-progress | Анкета пользователя проходит проверку, добавление новых данных невозможно. |
1007 | incorrect-file-size | Размер файла не соответствует требованиям в настройках. |
1008 | applicant-marked-as-deleted | Пользователь помечен как удаленный/неактивный. Действия в анкете запрещены. |
1009 | applicant-with-final-reject | Пользователь окончательно отклонен (FINAL). Действия в анкете запрещены. |
1010 | doc-type-not-in-req-docs | Попытка загрузить документ, который не входит в набор допустимых на уровне верификации. |
3000 | applicant-is-already-in-the-state | Анкета уже находится в нужном состоянии. |
4000 | app-token-invalid-format | Неверный формат значения X-App-Token. |
4001 | app-token-not-found | AppToken не найден (например, токен Тестового окружения используется в Основном). |
4002 | app-token-private-part-mismatch | Приватная часть токена (после точки) не совпадает с публичной частью. |
4003 | app-token-signature mismatch | Закодированная подпись не соответствует содержанию запроса. |
4004 | app-token-request-expired | X-App-Access-Ts не совпадает с количеством секунд, прошедших с эпохи Unix в UTC. |
4005 | app-token-invalid-value | Переданы некорректные значения заголовков аутентификации. |
4006 | app-token-not-all-auth-params-provided | Не все необходимые заголовки авторизации были предоставлены. |
4007 | app-token-invalid-params | Переданы неверные параметры аутентификации. |
5000 | applicant-already-blacklisted | Попытка внести в черный список пользователя, который уже внесен в черный список. |
5001 | applicant-already-whitelisted | Попытка внести в белый список пользователя, который уже внесен в белый список. |
Если всё же не удается решить возникшую проблему, пожалуйста, свяжитесь с нами указав correlationId ошибки.
# Анкета пользователя
# POST Создание анкеты пользователя
Анкета пользователя (англ. «Applicant») – это сущность, представляющая одного конкретного пользователя (физ. лицо) в нашей системе. Анкета содержит в себе данные, документы и изображения, которые необходимы для верификации пользователя согласно настроенному уровню проверки.
Чтобы создать анкету пользователя, используйте запрос:
POST /resources/applicants?levelName={levelName}
Query-параметры
| Название | Тип | Обязательно | Описание |
|---|---|---|---|
levelName | String | Да | Название уровня верификации пользователя, которое задается в разделе «Уровни проверок» Дешборда. |
Внимание:
levelName чувствительно к регистру и должно быть создано в том же окружении, в котором создается анкета пользователя (Тестовом или Основном).
Тело запроса
Тело запроса представляет собой объект, содержащий информацию о пользователе.
| Название | Тип | Обязательно | Описание |
|---|---|---|---|
externalUserId | String | Да | Внешний идентификатор пользователя – уникальный идентификатор пользователя на вашей стороне. |
sourceKey | String | Нет | Если вы хотите разделить потоки пользователей, задайте это поле. Оно также отображается в полезных нагрузках вебхуков. |
email | String | Нет | Электронная почта пользователя. |
phone | String | Нет | Номер телефона пользователя. |
lang | String | Нет | Язык, на котором пользователь должен увидеть результат верификации в формате ISO 639-1. |
metadata | Array of objects | Нет | Дополнительная информация, которая не отображается конечному пользователю (пример: [{"key": "keyFromClient", "value": "valueFromClient"}]). |
fixedInfo | Object | Нет | Информация о пользователе, которая не изменяется с нашей стороны. Информация сверяется с данными, полученными из документов. Поля совпадают с info. |
Поля элементов fixedInfo и info
| Название | Тип | Обязательно | Описание |
|---|---|---|---|
firstName | String | Нет | Имя. |
lastName | String | Нет | Фамилия. |
middleName | String | Нет | Второе имя/отчество. |
firstNameEn | String | Нет | Автоматическая транслитерация имени. |
lastNameEn | String | Нет | Автоматическая транслитерация фамилии. |
middleNameEn | String | Нет | Автоматическая транслитерация второго имени/отчества. |
legalName | String | Нет | Имя по паспорту. |
gender | String | Нет | Пол человека (M или F). |
dob | String | Нет | Дата рождения (формат YYYY-mm-dd). |
placeOfBirth | String | Нет | Место рождения. |
countryOfBirth | String | Нет | Страна рождения. |
stateOfBirth | String | Нет | Область/штат рождения. |
country | String | Нет | Трехбуквенный код страны Альфа-3 (например RUS). |
nationality | String | Нет | Трехбуквенный код страны Альфа-3 (например RUS). |
addresses | Array | Нет | Список адресов. |
tin | String | Нет | Идентификационный номер налогоплательщика (ИНН). |
Поля элемента addresses
| Название | Тип | Обязательно | Описание |
|---|---|---|---|
country | String | Нет | Трехбуквенный код страны Альфа-3 (например RUS). |
postCode | String | Нет | Почтовый индекс. |
town | String | Нет | Название города или населенного пункта. |
street | String | Нет | Название улицы или полный адрес в зависимости от формата в документе. |
subStreet | String | Нет | Дополнительная информация об улице. |
state | String | Нет | Название области (округа/республики/штата и т.д.). |
buildingName | String | Нет | Номер дома. |
flatNumber | String | Нет | Номер квартиры. |
buildingNumber | String | Нет | Номер здания. |
Внимание:
Сохраните ID анкеты пользователя (поле id ответа) после создания анкеты пользователя, так как оно понадобится для дальнейших запросов.
Пример
curl -X POST \
'https://api.cyberity.ru/resources/applicants?levelName=basic-kyc-level' \
-H 'Content-Type: application/json' \
-d '{
"externalUserId": "someUniqueUserId",
"email": "john.smith@cyberity.ru",
"phone": "+449112081223",
"fixedInfo": {
"country": "GBR",
"placeOfBirth": "London"
}
}'
{
"id": "5f80e6b7155a6336271e4677", //applicantId
"createdAt": "2020-10-09 22:39:51",
"clientId": "cyberityClient",
"inspectionId": "5f80e6b7155a6336271e4678",
"externalUserId": "someUniqueUserId",
"fixedInfo": {
"placeOfBirth": "London",
"country": "GBR"
},
"email": "john.smith@cyberity.ru",
"phone": "+449112081223",
"requiredIdDocs": {
"excludedCountries": [
"PRK"
],
"docSets": [
{
"idDocSetType": "IDENTITY",
"types": [
"PASSPORT",
"DRIVERS",
"ID_CARD",
"RESIDENCE_PERMIT"
]
},
{
"idDocSetType": "SELFIE",
"types": [
"SELFIE"
],
"videoRequired": "disabled"
}
]
},
"review": {
"reprocessing": false,
"createDate": "2020-10-09 22:39:51+0000",
"reviewStatus": "init"
},
"type": "individual"
}
# POST Изменение уровня верификации
Данный запрос позволяет сменить один уровень верификации пользователя (набор шагов для проверки) на другой. Это может понадобиться в случае, когда нужно добавить еще один шаг к проверке.
Пример: изначальный уровень требует для верификации только удостоверение личности и селфи, а вам необходимо получить подтверждение адреса проживания (PoA). В таком случае уровень меняется на тот, в котором присутствуют все нужные проверки: удостоверение личности, селфи и проверка адреса проживания.
POST /resources/applicants/{applicantId}/moveToLevel?name={levelName}
Внимание:
Обязательно проверьте статус анкеты пользователя перед изменением уровня. Вы не сможете этого сделать, если reviewStatus анкеты находится в состоянии pending, queued и onHold.
Если вы используете наши SDK, вы можете просто инициализировать его с подходящим levelName, и SDK изменит уровень автоматически.
Параметры запроса
| Название | Тип | Обязательно | Описание |
|---|---|---|---|
applicantId | String | Да | Идентификатор пользователя. |
Query-параметры
| Название | Тип | Обязательно | Описание |
|---|---|---|---|
levelName | String | Да | Название уровня верификации пользователя, которое настраивается в разделе «Уровни проверок» Дешборда. |
Ответ
Будут выданы новые requiredIdDocs (список документов/селфи, необходимых для верификации) и levelName (название уровня).
Пример
Пример запроса с телом для изменения требуемого набора документов:
curl -X POST \
'https://api.cyberity.ru/resources/applicants/5f80e6b7155a6336271e4677/moveToLevel?name=kyc-with-poa' \
-H 'Content-Type: application/json' \
{
"id": "5f80e6b7155a6336271e4677",
"createdAt": "2020-10-09 22:47:58",
"clientId": "cyberityClient",
"inspectionId": "5f80e6b7155a6336271e4678",
"externalUserId": "someUniqueUserId",
"info": {
"firstName": "John",
"firstNameEn": "John",
"lastName": "Smith",
"lastNameEn": "Smith",
"dob": "2000-03-04",
"placeOfBirth": "London",
"placeOfBirthEn": "London",
"country": "GBR",
"phone": "+449112081223"
},
"email": "john.smith@cyberity.ru",
"requiredIdDocs": {
"docSets": [
{
"idDocSetType": "IDENTITY",
"types": [
"PASSPORT",
"DRIVERS",
"ID_CARD",
"RESIDENCE_PERMIT"
]
},
{
"idDocSetType": "SELFIE",
"types": [
"SELFIE"
],
"videoRequired": "disabled"
},
{
"idDocSetType": "PROOF_OF_RESIDENCE",
"types": [
"UTILITY_BILL"
]
}
]
},
"review": {
"reprocessing": false,
"levelName": "kyc-with-poa",
"createDate": "2020-10-09 22:47:58+0000",
"reviewStatus": "init"
},
"type": "individual"
}
# POST Получение текущих настроек уровня верификации
Если вы хотите получить список необходимых для верификации документов/селфи (requiredIdDocs), используйте эндпоинт:
POST /resources/applicants/{applicantId}/requiredIdDocs
Параметры запроса
| Название | Тип | Обязательно | Описание |
|---|---|---|---|
applicantId | String | Да | Идентификатор пользователя. |
Пример
curl -X POST \
'https://api.cyberity.ru/resources/applicants/5f80e6b7155a6336271e4677/requiredIdDocs' \
-H 'Content-Type: application/json'
# POST Добавление документа, удостоверяющего личность
Ответ на запрос включает в себя: метаданные документа JSON и, опционально, фотографию документа. Если документ с таким же типом метаданных и страной уже существует, их данные будут объединены, существующие данные будут перезаписаны, а новое изображение будет добавлено в анкету пользователя. Если метаданные документа еще неизвестны, отправьте нам тип (idDocType) и страну (country), эти два поля являются обязательными. Например, «PASSPORT» и «RUS».
POST /resources/applicants/{applicantId}/info/idDoc
Параметры запроса
| Название | Тип | Обязательно | Описание |
|---|---|---|---|
applicantId | String | Да | Идентификатор пользователя. |
Заголовки запроса
| Название | Тип | Значение |
|---|---|---|
Content-Type | String | multipart/form-data |
X-Return-Doc-Warnings | Boolean | true/false |
Для добавления документов, подтверждающих адрес проживания (PoA), или удостоверения личности рекомендуется использовать заголовок X-Return-Doc-Warnings со значением true. Заголовок запроса позволяет определить, читаемы ли данные документа и подходят ли они прежде, чем переводить пользователя в статус ожидания (pending).
Внимание:
Пользователь не сможет быть переведен в статус pending, пока хоть один из шагов верификации не содержит в себе активных изображений. Для проверки этого можно использовать этот эндпоинт.
У некоторых типов документов idDocType данные располагаются на разных сторонах/разворотах (FRONT_SIDE и BACK_SIDE). Убедитесь, что отправили BACK_SIDE, если уже был отправлен FRONT_SIDE, иначе шаг верификации не будет завершен, и вы не сможете начать проверку. Если при загрузке одной из сторон документа возникает ошибка errors, оба изображения будут помечены как неактивные.
Так как это упрощенная и быстрая проверка, для некоторых типов документов она может не присылать ошибок, чтобы обеспечить лучшую конверсию.
Тело запроса
| Название | Тип | Обязательно | Описание |
|---|---|---|---|
metadata | Object | Да | Объект, представляющий документ, удостоверяющий личность. |
content | Binary | Нет | Фотография документа. |
Поля элемента metadata
| Название | Тип | Обязательно | Описание |
|---|---|---|---|
idDocType | String | Да | Тип документа. |
idDocSubType | String | Нет | FRONT_SIDE, BACK_SIDE или null. |
country | String | Да | Трехбуквенный код страны Альфа-3 (например RUS). |
firstName | String | Нет | Имя. |
middleName | String | Нет | Второе имя/отчество. |
lastName | String | Нет | Фамилия. |
issuedDate | String | Нет | Дата выдачи (формат YYYY-mm-dd). |
validUntil | String | Нет | Срок действия (формат YYYY-mm-dd). |
number | String | Нет | Номер документа. |
dob | String | Нет | Дата рождения. |
placeOfBirth | String | Нет | Место рождения. |
Если у документа две необходимых стороны/разворота, отправьте два изображения и правильно настройте idDocSubType (FRONT_SIDE и BACK_SIDE).
Ответ
Мы можем изменить значения country и idDocType, которые были отправлены нам при загрузке изображения, поэтому, если это важно для вашего сервиса, обязательно сравните эти поля с нашим ответом.
JSON, содержащий дополнительную информацию о документе. В случае обнаружения проблем с изображением документа будет представлено сообщение из массива errors или warnings.
Внимание:
Предупреждения warnings и ошибки errors отображаются только для первых четырех попыток загрузить документ. В последующих случаях мы предполагаем, что документ должен быть проверен в рамках полного процесса верификации.
Идентификатор фотографии imageId, можно найти в заголовке ответа X-Image-Id.
Доступные значения массива errors
В случае получения ошибок (errors), загруженное изображение будет помечено как неактивное и не будет использоваться для верификации, нужно будет загрузить другое изображение, чтобы продолжить процесс проверки пользователя. Если при загрузке одной из сторон документа возникает ошибка errors, оба изображения будут помечены как неактивные.
| Название | Описание |
|---|---|
forbiddenDocument | Неподдерживаемые или неподходящие тип/страна документа. |
differentDocTypeOrCountry | Тип документа или страна не соответствуют тем, которые были отправлены с metadata, распознанный из изображения тип запрещен настройками. |
missingImportantInfo | Не все необходимые данные документа могут быть распознаны. |
dataNotReadable | Нет доступных данных для распознавания с изображения. |
expiredDoc | Срок действия документа истек. |
documentWayTooMuchOutside | Некоторые части документа не попали в кадр. |
noIdDocFacePhoto | Лицо плохо видно на изображении документа. |
selfieFaceBadQuality | Лицо плохо видно на селфи. |
screenRecapture | Изображение может быть фотографией экрана. |
screenshot | Изображение является снимком экрана. |
sameSides | Изображение одной и той же стороны документа было загружено как лицевая (FRONT_SIDE) и оборотная стороны (BACK_SIDE). |
shouldBeMrzDocument | Тип отправляемого документа должен иметь MRZ, но на изображении MRZ нет/не читается. |
shouldBeDoubleSided | Должны быть предоставлены две стороны отправляемого документа. |
shouldBeDoublePaged | Требуется полный разворот двух страниц документа (обычно две основные страницы паспорта). |
documentDeclinedBefore | Изображение уже было ранее загружено пользователем и отклонено. |
mrzNotReadable | Мы не смогли извлечь код MRZ из загруженного документа. Это может произойти по разным причинам, например, из-за плохого качества изображения или отсутствия MRZ в кадре. |
docExpiresSoon | Срок действия отправленного документа истекает через N месяцев. Это задает параметр «Минимальный остаточный срок действия документа» в разделе Интеграция SDK. |
missingDob | Документ не содержит даты рождения владельца. |
incompleteDob | Документ не содержит полной даты рождения (день, месяц и год). |
Доступные значения массива warnings
Массив warnings предупреждает о том, что с документом может быть что-то не так.
| Название | Описание |
|---|---|
badSelfie | Убедитесь, что лицо и фотография в документе хорошо видны. |
dataReadability | Убедитесь, что информация в документе хорошо читается. |
inconsistentDocument | Убедитесь, что все загруженные фотографии относятся к одному и тому же документу. |
maybeExpiredDoc | Похоже, что срок действия вашего документа истек. |
documentTooMuchOutside | Убедитесь, что документ полностью соответствует фотографии. |
Пример
curl -X POST \
'https://api.cyberity.ru/resources/applicants/5b75a5e80a975a3ef2102a87/info/idDoc' \
-H 'Content-Type: multipart/form-data' \
-H 'X-Return-Doc-Warnings: true' \
-F 'metadata={"idDocType":"PASSPORT","country":"USA"}' \
-F 'content=@/cyberity/Example/name.jpg'
{
"idDocType": "PASSPORT",
"country": "USA",
"errors": [ "dataNotReadable" ] // will be absent in case of X-Return-Doc-Warnings not having value of "true"
}
В случаях, когда необходимо загрузить только данные документа:
curl -X POST \
'https://api.cyberity.ru/resources/applicants/5b75a5e80a975a3ef2102a87/info/idDoc' \
-H 'Content-Type: multipart/form-data' \
-F 'metadata={
"idDocType": "PASSPORT",
"country": "GBR",
"number": "123456789",
"issuedDate": "2015-01-02",
"dob": "2000-02-01",
"placeOfBirth": "London"
}'
{
"idDocType": "PASSPORT",
"country": "GBR",
"issuedDate": "2015-01-02",
"number": "40111234567",
"dob": "2000-02-01",
"placeOfBirth": "London"
}
# GET Получение данных о пользователе
В процессе верификации мы извлекаем данные из документов, удостоверяющих личность пользователя.
Чтобы получить данные, распознанные из предоставленных документов, воспользуйтесь одним из этих эндпоинтов.
GET /resources/applicants/{applicantId}/one
или, если вы не знаете applicantId, используйте:
GET /resources/applicants/-;externalUserId={externalUserId}/one
Параметры запроса
| Название | Тип | Обязательно | Описание |
|---|---|---|---|
applicantId | String | Да | Идентификатор пользователя. |
externalUserId | String | Да | Внешний идентификатор пользователя – уникальный идентификатор пользователя на вашей стороне. |
Ответ
В ответе приходят данные анкеты пользователя, которая была создана вами или SDK, с дополнительной информацией в случаях, когда верификация была завершена. Массив объектов info.idDocs[] содержит информацию, извлеченную из документов пользователя. Наличие определенных полей зависит от документов, которые отправили на проверку, а также от правил верификации.
Примеры результатов распознавания для всех поддерживаемых типов документов можно найти здесь.
Чтобы убедиться, что данные были получены из актуального документа, проверьте, какие idDocType и country были одобрены при помощи этого эндпоинта.
Обратите внимание, что конкретные данные отображаются только в том случае, когда они были получены из документа или предоставлены пользователем.
# Основные поля ответа:
| Название | Тип | Обязательно | Описание |
|---|---|---|---|
id | String | Да | Идентификатор пользователя. |
inspectionId | String | Да | Идентификатор проверки. |
externalUserId | String | Да | Внешний идентификатор пользователя – уникальный идентификатор пользователя на вашей стороне. |
sourceKey | String | Нет | Если вы хотите разделить пользователей на группы, предоставьте это поле, чтобы различать их. sourceKey также отображается в полезных нагрузках вебхуков. |
email | String | Нет | Электронная почта пользователя. |
phone | String | Нет | Номер телефона пользователя. |
lang | String | Нет | Язык, на котором пользователь должен увидеть результат верификации в формате ISO 639-1. |
metadata | Array of objects | Нет | Дополнительная информация, которая не отображается пользователю (Пример: [{«key»: «keyFromClient», «value»: «valueFromClient»}]). |
fixedInfo | Object | Нет | Информация о пользователе, которая не изменяется с нашей стороны. Информация сверяется с данными, полученными из документов. Поля совпадают с info. |
createdAt | Date | Да | Время и дата создания пользователя (GMT). |
requiredIdDocs | Object | Нет | Набор необходимых для верификации пользователя документов и данных (например, шаги IDENTITY, SELFIE и соответствующие им документы: PASSPORT, ID_CARD и т.д.). |
review | Object | Да | Текущий статус пользователя. |
questionnaires | Array of objects | Нет | Данные о заполненной анкете. Более подробная информация здесь. |
Поля элементов fixedInfo и info
| Название | Тип | Обязательно | Описание |
|---|---|---|---|
firstName | String | Нет | Имя. |
lastName | String | Нет | Фамилия. |
middleName | String | Нет | Второе имя/отчество. |
firstNameEn | String | Нет | Автоматическая транслитерация имени. |
lastNameEn | String | Нет | Автоматическая транслитерация фамилии. |
middleNameEn | String | Нет | Автоматическая транслитерация второго имени/отчества. |
legalName | String | Нет | Имя по паспорту. |
gender | String | Нет | Пол человека (M или F). |
dob | String | Нет | Дата рождения (формат YYYY-mm-dd). |
placeOfBirth | String | Нет | Место рождения. |
country | String | Нет | Трехбуквенный код страны Альфа-3 (например RUS). |
nationality | String | Нет | Трехбуквенный код страны Альфа-3 (например RUS). |
addresses | Array | Нет | Список адресов. |
idDocs | Array of objects | Нет | Набор данных, распознанных из загруженных документов. |
tin | String | Нет | Идентификационный номер налогоплательщика (ИНН). |
Поля элемента addresses
| Название | Тип | Обязательно | Описание |
|---|---|---|---|
country | String | Нет | Трехбуквенный код страны Альфа-3 (например RUS). |
postCode | String | Нет | Почтовый индекс. |
town | String | Нет | Название города или населенного пункта. |
street | String | Нет | Название улицы или полный адрес в зависимости от формата в документе. |
subStreet | String | Нет | Дополнительная информация об улице. |
state | String | Нет | Название области (округа/республики/штата и т.д.). |
Пример
curl -X GET \
'https://api.cyberity.ru/resources/applicants/5b594ade0a975a36c9349e66/one'
{
"id": "5b594ade0a975a36c9349e66",
"createdAt": "2020-06-24 05:05:14",
"clientId": "ClientName",
"inspectionId": "5b594ade0a975a36c9379e67",
"externalUserId": "SomeExternalUserId",
"fixedInfo": {
"firstName": "Chris",
"lastName": "Smith"
},
"info": {
"firstName": "CHRISTIAN",
"firstNameEn": "CHRISTIAN",
"lastName": "SMITH",
"lastNameEn": "SMITH",
"dob": "1989-07-16",
"country": "DEU",
"idDocs": [
{
"idDocType": "ID_CARD",
"country": "DEU",
"firstName": "CHRISTIAN",
"firstNameEn": "CHRISTIAN",
"lastName": "SMITH",
"lastNameEn": "SMITH",
"validUntil": "2028-09-04",
"number": "LGXX359T8",
"dob": "1989-07-16",
"mrzLine1": "IDD<<LGXX359T88<<<<<<<<<<<<<<<",
"mrzLine2": "8907167<2809045D<<<<<<<<<<<<<8",
"mrzLine3": "SMITH<<CHRISTIAN<<<<<<<<<<<<<<"
}
]
},
"agreement": { //present when WebSDK was initialized with Agreement screen enabled
"createdAt": "2020-06-24 04:18:40",
"source": "WebSDK",
"targets": [
"By clicking Next, I accept [the Terms and Conditions](https://www.cyberity.ru/consent-to-personal-data-processing/)",
"I agree to the processing of my personal data, as described in [the Consent to Personal Data Processing](https://cyberity.ru/consent-to-personal-data-processing/)"
]
},
"email": "christman1@gmail.com",
"applicantPlatform": "Android",
"requiredIdDocs": {
"docSets": [
{
"idDocSetType": "IDENTITY",
"types": [
"PASSPORT",
"ID_CARD"
]
},
{
"idDocSetType": "SELFIE",
"types": [
"SELFIE"
]
}
]
},
"review": {
"elapsedSincePendingMs": 115879,
"elapsedSinceQueuedMs": 95785,
"reprocessing": true,
"levelName": "basic-kyc",
"createDate": "2020-06-24 05:11:02+0000",
"reviewDate": "2020-06-24 05:12:58+0000",
"reviewResult": {
"reviewAnswer": "GREEN"
},
"reviewStatus": "completed"
},
"lang": "de",
"type": "individual"
}
# PATCH Изменение предоставленной информации (fixedInfo)
В fixedInfo вы можете передавать информацию о пользователе, которую необходимо сверить с полученными из документов данными. Эту информацию мы не можем редактировать самостоятельно, поэтому, если вы хотите изменить данные, которые вы нам предоставили, используйте метод PATCH.
PATCH /resources/applicants/{applicantId}/fixedInfo
Параметры запроса
| Название | Тип | Обязательно | Описание |
|---|---|---|---|
applicantId | String | Да | Идентификатор пользователя. |
Тело запроса
В теле перечисляются поля атрибута fixedInfo, которые должны быть изменены.
Пример
curl -X PATCH \
'https://api.cyberity.ru/resources/applicants/609d68bf460647000aa2d87e/fixedInfo' \
-H 'Content-Type: application/json' \
-d '{
"firstName" : "Bradley",
"lastName" : "Peak",
"dob" : "1990-01-01"
}'
# POST Запрос проверки пользователя
Автоматическое изменение статуса на pending работает только в наших SDK, поэтому как только все необходимые документы и данные будут загружены в анкету, сообщите системе, что пользователь готов к верификации. Запрос проверки пользователя также может понадобиться, если вам нужно запросить у нас повторную проверку пользователя.
С помощью данного эндпоинта вы можете перевести анкету пользователя в статус pending.
POST /resources/applicants/{applicantId}/status/pending
Параметры запроса
| Название | Тип | Обязательно | Описание |
|---|---|---|---|
applicantId | String | Да | Идентификатор пользователя. |
Query-параметры
| Название | Тип | Обязательно | Описание |
|---|---|---|---|
reason | String | Нет | Причина изменения статуса. |
Если возможно, укажите причину изменения статуса reason. Это поможет нам улучшить качество сервиса, мы можем автоматизировать этот процесс или, например, выполнять несколько дополнительных проверок.
Ответ
В случае получения HTTP-ответа 200 вы можете не обращать внимания на его тело.
Пример
curl -X POST \
'https://api.cyberity.ru/resources/applicants/5b73b82f0a975a3b46429758/status/pending?reason=someReason'
{
"ok": 1
}
# GET Получение изображений из анкеты пользователя
Пользователь может несколько раз загружать изображения, а также присылать разные типы документов во время прохождения одного шага верификации, поэтому используйте данный запрос для того, чтобы получить изображения, которые повлияли на конечный результат проверки.
GET /resources/inspections/{inspectionId}/resources/{imageId}
Параметры запроса
| Название | Тип | Обязательно | Описание |
|---|---|---|---|
inspectionId | String | Да | Идентификатор проверки. |
imageId | String | Да | Идентификатор изображения. |
Ответ
Двоичное содержимое, представляющее собой изображение, заголовок Content-Type точно описывает медиа-тип ответа.
Пример
curl -X GET \
'https://api.cyberity.ru/resources/inspections/5bb8cca10a975a624903cf66/resources/551262049'
# POST Добавление пользователя в черный список
Для занесения пользователя в черный список вы можете использовать этот эндпоинт.
POST /resources/applicants/{applicantId}/blacklist?note={note}
Совет:
Проверьте, не была ли ранее эта анкета добавлена в черный список, в массиве rejectLabels[] этого пользователя не должны быть значения BLACKLIST или BLOCKLIST. Если вы попытаетесь добавить в черный список ранее добавленного пользователя, мы вернём HTTP-статус 400 с кодом ошибки 5000.
Параметры запроса
| Название | Тип | Обязательно | Описание |
|---|---|---|---|
applicantId | String | Да | Идентификатор пользователя. |
Query-параметры
| Название | Тип | Обязательно | Описание |
|---|---|---|---|
note | String | Да | Причина или примечание для пользователя, добавленного в черный список (в URL кодировке). |
Ответ
В ответе будет указан пользователь, добавленный в черный список.
Пример
curl -X POST \
'https://api.cyberity.ru/resources/applicants/5c0e93c30a975a53a79aa54b/blacklist?note=A%20user%20provided%20a%20fake%20document'
{
"id": "5bb8563c0a975a5e6b322ecc",
"createdAt": "2018-10-06 06:29:16",
"clientId": "cyberityClient",
"inspectionId": "5bb8563c0a975a5e6b322ecd",
"externalUserId": "someClientUserId",
"info": {
"firstName": "John",
"lastName": "Smith",
"dob": "2000-03-04",
"placeOfBirth": "London",
"country": "GBR",
"phone": "+449112081223"
},
"requiredIdDocs": {
"docSets": [
{
"idDocSetType": "IDENTITY",
"types": ["PASSPORT", "ID_CARD", "DRIVERS"]
}
]
},
"review": {
"createDate": "2018-12-10 16:26:45+0000",
"reviewDate": "2018-12-10 16:27:29+0000",
"reviewResult": {
"reviewAnswer": "RED",
"rejectLabels": ["BLOCKLIST"],
"reviewRejectType": "FINAL"
},
"reviewStatus": "completed"
}
}
# POST Сброс одного из шагов верификации
В некоторых случаях требуется, чтобы пользователь повторно прошел шаг верификации. Данный эндпоинт позволит сделать шаг неактивным, чтобы проверка запустилась снова и можно было собрать новые данные.
Обратите внимание, что не все шаги верификации можно сбросить с помощью описанного ниже запроса.
POST /resources/applicants/{applicantId}/resetStep/{idDocSetType}
Параметры запроса
| Название | Тип | Обязательно | Описание |
|---|---|---|---|
applicantId | String | Да | Идентификатор пользователя. |
idDocSetType | String | Да | Название сбрасываемого шага. |
Шаги верификации
| Название | Описание |
|---|---|
PHONE_VERIFICATION | Шаг проверки телефона. |
EMAIL_VERIFICATION | Шаг проверки электронной почты. |
QUESTIONNAIRE | Шаг проверки опросника. |
APPLICANT_DATA | Шаг проверки предоставленных данных. |
IDENTITY | Шаг проверки удостоверения личности. |
IDENTITY2 | Шаг проверки 2-го удостоверения личности. |
IDENTITY3 | Шаг проверки 3-го удостоверения личности. |
IDENTITY4 | Шаг проверки 4-го удостоверения личности. |
PROOF_OF_RESIDENCE | Шаг проверки подтверждения адреса проживания. |
PROOF_OF_RESIDENCE2 | Шаг проверки 2-е подтверждения адреса проживания. |
SELFIE | Шаг проверки селфи. |
SELFIE2 | Шаг проверки 2-го селфи. |
Пример
curl -X POST \
'https://api.cyberity.ru/resources/applicants/62164ddf8a86e20bbd28ab75/resetStep/PHONE_VERIFICATION'
{
"ok": 1
}
# POST Сброс анкеты пользователя
В случаях, когда требуется изменить статус пользователя на init, например, если пользователь обратился в службу поддержки с запросом на повторное прохождение верификации с нуля с новыми документами, воспользуйтесь данным эндпоинтом.
Внимание:
Сброс пользователя с мошенническими данными – небезопасное действие.
Проверьте rejectLabels, сброс безопасен, если в нём отсутствуют следующие значения:
FORGERYSELFIE_MISMATCHBLACKLISTBLOCKLISTINCONSISTENT_PROFILEFRAUDULENT_PATTERNS
Пожалуйста, сообщите нам, если вы планируете использовать этот эндпоинт — возможно, мы сможем предложить более подходящее решение.
POST /resources/applicants/{applicantId}/reset
Параметры запроса
| Название | Тип | Обязательно | Описание |
|---|---|---|---|
applicantId | String | Да | Идентификатор пользователя. |
Пример
curl -X POST \
'https://api.cyberity.ru/resources/applicants/5d6f821b0a975a0b8aa27b27/reset'
{
"ok": 1
}
# PATCH Изменение информации верхнего уровня
Этот запрос исправляет информацию верхнего уровня о пользователе, такую как email, externalUserId, sourceKey, type. Тело запроса должно содержать только те поля, которые вы собираетесь изменить. Отсутствующие поля будут проигнорированы.
PATCH /resources/applicants
Тело запроса
| Название | Тип | Обязательно | Описание |
|---|---|---|---|
id | String | Да | Идентификатор пользователя. |
externalUserId | String | Нет | Новый внешний идентификатор для пользователя. |
email | String | Нет | Новая электронная почта. |
phone | String | Нет | Новый номер телефона. |
sourceKey | String | Нет | Новый ключ источника. |
type | String | Нет | Новый тип (individual/company). |
lang | String | Нет | Язык, на котором пользователь должен увидеть результат верификации в формате ISO 639-1. |
questionnaires | Array of objects | Нет | Конфигурация анкеты с ответами. |
metadata | Array of objects | Нет | Дополнительная информация о пользователе в пользовательских полях. |
deleted | Boolean | Нет | Значение true помечает пользователя как неактивного/удаленного. Пользователь не будет считаться дубликатом, и не будет инициализироваться его проверка. |
Пример
curl -X PATCH \
'https://api.cyberity.ru/resources/applicants' \
-H 'Content-Type: application/json' \
-d '{"id":"5e9ad53d0a975a656d67e4d0","externalUserId":"1983114","email":"new@email.nz"}'
{
"id": "5e9ad53d0a975a656d67e4d0",
"createdAt": "2020-04-18 10:23:57",
"inspectionId": "5e9ad53d0a975a656d67e4d1",
"externalUserId": "1983114",
"email": "new@email.nz",
"requiredIdDocs": {
"docSets": [
{
"idDocSetType": "IDENTITY",
"types": [
"ID_CARD",
"PASSPORT",
"DRIVERS"
]
},
{
"idDocSetType": "SELFIE",
"types": [
"SELFIE"
],
"videoRequired": "liveness"
}
]
},
"review": {
"createDate": "2020-04-18 10:25:53+0000",
"expireDate": "2020-04-18 10:40:53+0000",
"reviewStatus": "init"
},
"lang": "en",
"type": "individual"
}
# POST Импорт пользователей
Этот эндпоинт предназначен для импорта данных. Например, в случае, если у вас уже много пользователей и вы хотите перепроверить или сохранить последовательность данных.
Пожалуйста, сообщите нам, если вы планируете использовать этот эндпоинт — возможно, мы сможем предложить более подходящее решение.
POST /resources/applicants/-/ingestCompleted?levelName={levelName}
Query-параметры
| Название | Тип | Обязательно | Описание |
|---|---|---|---|
levelName | String | Нет | Уровень верификации пользователя, который настраивается в разделе «Уровни проверок» Дешборда. |
Тело запроса
Тело запроса содержит в себе объект с информацией об анкете пользователя. Обратите внимание, что структура тела запроса может быть уникальной в зависимости от конкретного случая.
Пример
curl -X POST 'https://api.cyberity.ru/resources/applicants/-/ingestCompleted?levelName=basic-kyc-level' \
-H 'Content-Type: application/json' \
-d '{
"externalUserId": "someClientUserId",
"info": {
"firstName": "John",
"lastName": "Snow",
"country": "GBR"
},
"review": {
"elapsedSincePendingMs": 100,
"elapsedSinceQueuedMs": 50,
"createDate": "2020-10-21 08:25:32+0000",
"reviewDate": "2020-10-21 08:25:36+0000",
"reviewResult": {
"moderationComment": "",
"clientComment": "",
"reviewAnswer": "GREEN"
},
"reviewStatus": "completed"
}
}'
{
"id": "5f0864923cc18175d35bf1aa",
"createdAt": "2020-07-10 12:52:34",
"key": "QJZKBRIYUSBBWY",
"clientId": "yourclientid",
"inspectionId": "5f0864923cc18175d35bf1ab",
"externalUserId": "someClientUserId",
"info": {
"firstName": "John",
"lastName": "Snow"
},
"requiredIdDocs": {
"docSets": [{
"idDocSetType": "IDENTITY",
"types": [
"PASSPORT",
"ID_CARD",
"DRIVERS"
]
}]
},
"review": {
"elapsedSincePendingMs": 100,
"elapsedSinceQueuedMs": 50,
"createDate": "2019-10-21 08:25:32+0000",
"reviewDate": "2019-10-21 08:25:36+0000",
"reviewResult": {
"moderationComment": "",
"clientComment": "",
"reviewAnswer": "GREEN"
},
"reviewStatus": "completed",
"levelName": "basic-kyc-level"
},
"lang": "en",
"type": "individual"
}
# POST Назначение уровня риска для пользователя
Этот запрос позволяет вам задать уровень риска для пользователя по вашим собственным критериям.
POST /resources/applicants/{applicantId}/riskLevel/entries
Внимание:
Для выполнения этого запроса требуется специальное разрешение. Пожалуйста, обратитесь в службу технической поддержки IDnGO.
Параметры запроса
| Название | Тип | Обязательно | Описание |
|---|---|---|---|
applicantId | String | Да | Идентификатор пользователя. |
Тело запроса
| Название | Тип | Обязательно | Значение |
|---|---|---|---|
comment | String | Да | Любая строка. |
riskLevel | String | Да | unknown/low/medium/high |
Пример
curl -X POST 'https://api.cyberity.ru/resources/applicants/5edbe3460a975a259dd2f993/riskLevel/entries' \
-H 'Content-Type: application/json' \
-d '{"comment":"Danger!","riskLevel":"high"}'
{
"riskLevel": "high",
"entries": [
{
"id": "5eda11960a975a6de48b5c08",
"createdAt": "2020-06-05 09:34:14",
"comment": "Danger!",
"riskLevel": "high"
}
]
}
# POST Добавление тегов для пользователя
Используйте этот эндпоинт для присвоения пользовательских тегов профилям пользователей. Создать теги можно в разделе «Глобальные настройки» Дешборда.
POST /resources/applicants/{applicantId}/tags
Параметры запроса
| Название | Тип | Обязательно | Описание |
|---|---|---|---|
applicantId | String | Да | Идентификатор пользователя. |
Тело запроса
Тело представляет собой массив строк с пользовательскими тегами.
Пример
curl -X POST 'https://api.cyberity.ru/resources/applicants/5fd1012c885b5d0009d50e6e/tags' \
-H 'Content-Type: application/json' \
-d '["Approved Sanctions", "Approved PEP", "821"]'
{
"ok": 1
}
# DELETE Пометка изображения как неактивного (удаленного)
Этот эндпоинт позволяет пометить загруженное изображение как удаленное. Его можно использовать в тех случаях, когда вы хотите, чтобы пользователи повторно загрузили документ, который ранее был одобрен.
Внимание:
Попытка пометить изображения как неактивные, пока пользователь находится в обработке (статусы pending, prechecked, queued), приведет к ошибке и HTTP-статусу 304.
DELETE /resources/inspections/{inspectionId}/resources/{imageId}
Параметры запроса
| Название | Тип | Обязательно | Описание |
|---|---|---|---|
inspectionId | String | Да | Идентификатор проверки. |
imageId | String | Да | Идентификатор изображения (подробнее здесь). |
Query-параметры
| Название | Тип | Обязательно | Описание |
|---|---|---|---|
revert | Boolean | Нет | Задайте true, чтобы отменить неактивность изображения (вернуть фотографию). По умолчанию — false. |
Ответ
В случае получения HTTP-ответа 200 вы можете не обращать внимания на его тело.
Пример
curl -X DELETE \
'https://api.cyberity.ru/resources/inspections/5f649369aee05c75ea54c80a/resources/1045510331'
{
"ok": 1
}
# Результаты проверки
# GET Получение статуса проверки пользователя (SDK)
При интеграции через SDK (WebSDK или MobileSDK) воспользуйтесь этим эндпоинтом, чтобы узнать статус проверки и причины отказа.
GET /resources/applicants/{applicantId}/status
Параметры запроса
| Название | Тип | Обязательно | Описание |
|---|---|---|---|
applicantId | String | Да | Идентификатор пользователя. |
Ответ
| Название | Тип | Описание |
|---|---|---|
reviewId | String | Уникальный идентификатор проверки анкеты пользователя. |
levelName | String | Название уровня верификации пользователя, которое задается в разделе «Уровни проверок» Дешборда. |
attemptId | String | Уникальный идентификатор текущей попытки проверки. Пользователи могут инициировать несколько попыток проверки, например, если одна из них не удалась или они изменили/добавили документы. Вы также можете изменить уровень проверки, чтобы начать новую проверку. |
attemptCnt | Integer | Подсчет количества текущих попыток проверки на том же уровне проверки. |
elapsedSincePendingMs | Long | Время прошедшее с момента перехода заявителя в статус pending проверки. |
elapsedSinceQueuedMs | Long | Время прошедшее с момента перехода заявителя в статус queued проверки. |
reviewResult | Object | Дополнительные сведения о результатах проверки заявителя. |
reviewDate | Date | Дата окончания проверки. |
reviewStatus | String | Текущий статус проверки пользователя. |
createDate | Date | Дата создания анкеты пользователя. |
startDate | Date | Дата начала проверки. |
Поля элемента reviewResult
| Название | Тип | Описание |
|---|---|---|
reviewAnswer | String | Результат проверки GREEN или RED. |
rejectLabels | Array of strings | Указывает одну или несколько причин отклонения анкеты. Поле reviewAnswer доступно, если возвращается RED. |
reviewRejectType | String | Поле reviewRejectType для ответа RED сообщает тип отказа. Возможны следующие значения:FINAL — окончательный отказ без возможности для пользователя загрузить новые фотографии.RETRY — временный отказ, пользователь может загрузить новые фотографии/данные. |
clientComment | String | Человекочитаемый комментарий, который не следует показывать конечному пользователю. |
moderationComment | String | Человекочитаемый комментарий, который может быть показан конечному пользователю. |
buttonIds | Array of strings | Идентификаторы кнопок, которые используются для отклонения анкеты пользователя. Каждому отклонению автоматически присваивается конкретный идентификатор. |
Доступные значения элемента ReviewStatus
| Значение | Описание |
|---|---|
init | Анкета создана, пользователь находится в процессе заполнения профиля /ожидается загрузка всех необходимых документов. |
pending | Анкета пользователя готова к обработке. В профиль пользователя загружены все необходимые документы и данные, анкета ожидает проверки. |
prechecked | Анкета пользователя проходит первичную проверку. |
queued | Анкета пользователя проходит финальную проверку. |
completed | Проверка завершена. |
onHold | Пользователь ожидает окончательного решения от специалиста по соблюдению нормативных требований (начата ручная проверка) или ожидает, пока все бенефициары пройдут KYC в случае верификации компании. |
Результат проверки reviewAnswer доступен только после завершения проверки анкеты (reviewStatus: completed).
Пример
curl -X GET \
'https://api.cyberity.ru/resources/applicants/6863ef4f61008116594166bb/status'
{
"reviewId": "Qdelc",
"attemptId": "IYLzU",
"attemptCnt": 1,
"elapsedSincePendingMs": 61562,
"elapsedSinceQueuedMs": 10855,
"reprocessing": true,
"levelName": "KYC",
"levelAutoCheckMode": null,
"createDate": "2025-07-04 11:06:16+0000",
"reviewDate": "2025-07-04 11:07:18+0000",
"reviewResult": {
"reviewAnswer": "RED",
"rejectLabels": [
"UNSATISFACTORY_PHOTOS"
],
"reviewRejectType": "RETRY",
"buttonIds": [
"badPhoto",
"badPhoto_dataNotVisible"
]
},
"reviewStatus": "completed",
"priority": 0
}
# GET Получение статусов для отдельных шагов верификации (API)
Рекомендуется использовать этот запрос, если вы хотите получить результаты отдельных шагов проверки и комментарии к ним.
Некоторые типы отказов могут не влиять на статус документа, поэтому не забывайте проверять общий статус проверки пользователя и ответ.
GET /resources/applicants/{applicantId}/requiredIdDocsStatus
Параметры запроса
| Название | Тип | Обязательно | Описание |
|---|---|---|---|
applicantId | String | Да | Идентификатор пользователя. |
Ответ
Ответ приходит в формате JSON, в котором содержится информация о прохождении шагов проверки. Каждый шаг содержит массив идентификаторов изображений (их может быть несколько, например, если было загружено две стороны).
Вы можете получить изображения с идентификаторами из ответа, отправив этот запрос.
Некоторые шаги могут не иметь результатов проверки в случае, если они зависят от проверки какого-то другого шага, например, шаг проверки PROOF_OF_RESIDENCE зависит от шага проверки удостоверения личности IDENTITY, поэтому проверка PROOF_OF_RESIDENCE может не проводиться до тех пор, пока IDENTITY не будет одобрен.
Пример
curl -X GET \
'https://api.cyberity.ru/resources/applicants/5bb8cca10a975a624903cf65/requiredIdDocsStatus'
{
"IDENTITY": {
// a step identifier
"reviewResult": {
// if exists, that means that a document was uploaded
"moderationComment": "Please upload a photo of the front of your ID card.",
"reviewAnswer": "RED"
},
"country": "LVA", // document country
"idDocType": "ID_CARD", // specific document type for the step
"imageIds": [122352326,34246467], // image IDs that represent a document
//If imageIds array contains more than one element the first one would be front side and others - back sides
"imageReviewResults": {
"34246467": {
"reviewAnswer": "GREEN"
},
"122352326": {
"moderationComment": "Please upload a photo of the front of your ID card.", // A human-readable comment that can be shown to your end user
"clientComment": "One side of the document is missing.", //A human-readable comment that should not be shown to an end user, and is meant to be read by a client
"reviewAnswer": "RED",
"rejectLabels": ["DOCUMENT_PAGE_MISSING","FRONT_SIDE_MISSING"],
"reviewRejectType": "RETRY"
}
}
},
"SELFIE": {
"reviewResult": {
"reviewAnswer": "GREEN"
},
"country": "LVA",
"idDocType": "SELFIE",
"imageIds": [181314576],
"imageReviewResults": {
"181314576": {
"reviewAnswer": "GREEN"
}
}
}
}
# GET Уточнение причины отказа
Для каждой причины отказа документов и отклонения пользователя мы задаем определенный buttonId, который вы можете получить при помощи данного запроса:
GET /resources/moderationStates/-;applicantId={applicantId}
Параметры запроса
| Название | Тип | Обязательно | Описание |
|---|---|---|---|
applicantId | String | Да | Идентификатор пользователя. |
Ответ
| Название | Тип | Обязательно | Описание |
|---|---|---|---|
imagesStates | Object | Нет | Содержит imageId и buttonId, которые указывают на причину отклонения фотографий или документов. |
applicantState | Object | Нет | Содержит buttonId, который указывает причину отклонения данных пользователя или самого пользователя. |
imagesStates и applicantState присутствуют в ответе только в том случае, если пользователь был отклонён.
Доступный buttonId
{
"spam": [], //Загружено слишком много изображений
"redCrypto": [], //Криптотранзакции с высоким рисковым рейтингом
"blackCrypto": [], //Переданы некорректные параметры для проверки криптотранзакции
"applicantDataMismatch": [],
"regulationsViolations": [
"age", //Возраст не соответствует требованиям
"duplicate", //У пользователя уже есть одобренная анкета
"wrongRegion", //Регион или страна входит в список исключённых
"foreigner", //Страна проживания не совпадает со страной банковской карты
"crime", //У пользователя есть судимости
"poorDrivingSkills", //Водительский стаж не соответствует требованиям
"poorFinancialPosition", //Финансовое положение не соответствует требованиям
"fines", //Сумма штрафов не соответствует требованиям
"deprivations", //Обнаружены факты изъятия документов
"notAllowedToDrive", //У пользователя нет права на вождение (специальная настройка)
"diffDocPersons", //Предоставлены документы разных людей
"inconsistency", //Предоставленная информация не совпадает с данными в документах
"docNotFound", //Данные документа не найдены в базах данных
"countriesMismatch", //Страна проживания не совпадает со страной банковской карты
"riskBankCard", //Банковская карта с высоким уровнем риска
"highRiskProfile", //Высокий поведенческий риск
"spam", //Загружено слишком много изображений
"blacklist" //Данные пользователя найдены в глобальном блок-листе
"blocklist" //Данные пользователя найдены в вашем локальном блок-листе
],
"automaticRegulations": [
"wrongRegion", //Регион или страна входит в список исключённых
"wrongProvince", //Провинция входит в список исключённых
"wrongCountry" //Страна входит в список исключённых
],
"specificClientRequirements": [
"age", //Возраст не соответствует требованиям
"notAllowedToDrive", //У пользователя нет права на вождение
"anotherDocument" //Документ не поддерживается по индивидуальным требованиям
],
"kycBlacklisted": [
"compromisedDoc", //Использован украденный или утекший документ
"physicalForgery", //Фото физически подделанного документа
"digitalForgery", //Фото документа с цифровыми правками
"creditCardFraud", //Мошенничество с банковской картой
"anotherPersonsDoc", //Использован документ другого человека
"multipleRegistration", //Повторная регистрация
"forcedRegistration", //Регистрация была выполнена под давлением
"financialFraud", //Финансовое мошенничество
"clientRules", //Индивидуальная причина отказа (задано клиентом)
"virtualCam" //Во время проверки использовалась виртуальная камера
],
"dataMismatch": [
"fullName", //Полное имя в профиле отсутствует или указано с ошибкой
"dateOfBirth", //Дата рождения в профиле отсутствует или указана с ошибкой
"address", //Проблема с адресом в профиле
"inconsistency" //Имя держателя банковской карты не совпадает с именем в документе
],
"fraudulentPatterns": [
"selfieMismatch", //Селфи не совпадает с фото в документе
"fake", //Подозрение на мошенничество
"blacklist", //Аккаунт подозревается в подделке — найден в глобальном блок-листе
"blocklist", //Аккаунт подозревается в подделке — найден в вашем локальном блок-листе
"highRiskProfile", //Высокий поведенческий риск
"physicalForgery", //Загружена физически подделанная копия документа
"wantedDocument", //Документ находится в списке разыскиваемых или утерянных
"livenessForced", //Обнаружены следы принуждения пользователя
"deepFake" //Попытка обойти проверку с помощью дипфейка
],
"moreDocs": [
"individual", //Не предоставлены все обязательные документы
"additionalPages" //Требуются дополнительные страницы документа
],
"compromisedPersons": [ //Обнаружено совпадение с персоной из списков AML (подозрение подтверждено)
"pep",
"sanctionList",
"criminalRecords",
"adverseMedia"
],
"company": [
"moreDocs", //Не предоставлены все обязательные документы компании
"notDeterminedBeneficiaries", //Не удалось определить бенефициаров
"controlStructureIsNotEstablished",
"notValidatedBeneficiaries", //Бенефициары не прошли проверку
"notDeterminedRepresentatives", //Не удалось определить представителей
"notValidatedRepresentatives", //Представители не прошли проверку
"additionalInfo" //Требуется дополнительная информация о компании
],
"checks": [
"noInfoForChecks"
],
"additionalPages": [ //Требуются дополнительные страницы или стороны документа
"anotherSide",
"frontSideId",
"backSideId",
"frontSideDl",
"backSideDl",
"frontSideTranslation",
"backSideTranslation",
"frontSideRp",
"backSideRp",
"mainPageId",
"frontSideForeignId",
"backSideForeignId",
"localId",
"registrationStamp",
"2-3_IdDocPages",
"4-5_IdDocPages",
"6-7_IdDocPages",
"8-9_IdDocPages",
"10-11_IdDocPages",
"12-13_IdDocPages",
"30-31_IdDocPages",
"selfie",
"passport",
"proofOfAddress",
"birthCertificate"
],
"badDocument": [ //Предоставлен неподходящий документ
"expiredId", //Истек срок действия документа
"invalidId", //Недействительный документ
"damagedId", //Документ повреждён
"notFullNameOrDob", //В документе отсутствует полное имя и/или дата рождения
"withoutFace", //Лицо в документе плохо видно
"dataNotVisible", //Необходимые данные документа не видны
"copyOfIdDoc", //Предоставлена копия документа
"noStamp", //Печать не видна
"wrongType", //TТип документа не поддерживается или не принимается
"unsigned", //Документ не подписан
"needTranslation", //Требуется перевод документа на английский язык
"fake", //Недостоверное удостоверение личности
"expirationDate", //Документ должен быть действителен минимум 1 месяц после загрузки
"inconsistency" //Имя владельца банковской карты не совпадает с именем в документе
],
"badPhoto": [
"lowQuality", //Низкое качество изображения
"screenshot", //Загружен скриншот
"blackAndWhite", //Требуется цветное фото или скан
"imageEditor", //Обнаружено использование графического редактора
"incomplete", //Все углы документа должны быть видны
"notAPhoto", //Фото было преобразовано в PDF
"idOnly", //Требуется только документ, удостоверяющий личность
"faceNotFound",
"fullDoublePage", //Разворот документа виден не полностью
"frontSideId", //Требуется главный разворот документа
"backSideId", //Требуется обратный разворот документа
"frontSideDl", //Требуется лицевая сторона ВУ
"backSideDl", //Требуется обратная сторона ВУ
"mainIdDocPage",
"2-3_IdDocPages",
"4-5_IdDocPages",
"6-7_IdDocPages",
"frontSideNationalDl",
"backSideNationalDl",
"dataNotVisible", //Необходимые данные документа не видны
"pdfFonts", //Обнаружены следы редактирования изображения
"sticker", //Личная информация скрыта с помощью графического редактора
"cardRequirements"
],
"proofOfIdentity": [
"passport", //Запрошен паспорт
"idCard", //Запрошена ID-карта
"drivingLicence", //Запрошено водительское удостоверение
"residencePermit" //Запрошен вид на жительство
],
"selfie": [
"lowQuality", //Запрошено новое селфи с лучшим качеством изображения
"selfieWithId", //Запрошено селфи с удостоверением личности
"selfieWithPassport",
"selfieWithDl",
"selfieWithAnotherId", //Запрошено селфи с другим документом
"selfieWithNewId", //Запрошено селфи с новым удостоверением личности
"selfiePaper", //Запрошено селфи с листом бумаги с сегодняшней датой
"blackAndWhite", //Запрошено цветное фото
"badFaceComparison", //Плохое сравнение лиц
"avatarIssue",
"freshSelfie", //Запрошено актуальное селфи с текущей датой.
"selfieLiveness", //Запрошена повторная проверка на живость лица
"customIssue"
],
"videoSelfie": [
"lowQuality",
"videoWithoutFace",
"spokenPhraseMismatch",
"videoWithId", //Запрошено видео-селфи с документом
"videoWithAnotherId",
"videoWithNewId"
],
"profileImage": [
"lowQuality",
"wrongPhoto"
],
"proofOfAddress": [
"fullName", //Запрошено подтверждение адреса с полным именем пользователя
"fullAddress", //Требуется документ с подходящей датой выдачи
"issueDate", //Запрошен подходящий документ, подтверждающий адрес
"listOfDocs", //Истек срок действия документа
"expirationDate",
"dataMismatch",
"sameDoc", //Один и тот же документ был предоставлен как удостоверение личности и как подтверждение адреса
"certifiedForm", //Запрошена заверенная форма документа, подтверждающего адрес
"notEnoughData",
"countryMismatch"
],
"proofOfPayment": [
"bankCard", //Высокорисковая банковская карт
"bankStatement", //Запрошена выписка из банка
"e-wallet", //Запрошено подтверждение электронного кошелька
"wireTransfer", //Запрошено подтверждение банковского перевода
"bankAccount", //Отсутствует номер счёта
"dataMismatch"
],
"bankCard": [
"fullNameIssue", //Карта без имени пользователя
"highRisk",
"expirationDate",
"badCard",
"specificCard",
"noCard"
],
"bankStatement": [
"fullNameIssue", //Запрошена выписка с полным именем пользователя
"numberMismatch", //Номер карты в выписке не совпадает с предоставленной картой
"invalidIssueDate", //Запрошена выписка с подходящей датой выдачи
"notEnoughData" //Отсутствуют номер счёта или номер карты
],
"differentDocs": [
"identityDoc",
"paymentMethodDoc"
],
"graphicEditor": [
"frontSide",
"backSide",
"selfie"
],
"fake": [
"printed", //Распечатанная копия документа
"editedMrz", //Отредактированные MRZ-данные
"blacklisted", //Документ или способ оплаты в чёрном списке
"editedId", //Отредактированы основные данные документа
"forgedId", //Поддельный физический документ
"webId", //Образец документа из интернета
"fakePoa", //Недостоверное подтверждение адреса
"editedPoa", //Отредактированные данные адреса
"fakeSelfie" //Селфи с поддельным документом
],
"paymentsIssues": [
"bankStatement",
"bankBook",
"emailScreen",
"webScreen",
"dataScreen"
],
"livenessIssues": [
"livenessDifferentPeople", //Во время проверки на живость обнаружены разные лица
"livenessBypassAttempt" //Попытка обойти проверку на живость
]
}
Пример
curl -X GET \
'https://api.cyberity.ru/resources/moderationStates/-;applicantId=5eeb914604f940217bdbad05'
{
"list": {
"items": [
{
"id": "5eebac3dd5ea480a98d51b40",
"applicantId": "5eeb914604f940217bdbad05",
"key": "TFRRN1THCATLDW",
"imagesStates": {
"104037333": { //imageId
"state": {
"badPhoto": { //Unsatisfactory photo was submitted
"value": true //buttonId is active
},
"badPhoto_imageEditor": { //Graphic editing software usage was detected
"value": true
}
}
},
"885188054": {
"state": {
"badPhoto": {
"value": true
},
"badPhoto_imageEditor": {
"value": true
}
}
},
"1777063415": {
"state": {
"badPhoto": { //Unsatisfactory photo was submitted
"value": true
},
"badPhoto_incomplete": { //Not all document edges are visible
"value": true
}
}
},
"1054210547": {
"state": {
"badPhoto": {
"value": true
},
"badPhoto_incomplete": {
"value": true
}
}
},
"1234193281": {
"state": {
"badPhoto": {
"value": true
},
"badPhoto_incomplete": {
"value": true
}
}
},
"484169174": {
"state": {
"badPhoto": {
"value": true
},
"badPhoto_imageEditor": {
"value": true
}
}
},
"741138243": {
"state": {
"badPhoto": {
"value": true
},
"badPhoto_incomplete": {
"value": true
}
}
},
"2118922684": {
"state": {
"badPhoto": {
"value": true
},
"badPhoto_imageEditor": {
"value": true
}
}
},
"1719337639": {
"state": {
"badPhoto": {
"value": true
},
"badPhoto_incomplete": {
"value": true
}
}
}
},
"applicantState": {
"regulationsViolations_wrongRegion": { //User is from excluded region/country
"value": false //buttonId is inactive
},
"regulationsViolations": {
"value": false
},
"dataMismatch": {},
"dataMismatch_address": {
"value": false
},
"regulationsViolations_duplicate": {
"value": false
}
}
}
],
"totalItems": 1
}
}
# Тестирование API-интеграции
# POST Назначение результата проверки для пользователя в Тестовом окружении (Sandbox)
В Тестовом окружении (Sandbox) вы можете попробовать получить результаты проверки через вебхук applicantReviewed, но перед этим вам необходимо задать параметры проверки с помощью этого запроса.
POST /resources/applicants/{applicantId}/status/testCompleted
Параметры запроса
| Название | Тип | Обязательно | Описание |
|---|---|---|---|
applicantId | String | Да | Идентификатор пользователя. |
Тело запроса
| Название | Тип | Обязательно | Описание |
|---|---|---|---|
reviewAnswer | String | Да | Укажите результат GREEN или RED, чтобы смоделировать нужный вам ответ. |
rejectLabels | Array of Strings | Да | Причины отказов. |
reviewRejectType | String | Нет | Выберите FINAL или RETRY, чтобы смоделировать типы отказов. |
clientComment | String | Нет | Человекочитаемый комментарий, который не следует показывать конечному пользователю. |
moderationComment | String | Нет | Человекочитаемый комментарий, который может быть показан конечному пользователю. |
Ответ
В случае получения HTTP-ответа 200 вы можете не обращать внимания на его тело.
Пример
curl -X POST \
'https://api.cyberity.ru/resources/applicants/5bb8cca10a975a624903cf65/status/testCompleted' \
-H 'content-type: application/json' \
-d '{
"reviewAnswer" : "GREEN",
"rejectLabels": []
}
'
curl -X POST \
'https://api.cyberity.ru/resources/applicants/5bb8cca10a975a624903cf65/status/testCompleted' \
-H 'content-type: application/json' \
-d '{
"reviewAnswer": "RED",
"moderationComment": "We do not accept screenshots. Please upload an original photo.",
"clientComment": "Screenshots are not accepted.",
"reviewRejectType": "RETRY",
"rejectLabels": ["UNSATISFACTORY_PHOTOS","SCREENSHOTS"]
}
'
{
"ok": 1
}
# Обмен пользователями между партнерскими сервисами
Если вы начинаете сотрудничество с другим нашим клиентом и хотите упростить и ускорить верификацию пользователей, отличным решением будет объединить ваши пользовательские базы через IDnGO. Подробнее об обмене пользователями в разделе О верификации
Внимание:
Перед использованием функции обмена пользователями свяжитесь с нами, чтобы подписать трехстороннее соглашение об обмене персональными данными с вами, IDnGO и вашим партнерским сервисом.
# POST Генерация shareToken
POST /resources/accessTokens/-/shareToken?applicantId={applicantId}&forClientId={clientId}
Query-параметры
| Название | Тип | Обязательно | Описание |
|---|---|---|---|
applicantId | String | Да | Идентификатор вашего пользователя (сервис X). |
forClientId | String | Да | Идентификатор клиента, которому предназначается токен (сервис Y). Вы можете найти свой clientId в профиле пользователя или в ответе на запрос данных о пользователе. |
ttlInSecs | Integer | Нет | Продолжительность жизни токена в секундах (по умолчанию — 1200). |
Ответ
В полученном JSON shareToken указан в поле token.
Пример
Пример получения shareToken (выполняется X):
## applicantId and Y's client ID must be provided
curl -X POST \
'https://api.cyberity.ru/resources/accessTokens/-/shareToken?applicantId=5ce412012b4da877b2d910bd&forClientId=CoolCoinLtd'
{
"token": "_act-460a698b-d2bc-4cbc-9456-5f36fee38083",
"forClientId": "CoolCoinLtd"
}
# POST Импорт пользователя от сервиса-партнера
POST /resources/applicants/-/import?shareToken={shareToken}
Query-параметры
| Название | Тип | Обязательно | Описание |
|---|---|---|---|
shareToken | String | Да | shareToken, сгенерированный X. |
resetIdDocSetTypes | String | Нет | Укажите один или несколько типов документов, разделенных запятыми, если пользователь должен повторно представить эти документы для проверки. Например, SELFIE, IDENTITY и т.д. |
trustReview | Boolean | Нет | Если вы доверяете результату проверки вашего сервиса-партнера, используйте true. При значении false пользователь будет проверен повторно (по умолчанию — false). |
userId | String | Нет | Задает ваш собственный externalUserId для импортируемого пользователя. В случае обнаружения пустого значения мы сгенерируем случайный userId. |
levelName | String | Нет | Задает указанный levelName импортируемому пользователю и устанавливает статус init в случае, если присутствуют не все необходимые документы. |
shareToken после использования будут считаться недействительными.
Ответ
В ответ приходит информация об анкете импортированного в сервис Y пользователя.
Внимание:
В ответе будет передан новый идентификатор пользователя. Сохраните его, если это необходимо.
Пример
Пример импорта пользователя (выполняется Y):
curl -X POST \
'https://api.cyberity.ru/resources/applicants/-/import?shareToken=_act-0b8a43f6-b70f-4ad3-bda9-7ce904589380'
{
// Applicant in service Y
"id": "5d08a63239b79354a2ebaa1d",
"createdAt": "2019-06-18 10:52:02",
"clientId": "CoolCoinLtd",
...
}
# Проверка отправителя вебхука
Подробнее о вебхуках в разделе Начало работы.
# POST Проверка отправителя вебхука
Чтобы проверить, что вы вычисляете контрольное значение (digest) тем же способом, что и мы, воспользуйтесь этим эндпоинтом. Он принимает текст в качестве тела и не может обрабатывать полезную нагрузку в формате JSON, как в реальных случаях.
POST /resources/inspectionCallbacks/testDigest?secretKey={secretKey}
Query-параметры
| Название | Тип | Обязательно | Описание |
|---|---|---|---|
secretKey | String | Да | Секретный ключ, который может быть использован для подписи. |
digestAlg | String | Нет | Алгоритм шифроания подписи. Возможные значения: HMAC_SHA1_HEX, HMAC_SHA256_HEX, HMAC_SHA512_HEX (по умолчанию — HMAC_SHA1_HEX). |
Тело запроса
Тело запроса представляет собой любой текст.
Ответ
| Значение | Описание |
|---|---|
digest | Контрольное значение. |
Пример
curl -X POST \
'https://api.cyberity.ru/resources/inspectionCallbacks/testDigest?secretKey=SoMe_SeCrEt_KeY&digestAlg=HMAC_SHA1_HEX' \
-H 'Content-Type: text/plain' \
-d 'someText'
{
"digest": "f6e92ffe371718694d46e28436f76589312df8db"
}