Ваш клиент может купить саму карту за рубли по QR СБП. Цену карты в рублях задаёте вы. Клиент оплачивает её, купленные USDT целиком ложатся на баланс компании, и мы сразу выпускаем карту, как при POST /cards/request. Стоимость выпуска списывается с баланса, разница между ценой и стоимостью выпуска остаётся вам.
цена карты в настройках ──▶ POST /sbp/quotes (purpose: card_issue) ──▶ POST /sbp/orders (QR)
│
клиент платит ──▶ USDT на баланс компании
│
выпуск карты ──▶ card.assigned
│
webhook sbp.order.status_changed (cardIssueStatus, issuedCardId)Для выпуска за рубли у компании должны быть подключены покупка через СБП и программа карт. Клиент проходит ту же верификацию, что и при покупке USDT.
Цену задаёт владелец или участник с правом settings.write: в кабинете («Настройки» → «Выпуск карты за рубли») или запросом:
curl -X PATCH 'https://b2b.lumowallet.io/auth/company/profile' \
-H 'X-API-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{ "sbpCardPriceRub": "2500" }'sbpCardPriceRub — десятичная строка в рублях больше нуля, до 2 знаков. null выключает выпуск за рубли. Текущая цена приходит в GET /auth/company/profile в поле sbp.cardPriceRub.
Цена одна для всех клиентов компании. В запросе её не передают, поэтому клиент не может подменить сумму.
POST /sbp/quotes| Параметр | Тип | Обяз. | Описание |
|---|---|---|---|
customerId | string | да | Ваш идентификатор клиента |
purpose | string | да | card_issue |
amountRub, cardId и partnerFeeBps не передаются: сумма — цена карты, а ваш доход уже заложен в цену. С любым из них ответ — 400 VALIDATION_ERROR.
curl -X POST 'https://b2b.lumowallet.io/sbp/quotes' \
-H 'X-API-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{ "customerId": "cust-8841", "purpose": "card_issue" }'{
"quoteId": "5c2e8a1f-3b7d-4c9e-a1f0-6d4b2e8c7a13",
"customerId": "cust-8841",
"purpose": "card_issue",
"target": "balance",
"cardId": null,
"cardIssueUsdt": "25.00000000",
"amountRub": "2500.00",
"amountUsdt": "27.87780190",
"partnerFeeUsdt": "0.00000000",
"rate": "89.677085",
"expiresAt": "2026-11-02T18:02:00.000Z"
}amountUsdt— сколько ляжет на баланс компании после всех комиссий, по тому же курсу, что и покупка USDT.cardIssueUsdt— стоимость выпуска: комиссия за выпуск плюс обязательный первоначальный депозит, как в Выпуске карты. Спишется с баланса при выпуске.
В примере клиент платит 2 500 ₽, на баланс ложится 27,88 USDT, выпуск забирает 25 USDT, а 2,88 USDT остаются вам.
Если после комиссий USDT не хватает на выпуск, котировка ответит 400 SBP_CARD_PRICE_TOO_LOW, в details будут amountUsdt и cardIssueUsdt. Курс меняется, поэтому оставляйте запас в цене.
Заказ создаётся обычным POST /sbp/orders по quoteId, QR и статусы те же, что в разделе Котировка и заказ. После оплаты мы зачисляем USDT на баланс компании и сразу выпускаем карту. Исход виден в полях заказа и в вебхуке sbp.order.status_changed:
cardIssueStatus | Что это значит |
|---|---|
null | Выпуск ещё не запущен. При сбое связи мы повторим его сами и пришлём событие, когда выпуск пройдёт |
assigned | Карта выдана сразу, её id — issuedCardId |
pending | Свободной карты нет, заявка cardRequestId в очереди. Карта придёт вебхуком card.assigned с этим requestId |
failed | Выпуск не запустился (например, свободного баланса не хватило на резерв). USDT остаются на балансе компании, карту можно выпустить обычным POST /cards/request |
Карта получает externalId вида sbp-card-<id заказа>, поэтому её всегда можно найти запросом GET /cards?externalId=sbp-card-<id заказа>. Вебхук card.assigned приходит, как и при обычном выпуске.
{
"id": "9a7c3e1b-2d4f-4b6a-8c0e-1f3d5b7a9c2e",
"status": "completed",
"purpose": "card_issue",
"target": "balance",
"cardIssueUsdt": "25.00000000",
"amountRub": "2500.00",
"amountUsdt": "27.87780190",
"cardIssueStatus": "assigned",
"issuedCardId": "6f2b8d4a-1c3e-4a5b-9d7f-0e2c4a6b8d1f",
"cardRequestId": null
}В примере показаны только поля, важные для выпуска.
errorCode | HTTP | Что произошло |
|---|---|---|
SBP_CARD_PRICE_NOT_SET | 400 | Цена карты не задана (sbpCardPriceRub) |
SBP_CARD_PRICE_TOO_LOW | 400 | После комиссий USDT не хватает на выпуск карты |
VALIDATION_ERROR | 400 | Вместе с card_issue переданы amountRub, cardId или partnerFeeBps |
CARDS_NOT_ENABLED | 403 | Программа карт у компании не подключена |
Остальные ошибки котировки и заказа те же, что в разделе Котировка и заказ.