API Reference v1
Создание счёта
Создаёт счёт на оплату и возвращает ссылку на платёжную страницу и реквизиты.
POSTapp.ketmus.com/api/merchant/v1/invoices
Создаёт новый счёт. Если передан rail, адрес для оплаты выдаётся сразу и его можно показать в своём интерфейсе. Без rail клиент выберет монету на платёжной странице pay_url.
Параметры
amountnumber | stringобязательный- Сумма счёта в валюте
currency. Больше 0, не более 1 000 000 000. currencystring- Валюта цены:
USD,USDT,EUR,RUB,UAH,KZT,TRY,GBP. По умолчаниюUSD. order_idstring- Ваш номер заказа, до 64 символов. По нему можно найти счёт и избежать дубликатов.
descriptionstring- Описание, которое увидит клиент на платёжной странице. До 300 символов.
metadataobject- Произвольные данные (например,
user_id). Возвращаются в ответах и вебхуках. railstring- Сразу выбрать монету и сеть, например
usdt_tron. Список — в Монеты и сети. railsstring[]- Ограничить список монет, из которых выбирает клиент.
lifetime_secinteger- Время жизни счёта в секундах: от 300 (5 минут) до 86 400 (24 часа). По умолчанию — из настроек магазина (обычно 3600).
fee_payerstring- Кто платит комиссию:
merchantилиpayer. По умолчанию — из настроек магазина. underpaid_coverage_bpsinteger- Допустимая недоплата в базисных пунктах (0–5000), при которой счёт всё равно считается оплаченным.
callback_urlstring- URL для вебхуков этого счёта. Если не передан — используется URL из настроек магазина.
return_urlstring- Куда вернуть клиента по кнопке «Вернуться в магазин».
success_urlstring- Куда перенаправить клиента после успешной оплаты.
fail_urlstring- Куда перенаправить клиента, если счёт истёк или отменён.
payer_emailstring- Email клиента для чека и связи.
customer_idstring- Ваш идентификатор клиента, до 120 символов.
Неизвестные параметры отклоняются с ошибкой 400 invalid — это защищает от опечаток в названиях полей.
Пример запроса
curl -X POST "https://app.ketmus.com/api/merchant/v1/invoices" \
-H "Authorization: Bearer $KETMUS_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"amount": 25,
"currency": "USD",
"order_id": "ORDER-1042",
"description": "Подписка Pro на 1 месяц",
"rail": "usdt_tron",
"metadata": {
"user_id": "u_731"
},
"callback_url": "https://shop.example.com/webhooks/ketmus",
"success_url": "https://shop.example.com/orders/1042?paid=1",
"fail_url": "https://shop.example.com/orders/1042?failed=1"
}'Ответ
HTTP 201 Created. Объект счёта содержит также available_rails — монеты, которыми можно оплатить этот счёт.
{
"invoice": {
"type": "invoice",
"id": "8f0c6a52-3f7e-4b8e-9d61-2c4b0f8a1e7d",
"order_id": "ORDER-1042",
"status": "pending",
"is_final": false,
"late_payment": false,
"price": {
"amount": "25",
"currency": "USD"
},
"payment": {
"rail": "usdt_tron",
"asset": "USDT",
"network": "tron",
"address": "TQ7nX4yVh3cE9v5G2kRZb8aWm1pLd6sFJt",
"memo": null,
"amount_due": "25.31",
"amount_received": "0",
"amount_confirmed": "0",
"late_amount": "0",
"rate": "1",
"txids": []
},
"fee": {
"bps": 125,
"payer": "payer",
"amount": "0",
"merchant_amount": "0"
},
"pay_url": "https://app.ketmus.com/checkout/inv_5Kq2ZtR8wLmA",
"metadata": {
"user_id": "u_731"
},
"created_at": "2026-11-03T10:15:00.000Z",
"expires_at": "2026-11-03T11:15:00.000Z",
"paid_at": null,
"public_id": "inv_5Kq2ZtR8wLmA",
"description": "Подписка Pro на 1 месяц",
"lifetime_sec": 3600,
"underpaid_coverage_bps": 0,
"refresh_count": 0,
"return_url": "https://shop.example.com/orders/1042",
"success_url": "https://shop.example.com/orders/1042?paid=1",
"fail_url": "https://shop.example.com/orders/1042?failed=1",
"payer_email": null,
"customer_id": null,
"payment_uri": null,
"explorer_address_url": "https://tronscan.org/#/address/TQ7nX4yVh3cE9v5G2kRZb8aWm1pLd6sFJt",
"available_rails": [
{
"id": "usdt_tron",
"asset": "USDT",
"network": "tron",
"label": "USDT",
"network_label": "Tron (TRC-20)",
"icon": "/coins/tether.svg",
"confirmations": 20
},
{
"id": "ton",
"asset": "TON",
"network": "ton",
"label": "Toncoin",
"network_label": "TON",
"icon": "/coins/toncoin.svg",
"confirmations": 1
}
]
}
}Счёт без выбранной монеты
Если rail не передан, поле payment равно null, а статус — new. Адрес появится, когда клиент выберет монету на pay_url:
{
"invoice": {
"type": "invoice",
"id": "8f0c6a52-3f7e-4b8e-9d61-2c4b0f8a1e7d",
"order_id": "ORDER-1042",
"status": "new",
"is_final": false,
"late_payment": false,
"price": {
"amount": "25",
"currency": "USD"
},
"fee": null,
"pay_url": "https://app.ketmus.com/checkout/inv_5Kq2ZtR8wLmA",
"metadata": {
"user_id": "u_731"
},
"created_at": "2026-11-03T10:15:00.000Z",
"expires_at": "2026-11-03T11:15:00.000Z",
"paid_at": null,
"public_id": "inv_5Kq2ZtR8wLmA",
"description": "Подписка Pro на 1 месяц",
"lifetime_sec": 3600,
"underpaid_coverage_bps": 0,
"refresh_count": 0,
"return_url": "https://shop.example.com/orders/1042",
"success_url": "https://shop.example.com/orders/1042?paid=1",
"fail_url": "https://shop.example.com/orders/1042?failed=1",
"payer_email": null,
"customer_id": null,
"payment_uri": null,
"explorer_address_url": null,
"payment": null
}
}Поля объекта счёта
idstring- Идентификатор счёта (UUID). Используйте в запросах к API.
public_idstring- Публичный идентификатор для ссылки на оплату.
statusstring- Текущий статус. → Статусы счёта
is_finalbooleantrue, если статус окончательный и больше не изменится.priceobject- Цена счёта:
amountиcurrency. paymentobject | null- Реквизиты и суммы в выбранной монете.
null, пока монета не выбрана. payment.addressstring- Адрес, на который нужно отправить перевод.
payment.memostring | null- Memo или destination tag (для XRP). Без него платёж не будет зачислен.
payment.amount_duestring- Сумма к оплате в монете, включая комиссию, если её платит клиент.
payment.amount_receivedstring- Сколько уже пришло, включая неподтверждённые транзакции.
payment.amount_confirmedstring- Сколько пришло с нужным числом подтверждений.
payment.txidsstring[]- Хеши транзакций по счёту.
feeobject | null- Комиссия:
bps,payer,amountиmerchant_amount— сумма к зачислению магазину. pay_urlstring- Ссылка на платёжную страницу Ketmus. Именно её отправляйте покупателю — для любой монеты и для СБП.
payment_uristring | null- URI для QR-кода в вашем собственном интерфейсе (
bitcoin:,ton:,ethereum:и т. д.). Для СБП — прямая ссылка банкаhttps://qr.nspk.ru/…: не отправляйте её покупателю вместоpay_url. sbpobject- Только для СБП:
amount_rub— точная сумма в рублях,pay_until— до какого времени действует QR-код. expires_atstring- Когда истекает счёт (ISO 8601, UTC).
paid_atstring | null- Когда счёт был оплачен.