Счета
Счёт — это запрос на оплату: сумма, монета и описание. Покупатель оплачивает его по ссылке 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
}| Поле | Тип | Описание |
|---|---|---|
id | string | Идентификатор счёта |
status | string | active → paid · expired · cancelled. Конечные статусы не меняются. |
amount | string | Сумма к оплате |
asset | string | Монета: USDT, BTC, ETH, GRAM (TON), TRX, BNB |
fiat · fiat_amount | string|null | Для счёта в валюте: валюта и сумма, которую вы просили ("RUB", "500"). У счёта в монете — null |
description | string|null | Видит покупатель |
order_id | string|null | Ваш номер заказа |
payload | string|null | Ваши данные — покупатель их не видит |
pay_url | string | Ссылка на оплату в Telegram |
success_url | string|null | Куда вернуть покупателя после оплаты |
created_at · expires_at · paid_at | string|null | Время в UTC |
Создать счёт
/v1/invoices| Параметр | Тип | Описание |
|---|---|---|
amountобяз. | string | Сумма, например "12.50" |
assetобяз. | string | Монета (список — GET /v1/currencies) |
order_id | string ≤128 | Номер заказа; уникален в приложении. Защищает от дублей |
description | string ≤1024 | Что покупают — видно покупателю |
payload | string ≤4096 | Ваши данные (id пользователя, корзина…) |
expires_in | integer | Сколько секунд счёт действует: от 60 до 604800. По умолчанию 3600 |
success_url | https URL | После оплаты у покупателя появится кнопка «Вернуться в магазин» |
fiat | string | Счёт в валюте: 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)
const invoice = await pay.invoices.create({ amount: "12.50", asset: "USDT", orderId: "1001", description: "Заказ #1001", expiresIn: 1800 });
$invoice = $pay->invoices->create(['amount' => '12.50', 'asset' => 'USDT', 'order_id' => '1001', 'description' => 'Заказ #1001', 'expires_in' => 1800]);
curl https://kivix.cc/v1/invoices -H "Authorization: Bearer $KIVIX_PAY_KEY" \
-H "Content-Type: application/json" \
-d '{"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 минут).
Список счетов
/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)
for await (const invoice of pay.invoices.iterate({ status: "paid" })) { console.log(invoice.order_id, invoice.amount); }
foreach ($pay->invoices->iterate('paid') as $invoice) { echo $invoice['order_id'], ' ', $invoice['amount'], PHP_EOL; }
curl "https://kivix.cc/v1/invoices?status=paid&limit=50" -H "Authorization: Bearer $KIVIX_PAY_KEY"
Получить счёт
/v1/invoices/{id}Найти по номеру заказа — GET /v1/invoices?order_id=1001 (в SDK: find_by_order / findByOrder).
Отменить счёт
/v1/invoices/{id}/cancelТолько пока он active. Оплаченный счёт отменить нельзя — вернётся 409 invoice_not_cancellable.
Приложение и баланс
/v1/me— название, статус, статистика оплат/v1/balance— сколько накопилось по монетам/v1/currencies— монеты, точность и лимиты (без ключа)Вывести накопленное на свой кошелёк — в боте: Kivix Pay → приложение → 💰 Вывести на кошелёк.