RolliePay
RolliePayМерчантам
API Documentation

Документация для мерчантов

Интегрируйте RolliePay в свой проект за несколько часов. Принимайте P2P-платежи через карты, СБП и переводы.

REST APIWebhooksJSONHTTPS

Введение

RolliePay — процессинговая платформа для приёма P2P-платежей. Мерчант создаёт платёж через API, система автоматически назначает оператора с подходящими реквизитами. Покупатель переводит деньги напрямую оператору, после чего оператор подтверждает получение.

Создайте платёж

POST /api/payments/create с суммой и методом

Перенаправьте

Покупатель оплачивает по реквизитам оператора

Получите webhook

Уведомление об успехе или неуспехе

Аутентификация

Все запросы к API должны содержать ваш API-ключ в заголовке X-Api-Key. Ключ выдаётся администратором и начинается с mk_.

X-Api-Key: mk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Храните API-ключ в переменных окружения. Никогда не публикуйте его в клиентском коде или репозитории.

Создать платёж

Основная операция — создание платежа. В ответ получаете объект платежа с реквизитами оператора.

POST
/api/payments/create

Создать новый платёж

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

ПолеТипОбяз.Описание
amountnumberСумма платежа в рублях
currencystring"RUB"
methodstring"card" | "sbp" | "c2c"
traffic_typestring"classic" | "bt" | "mk". Для Onyx влияет на плавающий процент; по умолчанию "classic".
order_idstringВаш внутренний ID заказа. Возвращается без изменений в webhook — используйте для сверки.
callback_urlstringURL для webhook-уведомлений
success_urlstringРедирект при успешной оплате
fail_urlstringРедирект при неуспешной оплате
customer_emailstringEmail покупателя
descriptionstringОписание платежа
Для мерчанта Onyx поле traffic_type выбирает тариф: classic — до 5 000 ₽: 17%, от 5 000 до 9 999 ₽: 16%, от 10 000 ₽: 12%; bt — 18%; mk — 18.5%.

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

curl -X POST https://merch-production-f1cb.up.railway.app/api/payments/create \
  -H "Content-Type: application/json" \
  -H "X-Api-Key: mk_ваш_ключ" \
  -d '{
    "amount": 1000,
    "currency": "RUB",
    "method": "card",
    "traffic_type": "classic",
    "order_id": "ORDER-123",
    "callback_url": "https://yoursite.com/webhook",
    "success_url": "https://yoursite.com/success",
    "fail_url": "https://yoursite.com/fail"
  }'

Ответ

{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "amount": 1000,
  "currency": "RUB",
  "method": "card",
  "traffic_type": "classic",
  "status": "pending",
  "order_id": "ORDER-123",
  "expires_at": "2024-01-15T12:30:00Z",
  "created_at": "2024-01-15T12:00:00Z",
  "requisite": {
    "type": "card",
    "bank": "sberbank",
    "value": "4276 **** **** 1234",
    "owner_name": "Иван И."
  }
}

Статус платежа

Получить текущий статус платежа по его UUID (без авторизации — для страницы покупателя).

GET
/api/payments/:id/public

Публичный статус платежа (без авторизации)

curl https://merch-production-f1cb.up.railway.app/api/payments/550e8400-e29b-41d4-a716-446655440000/public
Используйте этот эндпоинт для страницы ожидания оплаты — опрашивайте каждые 5 секунд и редиректьте при статусе success или failed.

Статусы платежей

СтатусОписаниеФинальный
pendingОжидает оплаты от покупателя
successОплата подтверждена оператором
failedПлатёж не прошёл / открыт спор
expiredИстекло время ожидания (30 мин)
cancelledОтменён

Webhook

При изменении статуса платежа RolliePay отправляет POST-запрос на ваш callback_url. Ваш сервер должен вернуть 200 OK.

События

payment.success

Сейчас отправляется только событие успешной оплаты. Для отслеживания истёкших и неуспешных платежей опрашивайте GET /api/payments/:id/public.

Тело запроса

Webhook отправляется плоским JSON-объектом (без вложенности). Поля:

ПолеТипОписание
eventstringТип события, напр. "payment.success"
payment_idstringUUID платежа в RolliePay
order_idstringВаш ID заказа — то же значение, что вы передали в order_id при создании платежа. Используйте его для сверки со своей системой.
amountnumberСумма платежа в рублях
currencystring"RUB"
methodstring"card" | "sbp" | "c2c"
traffic_typestring"classic" | "bt" | "mk"
statusstringСтатус платежа, напр. "success"
fee_amountnumberКомиссия платформы в рублях
tx_hashstring | nullХеш транзакции (null для P2P)
created_atstringISO-дата создания платежа
timestampnumberUnix-время (мс) отправки webhook
POST https://yoursite.com/webhook
Content-Type: application/json
X-Webhook-Event: payment.success
X-Webhook-Signature: sha256=<hmac>

{
  "event": "payment.success",
  "payment_id": "a09f36b0-05a5-4f30-8b3c-6e60450cfb5e",
  "order_id": "ORDER-123",
  "amount": 3065,
  "currency": "RUB",
  "method": "c2c",
  "traffic_type": "classic",
  "status": "success",
  "fee_amount": 459.75,
  "tx_hash": null,
  "created_at": "2026-06-10T19:50:58.586Z",
  "timestamp": 1781121457358
}
order_id в webhook — это ваш собственный идентификатор, который вы передали при создании платежа. Если вы его не передавали, поле будет null. Поле payment_id — это UUID платежа на стороне RolliePay.

Проверка подписи

Каждый webhook содержит заголовок X-Webhook-Signature в формате sha256=<hmac>. Это HMAC-SHA256 от сырого тела запроса с вашим секретом. Сравните его со своим расчётом, чтобы убедиться в подлинности.

const crypto = require('crypto');

const raw = JSON.stringify(req.body); // сырое тело запроса
const expected = 'sha256=' + crypto
  .createHmac('sha256', WEBHOOK_SECRET)
  .update(raw)
  .digest('hex');

if (req.headers['x-webhook-signature'] !== expected) {
  return res.sendStatus(401); // подпись не совпала
}
Дополнительно проверяйте статус через GET /api/payments/:id/public — webhook может не дойти при временных сетевых сбоях.

Примеры интеграции

Node.js / Express — обработка webhook

app.post('/webhook', express.json(), async (req, res) => {
  const { event, order_id, payment_id, amount, status } = req.body;

  if (event === 'payment.success') {
    // order_id — ваш ID заказа, переданный при создании платежа
    await creditsService.add(order_id, amount);
  }

  res.sendStatus(200); // обязательно вернуть 200
});

Методы оплаты

methodОписаниеВалюта
cardПеревод на банковскую картуRUB
sbpСБП — Система быстрых платежейRUB
c2cCard2Card переводRUB

Ошибки

HTTPmessageПричина
401Invalid API keyНеверный или отсутствующий X-Api-Key
400Validation failedНеверные параметры запроса
404Payment not foundПлатёж с таким ID не существует
503No operators availableНет доступных операторов для суммы/метода

Нужна помощь с интеграцией?

Наш менеджер ответит на все вопросы по API и настройке

Написать в Telegram