KYC Magic Link
Этот сценарий использования не использует эндпоинт Unico POST /v1/process и не использует контракт API/TCA. Интеграция осуществляется с Trully.ai (хост api.trully.ai), с аутентификацией через x-api-key вместо Bearer JWT, и собственной схемой ответа. Для других стран используйте Онбординг (Глобальный).
Что решает этот сценарий использования
KYC Magic Link решает задачу выполнения процесса идентификации в Мексике, сбора национальных удостоверений личности (INE) и биометрических данных лица. Благодаря процессу, размещённому Unico, вы устраняете трудности с разработкой front-end с помощью ссылки, отправляемой через ваши собственные каналы (WhatsApp, SMS, электронная почта).
Используйте этот сценарий, когда:
- Вы работаете в Мексике и используемый документ удостоверения личности — INE (обязательно).
Не используйте этот сценарий, когда:
- Пользователь находится за пределами Мексики или использует другие документы → обратитесь к другим сценариям онбординга.
Задействованные возможности
Конвейер, выполняемый в рамках одного процесса:
| Возможность | Обязательность | Роль в процессе |
|---|---|---|
| Захват документа | Обязательно | Захватывает изображение документа INE. Повторное использование документа недоступно в этом сценарии — каждая сессия требует нового захвата. |
| Liveness | Обязательно | Проверка живости — обязательное селфи, которое привязывает процесс. |
| Классификация рисков | Обязательно | Перекрёстно сопоставляет поведенческие сигналы для выявления риска мошенничества, связанного с CPF. |
| Верификация личности | Опционально (при наличии контракта) | Проверяет, принадлежит ли лицо в транзакции владельцу предоставленного государственного идентификатора, используя базу идентификаторов Unico и дополнительные сигналы. |
Предварительные требования
- API-ключ — предоставляется вашим менеджером проекта по онбордингу в Unico. Отправляется в заголовке
x-api-key. - Публичный HTTPS-эндпоинт для получения вебхуков (опционально, но рекомендуется).
- Настройка CORS — разрешите источники
https://verification.unico.app(продакшн) иhttps://verification.uat.unico.app(sandbox) на сервере, принимающем вебхук.
Пошаговая реализация
В отличие от других сценариев, Magic Link не имеет поля flow — интеграция осуществляется напрямую с Trully API. Эндпоинт создаёт уникальную ссылку для верификации, которую вы распространяете среди пользователей через собственный канал.
Эндпоинт: POST https://sandbox.trully.ai/v2/magic-link
Заголовки:
| Заголовок | Обязательность | Описание |
|---|---|---|
x-api-key | Да | API-ключ, предоставленный вашим менеджером проекта по онбордингу в Unico. |
Content-Type | Да | application/json |
Тело (application/json):
| Поле | Тип | Обязательность | Описание |
|---|---|---|---|
external_id | string | Нет | Внешний идентификатор запроса, используемый для отслеживания и справочных целей. |
metadata | object | Нет | Контейнер для параметров конфигурации. |
metadata.phone | string | Нет | Номер телефона пользователя в международном формате (например, 521234567890). |
metadata.redirect_url | string | Нет | URL для перенаправления пользователя после завершения процесса KYC. |
metadata.webhook_url | string | Нет | URL для отправки данных процесса KYC после его завершения. Этот вебхук будет вызываться на стороне клиента. В целях безопасности эндпоинт должен использовать HTTPS. Компонент будет ждать одну минуту ответа от вашего вебхук-сервера — по истечении этого времени связь будет прервана. Процесс никак не пострадает от сбоя вебхук-коммуникации. Убедитесь, что https://verification.unico.app и https://verification.uat.unico.app разрешены в вашей конфигурации CORS для продакшна и sandbox соответственно. |
metadata.track_webhook_url | string | Нет | URL для отправки данных каждого шага KYC, выполненного пользователем (см. события вебхуков ниже). Этот вебхук будет вызываться на стороне клиента. В целях безопасности эндпоинт должен использовать HTTPS. Компонент будет ждать одну минуту ответа от вашего вебхук-сервера — по истечении этого времени связь будет прервана. Процесс никак не пострадает от сбоя вебхук-коммуникации. Убедитесь, что https://verification.unico.app и https://verification.uat.unico.app разрешены в вашей конфигурации CORS для продакшна и sandbox соответственно. |
Возможные значения для data.step (отправляется на track_webhook_url):
| Шаг | Описание |
|---|---|
form_start | Пользователь в данный момент сканирует документ. |
form_document_front | Пользователь уже захватил лицевую сторону INE. |
form_document_back | Пользователь уже захватил обратную сторону INE. |
form_document | Процесс в данный момент находится на шаге создания селфи. |
form_selfie | Пользователь достиг финального шага операции. |
form_decision_maker | Операция возвращает системный ответ. |
Пример запроса:
curl -X POST https://sandbox.trully.ai/v2/magic-link \
-H "x-api-key: $TRULLY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"external_id": "user-mx-12345",
"metadata": {
"phone": "521234567890",
"redirect_url": "https://app.client.com.mx/kyc-done",
"webhook_url": "https://app.client.com.mx/webhook/result",
"track_webhook_url": "https://app.client.com.mx/webhook/track"
}
}'
Поля ответа:
| Поле | Тип | Описание |
|---|---|---|
data.external_id | string (nullable) | Внешний идентификатор запроса, используемый для отслеживания и справочных целей. |
data.created_on | string (date-time) | Дата создания magic link. |
data.is_active | boolean | Если true, magic link активен. |
data.token | string | Токен magic link, который будет использоваться для привязки процессов KYC к magic link. |
data.magic_link_url | string (URI) | Магическая URL-ссылка для начала процесса KYC. |
data.metadata.redirect_url | string (nullable) | URL д ля перенаправления пользователя после завершения процесса KYC. |
data.metadata.webhook_url | string (nullable) | URL для отправки данных процесса KYC после его завершения. Этот вебхук будет вызываться на стороне клиента. |
data.metadata.track_webhook_url | string (nullable) | URL для отправки данных каждого шага KYC, выполненного пользователем. Этот вебхук будет вызываться на стороне клиента. |
data.version | string | Версия magic link. |
version | string | Версия API, обработавшего запрос, полезна для отслеживания изменений и совместимости. |
status | string | Текстовое представление статуса ответа, указывающее на успех или неудачу операции. |
status_code | integer | HTTP-код статуса ответа, обеспечивающий стандартизированный индикатор результата запроса. |
request_date | string (date-time) | Дата и время запроса в формате ISO 8601. |
request.metadata.redirect_url | string (nullable) | URL для перенаправления пользователя после завершения процесса KYC (эхо запроса). |
request.metadata.webhook_url | string (nullable) | URL для отправки данных процесса KYC после завершения (эхо запро са). |
request.metadata.track_webhook_url | string (nullable) | URL для отправки данных каждого шага KYC, выполненного пользователем (эхо запроса). |
Пример ответа:
{
"data": {
"external_id": null,
"created_on": "2025-07-28T18:11:54.430048399Z",
"is_active": true,
"token": "3f6dbcc1-49ba-4935-be90-dd8dd59b5530",
"magic_link_url": "https://verification.uat.unico.app/link/v2/3f6dbcc1-49ba-4935-be90-dd8dd59b5530",
"metadata": {
"redirect_url": null,
"webhook_url": null,
"track_webhook_url": null
},
"version": "v2"
},
"version": "v1.4.2",
"status": "ok",
"status_code": 200,
"request_date": "2025-07-28T18:11:54+0000",
"request": {
"metadata": {
"redirect_url": null,
"webhook_url": null,
"track_webhook_url": null
}
}
}
Ответы об ошибках — POST /v2/magic-link
| Код | Сообщение | Описание |
|---|---|---|
400 Bad Request | data provided in the field is invalid | Недопустимая структура данных или значения полей в теле запроса. Проверьте обязательные поля и форматы. |
403 Forbidden | Forbidden | API-ключ отсутствует, истёк или не имеет разрешения. Проверьте заголовок x-api-key. |
500 Internal Server Error | internal server error | Ошибка обработки на стороне сервера. Повторите попытку с экспоненциальной задержкой. При сохранении проблемы сообщите в службу поддержки. |
Пример ответа 400:
{
"data": {
"error": "data provided in the field is invalid"
},
"version": "v1.4.2",
"status": "bad request",
"status_code": 400,
"request_date": "2025-07-28T20:22:29+0000",
"request": {
"metadata": null
}
}
Отправьте через WhatsApp, SMS, электронную почту или встройте в страницу. Пользователь открывает ссылку на своём устройстве и проходит размещённый процесс.
- Опрос через GET (обязательно) — периодически вызывайте
GET /v2/history/request?magic_link_token={token}до тех пор, пока не будет заполнено полеunico.result. См. Опрос через GET ниже. - Вебхук (опционально) — настройте с вашим менеджером проекта по онбордингу для автоматического получения событий. См. Вебхук ниже.
Опрос через GET
Эндпоинт: GET https://sandbox.trully.ai/v2/history/request
Параметры запроса:
| Параметр | Тип | Обязательность | Описание |
|---|---|---|---|
magic_link_token | string | Да | Токен, возвращённый при создании Magic Link. |
Заголовки:
| Заголовок | Обязательность | Описание |
|---|---|---|
x-api-key | Да | API-ключ, предоставленный вашим менеджером проекта по онбордингу в Unico. |
Пример запроса:
curl "https://sandbox.trully.ai/v2/history/request?magic_link_token=$TOKEN" \
-H "x-api-key: $TRULLY_API_KEY"
Пример ответа:
{
"data": {
"images": {
"document_image": "/9j/4ASu7bmV[...]fyPjOKfgif//Z",
"document_image_back": "/9j/4ASu7bmV[...]fyPjOKfgif//Z",
"selfie": "/9j/4ASu7bmV[...]fyPjOKfgif//Z"
},
"response": {
"curp": {
"age": 58,
"curp": "GOCJ850627HDFRRL09",
"date_of_birth": "14/11/1956",
"deceased": false,
"gender": "M",
"government_name": "LUKE SKYWALKER",
"government_valid": true,
"is_mexican": true,
"name_to_CURP_valid": true,
"state_iso": "MX-NLE",
"state_of_birth": "Nuevo León"
},
"document": {
"back": {
"cic": "237457894",
"citizen_id": "237457894",
"mrz": "IDMEX999999999999<9 VADER<SKYWALKER<<LUKE"
},
"details": {
"detected": true,
"document_id": 229928,
"forensics": { "is_valid": "no" }
},
"front": {
"face_analysis": {
"face_id": 237437,
"face_id_v2": 199068,
"first_seen": "12/22/2022, 18:54:09",
"inquiry_date": "07/28/2025, 20:53:12",
"last_seen": "07/28/2025, 18:47:46",
"last_seen_by_your_company": "07/24/2025, 21:38:21",
"match": true,
"match_fraud_flag": true,
"seen_by_your_company": true,
"seen_different_companies": 46,
"times_seen_by_your_company": 3,
"times_seen_last_month": 111,
"unique_face_id_v2": 126880,
"warnings": {
"external_id": "User found in the company with other external_ids: ['abc-123']"
}
},
"information": {
"address": { "text": "DOMICILIO/ADDRESS, HARLINGEN, TX 78552", "valid": false },
"birthdate": { "text": "14/11/1956", "valid": true },
"complete_name": { "text": "LUKE SKYWALKER", "valid": true },
"curp": { "text": "GOCJ850627HDFRRL09", "valid": true },
"electoral_key": { "text": "GRCRSN82031007M500", "valid": true },
"last_name": { "text": "SKYWALKER", "valid": true },
"mother_last_name": { "text": "ORGANA", "valid": true },
"name": { "text": "LUKE", "valid": true },
"registration_year": { "text": "1998", "valid": true },
"sex": { "text": "H", "valid": true },
"valid_thru": { "text": "2027", "valid": true }
}
}
},
"face_match": false,
"label": null,
"reason": null,
"request_id": "d1kxp9ah8f0s71uv9zx0",
"selfie": {
"face_id": 237436,
"face_id_v2": 4378,
"first_seen": "02/05/2025, 02:36:19",
"first_seen_image": true,
"inquiry_date": "07/28/2025, 20:52:49",
"last_seen": "07/28/2025, 20:52:51",
"last_seen_by_your_company": "07/23/2025, 18:14:27",
"match": true,
"match_fraud_flag": true,
"seen_by_your_company": true,
"seen_different_companies": 2,
"times_seen_by_your_company": 2,
"times_seen_last_month": 7,
"unique_face_id_v2": 494,
"warnings": {}
},
"unico": {
"process_id": "d333dfac-9ddb-4066-8e2c-44eaf4c86b4a",
"result": "PROCESS_RESULT_LIVE"
}
},
"user_id": ""
},
"request_date": "2025-07-28T20:53:38",
"status": "Request fulfilled, document follows",
"status_code": 200,
"version": "v3.6.0"
}
Поля ответа:
Корневой уровень:
| Поле | Тип | Описание |
|---|---|---|
status | string | Текстовое представление статуса ответа. |
status_code | integer | HTTP-код статуса. |
request_date | string (date-time) | Дата и время запроса. |
version | string | Версия API, обработавшего запрос. |
data.user_id | string | ID пользователя, установленный в исходном запросе. |
data.images — Захваченные изображения в Base64:
| Поле | Тип | Описание |
|---|---|---|
data.images.document_image | string | Изображение лицевой стороны документа в Base64. |
data.images.document_image_back | string | Изображение обратной стороны док умента в Base64. |
data.images.selfie | string | Изображение селфи, захваченного при верификации, в Base64. |
data.response.unico — Сводный вердикт:
| Поле | Тип | Описание |
|---|---|---|
data.response.unico.process_id | string (UUID) | Внутренний идентификатор, связанный с процессом верификации. |
data.response.unico.result | string | Результат процесса. Возможные значения описаны ниже. |
Возможные значения для data.response.unico.result:
Значение результата кодирует одно из трёх измерений оценки:
- Оценка личности — принадлежит ли захваченное лицо владельцу документа (
PROCESS_RESULT_VERIFIED,PROCESS_RESULT_NOT_APPROVED). - Мошенническое поведение — указывают ли поведенческие или сетевые сигналы на риск мошенничества (
PROCESS_RESULT_LIVE,PROCESS_RESULT_HIGH_RISK,PROCESS_RESULT_CRITICAL_RISK,PROCESS_RESULT_NOT_APPROVED). - Liveness — было ли живое лицо обнаружено в момент захвата (
PROCESS_RESULT_NOT_LIVE).
| Результат | Рекомендация | Значение | Сигнал |
|---|---|---|---|
PROCESS_RESULT_ERROR |