Qut Pay Сайт Кабинет База знаний Инструкции Документация API ҚАЗРУС
ГлавнаяБаза знаний → Справочник

Создание счёта: все поля

Обновлено: 2026-09-14 · Версия в Markdown

Коротко

Создание счёта — это один запрос:

POST https://api.qut.kz/api/v1/invoices
X-API-Key: qp_live_…
Content-Type: application/json

В ответе приходит статус 201 и payUrl — отправьте покупателя по этому адресу. Обязательное поле всего одно: amount.

Старый путь POST /api/v1/orders тоже принимается, это алиас того же эндпоинта.

Поля запроса

ПолеТипОбязательноОписание
amountnumberТенге. В QR-счёте не более 2 знаков после запятой, в счёте по телефону — целое
kindqr \phoneqr — по умолчанию: QR-код и ссылка. phone — push в приложение Kaspi покупателя
descriptionstringВидит покупатель. QR — 100 символов, phone — 60
externalOrderIdstringВаш номер заказа. Возвращается в вебхуке
customer.namestringИмя покупателя
customer.phonestring✅ для kind: phoneВ формате 7XXXXXXXXXX, 11 цифр
customer.emailstringЕсли указан, покупателю может уйти письмо с чеком
successUrlurlКуда вернуть покупателя после успешной оплаты. Только http(s)
failUrlurlКуда вернуть, если оплата не прошла. Только http(s)
metadataobjectЛюбой JSON. Хранится без изменений и возвращается в вебхуке

Заголовки:

ЗаголовокОбязателенЗачем
X-API-Keyqp_live_… или qp_test_…
Content-Type: application/jsonТело в JSON
Idempotency-KeyЗащита от дублей, см. ниже

Если передать Idempotency-Key, повторный запрос с тем же ключом не создаст новый счёт: вернётся прежний, с HTTP 200 и полем idempotentReplay: true. Подробнее: Идемпотентность.

Разница между qr и phone

qrphone
Что видит покупательQR-код или ссылку на оплатуPush-счёт в приложении Kaspi
customer.phoneНе обязателенОбязателен
СуммаДо 2 знаков после запятойТолько целые тенге
description100 символов60 символов
Когда удобноСайт, офлайн-точка, экранПродажа по телефону, удалённо

Полное сравнение: QR-счёт или счёт по телефону.

Ответ

HTTP 201 и тело такого вида:

ПолеЧто это
idИдентификатор счёта, inv_…
statusПри создании pending
payUrlСтраница оплаты, сюда отправляйте покупателя
qrUrlСодержимое QR-кода
deepLinkСсылка, открывающая приложение Kaspi
qrImageUrlКартинка QR, можно вывести на своей странице
expiresAtПосле этого времени счёт недействителен

Окно сканирования QR — примерно три минуты, его задаёт Kaspi. Не зашивайте это число в код: всегда берите expiresAt из ответа.

Пример на curl

curl -X POST https://api.qut.kz/api/v1/invoices \
  -H 'X-API-Key: qp_live_…' \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: order-1001' \
  -d '{
    "amount": 2500,
    "kind": "qr",
    "description": "Заказ №1001",
    "externalOrderId": "1001",
    "customer": { "name": "Айгуль", "phone": "77010000000" },
    "successUrl": "https://site.kz/ok",
    "failUrl": "https://site.kz/fail",
    "metadata": { "branch": "almaty-1", "cart": 17 }
  }'

Пример на Node

const res = await fetch('https://api.qut.kz/api/v1/invoices', {
  method: 'POST',
  headers: {
    'X-API-Key': process.env.QUTPAY_API_KEY,
    'Content-Type': 'application/json',
    'Idempotency-Key': `order-${order.id}`,
  },
  body: JSON.stringify({
    amount: order.total,
    kind: 'qr',
    description: `Заказ №${order.id}`,
    externalOrderId: String(order.id),
    successUrl: 'https://site.kz/ok',
    metadata: { orderId: order.id },
  }),
});

