#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).