VangardPay — Merchant Portal

Единый портал для мерчантов VangardPay — руководство по работе с платформой, управлению балансом, разрешению апелляций и интеграции по API.

work Merchant Dashboard

Вывод средств

Доступный баланс отображается на главном экране Dashboard. Для вывода нажмите «Вывести».

Параметр Значение
Комиссия за вывод 3.5 USDT за операцию
Время обработки до 60 минут в рабочие часы (10:00–00:00 МСК)
Допустимые адреса Только верифицированные кошельки. При использовании нескольких адресов — предварительно согласуйте с финансовым отделом
block
Вывод на площадки, находящиеся под санкциями, запрещён. Такие транзакции будут отклонены.

История операций

Раздел отображает полную историю движения средств по вашему балансу.

Доступные фильтры:

Данные в таблице:

Столбец Описание
ID Уникальный идентификатор операции (UUID)
Дата Дата и время создания операции
Тип Тип операции: CREDIT, DEBIT, DEPOSIT, WITHDRAW, FREEZE, UNFREEZE, DEDUCT
Сумма Сумма операции в USDT
Баланс до Состояние баланса до операции
Баланс после Состояние баланса после операции
Тип баланса Категория баланса: WORKING (рабочий) или FROZEN (замороженный)
Описание Описание операции и номер связанного ордера

Финансовая отчётность (экспорт)

Выгрузка статистики в формате Excel за произвольный период.

Как выгрузить:

  1. Откройте Настройки → Отчётность
  2. Укажите период (начальная и конечная дата)
  3. Нажмите «Экспорт»

Состав отчёта:


История транзакций

Раздел содержит все транзакции в финальном статусе: Успешно или Отклонено.

Типичные причины отклонения:

Доступные фильтры: дата, статус, способ оплаты, внешний ID (ExtID), внутренний ID.

Данные в таблице:

Столбец Описание
Статус Успешно / Отклонено
Баланс (USDT) Баланс после операции
Сумма (USDT) Эквивалент в USDT
Курс Курс конвертации
Сумма (фиат) Сумма в локальной валюте
Реквизиты Маскированные данные получателя
Дата Дата и время создания
Метод Способ оплаты (Card / SBP / QR)
#ID Уникальный идентификатор транзакции

balance Апелляции

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

Классификация апелляций

Категория A. Ошибка плательщика

Качество информирования плательщика на платёжной форме напрямую влияет на количество апелляций. Рекомендуем максимально проработать UX вашей платёжной страницы.

Код Тип Описание
A-1 Неполная оплата Плательщик перевёл сумму меньше указанной в ордере. Распространённые причины: удержание комиссии банком, невнимательность, ошибка ввода
A-2 Избыточная оплата Перечислена сумма больше указанной. При значительном превышении (например, реквизиты на 5 000, оплата 500 000) существует высокий риск, что средства не будут зачислены
A-3 Просроченная оплата Перевод выполнен после истечения срока действия ордера. Платформа не несёт ответственности за такие переводы
A-4 Устаревшие реквизиты Плательщик использовал реквизиты из предыдущего ордера для оплаты нового
A-5 Неверный банк-получатель При оплате через СБП указан конкретный банк, но перевод направлен в другой. Средства могут поступить на заблокированный счёт
A-6 Дробление платежа Оплата одного ордера несколькими переводами. Автоматическое сопоставление невозможно — требуется ручная обработка

Категория B. Фрод

Код Тип Описание
B-1 Поддельное подтверждение Предоставлен сфальсифицированный чек или скриншот
B-2 Повторное использование чека Один чек используется для подтверждения нескольких разных ордеров
B-3 Прочее Иные случаи мошенничества. Детали предоставляются в рамках индивидуального разбора

Категория C. Техническая ошибка

В редких случаях автоматика платформы может не обработать корректный платёж. Причины: сбой на стороне банка, задержка SMS-подтверждения, проблемы со связью. VangardPay постоянно совершенствует систему для минимизации таких случаев.


Требования к доказательствам

Для успешного рассмотрения апелляции необходимо предоставить подтверждающие документы в одном из следующих форматов:

Банковский чек (PDF)

Видеозапись экрана

Банковская выписка

Аудиозапись звонка в банк


Процедура рассмотрения апелляций

analytics Диаграмма процесса (см. описание ниже)
warning
Апелляция считается активной только после того, как связанная транзакция перейдёт в финальный статус «Отклонено». До этого момента заявка не рассматривается.

Подача апелляции

Мерчант создаёт апелляцию через API (рекомендуется) или через Портал апелляций. Апелляция поступает трейдеру на рассмотрение.

lightbulb
Рекомендация: прикладывайте видеозапись экрана сразу при создании апелляции. Это ускоряет рассмотрение и позволяет закрыть спор на первом этапе — без промежуточных запросов.

Рассмотрение трейдером

Вторичная апелляция (2 этапа)

Вторичная апелляция возможна только при отклонении по причине «Платёж не обнаружен». Следующие причины отклонения являются окончательными и не подлежат вторичной апелляции:

warning
Максимальное количество раундов по одной транзакции — 2 (первичная апелляция → вторичная апелляция). После этого вопрос закрыт.

Иерархия веса доказательств (от слабого к сильному):

Приоритет Тип доказательства
1 (низший) Чек плательщика (PDF)
2 Банковская выписка (трейдера или плательщика)
3 Видеозапись плательщика
4 (высший) Видеозапись трейдера

Этап 1. Первичная апелляция

Мерчант создаёт апелляцию и прикладывает чек плательщика. Апелляция поступает трейдеру.

Действия трейдера:

warning
Важно: при отклонении трейдер обязан приложить банковскую выписку, подтверждающую отсутствие поступления. Отклонение без выписки не принимается системой.

После отклонения апелляция передаётся саппорту — саппорт проверяет документы трейдера и пересылает их мерчанту с запросом дополнительных доказательств (видео).

Действия мерчанта (ожидание ответа):

lightbulb
Шорткат: если мерчант приложил видеозапись (а не чек) сразу при создании первичной апелляции, трейдер может отклонить её только приложив встречное видео. Вторичная апелляция в этом случае исключается — вопрос решается сразу.

Этап 2. Вторичная апелляция

Трейдер получает вторичную апелляцию с видео плательщика.

Действия трейдера:

info
Почему 3 банковских дня?
  • Платёж может находиться на проверке службой безопасности банка
  • Банку требуется до 3 рабочих дней на рассмотрение
  • За это время платёж либо зачислится, либо вернётся отправителю
lightbulb
Рекомендация: прикладывайте видеозапись плательщика сразу при создании первичной апелляции. Это позволяет закрыть спорную ситуацию быстрее — без промежуточных этапов и дополнительных запросов.

Сроки рассмотрения (SLA)

Служба апелляций работает круглосуточно, 7 дней в неделю.

