Открыть бота

Счета

Счёт — это запрос на оплату: сумма, монета и описание. Покупатель оплачивает его по ссылке pay_url.

Объект счёта

{
  "id": "7Hq2pXbV9kLmN3sT1a",
  "object": "invoice",
  "status": "active",
  "amount": "12.5",
  "asset": "USDT",
  "description": "Заказ #1001",
  "order_id": "1001",
  "payload": null,
  "pay_url": "https://t.me/kivixapp?start=invoice_7Hq2pXbV9kLmN3sT1a",
  "success_url": "https://shop.example/thanks",
  "created_at": "2026-10-26T12:30:00Z",
  "expires_at": "2026-10-26T13:30:00Z",
  "paid_at": null
}
ПолеТипОписание
idstringИдентификатор счёта
statusstringactive → paid · expired · cancelled. Конечные статусы не меняются.
amountstringСумма к оплате
assetstringМонета: USDT, BTC, ETH, GRAM (TON), TRX, BNB
fiat · fiat_amountstring|nullДля счёта в валюте: валюта и сумма, которую вы просили ("RUB", "500"). У счёта в монете — null
descriptionstring|nullВидит покупатель
order_idstring|nullВаш номер заказа
payloadstring|nullВаши данные — покупатель их не видит
pay_urlstringСсылка на оплату в Telegram
success_urlstring|nullКуда вернуть покупателя после оплаты
created_at · expires_at · paid_atstring|nullВремя в UTC

Создать счёт

POST/v1/invoices
ПараметрТипОписание
amountобяз.stringСумма, например "12.50"
assetобяз.stringМонета (список — GET /v1/currencies)
order_idstring ≤128Номер заказа; уникален в приложении. Защищает от дублей
descriptionstring ≤1024Что покупают — видно покупателю
payloadstring ≤4096Ваши данные (id пользователя, корзина…)
expires_inintegerСколько секунд счёт действует: от 60 до 604800. По умолчанию 3600
success_urlhttps URLПосле оплаты у покупателя появится кнопка «Вернуться в магазин»
fiatstringСчёт в валюте: USD, RUB, EUR, UAH, KZT. Тогда amount — сумма в этой валюте (до 2 знаков), а покупатель платит эквивалент в asset

Ответ: 201 Created и объект счёта. Повтор с тем же order_id — 200 OK и тот же счёт.

Счёт в валюте

Передайте fiat — и укажите цену так, как она стоит у вас в магазине: {"amount": "500", "fiat": "RUB", "asset": "USDT"}. Kivix пересчитает её в монету по курсу в момент создания счёта и округлит вверх до точности монеты — вы получите не меньше запрошенного. Сумма в монете дальше не меняется, сколько бы ни прошло времени. В ответе — amount в монете и fiat / fiat_amount как вы просили. Повтор с тем же order_id сверяется по валютной сумме: курс за это время мог измениться, а счёт останется тем же. Если курс временно недоступен — 503 rate_unavailable, повторите через минуту.

invoice = pay.invoices.create(amount="12.50", asset="USDT", order_id="1001",
                              description="Заказ #1001", expires_in=1800)

Как покупатель оплачивает счёт

Покупатель открывает pay_url в Telegram и выбирает способ: из кошелька Kivix, через @CryptoBot, @xRocket, рублями по СБП или переводом криптовалюты на свой адрес Kivix. Для вас разницы нет: счёт всегда оплачивается одинаково — ровно на amount в asset, деньги приходят на баланс приложения, вы получаете событие invoice.paid. Комиссии провайдеров платит покупатель.

Если счёт истёк, пока покупатель платил провайдеру или переводил, деньги остаются у покупателя на балансе Kivix — счёт не оплачивается задним числом. Поэтому ставьте expires_in с запасом, если ждёте оплату переводом (сеть Bitcoin — до 30 минут).

Список счетов

GET/v1/invoices

Новые первыми. Фильтры: status, order_id; limit 1–100 (по умолчанию 20); starting_after — курсор.

for invoice in pay.invoices.iterate(status="paid"):   # страницы подгружаются сами
    print(invoice.order_id, invoice.amount)

Получить счёт

GET/v1/invoices/{id}

Найти по номеру заказа — GET /v1/invoices?order_id=1001 (в SDK: find_by_order / findByOrder).

Отменить счёт

POST/v1/invoices/{id}/cancel

Только пока он active. Оплаченный счёт отменить нельзя — вернётся 409 invoice_not_cancellable.

Приложение и баланс

GET/v1/me— название, статус, статистика оплат
GET/v1/balance— сколько накопилось по монетам
GET/v1/currencies— монеты, точность и лимиты (без ключа)

Вывести накопленное на свой кошелёк — в боте: Kivix Pay → приложение → 💰 Вывести на кошелёк.