Что нужно до начала
-
К аккаунту Kaspi Pay подключена Kaspi Касса (ОФД). Смены, отчёты и сверку мы получаем от неё — это та же связка, что включает каталог товаров.
Если продажи идут через Kaspi Pos без ОФД, кассовых смен у организации не существует: раздела «Касса» в кабинете нет, кассовые запросы отвечают отказом. Подробнее — «Переход на каталог товаров».
-
Подключён кассир Kaspi. Раздел «Касса» работает через сотрудника с ролью «Кассир» — см. «Как подключить кассира Kaspi».
-
Настройки кассы меняет владелец организации. Остальным сотрудникам они видны только для чтения; по API-ключу организации тумблеры доступны без этого ограничения.
-
Настроены вебхуки, если результат закрытия нужен вашей системе, — «Настройка вебхуков».
Если Kaspi Касса у вас подключена, а раздела «Касса» нет — нажмите в настройках «Обновить информацию об организации»: состояние пересверяется в этот момент.
⚠️ Этим же действием включается каталог товаров: после него QR-счета выставляются только с составом покупки, а уже напечатанные QR-листы без состава перестают работать — переиздать их нельзя. Сначала убедитесь, что ваша интеграция умеет передавать состав, — «Переход на каталог товаров».
В песочнице кассовые запросы отвечают всегда — тестовыми данными и независимо от того, есть ли касса в бою. Раздел «Касса» в кабинете тестовой организации появляется, если вы ответили, что касса есть; ответ меняется в настройках. Интеграцию, прошедшую в песочнице, обязательно проверьте на боевой организации.
Тумблер автозакрытия
Ответ на переключение содержит два поля:
{ "changed": true, "new_value": true }
changed: false — не ошибка: на кассе уже стояло запрошенное значение, менять было нечего. Это удобно для скриптов — можно спокойно «доводить» настройку до нужного состояния при каждом запуске.
Отдельно стоит знать про два отказа:
503 cashbox_toggle_in_progress— эту же настройку прямо сейчас меняет другой запрос. Повторите через минуту.503 cashbox_toggle_unavailable— проверить текущее значение на кассе не удалось, изменение не применено.
Рядом живёт второй тумблер — автоизъятие наличных при закрытии смены (PUT /cashbox/settings/auto-withdrawal): когда он включён, наличные изымаются из кассы при закрытии смены автоматически. Контракт ответа и отказы у него те же.
Закрытие смены через API
POST /api/v1/cashbox/shifts/close
{ "client_operation_id": "close-2026-08-10-01", "shift_number": 106 }
Ответ — 202 с идентификатором операции и poll_url. Дальше два пути:
- Поллинг:
GET /cashbox/operations/{id}до статусаcompletedилиfailed. - Вебхук:
cashbox.shift_closedпри успехе,cashbox.shift_close_failedпри отказе.
client_operation_id уникален в пределах организации: повторный запрос с тем же значением вернёт 409 cashbox_duplicate_operation и в теле — идентификатор уже идущей операции. Это защита от двойного нажатия, а не ошибка.
Если закрытие не удалось
У операции есть поле resolution.safe_to_retry. Оно равно true только у операции в статусе failed — у pending, sending и completed там false.
Отказ не означает, что смена точно осталась открытой: если ответ Kaspi не дошёл, она могла и закрыться. Повторить закрытие после failed безопасно — уже закрытую смену Kaspi отдаёт как «смена уже закрыта», и операция завершается успехом.
Повтор всегда с новым client_operation_id: прежний после отказа не освобождается.
Хотите убедиться в фактическом состоянии до повтора — смотрите список GET /cashbox/shifts и приложение Kaspi Pos.
Для вашего ИИ-агента
Смотрите: кассовые ручки требуют подключённой Kaspi Кассы (ОФД) — без неё GET /cashbox/shifts и POST /cashbox/shifts/close отвечают 409 cashbox_kkm_unknown, а GET /cashbox/summary и оба тумблера — 409 rfo_missing; PUT /cashbox/settings/auto-close с {enabled} → {changed,new_value}, changed:false — норма; POST /cashbox/shifts/close отвечает 202, результат читать поллингом GET /cashbox/operations/{id} или вебхуком cashbox.shift_closed/cashbox.shift_close_failed; при failed повторять новым client_operation_id (повтор безопасен: уже закрытая смена считается успехом), resolution.safe_to_retry равен true ровно у статуса failed; у кассовых ручек отдельный минутный лимит — 30 запросов в минуту на ключ.
Частые вопросы
Автозакрытие заменяет ручное закрытие полностью?
Кнопка и ручка API остаются доступны при включённом автозакрытии — закрыть смену раньше можно в любой момент.
Повлияет ли автозакрытие на фискальные чеки?
Да. Чек выбивается только при открытой смене: если смена уже закрылась автоматически, запрос чека завершится отказом shift_closed. Откройте смену в приложении Kaspi Pos и повторите с новым client_operation_id — «Выбить фискальный чек Kaspi».
Почему тумблер показывает «Значение из Kaspi ещё не получено»?
Живое состояние настройки приходит вместе с данными кассы. Если раздел только что открылся или касса не ответила, значение неизвестно — это не то же самое, что «выключено».
Смена закрылась, а отчёта нет?
Отчёт по закрытой смене запрашивается отдельно — «Отчёт по кассовой смене Kaspi».