Возраст транзакции Время суток (МСК) Максимальный срок ответа
0–48 часов 10:00–23:59 45 минут
0–48 часов 00:00-10:00 До 10:00 утра
2–14 дней любое 5 банковских дней
Вторичная апелляция (срок ответа трейдера) любое 3 банковских дня
Ответ мерчанта на доказательства трейдера любое 24 часа (минимум один документ: чек PDF / видео; текст без документа — не ответ)
Старше 14 дней Не принимается

currency_exchange Расчёты и конвертация

Курсообразование

Все расчёты на платформе выполняются по рыночному курсу, сформированному на основе агрегированных данных P2P-площадок (ByBit, Rapira и др.). Курс обновляется в реальном времени.

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


Формула начислений

При зачислении средств на баланс мерчанта из суммы платежа удерживается комиссия. Расчёт производится в три этапа.

Исходные данные:

Все промежуточные значения округляются до 2 знаков после запятой по стандартным математическим правилам (≥ 0.005 → вверх).

Этап Формула Пример (amount=10 000₽, rate=95.53, fee=12%)
1. Конвертация в USDT usdt = round(amount / rate, 2) round(10000 / 95.53, 2) = 104.68
2. Расчёт комиссии commission = round(usdt × fee / 100, 2) round(104.68 × 12 / 100, 2) = 12.56
3. Зачисление на баланс credit = usdt − commission 104.68 − 12.56 = 92.12 USDT

gavel Правила и ответственность

Настоящий раздел определяет обязательства мерчанта при работе с платформой VangardPay. Нарушение условий может повлечь финансовую ответственность в соответствии с заключённым договором.

1. Соответствие согласованным параметрам трафика

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

2. Раскрытие информации об источниках трафика

Мерчант обязан предоставлять полные и достоверные сведения обо всех источниках трафика. Сокрытие информации или предоставление ложных данных влечёт ответственность согласно условиям договора.

3. Добросовестность транзакций

Мерчант несёт ответственность за качество предоставляемых заявок. Намеренная подача недобросовестных или фиктивных ордеров является грубым нарушением условий сотрудничества.

4. Комплаенс при обменных операциях

Использование платформы для приобретения плательщиком товаров, предметов или услуг, запрещённых законодательством соответствующей юрисдикции, строго запрещено.

5. Компенсация убытков

Если действия мерчанта или плательщиков, действующих от имени мерчанта, привели к материальному ущербу для трейдеров платформы, мерчант обязан возместить убытки в полном объёме. Возмещение производится путём списания средств с баланса после предоставления платформой обоснованных доказательств.

Ежемесячно (30-го числа) VangardPay направляет мерчанту акт сверки с детализацией всех случаев.

6. Информирование плательщиков

Мерчант обязан доводить до плательщиков правила совершения платежей и последствия их нарушения. Рекомендуется размещать краткую инструкцию непосредственно на платёжной форме.

7. Защита от автоматизированных атак

Мерчант обязан реализовать на своей стороне защиту от парсинга и перебора платёжных реквизитов (rate limiting, CAPTCHA, мониторинг аномалий).



API Reference

Полная техническая документация для интеграции с платёжной платформой VangardPay. Все запросы выполняются через HTTPS.

vpn_key

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

API-ключ выдаётся администратором. Передавайте его в заголовке X-API-Key

webhook

Вебхуки

POST на ваш callbackUrl при изменении статуса ордера. HMAC-SHA256 подпись.

dns

Базовый URL

https://api.vangardpay.com

rocket_launch Быстрый старт

Четыре шага, чтобы начать принимать платежи:

ШагДействиеПодробнее
1Получите доступ к Merchant Dashboard от вашего менеджера
2Получите X-API-Key у администратора VangardPayКлюч выдаётся вручную
3Выполните тестовый платёж в Sandbox-средеH2H API или Payment Page
4Переключитесь на Production и начните приём платежейDashboard → Настройки

Способы интеграции

code

Ордера Pay-in

Создание ордеров на пополнение через API. Вы сами строите платёжную форму. Полный контроль над UX.

→ Перейти к Pay-in API

web

Платёжная страница

Создание сессии → редирект на страницу VangardPay. Клиент выбирает сумму и метод сам.

→ Перейти к Payment Page API

Формат ответов

Все ответы в формате JSON. Успешные запросы возвращают данные напрямую. При ошибке — стандартный объект ошибки.

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

Все ошибки возвращаются в унифицированном формате с типизированным errorCode. Полный список кодов — в разделе Коды ошибок внизу страницы.

{
  "statusCode": 404,
  "errorCode": "ORDER_NOT_FOUND",
  "message": "Ордер не найден",
  "details": null,
  "timestamp": "2026-03-18T12:00:00.000Z",
  "path": "/api/v1/orders/by-id/..."
}

code Ордера Pay-in

Создание ордеров на пополнение через API с заголовком X-API-Key.

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

Поле method определяет, какие реквизиты будут подобраны для ордера. Каждый метод имеет свои обязательные и необязательные поля.

МетодОписаниеДоп. поля в запросеРеквизиты в ответе
CARD_NUMBERПеревод на банковскую карту. По умолчанию, если method не указан.cardNumber (необязательно), bankrequisite.cardNumber, requisite.holder.bank
SBPПеревод через Систему быстрых платежей (по номеру телефона).phoneNumber (необязательно), bankrequisite.sbpPhoneNumber, requisite.holder.bank
ACCOUNT_TRANSFERПеревод на банковский счёт (для юридических лиц и крупных сумм).accountNumber (необязательно), bankrequisite.accountNumber, requisite.holder.bank

Внутрибанковский трафик

При указании поля bank в запросе система подберёт реквизиты только того же банка. Это обеспечивает внутрибанковский перевод — быстрее, надёжнее, без межбанковских комиссий.

info
Как работает: Система матчит bank из запроса с полем bank.code или bank.name у реквизита трейдера. Если совпадение найдено — ордер будет назначен на реквизит этого банка. Если нет подходящих реквизитов — ошибка 400.

Пример запроса с внутрибанком:

Пример запроса
curl -X POST https://api.vangardpay.com/api/v1/orders \\\\
  -H "X-API-Key: YOUR_API_KEY" \\\\
  -H "Content-Type: application/json" \\\\
  -d '{"type": "DEPOSIT", "amount": 5000, "method": "CARD_NUMBER", "bank": "SBERBANK"}'

↑ Ордер будет обрабатываться только реквизитами Сбербанка (перевод карта→карта внутри банка).

Уникализация суммы

Система автоматически корректирует сумму ордера (+1 ₽), если у того же держателя в том же банке уже есть активный ордер с такой суммой. Это необходимо для корректной автоматической привязки платежей.

info
Поле amount в ответе может отличаться от запрошенного (например, 5001 вместо 5000). Всегда используйте amount из ответа для отображения плательщику!

Создание нового ордера

