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,
      "subscriptionQrcId": null // UniQrId подписочного QR, если этот QR — рекуррентное списание (/subscription/pay); иначе null
    }
  ],
  "errorCode":    null,
  "errorMessage": null
}
Поле subscriptionQrcId заполнено, если запрошенный QR — это разовое рекуррентное списание, созданное вызовом /subscription/pay: в нём лежит uniQrId подписочного QR, по которому прошло списание. Для обычных QR поле равно null.
Статусы QR-кода
СтатусОписание
CREATEDQR-код создан, оплата ещё не начиналась.
NOT_STARTEDФинансовая операция ещё не начата.
RECEIVEDЗапрос получен, ожидает подтверждения.
ACCEPTEDОплата завершена успешно — финальный статус.
REJECTEDОплата отменена — финальный статус.
BLOCKEDQR заблокирован — финальный статус.
EXPIREDИстёк срок жизни QR-кода (TTL); оплата не поступила — финальный статус.

POST /api/payments/qr/subscription

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

Это информационная ссылка СБП — деньги при сканировании не списываются. 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"      // сохраняется шлюзом, платформе не требуется
}
  1. При status: "ACWP" (привязка подтверждена) шлюз переводит подписочный QR в статус ACCEPTED и сохраняет данные привязки (subscriptionToken и memberId) у себя. С этого момента по подписке можно выполнять списания через /subscription/pay.
subscriptionToken и memberId платформе знать не нужно — шлюз хранит их у себя и подставляет при списании. Платформе достаточно дождаться статуса ACCEPTED у подписочного QR (через /qr/status) — это значит, что счёт привязан и по подписке можно списывать.

POST /api/payments/subscription/pay

Выполняет разовое списание с привязанного счёта плательщика (рекуррентный платёж по подписке). Вызывается столько раз, сколько нужно списаний — по одному вызову на каждое.

Предварительно счёт должен быть привязан через подписочный QR: система принимает списание, только если указанный qrcId — это подписочный QR в статусе ACCEPTED (данные привязки subscriptionToken/memberId шлюз подставляет сам). Иначе вернётся ошибка SUBSCRIPTION_NOT_FOUND.

Как это работает. На каждый вызов система автоматически регистрирует новый одноразовый QR на указанную сумму и проводит по нему списание с привязанного счёта — вам делать это вручную не нужно. В ответе возвращается qrcId этого нового QR: отслеживайте зачисление по нему через /qr/status (успешное списание → статус ACCEPTED).
Тело запроса
{
  "qrcId":  "A2B3C4D5E6F7...", // UniQrId ПОДПИСОЧНОГО QR (статус ACCEPTED) (обязательно)
  "amount": 5000               // сумма списания в копейках (обязательно)
}
Успешный ответ 200 OK
{
  "isSuccess":     true,
  "qrcId":         "F9E8D7C6B5A4...", // НОВЫЙ одноразовый QR этого списания — отслеживайте через /qr/status
  "status":        "NOT_STARTED",     // статус нового QR; станет ACCEPTED после зачисления средств
  "transactionId": null,
  "errorCode":     null,
  "errorMessage":  null
}
Ошибка 400 Bad Request
{
  "errorCode":    "SUBSCRIPTION_NOT_FOUND",
  "errorMessage": "Активная подписка не найдена: проверьте qrId (подписочный QR должен быть в статусе ACCEPTED)."
}
Платформе не нужно передавать subscriptionToken/memberId — шлюз хранит их у себя с момента привязки счёта и подставляет автоматически. Достаточно, чтобы подписочный qrcId был в статусе ACCEPTED.

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.