KYC (Know Your Customer)
KYC — верификация конечного клиента мерчанта (того кто платит). Не мерчанта. Нужен только для:
- Платежей на суммы выше настроенного порога (если настроено);
- Обменов (
/exchanges) в обе стороны — USDT↔RUB; - Некоторых категорий мерчантов по решению X-Hub.
Если твой аккаунт не требует KYC — пропусти этот раздел. Все три KYC-эндпоинта вернут {"status": "not_required"} или 400 KYC_NOT_REQUIRED.
Два способа интеграции KYC
У мерчанта два варианта — выбери один:
Способ 1: Hosted redirect (простой)
X-Hub предоставляет готовую страницу верификации. Мерчант перенаправляет своего клиента туда, клиент заполняет форму (телефон, селфи, паспорт, адрес), после верификации возвращается на сайт мерчанта.
Query-параметры:
| Параметр | Обяз. | Описание |
|---|---|---|
phone |
— | Телефон клиента в формате +7XXXXXXXXXX (можно не передавать — клиент введёт сам) |
redirect |
— | URL, куда вернуть клиента после завершения. Только HTTPS, только same-origin с твоим доменом. Если не указан — редирект на / |
Плюсы: ничего не надо писать на стороне мерчанта. Минусы: клиент уходит с твоего сайта, меньше контроля над UX.
Способ 2: API-first (встроенный в UI мерчанта)
Мерчант делает KYC-форму внутри своего приложения (свой UI, свой дизайн), а вызывает наши API для загрузки документов и регистрации. Клиент не покидает сайт мерчанта.
Flow (со стороны backend мерчанта):
POST /v1/kyc/check→ проверить, нужен ли KYC и не пройден ли уже;POST /v1/kyc/upload-url× 3 → получить signed URL на селфи / паспорт / адрес;- Фронтенд мерчанта загружает файлы напрямую на upload URL (PUT, без прохождения через backend);
POST /v1/kyc/register→ передатьfile_key'и +phone;- Периодически
POST /v1/kyc/check→ дождатьсяstatus: verified.
Плюсы: полный контроль UX и брендинга. Минусы: больше кода на стороне мерчанта, своя форма загрузки файлов.
Детали всех endpoints — ниже.
Когда нужен KYC
Если при создании платежа вы получаете ошибку:
— значит для вашего аккаунта настроена обязательная KYC-проверка. Используйте flow ниже.
Если ошибки нет
Если при создании платежа вы НЕ получаете KYC_REQUIRED — KYC не требуется. Можете пропустить этот раздел. Все три KYC-эндпоинта вернут {"status": "not_required"} или 400 KYC_NOT_REQUIRED.
Проверить KYC — POST /kyc/check
Проверяет статус KYC-верификации клиента по номеру телефона.
curl -X POST https://api.x-hub.online/api/v1/kyc/check \
-H "X-Api-Key: ..." -H "X-Api-Secret: ..." \
-H "Content-Type: application/json" \
-d '{"phone": "+79991234567"}'
Body
| Поле | Тип | Обяз. | Описание |
|---|---|---|---|
phone |
string | ✓ | Телефон клиента в формате +7XXXXXXXXXX |
Ответы
KYC не требуется (для вашего аккаунта не настроен):
KYC верифицирован:
KYC не пройден (нужна регистрация):
KYC в обработке:
KYC отклонён:
Ошибки KYC-эндпоинтов
Одинаковы для всех трёх (/kyc/check, /kyc/upload-url, /kyc/register):
| HTTP | Code | Причина | Что делать |
|---|---|---|---|
| 400 | SANDBOX_NOT_SUPPORTED |
KYC в песочнице недоступен для конфигурации твоего аккаунта | Тестируй KYC в боевом режиме или напиши в X-Hub |
| 400 | KYC_NOT_REQUIRED |
KYC для аккаунта не настроен (/upload-url, /register). У /kyc/check тот же случай даёт 200 {"status":"not_required"} |
Просто создавай платежи, KYC не нужен |
| 400 | VALIDATION_ERROR |
Невалидный phone / content_type / состав ключей файлов |
Проверь формат |
| 403 | PROVIDER_DISABLED |
KYC для твоего аккаунта отключён. Отдаётся до любой другой проверки — то есть даже валидный запрос получит 403 |
Это не ошибка запроса и не «не пройден KYC». Ретрай не поможет: напиши в X-Hub |
| 502 | PROVIDER_ERROR |
Проверяющая сторона не ответила (сеть, таймаут, её 5xx) |
Временная ошибка. Ретрай через 30–60 сек |
| 503 | KYC_UNAVAILABLE |
Твоему аккаунту KYC положен, но верификация сейчас недоступна на нашей стороне (внутренняя неполадка X-Hub, не твоей интеграции) | Это не «KYC не нужен» — не пропускай верификацию клиента. Ретрай через 1–2 минуты; если долго — напиши в X-Hub |
| 500 | KYC_PERSIST_FAILED |
Только на /kyc/register: проверяющая сторона клиента уже приняла, но у нас не сохранилась запись об этом — сбой уже ПОСЛЕ успешного шага верификации |
Не повторяй запрос с теми же данными. Напиши в X-Hub с временем запроса и телефоном/e-mail клиента — восстановим вручную |
403 PROVIDER_DISABLED легко спутать с отказом в верификации
Это не «клиент не прошёл KYC» — отказ по клиенту приходит как {"status": "failed"} с 200. 403 PROVIDER_DISABLED означает, что KYC для твоего аккаунта отключён, и ни один клиент верифицироваться не сможет. Если он появился внезапно — не переписывай интеграцию, сначала спроси команду X-Hub.
503 KYC_UNAVAILABLE — тоже не «KYC не нужен»
Если твой аккаунт настроен на KYC, KYC_NOT_REQUIRED / {"status":"not_required"} ты в норме никогда не увидишь. 503 KYC_UNAVAILABLE значит ровно обратное: KYC нужен, но сейчас сломан на нашей стороне. Не интерпретируй его как разрешение пропустить верификацию клиента.
Получить URL для загрузки документов — POST /kyc/upload-url
Получает pre-signed URL для загрузки документов KYC (фото паспорта, селфи).
curl -X POST https://api.x-hub.online/api/v1/kyc/upload-url \
-H "X-Api-Key: ..." -H "X-Api-Secret: ..." \
-H "Content-Type: application/json" \
-d '{"content_type": "image/jpeg"}'
Body
| Поле | Тип | Обяз. | Описание |
|---|---|---|---|
content_type |
string | ✓ | MIME-тип файла (image/jpeg, image/png, application/pdf) |
Ответ
Загрузи файл по upload_url (PUT), затем используй file_key в POST /kyc/register.
Зарегистрировать KYC — POST /kyc/register
Отправляет данные KYC-верификации в X-Hub.
curl -X POST https://api.x-hub.online/api/v1/kyc/register \
-H "X-Api-Key: ..." -H "X-Api-Secret: ..." \
-H "Content-Type: application/json" \
-d '{
"phone": "+79991234567",
"selfie_key": "kyc/selfie-abc123",
"document_key": "kyc/doc-def456",
"address_key": "kyc/addr-ghi789"
}'
Body
| Поле | Тип | Обяз. | Описание |
|---|---|---|---|
phone |
string | ✓ | Телефон клиента в формате +7XXXXXXXXXX. Единственное поле, обязательное всегда |
selfie_key |
string | * | file_key от upload-url (селфи) |
document_key |
string | * | file_key от upload-url (документ) |
address_key |
string | file_key от upload-url (подтверждение адреса) |
|
email |
string | * | E-mail клиента |
user_type |
string | * | individual или legal_entity |
Какие из полей со звёздочкой нужны — зависит от KYC-конфигурации аккаунта
Конфигураций две, и обязательный набор у них разный:
- загрузка документов — нужны
selfie_key+document_key(плюс опциональноaddress_key); - переадресация клиента на форму верификации — нужны
email+user_type, файлы не нужны; в ответе придёт{"status": "required", "kycUrl": "..."}, и клиента надо отправить по этому адресу.
Валидация тела не проверяет комбинацию: запрос без нужных полей пройдёт схему и упрётся уже в проверяющую сторону (502 PROVIDER_ERROR или отказ по клиенту). Какая конфигурация у тебя — уточни при подключении.
Ответ
Либо {"status": "required", "kycUrl": "..."} — если клиента нужно отправить на форму верификации, либо {"status": "verified", "accountNumber": "..."} — если он уже верифицирован.
Повторный register по тому же телефону безопасен
Если клиент уже верифицирован (или ему уже выдана ссылка на верификацию), повторный вызов вернёт сохранённый результат, не запуская проверку заново. Исключение — клиент, которому ранее отказали: такой запрос уйдёт на новую проверку.
Исключение — 500 KYC_PERSIST_FAILED: это НЕ тот безопасный повтор
Если ответ — 500 KYC_PERSIST_FAILED, «сохранённого результата» из подсказки выше ещё нет: у нас не записалась информация о том, что клиент уже прошёл шаг верификации. Слепой повтор register с теми же данными может уйти в новую попытку регистрации у проверяющей стороны — для части конфигураций это ломает саму возможность зарегистрировать клиента повторно. Не повторяй — пиши в X-Hub.
После регистрации — периодически проверяй статус через POST /kyc/check.
Интеграция KYC + платежи
Если для вашего аккаунта требуется KYC, при создании платежа передавай client_phone:
curl -X POST https://api.x-hub.online/api/v1/payments \
-H "X-Api-Key: ..." -H "X-Api-Secret: ..." \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"amount_rub": "500.00",
"payment_method": "sbp",
"client_phone": "+79991234567"
}'
Если KYC не пройден, API вернёт:
400 KYC_REQUIRED— клиент не верифицирован400 KYC_PROCESSING— верификация в процессе, попробуй позже400 KYC_FAILED— верификация отклонена