POST /api/v1/orders
Тело запроса CreateOrderDto
ПолеТипОбяз.Описание
typeenum (DEPOSIT | WITHDRAWAL)даТип операцииПример: "DEPOSIT"
amountnumberдаСумма (0.01–300 000)Пример: 5000
currencystringнетВалюта (по умолчанию RUB)Пример: "RUB"
methodenum (SBP | CARD_NUMBER | ACCOUNT_TRANSFER)даМетод оплаты (по умолчанию CARD_NUMBER)Пример: "SBP"
bankstringнетКод банка для внутрибанковского трафика (см. Внутрибанк и GET /banks)Пример: "SBERBANK"
invIdstringнетВаш внутренний ID заказа (генерируется автоматически если не указан)Пример: "ORDER_123"
callbackUrlstringнетURL для вебхук-уведомлений (см. Вебхуки)Пример: "https://your-site.com/webhook"
ttlnumberнетВремя жизни ордера в секундах (300–86400, по умолчанию 3600)Пример: 3600
phoneNumberstringнетТелефон для СБП (обязательно если method=SBP)Пример: "+79991234567"
cardNumberstringнетНомер карты (обязательно если method=CARD_NUMBER)Пример: "4111111111111111"
recipientFiostringнетФИО получателя (для отображения плательщику)Пример: "Иванов Иван Иванович"
Пример запроса
curl -X POST https://api.vangardpay.com/api/v1/orders \\
  -H "X-API-Key: YOUR_API_KEY" \\
  -H "Content-Type: application/json" \\
  -d '{
    "type": "DEPOSIT",
    "amount": 5000,
    "method": "SBP",
    "bank": "SBERBANK",
    "callbackUrl": "https://your-site.com/webhook"
  }'
Пример ответа 201 Created
{
  "order": {
    "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "invId": "ORDER_1710528000_abc123",
    "status": "PENDING",
    "amount": 5000,
    "currency": "RUB",
    "trader": { "name": "Трейдер 1" },
    "requisite": {
      "id": "req-uuid",
      "method": "SBP",
      "cardNumber": null,
      "sbpPhoneNumber": "+79991234567",
      "accountNumber": null,
      "holder": {
        "firstName": "Иван",
        "lastName": "Иванов",
        "phoneNumber": "+79991234567",
        "bank": { "name": "Сбербанк", "code": "SBERBANK" }
      }
    },
    "merchant": { "displayName": "My Store" },
    "createdAt": "2026-03-16T18:00:00.000Z"
  },
  "paymentDetails": {
    "bankName": "Сбербанк",
    "bankCode": "SBERBANK",
    "paymentMethod": "SBP",
    "instructions": "Переведите 5000 RUB на указанные реквизиты"
  }
}
Параметры ответа — order
ПолеТипОбяз.Описание
order.idstring (UUID)даУникальный идентификатор ордера в системе VangardPay
order.invIdstringдаПубличный ID заказа (ваш или сгенерированный автоматически)
order.statusstringдаНачальный статус: PENDING (ожидает назначения трейдера)
order.amountnumberдаЗапрошенная сумма (может быть скорректирована, см. Уникализация)
order.currencystringдаКод валюты (RUB, KZT и т.д.)
order.trader.namestringдаИмя назначенного трейдера
order.requisite.idstring (UUID)даID реквизита трейдера
order.requisite.methodstringдаМетод оплаты: SBP, CARD_NUMBER, ACCOUNT_TRANSFER
order.requisite.cardNumberstring | nullнетНомер карты (заполнено если method = CARD_NUMBER)
order.requisite.sbpPhoneNumberstring | nullнетТелефон СБП (заполнено если method = SBP)
order.requisite.accountNumberstring | nullнетНомер счёта (заполнено если method = ACCOUNT_TRANSFER)
order.requisite.holder.firstNamestringдаИмя держателя реквизита
order.requisite.holder.lastNamestringдаФамилия держателя
order.requisite.holder.phoneNumberstringнетТелефон держателя
order.requisite.holder.bank.namestringдаНазвание банка
order.requisite.holder.bank.codestringдаКод банка (SBERBANK, TINKOFF и т.д.)
order.merchant.displayNamestringдаИмя мерчанта
order.createdAtstring (ISO 8601)даДата создания
Параметры ответа — paymentDetails
ПолеТипОбяз.Описание
paymentDetails.bankNamestringдаНазвание банка для отображения
paymentDetails.bankCodestringдаКод банка
paymentDetails.paymentMethodstringдаМетод оплаты
paymentDetails.instructionsstringдаТекстовая инструкция для плательщика

Получение статуса ордера по invId

GET /api/v1/orders/:invId/status

Параметр :invId — ваш внутренний ID заказа, указанный при создании.

Пример запроса
curl -X GET https://api.vangardpay.com/api/v1/orders/ORDER_123/status \\
  -H "X-API-Key: YOUR_API_KEY"
Пример ответа 200 OK
{
  "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "invId": "ORDER_123",
  "status": "COMPLETED",
  "amount": 5000,
  "factAmount": 4997.50,
  "createdAt": "2026-03-16T18:00:00.000Z",
  "completedAt": "2026-03-16T18:15:00.000Z",
  "appeals": []
}
Параметры ответа
ПолеТипОбяз.Описание
idstring (UUID)даУникальный ID ордера в VangardPay
invIdstringдаВаш внутренний ID заказа
statusstringдаТекущий статус: PENDING, AWAITING_PAYMENT, COMPLETED, CANCELLED, EXPIRED, FAILED
amountnumberдаЗапрошенная сумма в фиатной валюте
factAmountnumber | nullнетФактическая полученная сумма (отличается при недоплате/переплате)
createdAtstring (ISO 8601)даДата создания
completedAtstring | nullнетДата завершения (null пока не завершён)
appealsarrayдаПривязанные апелляции [{id, status, reason, createdAt, updatedAt}]

Список ордеров мерчанта

GET /api/v1/orders

Возвращает список ордеров с пагинацией и фильтрами.

Query-параметры
ПолеТипОбяз.Описание
pagenumberнетНомер страницы (по умолчанию 1)Пример: 1
limitnumberнетКоличество на страницу (по умолчанию 20, макс. 100)Пример: 20
statusstringнетФильтр по статусу: PENDING, AWAITING_PAYMENT, COMPLETED, CANCELLED, FAILED, EXPIREDПример: "COMPLETED"
typestringнетТип ордера: DEPOSIT или WITHDRAWALПример: "DEPOSIT"
dateFromstring (ISO 8601)нетНачало периода (включительно)Пример: "2026-03-01T00:00:00Z"
dateTostring (ISO 8601)нетКонец периода (включительно)Пример: "2026-03-31T23:59:59Z"
Пример запроса
curl -X GET "https://api.vangardpay.com/api/v1/orders?status=COMPLETED&page=1&limit=10" \\
  -H "X-API-Key: YOUR_API_KEY"
