Paygrator Войти в кабинет

Документация Paygrator API

Paygrator API позволяет платформам создавать QR-коды СБП, принимать платежи по подписке, получать статусы операций и выполнять возвраты.

Base URL
https://api.paygrator.pro/api/payments
{BASE_URL}
https://api.paygrator.pro — используется в примерах ниже
Формат
JSON (Content-Type: application/json)
Кодировка
UTF-8

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

Каждый запрос должен содержать заголовок X-Api-Token с токеном платформы. Токен выдаётся администратором системы и привязан к контракту платформы.

X-Api-Token: ваш_токен_платформы
При отсутствии или неверном токене сервер возвращает 401 Unauthorized.
Ограничение по IP-адресам

Для каждого токена администратор может задать список разрешённых IP-адресов. Если список задан — запросы с любых других адресов будут отклонены с кодом 401 Unauthorized до проверки самого токена.

Список задаётся строкой с IP-адресами через запятую:

192.168.1.10, 10.0.0.5, 203.0.113.42
Значение поляПоведение
Не задано (пусто) Запросы принимаются с любого IP-адреса.
192.168.1.10, 10.0.0.5 Запросы принимаются только с указанных адресов; остальные получают 401.
Поддерживаются только точные IPv4 и IPv6 адреса. CIDR-диапазоны (192.168.1.0/24) не поддерживаются. Пробелы вокруг запятых игнорируются.

Лимиты

Каждый контракт платформы имеет два ограничения, задаваемых администратором:

ПараметрОписание
MaxAmountPerTransaction Максимальная сумма одной транзакции (в копейках).
MaxDailyAmount Максимальная суммарная сумма транзакций за сутки UTC (в копейках).

При превышении любого лимита запрос возвращает 400 Bad Request с описанием причины в поле error.

Формат ошибок

При ошибке сервер возвращает HTTP 400 Bad Request с телом:

{
  "errorCode":    "КОД_ОШИБКИ",   // код банка или внутренний (может быть null)
  "errorMessage": "Описание"      // читаемое сообщение об ошибке
}

Возможные внутренние ошибки:

СценарийОтвет
Неверный или отсутствующий токен401 Unauthorized
Активный контракт не найден400Активный контракт не найден.
Превышен лимит на транзакцию400Превышен лимит на транзакцию.
Превышен суточный лимит400Превышен суточный лимит.
Неподдерживаемая валюта400Валюта '...' не поддерживается.

Эндпоинты

POST /api/payments/qr/onetime

Создаёт одноразовый QR-код СБП для приёма оплаты. После первой успешной оплаты QR-код переходит в статус ACCEPTED и становится недействительным.

Тело запроса
{
  "amount":         10000,                  // сумма в копейках (обязательно)
  "currency":       "RUB",                  // валюта ISO 4217 (обязательно)
  "purpose":        "Оплата заказа #1234",  // назначение платежа (опционально)
  "redirectUrl":    "https://example.com/return", // URL редиректа после оплаты (опционально)
  "ttlMinutes":     15,                     // время жизни QR в минутах (опционально)
  "imageMediaType": "image/png",            // формат изображения: "image/png" или "image/svg+xml" (опционально)
  "imageSize":      300                     // размер изображения в пикселях 200–1000, по умолчанию 300 (опционально)
}
Успешный ответ 200 OK
{
  "isSuccess":      true,
  "uniQrId":        "A2B3C4D5E6F7...",    // идентификатор QR в системе банка
  "payload":        "https://qr.nspk.ru/...", // SBP-ссылка для генерации QR
  "status":         "CREATED",
  "imageMediaType": "image/png",           // null если imageMediaType не был передан
  "imageContent":   "iVBORw0KGgo...",     // QR-изображение в base64, null если не запрошено
  "errorCode":      null,
  "errorMessage":   null
}
Важно: сумма передаётся в копейках. Например, 100 рублей = "amount": 10000. Поля imageMediaType и imageContent заполняются только если в запросе передан imageMediaType.

POST /api/payments/qr/reusable

Создаёт многоразовый QR-код для привязки счёта плательщика (C2B Подписка). Плательщик сканирует QR, подтверждает привязку — после этого можно инициировать списания без повторного сканирования.

