Создание заявок на выплаты
Выплаты клиентам на карту или по СБП через Parallel API
Обзор
Заявка на выплату (direction: "out") переводит рубли вашему клиенту на карту или по СБП, например когда игрок выводит выигрыш. Выплата оплачивается с вашего USDT-баланса в Parallel: при создании заявки сумма amount / dealRate USDT замораживается, после выплаты списывается, а если выплата истекла или отменена — возвращается на баланс.
Время жизни: выплату должны выплатить до newStatusExpiresAt. Срок задаётся для магазина при подключении, по умолчанию 5 часов. Не выплаченная к сроку целиком выплата переходит в expired, а USDT возвращаются на баланс: paid после срока не бывает. Первые 5 минут после создания выплату не начинают, и её гарантированно можно отменить.
Баланс: на балансе должно быть доступно не меньше amount / dealRate USDT, иначе заявка не создастся (400 «Недостаточно доступных средств»). Проверить баланс: GET /api/v1/merchants/balance.
Создание заявки
Выплаты создаются тем же endpoint, что и заявки на приём, с direction: "out":
Параметры
Поле
Тип
internalId общий для приёма и выплат. Если выплата получит internalId уже существующей заявки на приём, в ответ придёт та заявка на приём (direction: "in"), а выплата не создастся. Используйте разные префиксы, например deposit-… и payout-…, и сверяйте direction в ответе.
Реквизиты получателя
paymentRequisites — объект или JSON-строка с тем же объектом. Обязательны ФИО и реквизит под paymentMethod: телефон для SBP, номер карты для TO_CARD.
Поле
Тип
Пример запроса
const response = await fetch('https://api.parallel-pay.com/api/v1/invoices', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${process.env.PARALLEL_TOKEN}`
},
body: JSON.stringify({
internalId: 'payout-12345',
direction: 'out',
amount: 1000,
currency: 'RUB',
// Перевод на карту
paymentRequisites: {
fullName: 'Иван Иванов',
cardNumber: '2200700012345673'
},
// ИЛИ СБП:
// paymentRequisites: { fullName: 'Иван Иванов', phoneNumber: '+79001234567' },
// paymentMethod: 'SBP',
paymentMethod: 'TO_CARD',
paymentOption: 'tbank',
notificationUrl: 'https://your-site.com/webhooks/parallel',
notificationToken: 'your-secret-webhook-token-min-32-chars'
})
});
const result = await response.json();
console.log(result);Пример ответа
HTTP Status: 201 Created
Повторный запрос с тем же internalId вернёт ту же заявку с кодом 200 OK.
{
"id": "cm3k8x7y80001z8j4k5m6n7o8",
"direction": "out",
"status": "new",
"paymentMethod": "TO_CARD",
"paymentOption": "tbank",
"amount": "1000",
"currency": "RUB",
"newStatusExpiresAt": "2025-11-03T20:00:00.000Z",
"dealRequisites": {
"fullName": "Иван Иванов",
"cardNumber": "2200700012345673"
},
"dealRate": "95.50",
"createdAt": "2025-11-03T15:00:00.000Z",
"updatedAt": "2025-11-03T15:00:00.000Z",
"internalId": "payout-12345",
"merchantName": "MerchantName"
}Примеры ошибок
Ошибка: Недостаточно средств
HTTP Status: 400 Bad Request
Доступного баланса не хватает на amount / dealRate USDT. Пополните баланс приёмом платежей или уменьшите сумму.
{
"error": "Недостаточно доступных средств"
}Ошибка: Неверные реквизиты
HTTP Status: 400 Bad Request
Нет ФИО, нет реквизита под paymentMethod (телефона для SBP, номера карты для TO_CARD) или реквизит в неверном формате.
{
"error": "Для paymentMethod SBP нужен paymentRequisites.phoneNumber"
}Ошибка: Выплаты временно недоступны
HTTP Status: 503 Service Unavailable
Сейчас выплату некому провести. Повторите запрос позже с тем же internalId: повтор не создаст вторую выплату.
{
"error": "Выплаты временно недоступны, повторите позже"
}Ошибка: Курс недоступен
HTTP Status: 503 Service Unavailable
Курс USDT/RUB сейчас получить не удалось, заявка не создана. Повторите запрос позже с тем же internalId.
{
"error": "Курс USDT/RUB временно недоступен, повторите позже"
}Статусы выплаты
| Статус | Что происходит |
|---|---|
new | Заявка создана, USDT заморожены, выплату ещё не начали |
processing | Выплата идёт: получателю переводят деньги, возможно несколькими переводами |
review | Чеки на всю сумму загружены и проверяются. Если все чеки уже проверены, заявка переходит из processing сразу в paid, минуя review |
paid | Выплачена, USDT списаны с баланса. Чеки — в transactionProofUrl и transactionProofUrls |
expired | К newStatusExpiresAt выплата не выплачена целиком, USDT вернулись на баланс. Статус окончательный |
canceled | Отменена до начала выплаты, USDT вернулись на баланс. Статус окончательный |
dispute | По выплате открыт спор |
Если администратор Parallel отклонил чек, заявка возвращается в new с причиной в rejectionReason, и отклонённую часть переводят заново. Такую заявку уже нельзя отменить: часть денег могла дойти до получателя.
О каждом переходе в review, paid, expired и canceled приходит webhook-уведомление с объектом выплаты, кроме возврата в paid после спора: тогда приходит только dispute.resolved. Об открытии и решении спора приходят dispute.created и dispute.resolved с объектом спора. Заявка в статусе paid может прийти без предшествующего review. О возврате из review в new после отклонения чека webhook не приходит: если выплата долго остаётся в review, проверьте её статус запросом.
Объект выплаты
Этот же объект приходит в ответе на создание, в проверке статуса и в теле webhook-уведомления. В отличие от заявки на приём, в нём нет expireAt и requisiteId, а dealRequisites — объект, а не JSON-строка.
Поле
Тип
Проверка статуса выплаты
Возвращает выплату в том же формате, что и при создании, с текущим статусом. Используйте, если webhook-уведомление не дошло.
curl "https://api.parallel-pay.com/api/v1/invoices/cm3k8x7y80001z8j4k5m6n7o8" \
-H "Authorization: Bearer $PARALLEL_TOKEN"Отмена выплаты
Отменяет выплату, которую ещё не начали: статус new без rejectionReason. Первые 5 минут после создания выплату не начинают, поэтому в это время отмена проходит всегда. Заявка переходит в canceled, USDT возвращаются на баланс. Ответ — объект выплаты. Начатую выплату отменить нельзя, даже если после отклонения чека она вернулась в new:
HTTP Status: 409 Conflict
{
"error": "Действие недоступно: заявка в статусе processing"
}