Пример ответа 200 OK
{
  "data": [{
    "id": "a1b2c3d4-...", "invId": "ORDER_123", "type": "DEPOSIT",
    "status": "COMPLETED", "currency": "RUB", "amount": 5000,
    "factAmount": 4997.50, "bank": "SBERBANK", "method": "SBP",
    "createdAt": "2026-03-16T18:00:00.000Z",
    "completedAt": "2026-03-16T18:15:00.000Z",
    "expiresAt": "2026-03-16T18:30:00.000Z", "appeals": []
  }],
  "meta": { "total": 42, "page": 1, "limit": 10, "totalPages": 5 }
}
Параметры ответа — data[] (ордер)
ПолеТипОбяз.Описание
idstring (UUID)даID ордера
invIdstringдаПубличный ID заказа
typestringдаDEPOSIT или WITHDRAWAL
statusstringдаТекущий статус ордера
currencystringдаКод валюты
amountnumberдаЗапрошенная сумма
factAmountnumber | nullнетФактическая полученная сумма
bankstring | nullнетКод банка
methodstring | nullнетМетод оплаты
createdAtstring (ISO 8601)даДата создания
completedAtstring | nullнетДата завершения
expiresAtstring | nullнетДата истечения ордера
appealsarrayдаПривязанные апелляции [{id, status}]
Параметры ответа — meta
ПолеТипОбяз.Описание
meta.totalnumberдаОбщее количество ордеров по фильтрам
meta.pagenumberдаТекущая страница
meta.limitnumberдаЗаписей на страницу
meta.totalPagesnumberдаВсего страниц

Получение ордера по UUID

GET /api/v1/orders/by-id/:id

Возвращает детальную информацию: курс, комиссию, время оплаты и привязанные апелляции.

Пример запроса
curl -X GET https://api.vangardpay.com/api/v1/orders/by-id/a1b2c3d4-e5f6-7890-abcd-ef1234567890 \\
  -H "X-API-Key: YOUR_API_KEY"
Пример ответа 200 OK
{
  "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "invId": "ORDER_123", "type": "DEPOSIT", "status": "COMPLETED",
  "currency": "RUB", "amount": 5000, "factAmount": 4997.50,
  "exchangeRate": 92.5, "usdtAmount": 54.05, "merchantFee": 2.50,
  "bank": "SBERBANK", "method": "SBP",
  "callbackUrl": "https://your-site.com/webhook", "callbackSent": true,
  "expiresAt": "2026-03-16T18:30:00.000Z",
  "createdAt": "2026-03-16T18:00:00.000Z",
  "completedAt": "2026-03-16T18:15:00.000Z",
  "paidAt": "2026-03-16T18:14:50.000Z", "appeals": []
}
Параметры ответа
ПолеТипОбяз.Описание
idstring (UUID)даID ордера
invIdstringдаПубличный ID заказа
typestringдаDEPOSIT или WITHDRAWAL
statusstringдаТекущий статус
currencystringдаВалюта ордера
amountnumberдаЗапрошенная сумма в фиатной валюте
factAmountnumber | nullнетФактическая полученная сумма (отличается при недоплате)
exchangeRatenumber | nullнетКурс фиат → USDT на момент создания
usdtAmountnumber | nullнетЭквивалент суммы в USDT
merchantFeenumber | nullнетКомиссия мерчанта в USDT
bankstring | nullнетКод банка
methodstring | nullнетМетод оплаты
callbackUrlstring | nullнетURL вебхука, указанный при создании
callbackSentbooleanдаБыл ли отправлен вебхук (true/false)
expiresAtstring | nullнетВремя истечения ордера
createdAtstring (ISO 8601)даДата создания
completedAtstring | nullнетДата завершения
paidAtstring | nullнетДата фиксации оплаты клиентом
appealsarrayдаПривязанные апелляции [{id, status, reason, createdAt, updatedAt}]

Отмена ордера

POST /api/v1/orders/:id/cancel

Отменяет ордер. Допустимо только для PENDING и AWAITING_PAYMENT. Замороженные средства трейдера разблокируются автоматически.

warning
Отмена ордера в другом статусе вернёт ошибку ORDER_CANCEL_INVALID_STATUS (400).
Пример запроса
curl -X POST https://api.vangardpay.com/api/v1/orders/a1b2c3d4-.../cancel \\
  -H "X-API-Key: YOUR_API_KEY"
Пример ответа 200 OK
{
  "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "invId": "ORDER_123", "status": "CANCELLED",
  "amount": 5000, "currency": "RUB",
  "createdAt": "2026-03-16T18:00:00.000Z",
  "completedAt": "2026-03-16T18:20:00.000Z"
}
Параметры ответа
ПолеТипОбяз.Описание
idstring (UUID)даID отменённого ордера
invIdstringдаПубличный ID заказа
statusstringдаВсегда CANCELLED
amountnumberдаЗапрошенная сумма
currencystringдаВалюта
createdAtstring (ISO 8601)даДата создания
completedAtstring (ISO 8601)даДата отмены

Баланс мерчанта

GET /api/v1/balance
Пример запроса
curl -X GET https://api.vangardpay.com/api/v1/balance \\
  -H "X-API-Key: YOUR_API_KEY"
Пример ответа 200 OK
{
  "merchant": {
    "id": "m-abc123", "displayName": "My Store",
    "balance": 15250.75, "isVerified": true
  }
}
Параметры ответа — merchant
ПолеТипОбяз.Описание
merchant.idstring (UUID)даID мерчанта
merchant.displayNamestringдаОтображаемое имя
merchant.balancenumberдаТекущий баланс в USDT
merchant.isVerifiedbooleanдаВерификация пройдена

Список поддерживаемых банков

GET /api/v1/banks

Возвращает банки, доступные для создания ордеров. Поле code используется в параметре bank при создании ордера.

Пример запроса
curl -X GET https://api.vangardpay.com/api/v1/banks \\
  -H "X-API-Key: YOUR_API_KEY"
Пример ответа 200 OK
[
  { "id": "bank-uuid-1", "name": "Сбербанк", "code": "SBERBANK", "logoUrl": "/uploads/banks/sber.png", "countryCode": "RU" },
  { "id": "bank-uuid-2", "name": "Тинькофф", "code": "TINKOFF", "logoUrl": "/uploads/banks/tinkoff.png", "countryCode": "RU" }
]
Параметры ответа — массив объектов
ПолеТипОбяз.Описание
idstring (UUID)даID банка
namestringдаНазвание банка
codestringдаКод для параметра bank
logoUrlstring | nullнетURL логотипа
countryCodestringдаКод страны ISO 3166-1 alpha-2

output Вывод Pay-out

Создание заявок на вывод средств с баланса мерчанта в USDT на TRC-20 кошелёк. Маршрут: /api/withdrawals. Авторизация: Bearer JWT.