Тело запроса
{
  "purpose":        "Ежемесячная подписка",       // назначение (обязательно)
  "redirectUrl":    "https://example.com/return", // URL редиректа после привязки (опционально)
  "amount":         50000,                        // фиксированная сумма списания в копейках (опционально)
  "currency":       "RUB",                        // валюта, обязательна при указании amount (опционально)
  "ttlMinutes":     1440,                         // время жизни QR в минутах (опционально)
  "imageMediaType": "image/png",                  // формат изображения: "image/png" или "image/svg+xml" (опционально)
  "imageSize":      300                           // размер изображения в пикселях 200–1000, по умолчанию 300 (опционально)
}
Успешный ответ 200 OK
{
  "isSuccess":      true,
  "uniQrId":        "A2B3C4D5E6F7...",
  "payload":        "https://qr.nspk.ru/...",
  "status":         "CREATED",
  "imageMediaType": "image/png",           // null если imageMediaType не был передан
  "imageContent":   "iVBORw0KGgo...",     // QR-изображение в base64, null если не запрошено
  "errorCode":      null,
  "errorMessage":   null
}

GET /api/payments/qr/status

Возвращает текущий статус одного или нескольких QR-кодов. Можно опрашивать до получения финального статуса (ACCEPTED / REJECTED).

Query-параметры
ПараметрТипОписание
uniQrIds string Идентификаторы QR через запятую. Пример: A1B2,C3D4
Пример запроса
GET {BASE_URL}/api/payments/qr/status?uniQrIds=A2B3C4D5E6F7
X-Api-Token: ваш_токен_платформы
Успешный ответ 200 OK
{
  "isSuccess": true,
  "items": [
    {
      "uniQrId": "A2B3C4D5E6F7...",
      "status": "ACCEPTED", // CREATED | NOT_STARTED | RECEIVED | ACCEPTED | REJECTED | BLOCKED | EXPIRED
      "transactionId": "TXN123456789", // null если оплата ещё не произошла
      "errorCode": null,
      "errorMessage": null,
      "subscriptionToken": "a1b2c3d4-...", // только для подписочных QR; null пока счёт не привязан
      "memberId": "100000000111" // только для подписочных QR; null пока счёт не привязан
    }
  ],
  "errorCode":    null,
  "errorMessage": null
}
Статусы QR-кода
СтатусОписание
CREATEDQR-код создан, оплата ещё не начиналась.
NOT_STARTEDФинансовая операция ещё не начата.
RECEIVEDЗапрос получен, ожидает подтверждения.
ACCEPTEDОплата завершена успешно — финальный статус.
REJECTEDОплата отменена — финальный статус.
BLOCKEDQR заблокирован — финальный статус.
EXPIREDИстёк срок жизни QR-кода (TTL); оплата не поступила — финальный статус.

POST /api/payments/qr/subscription

Создаёт подписочный QR-код СБП для привязки счёта плательщика. После сканирования плательщик подтверждает привязку в приложении своего банка — система получает subscriptionToken и memberId, необходимые для последующих списаний через /subscription/pay.

Это информационная ссылка СБП — деньги при сканировании не списываются. QR предназначен исключительно для привязки счёта.
Тело запроса
{
  "purpose":        "Ежемесячная подписка",       // описание для плательщика, до 140 символов (опционально)
  "redirectUrl":    "https://example.com/return", // URL возврата после привязки (опционально)
  "ttlMinutes":     1440,                         // время жизни QR в минутах (опционально)
  "imageMediaType": "image/png",                  // формат изображения: "image/png" или "image/svg+xml" (опционально)
  "imageSize":      300                           // размер изображения в пикселях 200–1000 (опционально)
}
Успешный ответ 200 OK
{
  "isSuccess":      true,
  "uniQrId":        "A2B3C4D5E6F7...",    // идентификатор QR в системе банка
  "payload":        "https://qr.nspk.ru/...", // SBP-ссылка для генерации QR
  "status":         "CREATED",
  "imageMediaType": "image/png",           // null если imageMediaType не был передан
  "imageContent":   "iVBORw0KGgo...",     // QR-изображение в base64, null если не запрошено
  "errorCode":      null,
  "errorMessage":   null
}
Флоу привязки счёта
  1. Платформа вызывает POST /api/payments/qr/subscription и получает uniQrId и payload.
  2. Плательщик сканирует QR в приложении своего банка и подтверждает привязку.
  3. Банк отправляет уведомление на URL CallbackSubscriptionUrl с параметрами:
{
  "qrcId":             "A2B3C4D5E6F7...",  // совпадает с uniQrId
  "status":            "ACWP",             // ACWP — привязан, RJCT — отказ
  "subscriptionToken": "TOKEN_VALUE",      // сохраните для списаний
  "memberId":          "100000012000"      // ID банка плательщика, сохраните для списаний
}
subscriptionToken и memberId нужны для каждого вызова /subscription/pay. Мы сохраняем их у себя при получении уведомления, поэтому платформа может в любой момент получить их через /qr/status (поля subscriptionToken и memberId) — отдельно сохранять уведомление не обязательно.

