Back to updates
ImprovedOct 13, 2026

P2P deposit webhooks: silent expiry, credit by payment_amount

An expired P2P deposit no longer sends PAYMENT_CANCELED, and PAYMENT_PAID must be credited with payment.payment_amount.

Overview

An expired P2P deposit now sends no webhook, like a classic invoice: payment_status becomes PAYMENT_EXPIRED. After expired_at, confirm with GET /v1/payment/info (or GET /v1/p2p/flow/:flowId) and close the order yourself. PAYMENT_CANCELED is sent only for a real cancel — the payer cancelled or an admin released the match.

PAYMENT_PAID stays the only paid event. When an admin settles a deposit at what the payer really transferred, payment.amount is still the order while payment.payment_amount (and transaction.amount) is what was credited, and data.amount_adjustment explains the difference. Credit with payment.payment_amount.

What changed

  • ChangedExpired P2P deposit: no webhook (was PAYMENT_CANCELED).
  • ChangedPAYMENT_CANCELED for P2P: only a real cancel (payer or admin).
  • AddedPAYMENT_PAID.amount_adjustment { ordered_amount, transferred_amount, credited_amount, uncredited_amount, reason, adjusted_by } when an admin re-amounted the deposit.