info
Поток вывода: Мерчант создаёт заявку → средства замораживаются → администратор одобряет → средства списываются и отправляется транзакция → заявка завершается с txHash.

Создание заявки на вывод

POST /api/withdrawals
Тело запроса
ПолеТипОбяз.Описание
merchantIdstring (UUID)даID мерчанта (должен совпадать с авторизованным)Пример: "m-abc123"
amountnumberдаСумма вывода в USDTПример: 500
walletAddressstringдаTRC-20 адрес кошелька (формат: T + 33 символа)Пример: "TJYs..."
currencystringнетВалюта (поддерживается только USDT)Пример: "USDT"
commentstringнетКомментарий к заявкеПример: "Вывод за март"
warning
Валидация: адрес должен быть TRC-20 (/^T[A-Za-z1-9]{33}$/). Доступный баланс = balance - frozenBalance. При создании заявки средства замораживаются.
Пример запроса
curl -X POST https://api.vangardpay.com/api/withdrawals \\
  -H "Authorization: Bearer YOUR_JWT_TOKEN" \\
  -H "Content-Type: application/json" \\
  -d '{
    "merchantId": "m-abc123",
    "amount": 500,
    "walletAddress": "TJYs7pEqSKVaKnbeed1HpKr1MBGGGEaK1Y",
    "comment": "Вывод за март"
  }'
Пример ответа 201 Created
{
  "id": "wd-uuid-123",
  "merchantId": "m-abc123",
  "amount": 500,
  "currency": "USDT",
  "walletAddress": "TJYs7pEqSKVaKnbeed1HpKr1MBGGGEaK1Y",
  "bankDetails": null,
  "comment": "Вывод за март",
  "status": "PENDING",
  "adminComment": null,
  "processedBy": null,
  "processedAt": null,
  "txHash": null,
  "completedAt": null,
  "createdAt": "2026-03-18T12:00:00.000Z",
  "updatedAt": "2026-03-18T12:00:00.000Z",
  "merchant": {
    "id": "m-abc123",
    "displayName": "My Store",
    "user": { "id": "user-uuid", "login": "merchant@example.com" }
  }
}
Параметры ответа
ПолеТипОбяз.Описание
idstring (UUID)даID заявки на вывод
merchantIdstring (UUID)даID мерчанта
amountnumberдаСумма вывода в USDT
currencystringдаВалюта (USDT)
walletAddressstringдаTRC-20 адрес кошелька
bankDetailsobject | nullнетБанковские реквизиты (не используется для USDT)
commentstring | nullнетКомментарий мерчанта
statusstringдаСтатус: PENDING, APPROVED, COMPLETED, REJECTED, CANCELLED
adminCommentstring | nullнетКомментарий администратора (при одобрении/отклонении)
processedBystring | nullнетID администратора, обработавшего заявку
processedAtstring | nullнетДата обработки
txHashstring | nullнетХеш транзакции (заполняется при завершении)
completedAtstring | nullнетДата завершения вывода
createdAtstring (ISO 8601)даДата создания
updatedAtstring (ISO 8601)даДата обновления
merchantobjectдаДанные мерчанта (id, displayName, user)

Список заявок на вывод

GET /api/withdrawals

Возвращает заявки текущего мерчанта с пагинацией и фильтрами.

Query-параметры
ПолеТипОбяз.Описание
pagenumberнетНомер страницы (по умолчанию 1)Пример: 1
limitnumberнетКоличество на страницу (по умолчанию 10)Пример: 10
statusstringнетФильтр по статусу: PENDING, APPROVED, COMPLETED, REJECTED, CANCELLEDПример: "PENDING"
Пример запроса
curl -X GET "https://api.vangardpay.com/api/withdrawals?page=1&limit=10&status=PENDING" \\
  -H "Authorization: Bearer YOUR_JWT_TOKEN"
Пример ответа 200 OK
{
  "data": [{
    "id": "wd-uuid-123",
    "merchantId": "m-abc123",
    "amount": 500,
    "currency": "USDT",
    "walletAddress": "TJYs...",
    "status": "PENDING",
    "comment": "Вывод за март",
    "adminComment": null,
    "txHash": null,
    "createdAt": "2026-03-18T12:00:00.000Z",
    "merchant": {
      "id": "m-abc123",
      "user": { "id": "user-uuid", "login": "merchant@example.com" }
    }
  }],
  "meta": { "page": 1, "limit": 10, "total": 5, "totalPages": 1 }
}
Параметры ответа — data[]
ПолеТипОбяз.Описание
idstring (UUID)даID заявки
merchantIdstringдаID мерчанта
amountnumberдаСумма вывода
currencystringдаВалюта (USDT)
walletAddressstringдаTRC-20 адрес
statusstringдаТекущий статус заявки
commentstring | nullнетКомментарий мерчанта
adminCommentstring | nullнетКомментарий администратора
txHashstring | nullнетХеш транзакции
createdAtstring (ISO 8601)даДата создания
merchantobjectдаДанные мерчанта
Параметры ответа — meta
ПолеТипОбяз.Описание
meta.pagenumberдаТекущая страница
meta.limitnumberдаЗаписей на страницу
meta.totalnumberдаОбщее кол-во заявок
meta.totalPagesnumberдаВсего страниц

Детали заявки на вывод

GET /api/withdrawals/:id
Пример запроса
curl -X GET https://api.vangardpay.com/api/withdrawals/wd-uuid-123 \\
  -H "Authorization: Bearer YOUR_JWT_TOKEN"
Пример ответа 200 OK
{
  "id": "wd-uuid-123",
  "merchantId": "m-abc123",
  "amount": 500,
  "currency": "USDT",
  "walletAddress": "TJYs7pEqSKVaKnbeed1HpKr1MBGGGEaK1Y",
  "bankDetails": null,
  "comment": "Вывод за март",
  "status": "COMPLETED",
  "adminComment": "Одобрено",
  "processedBy": "admin-uuid",
  "processedAt": "2026-03-18T14:00:00.000Z",
  "txHash": "abc123def456...",
  "completedAt": "2026-03-18T15:00:00.000Z",
  "createdAt": "2026-03-18T12:00:00.000Z",
  "updatedAt": "2026-03-18T15:00:00.000Z",
  "merchant": {
    "id": "m-abc123",
    "user": { "id": "user-uuid", "login": "merchant@example.com" }
  }
}
Параметры ответа
ПолеТипОбяз.Описание
idstring (UUID)даID заявки
merchantIdstringдаID мерчанта
amountnumberдаСумма вывода
currencystringдаВалюта
walletAddressstringдаTRC-20 адрес
bankDetailsobject | nullнетБанковские реквизиты
commentstring | nullнетКомментарий мерчанта
statusstringдаТекущий статус
adminCommentstring | nullнетКомментарий администратора
processedBystring | nullнетID администратора
processedAtstring | nullнетДата обработки
txHashstring | nullнетХеш транзакции (после завершения)
completedAtstring | nullнетДата завершения
createdAtstring (ISO 8601)даДата создания
updatedAtstring (ISO 8601)даДата обновления
merchantobjectдаДанные мерчанта

