Skip to main content
File a dispute when a settled card charge should be reviewed. The transaction must belong to your business. Use the id from GET /cards/transactions or GET /cards/{cardId}/transactions, or the transactionId from a card.transaction.* webhook.
POST /cards/transactions/TRANSACTION_ID/dispute
Response
The disputed amount is the full transaction amount, in cents. You do not send it. The response includes disputeAmount as the amount filed. Every dispute is submitted to the card network. See Create a dispute for a transaction.
GET /cards/transactions/TRANSACTION_ID/dispute
This returns the dispute from the card issuer, including its current status. It returns 404 when the transaction has no dispute. GET /cards/transactions/{transactionId} includes issuerDispute when a dispute was logged. That object is loaded from the card issuer and includes the current status. GET /cards/transactions/{transactionId}/dispute returns the same issuer dispute. See Get the dispute for a transaction. One active dispute is allowed per transaction. A dispute is active while its status is pending or inReview. Filing another dispute in that window returns 409.

When a dispute can be filed

The transaction must be settled. That means status completed and a posted time. Pending, declined, and reversed transactions are rejected with 400. A zero-amount transaction, such as an authorisation hold the merchant never captured, is also rejected with 400.

Filing window

Card networks expect a dispute within 120 days of the transaction date. A shorter 75-day window applies when either of these is true:
  • The transaction was force-posted, meaning it settled without a prior authorisation.
  • You file under cardRecoveryBulletin, declinedAuthorization, noAuthorization, or invalidData.
File as early as you can. A dispute submitted close to the 75-day or 120-day deadline has a higher chance of rejection. A late filing can be declined by the card network.

Dispute type and reason code

disputeType is the broad category. disputeReasonCode is the finer reason code. It is optional. A reason code classifies the case more precisely and shortens review.
  • Send only disputeReasonCode and the issuer derives disputeType.
  • Send only disputeType and the dispute is filed with that type and no reason code.
  • Send both and they must agree. When they disagree, the API returns 400 and names the expected type.
  • An unsupported reason code returns 400.
  • The response includes disputeReasonCode when you sent one, and omits it when you did not.

Dispute types

Reason codes

textEvidence is optional written evidence, up to 65,535 characters.

Thresholds and fees

You can submit a dispute of any amount. Reporting a dispute costs nothing, and small disputes still help track fraud patterns. The card programme files a dispute with the card network only when the amount meets a minimum.

Status and reimbursement

card.dispute.created fires when the dispute is filed. card.dispute.updated fires when the status or textEvidence changes. Payload examples are in Webhooks. When the network accepts the dispute, reimbursement is a new completed card transaction with a negative amount (a credit). You receive card.transaction.completed for that credit. The credit can be less than the transaction amount that was disputed. Network investigations typically take 30–60 business days.

Unauthorized charges

When a user reports a charge they did not make:
  1. Cancel the affected card. For a virtual card, replace it. For a physical card, delete it and issue a new one.
  2. File a dispute for the settled unauthorized transaction.