1. Sandbox
Создайте тестовый счет, получите `invoice.id`, проверьте список счетов и отмену.
Base URL: https://pay.arzan.cloud/api. Аутентификация через
X-API-Key или Authorization: Bearer <api_key>.
Лимит публичного API: 60 req/min. Для тестов используйте
is_sandbox=true, чтобы не отправлять реальный счет в Kaspi.
curl -X POST https://pay.arzan.cloud/api/v1/invoices \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"amount": 10000,
"phone_number": "77011234567",
"description": "Order #1042",
"external_order_id": "order_1042",
"is_sandbox": true
}'
Создайте тестовый счет, получите `invoice.id`, проверьте список счетов и отмену.
Создайте endpoint, сохраните `secret`, проверьте `X-Webhook-Signature` на raw body.
Уберите `is_sandbox`, используйте `external_order_id`, не создавайте live-счета в healthcheck.
| Метод | Путь | Статус | Описание |
|---|---|---|---|
| POST | /organizations/verify | live | Проверить API key и организацию. |
| GET | /v1/me | live | Текущий мерчант и capabilities. |
| POST | /v1/invoices | live | Создать sandbox или реальный Kaspi-счет. |
| GET | /v1/invoices | live | Список счетов с pagination и фильтрами. |
| GET | /v1/invoices/{id} | live | Получить счет. |
| POST | /v1/invoices/{id}/cancel | live | Отменить pending/processing счет через Kaspi remote cancel. |
| POST | /v1/invoices/status/check | live | Проверить статусы через Kaspi remote details / QR status. |
| POST | /v1/qr | live | Создать sandbox или реальный Kaspi QR. |
| POST | /v1/invoices/{id}/refund | live | Создать возврат по оплаченному счету через Kaspi return. |
| GET/POST | /v1/refunds | live | Список и создание возвратов по оплаченным счетам/QR. |
| GET | /v1/kaspi/session | live | Мониторинг Kaspi-сессии: last success, last error, статус. |
| POST | /v1/sandbox/invoices/{id}/simulate | live | Песочница: paid, canceled, failed, pending без реального Kaspi. |
| GET/POST | /v1/webhooks | live | Настройка webhook endpoint. |
| GET/POST | /v1/webhook-deliveries | live | История доставок и retry webhook delivery. |
| GET | /v1/audit-logs | live | Audit log платежных действий. |
| GET | /v1/jobs | live | Очередь jobs/retry/dead-letter статусов. |
| POST | /v1/webhooks/{id}/test | live | Тестовая доставка webhook. |
| GET/POST | /v1/subscriptions | mvp | Подписки и очередь автосчетов. |
| GET/POST | /v1/catalog | mvp | Каталог и очередь синхронизации. |
Каждый webhook подписывается заголовком
X-Webhook-Signature: sha256=<hex>. Подпись считается как
HMAC-SHA256 от raw body с использованием webhook secret.
const expected = 'sha256=' + crypto
.createHmac('sha256', webhookSecret)
.update(rawBody)
.digest('hex')
Для create/refund endpoint'ов передавайте Idempotency-Key.
Повторный запрос с тем же ключом вернет сохраненный response и не создаст дубль.
Также external_order_id уникален внутри мерчанта.
Форма Tilda отправляет webhook на ваш bridge, bridge создает Arzan Pay invoice и получает статус через webhook.
Payment gateway создает invoice на checkout, webhook переводит order в processing/completed.
Бот спрашивает сумму и телефон, создает счет, webhook отправляет сообщение об оплате.
Робот сделки вызывает bridge, invoice id сохраняется в пользовательское поле, webhook двигает сделку.
Используйте `external_order_id`, чтобы связать чек или заказ с Arzan Pay invoice.
OpenAPI и Postman collection подходят для быстрой генерации клиента.
| 400 | invalid_phone, invalid_amount | Проверьте формат телефона и сумму. |
| 401 | api_key_required, invalid_api_key | Передайте корректный API key. |
| 404 | invoice_not_found, webhook_not_found | Объект не найден. |
| 409 | kaspi_not_connected, invoice_not_cancelable | Нужно подключить Kaspi или изменить действие. |
| 422 | validation_error | Тело запроса не прошло бизнес-валидацию. |
| 429 | rate_limit_exceeded | Используйте `Retry-After`. |
| 502 | kaspi_invoice_failed | Kaspi не принял создание счета. |