Отмена заявки на вывод

PATCH /api/withdrawals/:id/cancel

Отменяет заявку. Допустимо только для статуса PENDING. Замороженные средства автоматически разблокируются.

Пример запроса
curl -X PATCH https://api.vangardpay.com/api/withdrawals/wd-uuid-123/cancel \\
  -H "Authorization: Bearer YOUR_JWT_TOKEN"
Пример ответа 200 OK
{
  "id": "wd-uuid-123",
  "status": "CANCELLED",
  "amount": 500,
  "processedAt": "2026-03-18T13:00:00.000Z"
}
Параметры ответа
ПолеТипОбяз.Описание
idstring (UUID)даID заявки
statusstringдаВсегда CANCELLED
amountnumberдаСумма (средства размораживаются)
processedAtstring (ISO 8601)даДата отмены

Статусы заявок

Жизненный цикл заявки на вывод
ПолеТипОбяз.Описание
PENDINGнетСоздана, ожидает одобрения администратором. Средства заморожены
APPROVEDнетОдобрена администратором, ожидает отправки транзакции
COMPLETEDнетТранзакция отправлена, средства списаны. Содержит txHash
REJECTEDнетОтклонена администратором. Средства размораживаются. Причина в adminComment
CANCELLEDнетОтменена мерчантом (только из PENDING). Средства размораживаются

я страница

Создайте платёжную сессию и перенаправьте клиента на страницу VangardPay. Клиент сам выберет сумму и метод.

info
Поток: Создать сессию → получить paymentUrlредирект клиента → клиент платит → вебхук на ваш сервер

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

POST /api/v1/payment-sessions
Тело запроса CreatePaymentSessionDto
ПолеТипОбяз.Описание
minAmountnumberнетМинимальная сумма платежаПример: 100
maxAmountnumberнетМаксимальная сумма платежаПример: 100000
currencystringнетВалюта (по умолчанию RUB)Пример: "RUB"
allowedMethodsstringнетJSON-массив разрешённых методовПример: ["CARD_NUMBER", "SBP"]
useDeltabooleanнетДельта для уникализации суммы (по умолчанию true)Пример: true
callbackUrlstringнетURL для вебхук-уведомленийПример: "https://merchant.com/webhook"
successUrlstringнетURL редиректа после успехаПример: "https://merchant.com/success"
failUrlstringнетURL редиректа при ошибкеПример: "https://merchant.com/fail"
externalIdstringнетВаш внешний ID заказаПример: "ORDER_123"
metadatastringнетJSON с произвольными даннымиПример: {"userId": "123"}
ttlnumberнетВремя жизни сессии в секундах (300–86400)Пример: 3600
Пример запроса
curl -X POST https://api.vangardpay.com/api/v1/payment-sessions \\
  -H "X-API-Key: YOUR_API_KEY" \\
  -H "Content-Type: application/json" \\
  -d '{
    "minAmount": 500, "maxAmount": 50000,
    "allowedMethods": "["SBP", "CARD_NUMBER"]",
    "callbackUrl": "https://your-site.com/webhook",
    "successUrl": "https://your-site.com/success",
    "failUrl": "https://your-site.com/fail",
    "externalId": "ORDER_456"
  }'
Пример ответа 201 Created
{
  "sessionId": "session-uuid-123",
  "token": "ps_a1b2c3d4e5f6",
  "paymentUrl": "https://pay.vangardpay.com/pay/ps_a1b2c3d4e5f6",
  "expiresAt": "2026-03-16T19:00:00.000Z"
}
Параметры ответа
ПолеТипОбяз.Описание
sessionIdstring (UUID)даID сессии в системе
tokenstringдаПубличный токен сессии
paymentUrlstringдаURL платёжной страницы — перенаправьте клиента сюда
expiresAtstring (ISO 8601)даВремя истечения сессии

gavel Апелляции

Если ордер завершился некорректно (клиент оплатил, но статус не подтвердился), создайте апелляцию.

Создание апелляции

POST /api/appeals
Тело запроса CreateAppealDto
ПолеТипОбяз.Описание
orderIdstring (UUID)нетUUID ордера в системе (один из orderId / invId обязателен)Пример: "550e8400-..."
invIdstringнетВаш публичный ID заказа (альтернатива orderId)Пример: "INV-12345"
reasonstringдаПричина апелляцииПример: "Платёж не зачислен"
commentstringнетПодробный комментарийПример: "Клиент отправил 5000 руб"
imagesstring[]нетURL изображений (предварительно загрузите через /upload)
videosstring[]нетURL видеозаписей
documentsstring[]нетURL документов (PDF, DOC)
lightbulb
Сначала загрузите файлы через POST /api/appeals/upload, затем передайте URL в массивы images, videos, documents.
Пример запроса
curl -X POST https://api.vangardpay.com/api/appeals \\
  -H "X-API-Key: YOUR_API_KEY" \\
  -H "Content-Type: application/json" \\
  -d '{
    "invId": "ORDER_123",
    "reason": "Платёж не зачислен",
    "comment": "Клиент отправил 5000 руб, приложен чек",
    "images": ["https://api.vangardpay.com/uploads/appeals/appeal-123.jpg"]
  }'
Пример ответа 201 Created
{
  "id": "appeal-uuid-123",
  "orderId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "reason": "Платёж не зачислен",
  "comment": "Клиент отправил 5000 руб, приложен чек",
  "status": "PENDING",
  "images": "["https://api.vangardpay.com/uploads/appeals/appeal-123.jpg"]",
  "videos": null, "documents": null,
  "deadline": "2026-03-19T18:00:00.000Z",
  "createdAt": "2026-03-16T18:00:00.000Z",
  "order": {
    "id": "a1b2c3d4",
    "merchant": { "id": "m-abc", "displayName": "My Store" },
    "provider": null
  }
}
Параметры ответа
ПолеТипОбяз.Описание
idstring (UUID)даID апелляции
orderIdstring (UUID)даID связанного ордера
reasonstringдаПричина
commentstring | nullнетКомментарий
statusstringдаСтатус: PENDING, UNDER_REVIEW, APPROVED, REJECTED, SUPPORT_REVIEW, TRADER_REVIEW
imagesstring | nullнетJSON-массив URL изображений
videosstring | nullнетJSON-массив URL видео
documentsstring | nullнетJSON-массив URL документов
deadlinestring (ISO 8601)даКрайний срок рассмотрения
createdAtstring (ISO 8601)даДата создания
orderobjectдаКраткие данные связанного ордера

Загрузка файлов для апелляции

POST /api/appeals/upload

