Коротко
В Qut Pay действуют три разных ограничения, и их важно не путать:
- Месячный лимит счетов — сколько счетов разрешает ваш тариф. Закончился — приходит
tariff_limit_reached(HTTP 429). - Суточная защита — это не бизнес-лимит, а страховка от интеграции, ушедшей в цикл. Превышена — приходит
tariff_daily_burst(HTTP 429). - Частота запросов — сколько HTTP-запросов в секунду вы можете отправлять. Превышена —
rate_limitedилиrequest_rate_limited.
Процент с оборота не взимается: оплата сервиса — месячная подписка. Деньги приходят напрямую на ваш счёт в Kaspi.
Таблица тарифов
| Тариф | Цена в месяц | Счетов в месяц | Суточная защита |
|---|---|---|---|
| Пробный | 0 ₸ | — | 50 |
| Бастау | 4 990 ₸ | 800 | 200 |
| Бизнес | 14 900 ₸ | 4 000 | 1 500 |
| Про | 39 900 ₸ | 15 000 | 5 000 |
| Партнёрский | По договорённости | без лимита | — |
Тариф меняется в разделе Тариф в кабинете: https://qut.kz/app
Как считается месячный лимит
| Вопрос | Ответ |
|---|---|
| Какой период | Календарный месяц: с 1-го по последнее число |
| Часовой пояс | Время Алматы |
| Что считается | Счета, созданные в боевом режиме |
| Что не считается | Счета песочницы (созданные ключом qp_test_…) |
| Когда обнуляется | В первый день нового месяца |
Месячный лимит — это количество созданных счетов, а не оплаченных. Неоплаченный, истёкший или отменённый счёт тоже попадает в счётчик. Поэтому если код выставляет несколько счетов на один заказ, лимит закончится быстрее ожидаемого — включите идемпотентность.
При достижении лимита останавливается только создание новых счетов. Уже созданные продолжают работать: покупатель платит, вебхук приходит, возврат и чтение статуса тоже работают.
Суточная защита
Суточное число — не бизнес-лимит. Оно защищает от цикла в коде, от бесконечных повторов при обработке ошибок и от сломанной интеграции. Нормально работающий магазин до него не доходит: при месячном лимите 800 на тарифе Бастау суточные 200 — это 6 000 в месяц, то есть порог стоит намного выше реальных продаж.
Если вы видите tariff_daily_burst, проверяйте в первую очередь свой код, а не тариф: где-то повторяется цикл, где-то бесконечный retry в обработке ошибок, или на один заказ создаётся несколько счетов.
Разница между двумя ошибками
tariff_limit_reached | tariff_daily_burst | |
|---|---|---|
| HTTP | 429 | 429 |
| Значение | Закончился месячный лимит | Слишком много счетов за сутки |
| Причина | Бизнес вырос или создаются лишние счета | Обычно цикл в коде |
| Решение | Повысить тариф или дождаться нового месяца | Починить код |
| Когда пройдёт | В начале нового месяца | На следующие сутки |
| Поможет ли смена тарифа | Да, сразу | Косвенно: на старшем тарифе суточное число выше |
Есть и третья ошибка: tariff_inactive (HTTP 403) — тариф не оплачен или закончился пробный период. Это не лимит, а неактивная подписка.
Пробный период
| Что | Значение |
|---|---|
| Длительность | 7 дней |
| Счетов в сутки | 50 |
| Когда начинается | С первого боевого (live) счёта |
| Важна ли дата регистрации | Нет |
| Запускает ли пробный период песочница | Нет |
Значит, интеграцию можно писать в песочнице сколько угодно долго — семь дней начинают идти только тогда, когда вы принимаете первую настоящую оплату. Подробнее: Пробный период.
Песочница в лимит не входит
Песочница — режим с ключом qp_test_…. Запросы не уходят в Kaspi, настоящие деньги не движутся, оплату вы симулируете сами. Поэтому:
- счета песочницы не попадают в месячный лимит;
- счета песочницы не попадают в суточную защиту;
- как бы часто ни гоняли автотесты в песочнице, на боевой лимит это не влияет.
Разница режимов: Песочница и боевой режим.
Ограничения частоты запросов
Это не количество счетов, а количество HTTP-запросов. Точные значения меняются в зависимости от нагрузки, поэтому пишите код не по фиксированному числу, а по признакам в ответе.
| Код | HTTP | Что делать |
|---|---|---|
rate_limited | 429 | Подождать время из заголовка Retry-After и повторить |
request_rate_limited | 429 | Снизить частоту, уменьшить число параллельных потоков |
too_many_attempts | 429 | Слишком частый повтор одного действия, подождите минуту |
Правильная тактика — растущая пауза (backoff): 1, 2, 4, 8 секунд, с добавлением случайных сотен миллисекунд на каждом шаге. Повтор с постоянным интервалом только продлевает ограничение.
async function withRetry(fn, tries = 5) {
for (let i = 0; i < tries; i++) {
const res = await fn();
if (res.status !== 429) return res;
const wait = Number(res.headers.get('Retry-After')) || 2 ** i;
await new Promise((r) => setTimeout(r, wait * 1000 + Math.random() * 300));
}
throw new Error('rate limited');
}
Подробнее: Ограничения частоты запросов.
Что делать при приближении к лимиту
- Посмотрите текущее число за месяц в разделе Тариф в кабинете.
- Проверьте, нормальное ли это число: совпадает ли количество продаж с количеством счетов? Если разрыв большой — есть дубли.
- Есть дубли — включите идемпотентность, это заодно экономит лимит.
- Дублей нет, бизнес действительно вырос — повышайте тариф.
- Если объём выше 15 000 счетов в месяц, напишите в поддержку о партнёрском тарифе: WhatsApp +7 778 881 3333, Telegram @qutpaybot.
Вопросы и ответы
Если повысить тариф в середине месяца, лимит вырастет сразу? Да, месячный лимит и суточное число нового тарифа применяются с этого момента.
Неоплаченные счета входят в лимит? Да. Лимит считается по созданным счетам, а не по оплаченным.
У меня несколько организаций — лимиты складываются? Нет. У каждой организации свой тариф и свой лимит, они не переносятся между организациями.
Что происходит с уже созданными счетами при достижении лимита? Ничего. Покупатель платит, вебхук приходит, возврат работает. Не создаются только новые счета.
Можно ли отключить суточную защиту? Нет. Это ограничение защищает и вас, и ваших покупателей, если интеграция уйдёт в цикл.