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

Выпуск карты за рубли

Ваш клиент может купить саму карту за рубли по 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
ПараметрТипОбяз.Описание
customerIdstringдаВаш идентификатор клиента
purposestringда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
}

В примере показаны только поля, важные для выпуска.

Ошибки

errorCodeHTTPЧто произошло
SBP_CARD_PRICE_NOT_SET400Цена карты не задана (sbpCardPriceRub)
SBP_CARD_PRICE_TOO_LOW400После комиссий USDT не хватает на выпуск карты
VALIDATION_ERROR400Вместе с card_issue переданы amountRub, cardId или partnerFeeBps
CARDS_NOT_ENABLED403Программа карт у компании не подключена

Остальные ошибки котировки и заказа те же, что в разделе Котировка и заказ.