Skip to main content
When a cardholder or their issuing bank contests a charge, PayNext records it as a dispute and links it to the payment it was raised against. Disputes from supported processors arrive in the same shape, with the same stages, statuses, and reason categories, so you can track response deadlines and outcomes in one place. A payment can carry more than one dispute over its lifetime.

The dispute object

Timestamps use ISO 8601. The dispute object has no amount or currency—read amount and currency_code from the disputed payment with GET /payments/{id}.

Dispute details

details carries the processor’s own values for reference. Which keys appear depends on the processor, and a key with no value is null.

Dispute stages

A dispute can start as a retrieval request and move to a formal dispute. The stage changes independently of the status.
PayPal’s pre-arbitration and arbitration stages are both reported as DISPUTE. PayPal’s own stage value stays available in details.paypal_dispute_life_cycle_stage.

Dispute statuses

A dispute usually moves from NEEDS_RESPONSE through EVIDENCE_SUBMITTED and UNDER_REVIEW to a final status. It can also reach a final status straight from NEEDS_RESPONSE. Dashed arrows show a dispute reopening.
  • Once a dispute reaches a final status, it never changes again, and resolved_at records when that happened.
  • A dispute can already be final when PayNext first records it.
  • An open dispute can move back to NEEDS_RESPONSE from UNDER_REVIEW or EVIDENCE_SUBMITTED when your response is needed again.
There is no EXPIRED status. A dispute whose response deadline passes without a response is reported as LOST.

Dispute reasons

List and retrieve disputes

Use GET /disputes to list your organization’s disputes and GET /disputes/{id} to retrieve one.
The list returns data (an array of dispute objects) and meta, which includes the pagination fields page, pages, limit, and total. page * limit can’t exceed 10000. A request past that returns 400, and meta.pages never exceeds 10000 / limit.
The list can take up to about a minute to reflect a new or updated dispute, and list items never include details. When you need a dispute’s current state—for example, right after a dispute webhook arrives—fetch it with GET /disputes/{id}, which reflects changes immediately and includes details.
GET /disputes/{id} returns 404 for a dispute that belongs to another organization.

Disputes on a payment

Payments returned by GET /payments and GET /payments/{id} include a disputes array with a summary of each dispute linked to the payment: id, external_id, stage, status, reason, and disputed_at.
Payment webhook payloads don’t include disputes. To find payments by dispute status or stage, use the dispute.status and dispute.stage fields in search.

Required API key permission

GET /disputes and GET /disputes/{id} require the Disputes: Read permission. A scoped API key without it receives 403. See API keys.
Many disputes can be stopped before they’re filed. See Fraud prevention for the Visa and Mastercard programs PayNext supports.