Создание апелляций
Оспаривание платежных заявок при проблемах с оплатой
Обзор
Апелляции (споры) позволяют мерчантам оспаривать платежные заявки при возникновении проблем с оплатой. При создании апелляции по заявке на приём средства автоматически замораживаются до разрешения спора.
Важно: после создания апелляции заявка переходит в статус dispute, и все средства по заявке на приём замораживаются.
Выплаты: спор можно открыть и по выплате в статусе paid, например если получатель не получил деньги. Укажите reason: "unknown", опишите проблему в description и приложите выписку получателя. Спор по выплате открывается один раз, повторный получит 409. USDT за выплату к этому моменту уже списаны, поэтому спор ничего не замораживает; если он решён в пользу мерчанта, USDT за выплату возвращаются на баланс. После решения выплата возвращается в paid; исход — в resolution вебхука dispute.resolved, invoice.paid повторно не приходит. Ссылки на чеки в объекте выплаты остаются и в статусе dispute.
Создание апелляции
Endpoint для создания спора по существующей заявке:
Параметры запроса
invoiceId в пути — идентификатор заявки, например cm3k8x7y80001z8j4k5m6n7o8. Тело — multipart/form-data,
набор полей зависит от reason.
Неверная сумма (invalid_sum)
Клиент перевёл не ту сумму — укажите фактическую в disputeReasonData.
Поле
Тип
Остальные причины
Поле
Тип
Пример запроса
const fs = require('fs');
const invoiceId = 'cm3k8x7y80001z8j4k5m6n7o8';
const formData = new FormData();
formData.append('reason', 'invalid_sum');
formData.append('description', 'Клиент отправил 500 RUB вместо 1000 RUB');
formData.append('disputeReasonData', JSON.stringify({ amount: 500 }));
// Уберите эту строку, если файла нет
formData.append('attachment', new Blob([fs.readFileSync('/path/to/screenshot.jpg')]), 'screenshot.jpg');
const response = await fetch(`https://api.parallel-pay.com/api/v1/invoices/${invoiceId}/disputes`, {
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.PARALLEL_TOKEN}`
},
body: formData
});
const result = await response.json();
console.log(result);Пример ответа
{
"id": "disp_abc123xyz789",
"invoiceId": "cm3k8x7y80001z8j4k5m6n7o8",
"reason": "invalid_sum",
"description": "Клиент отправил 500 RUB вместо 1000 RUB",
"disputeReasonData": {
"amount": 500
},
"attachmentUrl": "https://files.parallel-pay.com/disp_abc123xyz789/screenshot.jpg",
"attachmentFilename": "screenshot.jpg",
"status": "open",
"resolution": null,
"resolutionNotes": null,
"createdAt": "2025-11-03T15:10:00+03:00",
"resolvedAt": null,
"autoResolveAt": null,
"amount": "1000.0000",
"currency": "RUB",
"paymentMethod": "SBP",
"paymentOption": "sberbank",
"requisites": {
"bankName": "sberbank",
"phoneNumber": "79099966512",
"fullName": "Ivan Ivanov"
},
"internalId": "order-12345",
"merchantName": "MerchantName"
}Объект спора
Этот же объект приходит в ответе на открытие спора, в проверке статуса и в теле webhook-уведомления.
Поле
Тип
Кто решает спор
Спор решает администратор Parallel. Автоматического решения нет: пока спора не рассмотрели, он остаётся открытым, а средства по заявке на приём — замороженными. Поле autoResolveAt всегда null.
Проверка статуса спора
После создания спора вы можете проверить его статус через webhook уведомления или через GET endpoint:
Пример запроса:
const disputeId = 'disp_abc123xyz789';
const response = await fetch(`https://api.parallel-pay.com/api/v1/disputes/${disputeId}`, {
headers: {
'Authorization': `Bearer ${process.env.PARALLEL_TOKEN}`
}
});
const dispute = await response.json();
console.log('Status:', dispute.status);
console.log('Resolution:', dispute.resolution);Пример ответа
{
"id": "disp_abc123xyz789",
"invoiceId": "cm3k8x7y80001z8j4k5m6n7o8",
"reason": "invalid_sum",
"description": "Клиент отправил 500 RUB вместо 1000 RUB",
"disputeReasonData": {
"amount": 500
},
"attachmentUrl": "https://files.parallel-pay.com/disp_abc123xyz789/screenshot.jpg",
"attachmentFilename": "screenshot.jpg",
"status": "open",
"resolution": null,
"resolutionNotes": null,
"createdAt": "2025-11-03T15:10:00+03:00",
"resolvedAt": null,
"autoResolveAt": null,
"amount": "1000.0000",
"currency": "RUB",
"paymentMethod": "SBP",
"paymentOption": "sberbank",
"requisites": {
"bankName": "sberbank",
"phoneNumber": "79099966512",
"fullName": "Ivan Ivanov"
},
"internalId": "order-12345",
"merchantName": "MerchantName"
}