1. Введение

Exenta Pay API позволяет создавать счета на оплату, проверять статусы и получать уведомления на ваш сервер. Все запросы выполняются в формате JSON по протоколу HTTPS.

Базовый URL

https://exenta.pro/api/v1

Ответы обёрнуты в объект { "success": true, "data": { ... } }. Суммы передаются строкой целого числа в копейках — например "249000" это 2 490,00 ₽.

2. Авторизация

Для запросов к API передайте ключи в заголовках. Ключи создаются в кабинете в разделе API.

KeyValue
X-Api-KeyПубличный ключ, формат pk_…
X-Api-SecretСекретный ключ, формат sk_…
Секретный ключ храните только на сервере. В кабинете его можно посмотреть в любой момент.

3. Балансы

После успешной оплаты средства зачисляются на холд. Через 2 дня они автоматически переходят на доступный баланс — только с него можно создавать выплаты.

ПолеТипОписание
availableBalancestringДоступно для вывода, в копейках
holdBalancestringНа холде, станет доступным через 2 дня
GET/balances

Балансы мерчанта по валютам. Требует API-ключ.

Пример ответа

JSON
{
  "success": true,
  "data": {
    "availableBalance": "100000",
    "holdBalance": "50000"
  }
}

4. Payments

POST/payments

Создаёт счёт и возвращает uuid для ссылки на оплату /pay/{uuid}.

Параметры тела запроса

ПараметрТипОбяз.Описание
currencyCodestringдаКод валюты. Сейчас: RUB
amountstringдаСумма счёта в копейках
descriptionstringнетНазначение платежа
successUrlstringнетРедирект после успешной оплаты
failedUrlstringнетРедирект при ошибке или отмене

Пример запроса

curl -X POST https://exenta.pro/api/v1/payments \
  -H "X-Api-Key: pk_ваш_ключ" \
  -H "X-Api-Secret: sk_ваш_секрет" \
  -H "Content-Type: application/json" \
  -d '{
    "currencyCode": "RUB",
    "amount": "249000",
    "description": "Заказ #48291",
    "successUrl": "https://shop.example.com/success",
    "failedUrl": "https://shop.example.com/failed"
  }'

Ответ

JSON
{
  "success": true,
  "data": {
    "uuid": "550e8400-e29b-41d4-a716-446655440000",
    "amount": "249000",
    "status": "PENDING"
  }
}
GET/payments

Список платежей вашего аккаунта.

Query-параметры

ПараметрТипОбяз.Описание
pagenumberнетСтраница, по умолчанию 1
limitnumberнетЗаписей на странице, по умолчанию 20
statusstringнетPENDING, SUCCESS, FAILED, CANCELLED
GET/payments/{uuid}

Данные и текущий статус платежа.

Статусы

СтатусОписание
PENDINGОжидает оплаты
SUCCESSОплачен
FAILEDОшибка
CANCELLEDОтменён
GET/payments/checkout/{uuid}

Публичные данные для страницы оплаты. API-ключ не нужен.

ПолеТипОписание
amountstringСумма к оплате
qrPayloadstringДанные QR-кода СБП
expiresAtstringСрок действия ссылки (15 мин)
successUrlstringРедирект после успеха
failedUrlstringРедирект при ошибке

5. Webhook

Exenta Pay отправляет POST на ваш URL при изменении статуса платежа. URL настраивается в кабинете → Webhooks.

POST/webhooks/configure

Настройка URL для получения событий.

Тело запроса

JSON
{
  "projectId": 1,
  "webhookUrl": "https://your-site.com/webhooks/exenta"
}
В ответе выдаётся webhookSecret — сохраните его для проверки подписи.

Подпись запроса

Каждый webhook содержит заголовки:

ЗаголовокОписание
X-Webhook-EventТип события, например payment.success
X-Webhook-SignatureHMAC-SHA256 подпись тела запроса
Content-Typeapplication/json

Тело запроса

JSON
{
  "event": "payment.success",
  "data": {
    "paymentUuid": "550e8400-e29b-41d4-a716-446655440000",
    "amount": "249000",
    "netAmount": "236550",
    "status": "SUCCESS"
  },
  "timestamp": "2026-06-08T14:30:00.000Z"
}

Проверка подписи (Node.js)

Node.js
const crypto = require("crypto");

function verifyWebhook(rawBody, signature, secret) {
  const expected = crypto
    .createHmac("sha256", secret)
    .update(rawBody)
    .digest("hex");
  return crypto.timingSafeEqual(
    Buffer.from(signature),
    Buffer.from(expected)
  );
}
Отвечайте HTTP 200 в течение 10 секунд. При ошибке — до 5 повторных попыток с экспоненциальной задержкой.

События

СобытиеОписание
payment.successПлатёж оплачен. Средства зачислены на холд-баланс
webhook.testТестовое событие из кабинета
ПолеТипОписание
paymentUuidstringUUID платежа
amountstringСумма оплаты в копейках
netAmountstringЗачисление мерчанту после комиссии
statusstringSUCCESS