Ваш клиент платит рубли по QR СБП из приложения своего банка, а вы получаете USDT на карту клиента или на баланс компании. Вся цепочка идёт через наш API: верификация клиента, курс, выпуск QR и зачисление.
POST /sbp/customers ──▶ POST /sbp/customers/{id}/kyc ──▶ клиент проходит проверку паспорта
│
webhook sbp.customer.kyc_updated (canBuy: true)
│
POST /sbp/quotes ──▶ POST /sbp/orders (QR) ──▶ клиент платит ──▶ USDT на карте / балансе
│
webhook sbp.order.status_changed (status: completed)Каждый покупатель проходит верификацию. Купить можно только после проверки внутреннего паспорта РФ. Ссылку на проверку выдаём мы, клиент проходит её один раз с телефона: фото паспорта и селфи. Результат приходит вебхуком.
Один паспорт — один покупатель. Паспорт, уже привязанный к другому покупателю, проверку не пройдёт.
Платить нужно с телефона, указанного при регистрации. Банк привязывает QR к номеру клиента и отклоняет оплату с другого номера. Если клиент платит с чужого телефона, оплата не пройдёт.
Цена окончательная до оплаты. Котировка (POST /sbp/quotes) уже показывает, сколько USDT получит клиент. Все комиссии, включая пополнение карты, сидят внутри amountUsdt и rate, отдельных строк с комиссией нет. Если курс на рынке изменится, пока клиент платит, вы всё равно получите сумму из котировки.
Свою наценку ставите вы. Передайте её в котировке (partnerFeeBps), она удержится из купленного и останется на балансе компании. Подробнее — в разделе Ваша наценка.
Можно продавать и саму карту. Задайте цену карты в рублях, клиент оплатит её по QR, и мы выпустим карту сразу после оплаты. Подробнее — в разделе Выпуск карты за рубли.
Зачисляем один раз и только после оплаты. Пока заказ не стал completed, ничего не зачислено и ничего не списано.
Покупка подключается отдельно и по умолчанию выключена. Если запросы к /sbp/* отвечают 403 SBP_BUY_NOT_ENABLED, напишите менеджеру.
Ключу нужны права sbp.read (чтение) и sbp.create (регистрация клиентов, котировки и заказы). Подробнее — в разделе Команда и права.
Куда идут купленные USDT, задаётся при подключении:
| Режим | Что это значит |
|---|---|
| Только на карту | В котировке обязателен cardId, USDT сразу пополняют карту |
| На карту или на баланс | Без cardId USDT ложатся на баланс компании |
Для зачисления на карту у компании должна быть подключена программа карт.
GET /sbp/ratecurl 'https://b2b.lumowallet.io/sbp/rate' -H 'X-API-Key: YOUR_API_KEY'{
"rate": "86.467005",
"minAmountRub": "5000",
"maxAmountRub": "50000",
"minFeeRub": "100.00",
"quotedAt": "2026-10-24T10:15:02.114Z"
}rate здесь ориентировочный: сколько рублей стоит 1 USDT на баланс компании. Для витрины этого достаточно, но окончательную цену даёт только котировка: в ней учтены комиссия пополнения карты и ваша наценка.
minFeeRub — наша комиссия с одного заказа не бывает меньше этой суммы в рублях. Поэтому на малых суммах курс хуже rate, точную сумму покажет котировка.
Границы суммы меняются вместе с лимитами банка, поэтому читайте их из GET /sbp/rate и не зашивайте в код.
У банка есть и лимиты на самого покупателя: сколько QR он может выпустить и оплатить за сутки, на какую сумму за сутки и за месяц. Мы заранее эти лимиты не отдаём. При превышении создание заказа отвечает 429 SBP_LIMIT_EXCEEDED, причина в details.providerCode.
Брошенные QR вредят клиенту. Несколько неоплаченных QR подряд банк считает подозрительными и может временно запретить покупки. Если клиент передумал, отменяйте заказ (POST /sbp/orders/{id}/cancel), а не ждите, пока он истечёт.