Базовый 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/* авторизации не требуют вовсе.
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 QR | X-API-Key | Idempotency-Key, X-Kaspi-Account (опц.) |
| GET | /v2/qr/{op_id} | Статус QR (синхронизирует с Kaspi) | X-API-Key | — |
| POST | /v2/invoices | Создать счёт (push на телефон) | X-API-Key | Idempotency-Key, X-Kaspi-Account (опц.) |
| GET | /v2/invoices/{op_id} | Статус счёта | X-API-Key | — |
| POST | /v2/invoices/{op_id}/cancel | Отменить счёт | X-API-Key | Idempotency-Key |
| POST | /v2/refunds | Вернуть средства | X-API-Key | Idempotency-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/JWT | Idempotency-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 QR | X-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 | Ссылка привязки Telegram | JWT |
Полный ключ отдаётся только в ответе POST /me/api-key/regenerate и больше не читается нигде — см. Авторизация.
Платежи из кабинета (JWT)
Те же операции, что и через /v2, но авторизуются JWT — для кабинетного UI без API-ключа.
| Метод | Путь | Назначение | Авторизация |
|---|---|---|---|
| GET | /me/payments?status=&limit= | Список платежей (без курсора, def 20, max 100) | JWT |
| GET | /me/payments/stats | today / month / week[] / all_time + конверсия | JWT |
| POST | /me/payments/create-qr | QR из кабинета (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, description | JWT |
| 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 | Тестовый вызов → TestResult | JWT |
Допустимые события клиента: 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_bin | JWT |
| POST | /me/kaspi/accounts/{id}/health-check | Живая проверка сессии | JWT |
| POST | /me/kaspi/accounts/{id}/set-default | Сделать аккаунтом по умолчанию | JWT |
| DELETE | /me/kaspi/accounts/{id} | Удалить → 204 | JWT |
| POST | /onboarding/kaspi/start | Отправить SMS-OTP | JWT |
| POST | /onboarding/kaspi/verify | Проверить OTP | JWT |
| POST | /onboarding/kaspi/resend | Переотправить OTP | JWT |
| GET | /onboarding/kaspi/status | Состояние подключения | JWT |
При мультиаккаунте передавайте X-Kaspi-Account: в вызовах создания платежа. Поле session_alive в карточке аккаунта — сигнал «переподключите Kaspi».
Брендинг чекаута
Кастомизация публичной страницы оплаты. JWT.
| Метод | Путь | Назначение | Авторизация |
|---|---|---|---|
| GET | /me/branding | display_name, logo_url, brand_color, support_email | JWT |
| PATCH | /me/branding | Правка тех же 4 полей | JWT |
| POST | /me/branding/logo | Загрузка файла → всегда 501 logo_upload_disabled | JWT |
Загрузка файла логотипа отключена (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 → 201 | partner |
| 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}/act | PDF-акт | 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_id | X-Partner-API-Key |
| POST | /partner/v1/clients/{ref}/kaspi/start | White-label Kaspi OTP: старт | X-Partner-API-Key |
| POST | /partner/v1/clients/{ref}/kaspi/verify | Проверить OTP | X-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} | Отозвать участника → 204 | JWT |
| 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.
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:
{
"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 (или включите Вебхуки вместо поллинга):
curl https://api.paybot.kz/v2/qr/op_3fa85f6457174562 \
-H "X-API-Key: kp_live_0123456789abcdef0123456789abcdef"{
"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: . Новые интеграции должны использовать только /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 — см. Лимиты запросов.