if (!res.ok) {
  const err = await res.json();
  console.error('qutpay', res.status, err.error, err.message);
  throw new Error(err.error);
}

const invoice = await res.json();
redirect(invoice.payUrl);

При ошибке смотрите на код в поле error, а не на текст message: текст может измениться, код — нет.

Алиас /orders

Для старых интеграций сохранён путь POST /api/v1/orders. Там дополнительно принимаются поля merchantRef (то же, что externalOrderId) и method: "invoice". Если пишете новый код, используйте /api/v1/invoices.

Частые ошибки

КодHTTPЧто случилосьРешение
invalid_amount422Суммы нет или это не числоПередайте положительное число
amount_must_be_whole_tenge422Переданы тиыныПередайте целые тенге
amount_too_small / amount_too_large422Сумма вне допустимого диапазонаИсправьте сумму
invalid_phone422Неверный формат телефона7XXXXXXXXXX, 11 цифр, без + и пробелов
phone_required422kind: phone, но телефона нетДобавьте customer.phone
invalid_kind422Неизвестный типqr или phone
invalid_url422Неверный successUrl/failUrlУкажите полный http(s)-адрес
unauthorized401Ключ не передан или недействителенПроверьте заголовок X-API-Key
insufficient_scope403У ключа нет invoices:writeДобавьте право в кабинете
kaspi_session_expired409Привязка кассира оборваласьПереподключите кассира
tariff_limit_reached429Закончился месячный лимитТарифы и лимиты
invoice_create_failed502Kaspi не принял счётПовторите с растущей паузой

Полный список: Каталог ошибок.

Пограничные случаи

Вопросы и ответы

Чем payUrl отличается от deepLink? payUrl — страница оплаты в браузере, работает на любом устройстве. deepLink открывает приложение Kaspi напрямую, удобен на телефоне.

Как узнать статус счёта? Через вебхук или запросом GET /api/v1/invoices/{id}. Что когда: Вебхук или опрос статуса.

Что можно класть в metadata? Любой JSON: номер точки, идентификатор корзины, номер ячейки. Он возвращается и в вебхуке, и в ответе на запрос статуса.

Можно изменить сумму уже созданного счёта? Нет. Отмените счёт и создайте новый.

В песочнице те же поля? Да, полностью. Разница только в том, что Kaspi не вызывается и оплату вы симулируете сами.

Связанные статьи

QR-счёт или счёт по телефону — что выбратьПолное сравнение двух типов счёта: значение kind, что делает покупатель, нужен ли номер, ограничения описания и суммы, срок жизни и таблица сценариев с рекомендацией по каждому.Идемпотентность: защита от дублейКак работает заголовок Idempotency-Key, как правильно составить ключ, какова роль externalOrderId, и как защититься от повторов при обработке вебхуков и при возвратах.Жизненный цикл счётаВсе статусы счёта и переходы между ними, какое событие вебхука приходит в какой момент, какие статусы считаются открытыми и оплаченными, и как обработать поздно пришедшую оплату.Массовое создание счетов — до 100 счетов в одном запросеМетод POST /api/v1/invoices/bulk: от 1 до 100 элементов за запрос, каждый проверяется отдельно, структура ответа, обработка ошибок поэлементно, идемпотентность и влияние на лимиты тарифа.Каталог ошибок — что возвращает API и что делатьВсе основные коды ошибок Qut Pay API по группам: авторизация, привязка Kaspi, счета, возвраты, лимиты тарифа, вебхуки, подписки. Причина и решение для каждой.

Остались вопросы? WhatsApp +77788813333 · kazprose@gmail.com
Написать можно и из кабинета: Поддержка.

Qut Pay — независимый сервис, не аффилирован с АО «Kaspi Bank». Kaspi и Kaspi Pay — товарные знаки их правообладателя.