#Webhook'и диспута
На полный цикл диспута приходит 2 webhook'а (открытие + закрытие). Дополнительно в момент открытия может прийти отдельный event=dispute payload.
#1. При открытии — tx-level webhook со status: "disputed"
Стандартный webhook транзакции, как у paid / cancel / expired, только статус другой.
{
"id": "8X85BPHJ",
"merchant_transaction_id": "ord_xxx",
"type": "out",
"payment_method": "card-out",
"amount": "3000",
"paid_amount": "0",
"currency": "RUB",
"currency_rate": "79.59",
"amount_in_usd": "37.69",
"rate": "3",
"commission": "90.00",
"status": "disputed",
"paid_at": null,
"expires_at": null,
"created_at": "...",
"card_number": "4276380012345678",
"owner_name": "Иванов И.И.",
"bank_id": "a1b2c3d4-e5f6-7890-abcd-111111111111",
"bank_name": "Сбербанк",
"provider_ref": "ord_xxx"
}#2. Dispute-specific webhook (опциональный)
Дополнительный payload с деталями именно апелляции, а не транзакции.
{
"event": "dispute",
"appeal_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"appeal_status": "process",
"appeal_amount": "5000",
"dispute_type": "payin_timeout",
"appeal_reason": "Customer paid, but the order is expired",
"appeal_created_at": "2026-04-19T17:23:00.000Z",
"transaction_id": "8ZNVCJ5S",
"merchant_transaction_id": "order_001",
"transaction_amount": "5000",
"currency_code": "RUB"
}#3. При закрытии — ещё один tx-level webhook
- Одобрен →
status: "paid",paid_at: timestamp,paid_amount: amount
(дляpayin_timeoutиногда возвращается вexpiredпри форс-резолве) - Отклонён →
status: "cancel"или"expired"(rollback на предыдущий терминальный статус)
Подпись и ретраи — те же, что у обычных webhook'ов (см. секцию Webhook).