Если вы мерчант и хотите принимать платежи через Kaspi Pay в своём бизнесе — вам нужна обычная документация:
Partner API использует X-Partner-Key и предназначен для server-to-server
интеграций, когда вы онбордите сторонних мерчантов в ApiPay от своего имени.
Server-to-server документация для партнёров-интеграторов (CRM, платформы, агрегаторы)
Если вы разрабатываете CRM-систему, платёжную платформу или агрегатор и хотите
подключать своих клиентов к приёму Kaspi Pay-платежей — Partner API ApiPay создан именно
для этого. Вы получаете единый X-Partner-Key и онбордите мерчантов
программно: создаёте организацию, авторизуете кассира через Kaspi-SMS, выдаёте
X-API-Key и начинаете создавать счета от имени клиента.
Все запросы к Partner API — заголовок X-Partner-Key: <ключ>.
Ключ выдаётся командой ApiPay при одобрении заявки. В БД хранится только хеш (sha256) — восстановить невозможно. Сохраните при получении.
| Параметр | Значение |
|---|---|
| Base URL | https://bpapi.bazarbay.site |
| Заголовок аутентификации | X-Partner-Key: pk_your_partner_key |
| Content-Type | application/json |
| Rate Limit | 120 req/min (общий), 10 req/min (kaspi-auth) |
Главный кейс Partner API — партнёр онбордит мерчанта в ApiPay без ручной регистрации. Авторизация основана на Kaspi-SMS: мерчант сообщает партнёру код из SMS.
POST /api/partner/organizations — создать организацию мерчантаPOST /api/partner/organizations/{id}/kaspi-auth/init — начать авторизацию кассираPOST /api/partner/organizations/{id}/kaspi-auth/send-phone — Kaspi шлёт SMS кассируPOST /api/partner/organizations/{id}/kaspi-auth/verify-otp — подтвердить код из SMSPOST /api/partner/organizations/{id}/api-key — получить X-API-Key + webhook/api/partner/organizationsСоздать организацию мерчанта. Идемпотентно по external_id — повторный запрос вернёт существующую организацию.
Body: { "has_catalog": false, "external_id": "crm-client-42" } (оба поля опциональны)
Ответ 201 / 200: { "success": true, "organization": <card> }
/api/partner/organizationsСписок организаций партнёра с пагинацией.
Query: per_page (1–100, default 25), page (default 1)
Ответ: { "success": true, "organizations": [...], "current_page": 1, "total": 42 }
/api/partner/organizations/{id}Карточка организации.
Ответ: { "success": true, "organization": <card> }
/api/partner/organizations/{id}Отвязать организацию: деактивирует все API-ключи, soft-delete.
Ответ: { "success": true }
/api/partner/organizations/{id}/kaspi-auth/initШаг 1 онбординга. Инициировать авторизацию кассира Kaspi.
Ответ: { "success": true, "process_id": "..." } — живёт 10 минут
/api/partner/organizations/{id}/kaspi-auth/send-phoneШаг 2 онбординга. Kaspi отправляет SMS на номер кассира.
Body: { "cashier_phone": "77001234567" } (формат 7XXXXXXXXXX)
Ошибки: invalid_phone (422), not_cashier (422), no_process (409), sms_failed (502)
/api/partner/organizations/{id}/kaspi-auth/verify-otpШаг 3 онбординга. Подтвердить код из SMS (4–6 цифр).
Body: { "otp": "1234" }
Успех: { "success": true, "mode": "self", "organization": <card> }
Неверный код: { "success": false, "error": "invalid_otp" } — сессия не сбрасывается, повтор возможен
/api/partner/organizations/{id}/kaspi-auth/statusСтатус авторизации кассира.
Ответ: { "success": true, "status": "pending|active|...", "kaspi_connected": bool, "expires_at": "..." }
/api/partner/organizations/{id}/api-keyСоздать или перегенерировать X-API-Key + webhook для организации мерчанта. Идемпотентно — повторный вызов перегенерирует ключ той же записи.
Body:
{
"name": "CRM key",
"webhook_url": "https://your-crm.example.com/webhooks/kaspi",
"webhook_secret": "optional_custom_secret"
}
webhook_url проходит SSRF-валидацию (приватные IP отклоняются, 422).
{
"success": true,
"key": "<plaintext, показывается ОДИН РАЗ>",
"key_id": 200,
"webhook_url": "https://your-crm.example.com/webhooks/kaspi",
"webhook_secret": "<plaintext>",
"is_org_default": true,
"regenerated": false
}
{
"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"
}
// 1. Создать организацию мерчанта
const orgRes = await fetch('https://bpapi.bazarbay.site/api/partner/organizations', {
method: 'POST',
headers: {
'X-Partner-Key': 'pk_your_partner_key_here',
'Content-Type': 'application/json',
},
body: JSON.stringify({ external_id: 'crm-client-42' }),
})
const { organization } = await orgRes.json()
const orgId = organization.id
// 2. Инициировать авторизацию кассира
await fetch(`https://bpapi.bazarbay.site/api/partner/organizations/${orgId}/kaspi-auth/init`, {
method: 'POST',
headers: { 'X-Partner-Key': 'pk_your_partner_key_here' },
})
// 3. Передать номер кассира — Kaspi пришлёт SMS
await fetch(`https://bpapi.bazarbay.site/api/partner/organizations/${orgId}/kaspi-auth/send-phone`, {
method: 'POST',
headers: {
'X-Partner-Key': 'pk_your_partner_key_here',
'Content-Type': 'application/json',
},
body: JSON.stringify({ cashier_phone: '77001234567' }),
})
// 4. Подтвердить OTP из SMS
const verifyRes = await fetch(`https://bpapi.bazarbay.site/api/partner/organizations/${orgId}/kaspi-auth/verify-otp`, {
method: 'POST',
headers: {
'X-Partner-Key': 'pk_your_partner_key_here',
'Content-Type': 'application/json',
},
body: JSON.stringify({ otp: '1234' }),
})
// { "success": true, "mode": "self", "organization": { "status": "verified", ... } }
// 5. Получить X-API-Key для мерчанта (один раз!)
const keyRes = await fetch(`https://bpapi.bazarbay.site/api/partner/organizations/${orgId}/api-key`, {
method: 'POST',
headers: {
'X-Partner-Key': 'pk_your_partner_key_here',
'Content-Type': 'application/json',
},
body: JSON.stringify({
name: 'CRM key',
webhook_url: 'https://your-crm.example.com/webhooks/kaspi',
}),
})
const { key, webhook_secret } = await keyRes.json()
// key — сохраните в вашем хранилище, больше не показывается
// После онбординга используйте X-API-Key мерчанта
const invoiceRes = await fetch('https://bpapi.bazarbay.site/api/v1/invoices', {
method: 'POST',
headers: {
'X-API-Key': 'merchant_api_key_obtained_during_onboarding',
'Content-Type': 'application/json',
},
body: JSON.stringify({
amount: 15000,
phone_number: '87001234567',
description: 'Оплата заказа #123',
external_order_id: 'order_123',
}),
})
const { id, status } = await invoiceRes.json()
curl -X GET 'https://bpapi.bazarbay.site/api/partner/organizations?per_page=25&page=1' \
-H 'X-Partner-Key: pk_your_partner_key_here'
| Группа | Лимит |
|---|---|
| partner-api (вся группа) | 120 req/min на партнёра |
| partner-kaspi-auth (send-phone, verify-otp) | 10 req/min на партнёра + организацию |
| Код | Описание |
|---|---|
| 401 | Неверный или отсутствующий X-Partner-Key |
| 403 | Нет доступа к ресурсу |
| 409 | Конфликт: no_process, already_exists |
| 422 | Ошибка валидации: invalid_phone, not_cashier, SSRF в webhook_url |
| 502 | Kaspi API недоступен: sms_failed |
{
"success": false,
"error": "error_code"
}
// или для ошибок валидации:
{
"success": false,
"errors": {
"field_name": ["описание ошибки"]
}
}
Оформите партнёрский статус на сайте и получите X-Partner-Key.
После одобрения вы сможете онбордить мерчантов программно через этот API.
Подать заявку на партнёрство →
Поддержка: WhatsApp +7 708 516 74 89