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

API-ключи — создание, хранение, ротация

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

Коротко

API-ключ — секретная строка, которая передаётся в заголовке X-API-Key. По нему API узнаёт вашу организацию.

POST /api/v1/invoices
X-API-Key: qp_live_a1b2c3d4…

Ключи бывают двух видов: qp_live_… работает с настоящими деньгами, qp_test_… — в песочнице. Ключ создаётся в кабинете и показывается только один раз — если не скопировали сразу, посмотреть его заново нельзя, придётся создавать новый.

Главное правило: ключ должен жить только на сервере.

Виды ключей

ПрефиксРежимЧто происходит
qp_test_ПесочницаKaspi не вызывается, настоящих денег нет, оплату вы симулируете сами
qp_live_БоевойНастоящий Kaspi QR, настоящие деньги, нужен кассир Kaspi

Режимы не смешиваются: ключом песочницы боевые счета не увидеть, и наоборот. Путаница с режимом — самая частая причина «у меня всё работало, а в проде перестало»: Чем песочница отличается от боевого режима.

При неверном формате ключа приходит invalid_api_key, при недействительном или удалённом — unauthorized: API отвечает 401.

Создание

Кабинет → Интеграции → API-ключи → создать ключ. При создании вы решаете три вещи:

ЧтоПояснение
НазваниеДля себя: «Сайт», «Telegram-бот», «1С». Потом по нему поймёте, кто что делает
Права (scopes)Включайте только нужные: Права доступа (scopes)
КассирПри желании ключ привязывается к конкретному кассиру

Ключ показывается на экране один раз. Скопируйте его тут же и сразу положите в хранилище секретов или в .env на сервере. Дальше в кабинете видно только название и последние символы.

Где хранить

МестоМожно
Файл .env на сервереДа
Секреты хостинга или CIДа
Хранилище секретов вроде VaultДа
JavaScript, выполняемый в браузереНет
Внутри мобильного приложения (APK/IPA)Нет
Публичный репозиторий, история gitНет
Скриншот, чат, трекер задачНет
Строка прямо в кодеНет

Причина простая: ключ, попавший в браузер или в приложение, может достать любой желающий. В мобильном приложении порядок должен быть таким: приложение → ваш сервер → Qut Pay → Kaspi.

Не забудьте добавить .env в .gitignore, а в коде читать переменную окружения:

// правильно
const KEY = process.env.QUTPAY_API_KEY;

// неправильно — ключ уедет в репозиторий вместе с кодом
const KEY = 'qp_live_a1b2c3d4e5f6';

Если ключ всё-таки утёк, первое действие — немедленно удалить его, и только потом создавать новый.

Отдельный ключ на каждую интеграцию

Один ключ на все системы выглядит удобно, но это плохая идея. Заведите отдельный ключ на каждую интеграцию:

ПлюсЧто даёт
ВидимостьВ журнале видно, какая система какой счёт создала
ИзоляцияУтёк один — удаляете только его, остальное продолжает работать
Минимум правБоту только invoices:write, системе отчётности только invoices:read
ОтчётностьРаздельный учёт по точкам или проектам

Пример разделения:

Сайт             → invoices:write, invoices:read
Telegram-бот     → invoices:write, invoices:read
Отчётность       → invoices:read
Панель возвратов → invoices:read, refunds:write

Привязка к кассиру

Ключ можно привязать к конкретному кассиру Kaspi. Тогда:

Если в организации несколько точек или несколько проектов, это самый чистый способ их разделить: Можно ли подключить несколько кассиров.

Кассира, к которому привязан ключ, удалить нельзя: сначала переназначьте ключ на другого кассира, иначе придёт connection_has_keys.

Счета песочницы к кассиру не привязываются — это общие тестовые данные организации.

Ротация без простоя

Ключ полезно периодически менять: уволился разработчик, ключ где-то засветился или просто пришло время по плану.

Порядок замены без остановки сервиса:

  1. Создайте новый ключ. Старый пока не удаляйте — они спокойно работают параллельно.
  2. Выдайте новому те же права и того же кассира.
  3. Замените переменную окружения на сервере и перезапустите приложение.
  4. Проверьте: создайте счёт в песочнице или один небольшой боевой счёт.
  5. Понаблюдайте несколько часов — не осталось ли забытого места, которое ещё ходит со старым ключом.
  6. Удалите старый ключ.

В аварийной ситуации (ключ утёк) порядок обратный: сначала удаляете старый, потом ставите новый. Несколько минут простоя будут, но это безопаснее, чем позволить постороннему выставлять счета от вашего имени.

Удаление

Удаление ключа действует немедленно. Никакой отсрочки и «мягкого отключения» нет.

Что происходитПояснение
ЗапросыВсе запросы с этим ключом получают unauthorized (401)
Ранее созданные счетаНе удаляются, видны в кабинете, продолжают оплачиваться
ВебхукиСобытия по прежним счетам продолжают приходить
ПодпискиРасписание не ломается, они привязаны к кассиру

То есть теряется только доступ. Восстановить удалённый ключ невозможно: создаёте новый и обновляете интеграции: Удалил API-ключ.

Связанные ошибки

КодHTTPПричина
unauthorized401Ключ не передан, недействителен или удалён
invalid_api_key422Неверный формат ключа
insufficient_scope403У ключа нет права на это действие
forbidden403Ресурс принадлежит другой организации
invoice_not_found404Счёт не принадлежит кассиру, к которому привязан ключ

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

Можно ли посмотреть ключ повторно? Нет. Он показывается один раз. Потеряли — создаёте новый.

Сколько ключей может быть у организации? Несколько. Заводить отдельный ключ на каждую интеграцию ничто не мешает.

Истекает ли ключ сам? Нет. Он действует, пока вы его не удалите или не замените.

Что будет, если использовать ключ песочницы в проде? Счета создадутся, но в Kaspi не уйдут — покупатель никогда не сможет оплатить. Это самая частая причина жалоб «оплата не приходит».

Можно ли дать ключ подрядчику? Создайте ему отдельный ключ с минимальными правами. По окончании работ удалите именно его, не трогая остальные интеграции.

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

Права доступа (scopes) — что может ключПолная таблица шести scope: invoices:read, invoices:write, refunds:write, subscriptions:manage, webhooks:manage, partner:manage. Какие методы открывает каждый, принцип минимальных прав и разбор ошибки insufficient_scope.Удалил API-ключ — что теперь будет и что делатьУдалённый ключ перестаёт работать мгновенно, восстановить его нельзя. На счета и деньги это не влияет. Как создать новый, заменить его в интеграции и не забыть про привязку к кассиру.API отвечает 401 — ключ не принимается401 unauthorized означает, что в запросе нет действующего API-ключа. Причины, порядок проверки и рабочий пример curl. Чаще всего виноват заголовок или префикс Bearer.Можно ли подключить несколько кассировДа, можно. У каждого кассира свой номер и своя привязка. Что такое основной кассир, как привязать API-ключ к конкретному кассиру и почему лимит остаётся общим.Чем песочница отличается от боевого режимаВ песочнице Kaspi не вызывается вообще, реальных денег нет и кассир не нужен — оплату вы симулируете сами. Полное сравнение двух режимов и что проверить при переходе в боевой.

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

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