Если вы мерчант и хотите принимать платежи через Kaspi Pay в своём бизнесе — вам нужна обычная документация:
Partner API использует X-Partner-Key и предназначен для server-to-server
интеграций, когда вы онбордите сторонних мерчантов в ApiPay от своего имени.
Server-to-server API для партнёров-интеграторов (CRM, маркетплейсы, white-label-кассы).
Партнёр онбордит своих мерчантов, авторизует их Kaspi-кассы и выдаёт им платёжный ключ
X-API-Key — всё программно, из своей системы.
Платёжные операции, webhook-события и проверка HMAC живут в документации для мерчантов (/docs) и здесь не дублируются. Привязку кассира перед боевым подключением можно прогнать в песочнице партнёра — детерминированно, без единого реального вызова Kaspi и без SMS.
Если вы разрабатываете CRM-систему, платёжную платформу, агрегатор или white-label-кассу
и хотите подключать своих клиентов к приёму Kaspi Pay-платежей — Partner API ApiPay создан
именно для этого. Вы получаете единый X-Partner-Key → создаёте организацию
мерчанта → авторизуете кассира через Kaspi-SMS → выпускаете её X-API-Key.
Дальше мерчант создаёт счета по документации для мерчантов /docs.
| Поверхность | Базовый URL |
|---|---|
| Partner API (онбординг, выдача X-API-Key) | https://apipay.kz/api/partner |
| Платёжный API мерчанта (счета, lookup, webhooks) — см. /docs | https://bpapi.bazarbay.site/api/v1 |
Релевантны API ровно два ключа.
| Ключ / заголовок | Кто владеет | Для чего |
|---|---|---|
X-Partner-Key |
партнёр | server-to-server: создание организаций мерчантов, авторизация кассира, мониторинг своих организаций, выдача X-API-Key мерчанту. Берётся в партнёрском кабинете. |
X-API-Key |
конкретный мерчант (вы выдаёте ключ через Partner API) | платёжные операции от имени мерчанта (счета, статусы, возвраты, lookup) — описаны в документации для мерчантов /docs, здесь не дублируются. |
X-Partner-Key выдаётся в партнёрском кабинете; ротация ключа и переключение
sandbox/production — тоже в кабинете (фронт), не через API.
X-Partner-Key)
Префикс /api/partner. Лимит группы — 120 req/min на партнёра.
Server-to-server: создавайте организации мерчантов, авторизуйте кассира, мониторьте свои
организации и выдавайте X-API-Key мерчанту.
/api/partner/organizations — создать организацию мерчантаИдемпотентно по external_id — повторный POST вернёт существующую org.
Лимит 10/min. Ответ 201 (создана) / 200 (идемпотентный повтор).
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
has_catalog | boolean | нет | Создать организацию с каталогом товаров |
external_id | string | нет | Ваш идентификатор клиента в CRM (ключ идемпотентности) |
curl -X POST https://apipay.kz/api/partner/organizations \
-H 'X-Partner-Key: <X-Partner-Key>' -H 'Content-Type: application/json' \
-d '{"has_catalog":false,"external_id":"crm-client-42"}'
{ "success": true, "organization": {
"id": 50, "name": "ТОО Example", "idn": "123456789012",
"status": "verified", "sandbox_mode": true, "has_catalog": false,
"kaspi_connected": true, "session_mode": "self", "external_id": "crm-client-42",
"payment_status": "active", "has_active_payment": true,
"created_at": "2026-05-16T10:00:00+00:00" } }
/api/partner/organizations — список организаций (мониторинг)Мониторинг своих организаций: список с пагинацией. Query: per_page (1–100, def 25), page (def 1).
{ "success": true, "organizations": ["<card>"], "current_page": 1,
"per_page": 25, "total": 42, "last_page": 2 }
/api/partner/organizations/{id} — карточка организацииПолучить карточку конкретной организации. → { "success": true, "organization": <card> }
/api/partner/organizations/{id} — отвязать организациюДеактивирует все API-ключи org и делает soft-delete. → { "success": true }
/api/partner/organizations/{id}/api-key — выдать X-API-Key мерчанту
Создать/перегенерировать ключ мерчанта + webhook. webhook_url проходит
SSRF-валидацию (приватные IP → 422). Идемпотентно (повтор = перегенерация).
Дальше мерчант работает этим ключом по документации для мерчантов
(/docs).
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
name | string | нет | Произвольное название ключа |
webhook_url | string | да | URL для webhook-уведомлений мерчанта |
webhook_secret | string | нет | Секрет подписи (генерируется, если не указан) |
curl -X POST https://apipay.kz/api/partner/organizations/501/api-key \
-H 'X-Partner-Key: <X-Partner-Key>' -H 'Content-Type: application/json' \
-d '{"name":"CRM key","webhook_url":"https://crm.example.kz/sub/501/webhook"}'
{ "success": true, "key": "<X-API-Key, один раз>", "key_id": 900,
"webhook_url": "https://crm.example.kz/sub/501/webhook",
"webhook_secret": "whsec_yyyy", "is_org_default": true, "regenerated": false }
Префикс /api/partner/organizations/{id}/kaspi-auth. process_id
живёт 10 минут — шаги send-phone и verify-otp нужно выполнить в
этом окне. Боевая org доступна только production-партнёру (иначе
403 production_access_required); тестовая org всегда идёт мок-путём.
.../kaspi-auth/init — Шаг 1Инициировать авторизацию кассира Kaspi. Body {}.
{ "success": true, "process_id": "SANDBOX-<uuid>" }
.../kaspi-auth/send-phone — Шаг 2Body { "cashier_phone": "7XXXXXXXXXX" }. Kaspi отправляет SMS на номер кассира.
Успех → { "success": true }.
Ошибки: invalid_phone (422 — неверный формат), not_cashier
(422 — номер не кассир Kaspi), no_process (409 — нет активного процесса:
вызовите init / он истёк), sms_failed (502), org_claim_conflict
(409 — касса уже привязана к другому владельцу). В sandbox not_cashier и
sms_failed эмулируются магическими номерами (см. раздел Sandbox).
.../kaspi-auth/verify-otp — Шаг 3Body { "otp": "0000" } (4–6 цифр). Подтвердить код из SMS.
200: { "success": true, "mode": "self", "organization": <card> } — org → status: verified.200: { "success": false, "error": "invalid_otp" } — повторяемо, сессия жива.0000 = успех, любой другой = invalid_otp..../kaspi-auth/status — статусТекущий статус авторизации кассира. status: pending (процесс идёт) | active (касса привязана).
{ "success": true, "status": "active", "kaspi_connected": true, "expires_at": "..." }
<card>| Поле | Тип | Описание |
|---|---|---|
id | number | ID организации |
name | string | Название |
idn | string | БИН/ИИН |
status | string | pending | verified | suspended |
sandbox_mode | boolean | Режим песочницы |
has_catalog | boolean | Есть каталог |
kaspi_connected | boolean | Касса Kaspi подключена |
session_mode | string | Режим привязки (self) |
external_id | string | Ваш CRM-идентификатор |
payment_status | string | none | active | expired |
payment_expires_at | string|null | Когда истекает тариф |
has_active_payment | boolean | Активная оплата |
created_at | string | Дата создания |
{
"id": 50, "name": "ТОО Example", "idn": "123456789012",
"status": "pending|verified|suspended",
"sandbox_mode": false, "has_catalog": false, "kaspi_connected": true,
"session_mode": "self", "external_id": "crm-client-42",
"payment_status": "none|active|expired",
"payment_expires_at": "2026-06-16T00:00:00+00:00",
"has_active_payment": false, "created_at": "2026-05-16T10:00:00+00:00"
}
Песочница партнёра детерминированно эмулирует привязку кассира: ни одного
реального вызова Kaspi, ни одной SMS. Магические номера на send-phone подменяют
ответ Kaspi на фиксированный; любой другой валидный номер 7XXXXXXXXXX трактуется
как «обычный» (success). Тестовая организация архитектурно не может стать боевой.
simulate-status) — это песочница мерчанта,
отдельная система: см. документацию для мерчантов /docs.
Магические значения (только привязка кассира):
| Шаг / магическое значение | Результат | HTTP |
|---|---|---|
kaspi-auth/init | process_id = "SANDBOX-<uuid>" | 200 |
send-phone 77770000010 | success (касса привязывается) | 200 |
send-phone 77770000011 | not_cashier — номер не кассир Kaspi | 422 |
send-phone 77770000012 | sms_failed — Kaspi не смог отправить SMS | 502 |
send-phone прочий валидный 7… | success | 200 |
verify-otp 0000 | success → org status: verified (sandbox_mode остаётся true) | 200 |
verify-otp любой другой код | invalid_otp (повторяемо, сессия жива) | 200 |
POST /organizations {"external_id":"test-1"} → org.idPOST .../{id}/kaspi-auth/init → process_idPOST .../send-phone {"cashier_phone":"77770000010"} → successPOST .../verify-otp {"otp":"0000"} → org status: verifiedPOST .../{id}/api-key → X-API-Key мерчанта (дальше — по /docs)POST .../send-phone {"cashier_phone":"77770000011"} → 422 not_cashierPOST .../send-phone {"cashier_phone":"77770000012"} → 502 sms_failedPOST .../send-phone {"cashier_phone":"77770000010"} → successPOST .../verify-otp {"otp":"1234"} → { "success": false, "error": "invalid_otp" } — повторяемо0000 — сессия остаётся живой.| Лимит | Значение | Превышение |
|---|---|---|
| Тестовых организаций на партнёра | 20 | 429 test_org_limit |
| Создание организаций | 10 req/min | throttle |
| kaspi-auth (тестовая org) | 60 req/min | throttle (на партнёра+org) |
| kaspi-auth (боевая org) | 10 req/min | throttle (на партнёра+org) |
| Вся группа Partner API | 120 req/min | throttle (на партнёра) |
Партнёрский онбординг до выдачи X-API-Key:
X-Partner-Key в партнёрском кабинете (фронт).POST /api/partner/organizations {external_id} → org.idPOST .../{id}/kaspi-auth/init → process_idPOST .../{id}/kaspi-auth/send-phone {"cashier_phone":"77770000010"} → successPOST .../{id}/kaspi-auth/verify-otp {"otp":"0000"} → org status: verifiedPOST .../{id}/api-key → X-API-Key мерчанта + webhook_secretX-API-Key — по документации для мерчантов (/docs).GET /api/partner/organizations.
Партнёр задаёт webhook_url при выдаче X-API-Key. Формат событий и
проверка HMAC-подписи описаны в документации для мерчантов
(/docs) — здесь не дублируются.
X-Partner-Key выдаётся в партнёрском кабинете (фронт). Sandbox — сразу
self-service. Production (реальный Kaspi-auth и mode=production) — после ручного
одобрения админом; переключение режима тоже в кабинете.
Онбординг мерчанта и привязку кассира — детерминированно, без реального Kaspi и SMS (магические номера). Тестирование счетов/возвратов/webhooks — это отдельная песочница мерчанта, см. /docs.
В документации для мерчантов /docs. Партнёр задаёт
webhook_url при выдаче X-API-Key, а формат событий и проверку HMAC
мерчант (и ваш сервер) берёт из /docs.
Оформите партнёрский статус на сайте — sandbox-доступ и X-Partner-Key
выдаются в партнёрском кабинете. Прогоните привязку кассира без единого реального вызова
Kaspi, затем запросите production-доступ у админа.
Подать заявку на партнёрство →
Поддержка: WhatsApp +7 708 516 74 89