Загрузка до 10 файлов (макс. 50 МБ каждый). Форматы: JPEG, PNG, GIF, WebP, MP4, AVI, PDF, DOC, DOCX, TXT, ZIP, XLS, XLSX.

Пример запроса
curl -X POST https://api.vangardpay.com/api/appeals/upload \\
  -H "X-API-Key: YOUR_API_KEY" \\
  -F "files=@screenshot.png" \\
  -F "files=@receipt.pdf"
Пример ответа 200 OK
{
  "files": [
    { "type": "image", "path": "https://api.vangardpay.com/uploads/appeals/appeal-123.png",
      "mime_type": "image/png", "originalName": "screenshot.png", "size": 245760 },
    { "type": "document", "path": "https://api.vangardpay.com/uploads/appeals/appeal-456.pdf",
      "mime_type": "application/pdf", "originalName": "receipt.pdf", "size": 102400 }
  ],
  "message": "Загружено 2 файл(ов)"
}
Параметры ответа — files[]
ПолеТипОбяз.Описание
typestringдаТип файла: image, video, document
pathstringдаПолный URL загруженного файла (передавайте в images/videos/documents при создании апелляции)
mime_typestringдаMIME-тип файла
originalNamestringдаОригинальное имя файла
sizenumberдаРазмер файла в байтах
Параметры ответа — корневые
ПолеТипОбяз.Описание
messagestringдаИнформационное сообщение

Список апелляций мерчанта

GET /api/appeals

Возвращает список апелляций с пагинацией и фильтрами.

Query-параметры
ПолеТипОбяз.Описание
pagenumberнетНомер страницы (по умолчанию 1)Пример: 1
limitnumberнетКоличество на странице (по умолчанию 20)Пример: 20
statusstringнетФильтр по статусу апелляцииПример: "PENDING"
orderIdstringнетФильтр по UUID ордера
dateFromstring (ISO 8601)нетНачало периода
dateTostring (ISO 8601)нетКонец периода
Пример запроса
curl -X GET "https://api.vangardpay.com/api/appeals?page=1&limit=10" \\
  -H "X-API-Key: YOUR_API_KEY"
Пример ответа 200 OK
{
  "data": [{
    "id": "appeal-uuid-123", "orderId": "a1b2c3d4",
    "reason": "Платёж не зачислен", "status": "PENDING",
    "deadline": "2026-03-19T18:00:00.000Z",
    "createdAt": "2026-03-16T18:00:00.000Z",
    "order": {
      "id": "a1b2c3d4", "invId": "ORDER_123", "amount": 5000,
      "status": "CANCELLED",
      "merchant": { "id": "m-abc", "displayName": "My Store" },
      "trader": { "id": "t-xyz", "name": "Трейдер 1" },
      "requisite": { "id": "req-uuid", "method": "SBP",
        "cardNumber": null, "sbpPhoneNumber": "+79991234567",
        "bank": { "id": "bank-uuid", "name": "Сбербанк" }
      }
    }
  }],
  "meta": { "total": 3, "page": 1, "limit": 10, "totalPages": 1 }
}
Параметры ответа — data[]
ПолеТипОбяз.Описание
idstring (UUID)даID апелляции
orderIdstringдаID связанного ордера
reasonstringдаПричина апелляции
statusstringдаСтатус апелляции
deadlinestring (ISO 8601)даКрайний срок
createdAtstring (ISO 8601)даДата создания
orderobjectдаДанные ордера (id, invId, amount, status, merchant, trader, requisite)
Параметры ответа — meta
ПолеТипОбяз.Описание
meta.totalnumberдаОбщее кол-во апелляций
meta.pagenumberдаТекущая страница
meta.limitnumberдаЗаписей на страницу
meta.totalPagesnumberдаВсего страниц

Детали апелляции

GET /api/appeals/:id

Полная информация: прикреплённые файлы, история изменений статуса.

Пример запроса
curl -X GET https://api.vangardpay.com/api/appeals/APPEAL_UUID \\
  -H "X-API-Key: YOUR_API_KEY"
Пример ответа 200 OK
{
  "id": "appeal-uuid-123",
  "orderId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "reason": "Платёж не зачислен", "comment": "Клиент отправил 5000 руб",
  "status": "PENDING",
  "images": "["https://api.vangardpay.com/uploads/appeals/appeal-123.jpg"]",
  "videos": null, "documents": null,
  "deadline": "2026-03-19T18:00:00.000Z",
  "createdAt": "2026-03-16T18:00:00.000Z",
  "order": {
    "id": "a1b2c3d4", "invId": "ORDER_123", "amount": 5000,
    "currency": "RUB", "status": "CANCELLED", "type": "DEPOSIT",
    "bank": "SBERBANK", "createdAt": "2026-03-16T17:00:00.000Z",
    "merchant": { "id": "m-abc", "displayName": "My Store" },
    "trader": { "id": "t-xyz", "name": "Трейдер 1" },
    "requisite": { "id": "req-uuid", "method": "SBP",
      "cardNumber": null, "sbpPhoneNumber": "+79991234567",
      "bank": { "id": "bank-uuid", "name": "Сбербанк" } }
  },
  "changeLogs": [
    { "id": "log-1", "status": "PENDING", "comment": null, "createdAt": "2026-03-16T18:00:00.000Z" }
  ]
}
Параметры ответа
ПолеТипОбяз.Описание
idstring (UUID)даID апелляции
orderIdstring (UUID)даID связанного ордера
reasonstringдаПричина
commentstring | nullнетКомментарий мерчанта
statusstringдаТекущий статус
imagesstring | nullнетJSON-массив URL изображений
videosstring | nullнетJSON-массив URL видео
documentsstring | nullнетJSON-массив URL документов
deadlinestring (ISO 8601)даКрайний срок рассмотрения
createdAtstring (ISO 8601)даДата создания
orderobjectдаПолные данные ордера (id, invId, amount, currency, status, type, bank, merchant, trader, requisite)
changeLogsarrayдаИстория смен статуса [{id, status, comment, createdAt}]

webhook Вебхуки

При каждом изменении статуса ордера VangardPay отправляет POST-запрос на ваш callbackUrl. Формат: application/json. Заголовок: User-Agent: PaymentAggregator/1.0.

info
Когда отправляется вебхук? При любом изменении статуса ордера: PENDING → AWAITING_PAYMENT, AWAITING_PAYMENT → COMPLETED, → CANCELLED, → EXPIRED, → FAILED.

Формат вебхука

