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

Подтверждение оплаты (Accept Order)

После создания котировки подтвердите её — это создаёт ордер и запускает платёж.

Endpoint

POST /orders/accept/{id}

Параметры

ПараметрРасположениеТипОбязательныйОписание
idpathuuidДаID котировки из /orders/prepare
Idempotency-KeyheaderstringНетКлюч идемпотентности

Нужно право orders.create.

Идемпотентность

Заголовок Idempotency-Key защищает от двойного подтверждения при повторе запроса:

curl -X POST 'https://b2b.lumowallet.io/orders/accept/550e8400-e29b-41d4-a716-446655440000' \
  -H 'X-API-Key: YOUR_API_KEY' \
  -H 'Idempotency-Key: accept-order-12345'
  • Повтор с тем же ключом возвращает ответ первого успешного запроса — ордер в том виде, каким он был при создании. Актуальный статус берите из GET /orders/{id} или вебхука.
  • Без ключа повтор вернёт 404 QUOTE_NOT_FOUND: котировка расходуется при первом подтверждении.
  • Ключ действует в рамках компании и не привязан к котировке: если передать тот же ключ с другой котировкой, вернётся первый ордер. Делайте ключ уникальным для каждой котировки, например accept-{quoteId}.

Рекомендация: всегда передавайте Idempotency-Key на продакшене.

Пример ответа

{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "amountUsdt": 52.63,
  "amountRub": 5000,
  "status": "created",
  "paymentType": "nspk",
  "paymentUntil": "2026-03-10T12:01:00.000Z",
  "merchantName": "ООО Кофейня",
  "externalOrderId": "order-12345",
  "createdAt": "2026-03-10T12:00:00.000Z"
}

Ответ — 201.

Поля ответа

ПолеТипОписание
iduuidID ордера — совпадает с ID котировки
amountUsdtnumberСумма в USDT
amountRubnumberСумма в рублях
statusstringТекущий статус. Сразу после accept — created
paymentTypestringnspk, st00012 или gibdd_uin — как в котировке
paymentUntildatetimeСрок, до которого платёж должен завершиться: 60 секунд после accept для nspk, 4 минуты для st00012 и gibdd_uin, от 50 000 ₽ на 10 секунд больше
merchantNamestringНазвание получателя, если известно
externalOrderIdstringВаш ID из котировки, если передавали
completedAtdatetimeВремя завершения — появляется у завершённого ордера
failureReasonstringПричина неудачи или спора; до завершения — null. После спора у ордера в success может остаться прежнее значение — ориентируйтесь на status
createdAtdatetimeВремя создания

Что происходит после accept

  1. Заморозка средств — amountUsdt переходит во frozenBalance, в доступном балансе их больше нет.
  2. Передача в оплату — ордер уходит исполнителю.
  3. in_progress — исполнитель взял ордер.
  4. Финал — success (сумма списана с баланса) или failed (заморозка снята). Приходит вебхук order.status_changed.

Срок оплаты

Срок оплаты зависит от типа платежа, точное время приходит в paymentUntil:

paymentTypeСрок после accept
nspk60 секунд
st00012, gibdd_uin4 минуты

От 50 000 ₽ срок на 10 секунд больше. Если к этому моменту ордер не завершился и спор по нему не открыт, он переводится в failed с failureReason: "Order expired", заморозка снимается и приходит вебхук. Если оплата всё же прошла позже, ордер перейдёт из failed в success и сумма спишется с баланса — см. Жизненный цикл ордера.

Все переходы — в разделе Жизненный цикл ордера.

Ошибки

HTTPerrorCodeОписание
400BAD_REQUESTid — не UUID (Validation failed (uuid is expected))
400QUOTE_EXPIREDКотировка истекла (TTL 30 секунд) — создайте новую
400INSUFFICIENT_BALANCEДоступного баланса меньше amountUsdt
401AUTH_REQUIRED / INVALID_API_KEYНет ключа или ключ неверный
403PERMISSION_DENIEDУ ключа нет права orders.create
404QUOTE_NOT_FOUNDКотировки нет: id неверный, она уже подтверждена или удалена после истечения
500INTERNAL_ERRORПлатёжный сервис недоступен. Ордер не создан, средства не заморожены — можно повторить, пока котировка не истекла
502WALLET_BACKEND_ERRORПлатёжный сервис не принял ордер. Средства не заморожены, котировка не израсходована — можно повторить, пока она не истекла. Если ошибка повторяется, платёж этому получателю не принимается

Пример полного flow

# 1. Создаём котировку
QUOTE=$(curl -s -X POST 'https://b2b.lumowallet.io/orders/prepare' \
  -H 'X-API-Key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"qrCode": "https://qr.nspk.ru/..."}')

QUOTE_ID=$(echo $QUOTE | jq -r '.id')

# 2. Подтверждаем
curl -X POST "https://b2b.lumowallet.io/orders/accept/$QUOTE_ID" \
  -H 'X-API-Key: YOUR_API_KEY' \
  -H "Idempotency-Key: accept-$QUOTE_ID"

Что дальше?