Перейти к содержимому
Последнее обновление

Клиенты и верификация

Регистрация клиента

POST /sbp/customers

Регистрирует покупателя под вашим идентификатором. Повторный вызов с тем же customerId второго клиента не создаёт: он обновит email и телефон и вернёт того же клиента. Нужно право sbp.create.

ПараметрТипОбяз.Описание
customerIdstringдаВаш идентификатор клиента, до 128 символов
emailstringдаEmail клиента
phonestringдаРоссийский мобильный номер, оформленный на самого клиента по его текущему паспорту: банк сверяет номер с паспортом, и с этого номера клиент будет платить

Телефон принимаем в любом виде: +7 999 123-45-67, 89991234567. Номер не российский или не мобильный — ответ 400 SBP_CUSTOMER_INVALID. Новый телефон начнёт действовать со следующего заказа.

curl -X POST 'https://b2b.lumowallet.io/sbp/customers' \
  -H 'X-API-Key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
    "customerId": "cust-8841",
    "email": "[email protected]",
    "phone": "+79991234567"
  }'
{
  "customerId": "cust-8841",
  "email": "[email protected]",
  "phone": "+79991234567",
  "kycStatus": "none",
  "kycReason": null,
  "kycTerminal": false,
  "canBuy": false,
  "verifiedAt": null,
  "createdAt": "2026-10-24T10:12:40.512Z"
}

Ссылка на верификацию

POST /sbp/customers/{customerId}/kyc

Возвращает verificationUrl. Откройте её клиенту в браузере или в WebView с доступом к камере, лучше с телефона. Понадобятся внутренний паспорт РФ и селфи.

ПараметрТипОбяз.Описание
callbackUrlstringнетКуда вернуть клиента после проверки, только https
curl -X POST 'https://b2b.lumowallet.io/sbp/customers/cust-8841/kyc' \
  -H 'X-API-Key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{ "callbackUrl": "https://example.com/kyc-done" }'
{
  "customerId": "cust-8841",
  "kycStatus": "verifying",
  "kycReason": null,
  "kycTerminal": false,
  "canBuy": false,
  "verificationUrl": "https://verify.didit.me/session/…",
  "…": "…"
}

Не храните ссылку, запрашивайте её каждый раз, когда клиент возвращается к проверке. Пока проверка не закончена, мы отдаём ту же сессию, и клиент продолжит с того места, где остановился.

verificationUrl: null означает, что открывать нечего: клиент уже верифицирован, его данные проверяет банк или он получил окончательный отказ. Смотрите на kycStatus.

Статус клиента

GET /sbp/customers/{customerId}

Тело то же, что при регистрации. Статус меняется сам, о каждом изменении приходит вебхук sbp.customer.kyc_updated.

kycStatusЧто происходит
noneПроверку не начинали, или сессия истекла (kycReason: didit_session_expired)
verifyingКлиент проходит проверку паспорта
submittingПаспорт проверен, передаём данные банку
provider_pendingБанк проверяет данные. Обычно это секунды, изредка дольше
verifiedМожно покупать, canBuy: true
rejectedОтказ, причина в kycReason

Показывайте кнопку покупки только при canBuy: true. Котировка неверифицированному клиенту вернёт 412 SBP_CUSTOMER_NOT_VERIFIED.

Отказы

kycTerminal подсказывает, что делать при rejected:

  • false — можно повторить: снова вызовите POST /sbp/customers/{customerId}/kyc. После didit_declined, passport_patronymic_missing и passport_unreadable придёт новая ссылка, число попыток ограничено, обычно три за неделю. После отказа банка (aura_…) паспорт и селфи заново не нужны: вызов просит банк перепроверить клиента, новый статус приходит сразу в ответе.
  • true — повтор не поможет. Решение принимает поддержка.
kycReasonОкончательныйЧто произошло
didit_declinedнетПроверка паспорта не пройдена: плохое фото, селфи не совпало и т. п.
passport_not_russian_passportдаДокумент не является внутренним паспортом РФ
passport_name_not_cyrillicдаВ паспорте не распознано ФИО кириллицей
passport_patronymic_missingнетОтчество не распознано, паспорт в банк не отправлен. Клиенту нужно пройти проверку заново, сфотографировав паспорт целиком и чётко
passport_unreadableнетДанные с разворота не совпали с машиночитаемой строкой внизу страницы или её не удалось прочитать, паспорт в банк не отправлен. Клиенту нужно пройти проверку заново: разворот целиком, ровно, без бликов на нижних строках
passport_already_usedдаПаспорт уже привязан к другому покупателю
passport_invalidдаБанк счёл паспорт недействительным
aura_…по kycTerminalОтказ банка, причина после префикса

Причины с префиксом aura_ приходят от банка как есть. Список может расширяться, поэтому опирайтесь на kycTerminal, а не на конкретное значение.

Частый исправимый отказ — PhoneNumberFailed в kycReason: банк не связал телефон с паспортом. Так бывает, если номер оформлен на другого человека или на старый паспорт клиента. Передайте номер, оформленный на клиента, через POST /sbp/customers (или пусть клиент обновит паспорт у своего оператора) и снова вызовите POST /sbp/customers/{customerId}/kyc.