ДокументацияВведение
Коды ошибок

Справочник

API Reference (v2)

Все эндпоинты на одной странице

Базовый URL API PayBot — https://api.paybot.kz. Все актуальные эндпоинты приёма платежей живут под префиксом /v2 и авторизуются заголовком X-API-Key; кабинетные вызовы под /me авторизуются Authorization: Bearer ; партнёрская интеграция — под /partner/v1 с заголовком X-Partner-API-Key. Полная машиночитаемая спецификация — https://api.paybot.kz/openapi.json. Эта страница — сгруппированный справочник реальных путей с методом, назначением, типом авторизации и обязательными заголовками.

Прежде чем звать эндпоинты, получите ключ и разберитесь с типами авторизации в разделе Авторизация. Формат ошибок, коды и request_id описаны в Ошибки. Модель доставки и подпись событий — в Вебхуки. Готовые сниппеты на четырёх языках — в SDK и библиотеки.

Как авторизовать запрос к API

PayBot использует три независимых механизма авторизации, каждый привязан к своей группе путей.

  • X-API-Key: kp_live_ (или kp_test_... в тестовом режиме) — для /v1/* и большинства /v2/*. Ключ выдаётся один раз в кабинете (POST /me/api-key/regenerate).
  • Authorization: Bearer (JWT) — для кабинетных путей /me/*, /partner/* (кабинет), /onboarding/*, /v1/subscription/*. Токен выдаёт /auth/login.
  • X-Partner-API-Key: pk_live_ — для white-label интеграции партнёра под /partner/v1/*.

Часть путей /v2/payment-links* и /v2/events принимают любой из двух вариантов — API-ключ или JWT. Публичные пути /v2/checkout/* авторизации не требуют вовсе.

Все суммы в API — целые числа в тенге (₸), без копеек. amount: 5000 означает 5000 ₸.

Какие заголовки обязательны

Кроме заголовка авторизации, мутирующие вызовы требуют дополнительных заголовков.

  • Idempotency-Keyобязателен на POST /v2/qr, POST /v2/invoices, POST /v2/invoices/{op_id}/cancel, POST /v2/refunds и на всех мутирующих /v1/*. Без него вернётся 400 idempotency_key_required. Подробно — Идемпотентность.
  • X-Kaspi-Account: — выбор конкретного Kaspi-аккаунта при мультиаккаунте (/v2/qr, /v2/invoices, /me/payments/create-qr, /me/payments/create-invoice). Без заголовка берётся аккаунт по умолчанию.
  • Content-Type: application/json — на всех запросах с телом.

Заголовки лимитов присутствуют в каждом ответе и вынесены в CORS-expose: X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset. Читайте их для backoff — см. Лимиты запросов.

Платежи v2

Ядро API: Kaspi QR, счета (invoice) с push на телефон, возвраты, список платежей и журнал событий. Авторизация — X-API-Key, если не указано иное.

МетодПутьНазначениеАвторизацияОбязательные заголовки
POST/v2/qrСоздать Kaspi QRX-API-KeyIdempotency-Key, X-Kaspi-Account (опц.)
GET/v2/qr/{op_id}Статус QR (синхронизирует с Kaspi)X-API-Key
POST/v2/invoicesСоздать счёт (push на телефон)X-API-KeyIdempotency-Key, X-Kaspi-Account (опц.)
GET/v2/invoices/{op_id}Статус счётаX-API-Key
POST/v2/invoices/{op_id}/cancelОтменить счётX-API-KeyIdempotency-Key
POST/v2/refundsВернуть средстваX-API-KeyIdempotency-Key
GET/v2/paymentsСписок платежей (курсорная пагинация)X-API-Key
GET/v2/eventsЖурнал событий аккаунтаX-API-Key или JWT
GET/v2/client?phone=Проверить клиента Kaspi по номеруX-API-Key

POST /v2/qr принимает {amount, items?, comment?} и возвращает QrCreated{operation_id, qr_token, deep_link, expires_at, status}. QR живёт около 5 минут — отслеживайте expires_at. POST /v2/invoices принимает {phone, amount, comment?} и возвращает InvoiceCreated{operation_id, status, expires_at}; счёт живёт около 24 часов. POST /v2/refunds принимает {operation_id, amount, reason?} и возвращает RefundResult{refund_id, status} со статусом completed | pending | failed.

GET /v2/payments поддерживает query cursor, limit (1–100, def 20), status, type (qr | invoice) и отдаёт конверт {data[], next_cursor, has_more}. Как перебирать страницы — в Пагинация. Как создавать QR и счета детально — в QR и счета.

Платёжные ссылки v2

Платёжная ссылка (payment link) — это постоянный paybot.kz/checkout/{token}, который можно напечатать на наклейке: страница каждый раз выдаёт свежий Kaspi QR. Авторизация — X-API-Key или JWT.

МетодПутьНазначениеАвторизацияОбязательные заголовки
POST/v2/payment-linksСоздать платёжную ссылкуX-API-Key/JWTIdempotency-Key (опц., авто-генерится)
GET/v2/payment-linksСписок ссылок (курсор)X-API-Key/JWT
GET/v2/payment-links/{token}Одна ссылка (авто-flip active→expired)X-API-Key/JWT
PATCH/v2/payment-links/{token}Правка описания, URL, срока, повтораX-API-Key/JWT
POST/v2/payment-links/{token}/refresh-qrНовый цикл Kaspi QRX-API-Key/JWT
POST/v2/payment-links/{token}/cancelОтменить ссылкуX-API-Key/JWT

Создание принимает {amount, description(1–500), success_url?, cancel_url?, expires_in_minutes(5–43200, def 1440), allow_repeat, email_required, metadata?}. Полная механика — в Платёжные ссылки. Публичная страница оплаты, которая отдаётся по ссылке, — в Hosted checkout.

Hosted checkout (публичные пути)

Публичная страница оплаты по токену ссылки. Авторизация не нужна — доступ по знанию token. У каждого пути свой rate-limit на токен+IP.

МетодПутьНазначениеАвторизацияЛимит
GET/v2/checkout/{token}Данные ссылки + QR + брендинг мерчантаПублично60/мин
GET/v2/checkout/{token}/status?op=Поллинг статуса оплатыПублично120/мин
POST/v2/checkout/{token}/refresh-qrСвежий QR при истеченииПублично10/мин
POST/v2/checkout/{token}/emailСохранить email плательщикаПублично20/мин

Параметр op в поллинге обязателен для ссылок с allow_repeat — иначе два посетителя увидят чужой paid. Подробно — в Hosted checkout.

Аккаунт `/me`

Кабинетные пути: профиль, оферта, ключ, использование, логи, организация. Все требуют JWT.

МетодПутьНазначениеАвторизация
GET/meПрофиль клиента (ClientProfile)JWT
POST/me/accept-termsПринять офертуJWT
POST/me/api-key/regenerateНовый API-ключ (показывается один раз)JWT
GET/me/usageСчётчики оплаченных платежей (14 дней)JWT
GET/me/logs?limit=Лог запросов (def 50, max 200)JWT
GET/PUT/me/organizationРеквизиты организацииJWT
POST/me/telegram-linkСсылка привязки TelegramJWT

Полный ключ отдаётся только в ответе POST /me/api-key/regenerate и больше не читается нигде — см. Авторизация.

Платежи из кабинета (JWT)

Те же операции, что и через /v2, но авторизуются JWT — для кабинетного UI без API-ключа.

МетодПутьНазначениеАвторизация
GET/me/payments?status=&limit=Список платежей (без курсора, def 20, max 100)JWT
GET/me/payments/statstoday / month / week[] / all_time + конверсияJWT
POST/me/payments/create-qrQR из кабинета (amount, description)JWT
POST/me/payments/create-invoiceСчёт из кабинета (phone, amount, description)JWT
GET/me/payments/status/{op_id}Статус платежаJWT
POST/me/payments/{op_id}/refundВозврат (amount?, reason?)JWT
GET/me/payments/exportЭкспорт CSV (лимит 1000 строк)JWT

Вебхуки `/me/webhooks`

Управление подписками на события и просмотр доставок. Все пути требуют JWT. Секрет вебхука показывается в открытом виде один раз при создании и при ротации.

МетодПутьНазначениеАвторизация
POST/me/webhooksСоздать вебхук → 201, секрет один разJWT
GET/me/webhooksСписок вебхуковJWT
GET/me/webhooks/{id}Один вебхукJWT
PATCH/me/webhooks/{id}Правка url, events, is_active, descriptionJWT
DELETE/me/webhooks/{id}Удалить вебхукJWT
POST/me/webhooks/{id}/rotate-secretРотация секрета (секрет один раз)JWT
POST/me/webhooks/{id}/enableВключить (сбрасывает failing_since)JWT
POST/me/webhooks/{id}/disableВыключитьJWT
GET/me/webhooks/{id}/deliveriesДоставки (курсор)JWT
POST/me/webhooks/{id}/deliveries/{delivery_id}/retryПовторить доставкуJWT
POST/me/webhooks/{id}/testТестовый вызов → TestResultJWT

Допустимые события клиента: payment.completed, payment.cancelled, payment.expired, payment.refunded, webhook.test. Подпись — HMAC-SHA256 над "{timestamp}.{body}". Полная механика доставки, заголовки и проверка подписи — в Вебхуки.

Kaspi-аккаунты и онбординг

Подключение и управление Kaspi-аккаунтами мерчанта. Все пути требуют JWT.

МетодПутьНазначениеАвторизация
GET/me/kaspi/accountsСписок Kaspi-аккаунтовJWT
GET/me/kaspi/accounts/{id}Один аккаунтJWT
PATCH/me/kaspi/accounts/{id}Правка display_name, org_type, org_binJWT
POST/me/kaspi/accounts/{id}/health-checkЖивая проверка сессииJWT
POST/me/kaspi/accounts/{id}/set-defaultСделать аккаунтом по умолчаниюJWT
DELETE/me/kaspi/accounts/{id}Удалить → 204JWT
POST/onboarding/kaspi/startОтправить SMS-OTPJWT
POST/onboarding/kaspi/verifyПроверить OTPJWT
POST/onboarding/kaspi/resendПереотправить OTPJWT
GET/onboarding/kaspi/statusСостояние подключенияJWT

При мультиаккаунте передавайте X-Kaspi-Account: в вызовах создания платежа. Поле session_alive в карточке аккаунта — сигнал «переподключите Kaspi».

Брендинг чекаута

Кастомизация публичной страницы оплаты. JWT.

МетодПутьНазначениеАвторизация
GET/me/brandingdisplay_name, logo_url, brand_color, support_emailJWT
PATCH/me/brandingПравка тех же 4 полейJWT
POST/me/branding/logoЗагрузка файла → всегда 501 logo_upload_disabledJWT

Загрузка файла логотипа отключена (501) — используйте logo_url. Настройка бренда — в Брендинг. Валидация: brand_color строго ^#[0-9A-Fa-f]{6}$, support_email должен содержать @.

Партнёрский кабинет `/partner`

B2B2C-кабинет партнёра: баланс, комиссии, клиенты, ссылки, выводы, аналитика. Авторизация — JWT с активным партнёрским профилем.

МетодПутьНазначениеАвторизация
POST/partner/auth/registerЗаявка партнёраJWT
GET/partner/meПрофиль партнёраJWT
GET/partner/balance{available_kzt, pending_kzt, updated_at}partner
GET/partner/balance/transactionsЛента транзакций (курсор)partner
GET/partner/commissions?status=Комиссии (курсор)partner
GET/partner/clients?status=Клиенты партнёра (курсор)partner
GET/partner/clients/{id}Детали клиента + payments[] + commissions[]partner
POST/partner/clients/inviteИнвайт по email → 201partner
POST/partner/clients/{id}/pay-subscriptionОплатить тариф клиенту с балансаpartner
GET/POST/partner/linksРеф-ссылки (POST → 201)partner
GET/PATCH/DELETE/partner/links/{id}Одна ссылка (DELETE → 204)partner
GET/PATCH/partner/settings/bankБанковские реквизитыpartner
POST/partner/withdrawalsЗаявка на вывод (202 = нужен telegram_code)partner
GET/partner/withdrawalsСписок выводов (курсор)partner
GET/partner/withdrawals/{id}/actPDF-актpartner
GET/partner/analytics/summary?period=Сводка (def 30d)partner
GET/partner/analytics/funnelВоронка [{step, value}]partner
GET/partner/analytics/income-graphГрафик доходаpartner

Минимальная сумма вывода — 30 000 ₸. Полный сценарий подключения партнёра — в Партнёрский API.

Партнёрская интеграция `/partner/v1`

White-label REST-API для партнёров: управление клиентами, их Kaspi-онбордингом, вебхуками и платежами. Авторизация — X-Partner-API-Key.

МетодПутьНазначениеАвторизация
GET/partner/v1/pingПроверка ключаX-Partner-API-Key
POST/partner/v1/clientsСоздать/вернуть клиента (upsert по external_id)X-Partner-API-Key
GET/partner/v1/clientsСписок клиентов (курсор)X-Partner-API-Key
GET/partner/v1/clients/{client_ref}Клиент по PayBot ID или external_idX-Partner-API-Key
POST/partner/v1/clients/{ref}/kaspi/startWhite-label Kaspi OTP: стартX-Partner-API-Key
POST/partner/v1/clients/{ref}/kaspi/verifyПроверить OTPX-Partner-API-Key
GET/partner/v1/clients/{ref}/kaspi/statusСостояние онбордингаX-Partner-API-Key
GET/POST/partner/v1/clients/{ref}/webhooksВебхуки клиента (POST → 201)X-Partner-API-Key
POST/partner/v1/clients/{ref}/api-key/rotateРотация ключа клиентаX-Partner-API-Key
POST/partner/v1/clients/{ref}/login-linkОдноразовая ссылка входаX-Partner-API-Key
POST/partner/v1/checkoutПлатёжная ссылка для клиентаX-Partner-API-Key
GET/partner/v1/paymentsПлатежи по клиентам партнёра (курсор)X-Partner-API-Key
GET/partner/v1/payments/{operation_id}Один платёжX-Partner-API-Key

Партнёрские ключи выдаются в кабинете: POST /partner/integration/api-keys (ключ показывается один раз). Детали — в Партнёрский API.

Прочие кабинетные группы

Кабинет PayBot покрывает больше, чем платежи. Все пути ниже требуют JWT.

МетодПутьНазначениеАвторизация
POST/v1/subscription/payСоздать QR на оплату тарифаJWT
GET/v1/subscription/check/{operation_id}Поллинг оплаты → активация планаJWT
GET/me/teamУчастники командыJWT
POST/me/team/inviteПригласить участника (email, role)JWT
PATCH/me/team/{member_id}Сменить рольJWT
DELETE/me/team/{member_id}Отозвать участника → 204JWT
GET/POST/me/ticketsТикеты поддержкиJWT
POST/me/tickets/{id}/messagesСообщение в тикетJWT
GET/me/notificationsУведомленияJWT
GET/me/notifications/unread-countЧисло непрочитанныхJWT
POST/me/notifications/read-allОтметить всё прочитаннымJWT
GET/me/integrationsСписок интеграций (AmoCRM, Bitrix24, Tilda)JWT
GET/me/partner-impersonation/sessionsКто заходил в аккаунт как партнёрJWT
PATCH/me/allow-partner-impersonationРазрешить/запретить партнёрский входJWT

Роли команды: owner | admin | accountant | support | viewer. Тарифы подписки зашиты в коде: starter=10000 ₸, professional=30000 ₸ в месяц; лимиты платежей в месяц — trial=30, starter=200, professional=1500, enterprise=999999.

Журнал событий

GET /v2/events (авторизация X-API-Key или JWT) отдаёт ленту активности аккаунта в конверте {data:[{id, type, data, created_at}], next_cursor, has_more}. Реально пишутся события payment.completed, payment.cancelled, payment.expired, payment_link.created, payment_link.updated, payment_link.cancelled, plan.changed, webhook.delivery_failed, webhook.auto_reactivated. Поле data — свободный объект, структура зависит от type. Полный список типов событий — в События.

Пример: создать QR и проверить статус

Минимальный сквозной вызов через X-API-Key с обязательным Idempotency-Key.

bash
Скачать
curl -X POST https://api.paybot.kz/v2/qr \
  -H "X-API-Key: kp_live_0123456789abcdef0123456789abcdef" \
  -H "Idempotency-Key: 6f9619ff-8b86-d011-b42d-00cf4fc964ff" \
  -H "Content-Type: application/json" \
  -d '{"amount": 5000, "comment": "Заказ #1042"}'

Ответ QrCreated:

json
Скачать
{
  "operation_id": "op_3fa85f6457174562",
  "qr_token": "kzqr_9d8f7a6b5c4d",
  "deep_link": "https://kaspi.kz/pay/9d8f7a6b5c4d",
  "expires_at": "2026-07-16T12:05:00Z",
  "status": "created"
}

Затем опрашивайте статус, пока не придёт paid (или включите Вебхуки вместо поллинга):

bash
Скачать
curl https://api.paybot.kz/v2/qr/op_3fa85f6457174562 \
  -H "X-API-Key: kp_live_0123456789abcdef0123456789abcdef"
json
Скачать
{
  "operation_id": "op_3fa85f6457174562",
  "status": "paid",
  "amount": 5000,
  "sender_name": "Айгерим Т.",
  "transaction_id": "tx_88213004",
  "paid_at": "2026-07-16T12:02:41Z",
  "raw_kaspi_status": "Processed"
}

Что со старым API v1

Версия /v1/* объявлена deprecated и отключается 31 декабря 2026 года. Каждый ответ v1 несёт заголовки Deprecation: true, Sunset: Wed, 31 Dec 2026 23:59:59 GMT и Link: ; rel="successor-version". Новые интеграции должны использовать только /v2. Таблицу соответствий путей и пошаговый перенос смотрите в Переход с v1 на v2.

Единственный путь без прямого аналога в v2 — GET /v1/status (живость сессии и счётчики использования); в кабинете те же данные доступны через GET /me и GET /me/usage.

FAQ

Где взять полный список запросов и ответов?

Машиночитаемая OpenAPI-спека с точными телами и схемами — https://api.paybot.kz/openapi.json. Эта страница — сгруппированный человекочитаемый срез тех же путей. Схемы полей (QrCreated, PaymentLinkResponse и т.п.) там же.

Чем `/v2/qr` отличается от `/me/payments/create-qr`?

Это одна и та же операция с разной авторизацией. /v2/qr авторизуется API-ключом (X-API-Key) и предназначен для серверной интеграции. /me/payments/create-qr авторизуется JWT и вызывается из кабинета/фронтенда, где нет API-ключа. Обязательный Idempotency-Key нужен обоим.

Почему список платежей отстаёт после создания?

Ответы /v2/payments и /v2/payment-links кэшируются на бэке 5 секунд. Сразу после создания платёж может не появиться в списке до истечения кэша — это ожидаемо. Для мгновенного статуса опрашивайте конкретную операцию через GET /v2/qr/{op_id}.

Какой лимит запросов у API?

По умолчанию 20 запросов в минуту на ключ. Лимит не действует для тарифа enterprise и для ключей в тестовом режиме (kp_test_...). Читайте заголовки X-RateLimit-* и делайте backoff — см. Лимиты запросов.