{
  "invId": "ORDER_123",
  "status": "COMPLETED",
  "amount": 5000,
  "factAmount": 4997.50,
  "currency": "RUB",
  "timestamp": "2026-03-16T18:15:00.000Z",
  "signature": "a1b2c3d4e5f6..."
}
Параметры вебхука (JSON body)
ПолеТипОбяз.Описание
invIdstringдаВаш внутренний ID заказа (invId при создании ордера)Пример: "ORDER_123"
statusstringдаНовый статус ордера: PENDING, AWAITING_PAYMENT, COMPLETED, CANCELLED, EXPIRED, FAILEDПример: "COMPLETED"
amountnumberдаЗапрошенная сумма ордера в фиатной валютеПример: 5000
factAmountnumber | nullнетФактическая полученная сумма (только для COMPLETED, может отличаться от amount)Пример: 4997.5
currencystringдаКод валюты ордераПример: "RUB"
timestampstring (ISO 8601)даВремя события на стороне сервераПример: "2026-03-16T18:15:00.000Z"
signaturestringдаHMAC-SHA256 подпись для верификации (см. ниже)

Проверка подписи (HMAC-SHA256)

Подпись вычисляется из конкатенации 4 полей + ваш callbackSecret:

dataString = invId + status + amount + timestamp
signature  = HMAC-SHA256(dataString, callbackSecret)
warning
Всегда проверяйте подпись! Без проверки подписи злоумышленник может подделать вебхук и зачислить средства без реальной оплаты.

Пример на Node.js:

const crypto = require('crypto');

app.post('/webhook', (req, res) => {
  const { invId, status, amount, timestamp, signature } = req.body;

  const dataString = invId + status + amount + timestamp;
  const expected = crypto
    .createHmac('sha256', CALLBACK_SECRET)
    .update(dataString)
    .digest('hex');

  if (expected !== signature) {
    return res.status(403).json({ error: 'Invalid signature' });
  }

  // Обработка события
  switch (status) {
    case 'COMPLETED':
      // Зачислить средства пользователю
      break;
    case 'CANCELLED':
    case 'EXPIRED':
    case 'FAILED':
      // Уведомить пользователя об ошибке
      break;
  }

  res.json({ ok: true });  // Обязательно ответить 200!
});

Пример на PHP:

$data = json_decode(file_get_contents('php://input'), true);

$dataString = $data['invId'] . $data['status'] . $data['amount'] . $data['timestamp'];
$expected = hash_hmac('sha256', $dataString, $callbackSecret);

if (!hash_equals($expected, $data['signature'])) {
    http_response_code(403);
    exit('Invalid signature');
}

// Обработка событие
if ($data['status'] === 'COMPLETED') {
    // Зачислить средства
}
http_response_code(200);
echo json_encode(['ok' => true]);

Пример на Python:

import hmac, hashlib, json
from flask import Flask, request, jsonify

app = Flask(__name__)

@app.route('/webhook', methods=['POST'])
def webhook():
    data = request.json
    data_string = f"{data['invId']}{data['status']}{data['amount']}{data['timestamp']}"
    expected = hmac.new(
        CALLBACK_SECRET.encode(),
        data_string.encode(),
        hashlib.sha256
    ).hexdigest()

    if not hmac.compare_digest(expected, data['signature']):
        return jsonify(error='Invalid signature'), 403

    if data['status'] == 'COMPLETED':
        # Зачислить средства
        pass

    return jsonify(ok=True), 200

Ожидаемый ответ

Ваш сервер обязан ответить HTTP 200 OK с любым телом. Все остальные коды считаются ошибкой.

Политика повторов

Политика повторной отправки
ПолеТипОбяз.Описание
Таймаутда10 секунд на ответ сервера
Количество попытокдаМаксимум 3 попытки
Интервалда60 секунд между попытками
После 3 неудачдаВебхук прекращается, callbackSent остаётся false
warning
Если ваш сервер не ответил 200 OK за 10 секунд, вебхук будет отправлен повторно до 3 раз с интервалом 60 секунд. После 3 неудачных попыток уведомление прекращается — используйте GET /orders/:invId/status для актуализации.

Идемпотентность

lightbulb
Рекомендация: обрабатывайте вебхуки идемпотентно. Один и тот же вебхук может быть доставлен повторно (при retry). Сохраняйте invId + status и проверяйте дубли перед зачислением средств.

Статусы ордеров

Возможные статусы
ПолеТипОбяз.Описание
PENDINGнетОрдер создан, ожидает назначения трейдера
AWAITING_PAYMENTнетТрейдер назначен, клиент должен оплатить
COMPLETEDнетПлатёж подтверждён, средства зачислены
CANCELLEDнетОрдер отменён мерчантом или системой
EXPIREDнетИстёк таймаут ордера (ttl)
FAILEDнетОшибка обработки ордера

error Коды ошибок

Все ошибки API возвращаются в унифицированном формате с типизированным errorCode:

{
  "statusCode": 400,
  "errorCode": "ORDER_CANCEL_INVALID_STATUS",
  "message": "Невозможно отменить ордер в статусе COMPLETED",
  "details": null,
  "timestamp": "2026-03-18T12:00:00.000Z",
  "path": "/api/v1/orders/uuid/cancel"
}
Параметры ошибки
ПолеТипОбяз.Описание
statusCodenumberдаHTTP-статус код (400, 401, 403, 404, 429, 500)
errorCodestringдаТипизированный код ошибки (см. таблицы ниже)
messagestringдаЧеловекочитаемое описание ошибки
detailsany | nullнетДополнительные данные (массив ошибок валидации и т.д.)
timestampstring (ISO 8601)даВремя ошибки
pathstringдаПуть запроса, вызвавшего ошибку

Ордера

Коды ошибок ордеров
ПолеТипОбяз.Описание
ORDER_NOT_FOUND404нетОрдер с указанным ID не найден
ORDER_ACCESS_DENIED403нетНет доступа к чужому ордеру
ORDER_CANCEL_INVALID_STATUS400нетОтмена допустима только для PENDING / AWAITING_PAYMENT
ORDER_EXPIRED400нетОрдер истёк
ORDER_CREATION_DISABLED400нетТорговая активность мерчанта отключена
NO_AVAILABLE_TRADERS400нетНет трейдеров с подходящими реквизитами и балансом

Апелляции

Коды ошибок апелляций
ПолеТипОбяз.Описание
APPEAL_NOT_FOUND404нетАпелляция не найдена
APPEAL_ACCESS_DENIED403нетНет доступа к чужой апелляции
APPEAL_STATUS_INVALID400нетНевалидная смена статуса

Общие

Общие коды ошибок
ПолеТипОбяз.Описание
UNAUTHORIZED401нетНевалидный API-ключ или JWT-токен
FORBIDDEN403нетНедостаточно прав для действия
VALIDATION_ERROR400нетОшибка валидации полей запроса
RATE_LIMIT_EXCEEDED429нетПревышен лимит запросов
MERCHANT_NOT_FOUND404нетMerchant профиль не найден
INSUFFICIENT_BALANCE400нетНедостаточно средств для операции
FILE_NOT_FOUND404нетФайл не найден на сервере
RECEIPT_NOT_FOUND404нетЧек не найден
INTERNAL_ERROR500нетВнутренняя ошибка сервера