POST /api/payments/subscription/pay

Инициирует списание денежных средств с привязанного счёта плательщика (C2B Подписка). Требует предварительно привязанного счёта через подписочный QR.

Тело запроса
{
  "qrcId":             "A2B3C4D5E6F7...", // UniQrId подписочного QR (обязательно)
  "memberId":          "MEMBER_ID",        // идентификатор плательщика от банка (обязательно)
  "subscriptionToken": "TOKEN_VALUE",      // токен подписки от банка (обязательно)
  "amount":            5000                // сумма в копейках (обязательно)
}
Успешный ответ 200 OK
{
  "isSuccess":    true,
  "transactionId": null,  // transactionId появляется асинхронно, отслеживайте через /operation/info
  "errorCode":    null,
  "errorMessage": null
}
Параметры memberId и subscriptionToken передаёт банк через уведомление о привязке счёта на URL вашего callback-сервера.

GET /api/payments/operation/info

Запрашивает актуальный статус операции у банка по transactionId и обновляет запись в системе.

Query-параметры
ПараметрТипОписание
transactionId string Идентификатор транзакции, полученный ранее.
Пример запроса
GET {BASE_URL}/api/payments/operation/info?transactionId=TXN123456789
X-Api-Token: ваш_токен_платформы
Успешный ответ 200 OK
{
  "isSuccess":     true,
  "transactionId": "TXN123456789",
  "type":          "C2BQRS",         // тип операции из СБП
  "status":        "ACCEPTED",       // статус операции
  "fpMessageId":   "FP_MSG_ID",      // идентификатор ОПКЦ СБП
  "origSbpId":     null,             // исходный SBP-идентификатор (для возвратов)
  "errorCode":     null,
  "errorMessage":  null
}

POST /api/payments/transfer/rollback

Инициирует автоматический возврат (откат) подписочного перевода по QR-коду. Используется для отмены операции, инициированной через подписку. Статус отслеживается асинхронно через /operation/info.

Тело запроса
{
  "qrcId": "A2B3C4D5E6F7..."  // UniQrId QR-кода (обязательно)
}
Успешный ответ 200 OK
{
  "isSuccess":     true,
  "transactionId": "TXN_ROLLBACK_ID",  // transactionId операции отката
  "errorCode":     null,
  "errorMessage":  null
}

POST /api/payments/payment/refund

Одношаговый возврат платежа по оригинальной транзакции. Инициирует возврат и автоматически подтверждает его в фоне. Фоновый процесс циклически опрашивает статус до получения финального результата.

Тело запроса
{
  "transactionId": "TXN123456789",           // transactionId исходного платежа (обязательно)
  "amount":        5000,                     // сумма возврата в копейках (обязательно)
  "currency":      "RUB",                    // валюта ISO 4217 (обязательно)
  "comment":       "Возврат по запросу клиента" // комментарий (опционально)
}
Успешный ответ 200 OK
{
  "isSuccess":     true,
  "transactionId": "TXN_REFUND_ID",  // transactionId операции возврата
  "errorCode":     null,
  "errorMessage":  null
}
Частичный возврат поддерживается — передайте сумму меньше оригинальной транзакции. Результат подтверждения отслеживайте через /operation/info по полученному transactionId.