Filing a Dispute
You can only file disputes for transactions that:- Have a
postedAttimestamp (settled transactions). Pending or unsettled transactions cannot be disputed. - Have a non-zero amount. Zero-amount transactions, such as authorization holds that were not captured, cannot be disputed.
400 Bad Request error.
Card Network Deadline
Card networks (Visa, Mastercard) require disputes to be filed within 120 days of the transaction date. After 120 days, the card network may decline the dispute. To file a dispute, use Rain’s Dispute API.Dispute Reason Codes
When you file a dispute, you can optionally set adisputeReasonCode to classify it precisely using a Visa Claims Resolution (VCR) reason code. Reason codes give you finer-grained classification than the broad disputeType categories, which reduces back-and-forth during review.
The disputeReasonCode field is optional. Here is how it interacts with disputeType when you create a dispute:
- If you send only
disputeReasonCode, Rain derives thedisputeTypefrom it automatically. - If you send only
disputeType, Rain files the dispute with that type and no reason code, exactly as before. - If you send both, they must agree. If the reason code implies a different
disputeTypethan the one you sent, the API returns a400 Bad Requestnaming the expected type. - If you send a reason code that is not one of the supported values, the API returns a
400 Bad Request.
disputeType, as shown in the table below.
Dispute Thresholds and Fees
Rain files a dispute with the card network only when the disputed amount meets a minimum threshold. Nothing changes in how or what you submit. Keep submitting every dispute regardless of size: reporting a dispute costs you nothing, and it helps Rain track fraud patterns even when a formal dispute is not filed. The date you submit a dispute determines which threshold applies:
These thresholds are defined in your Master Services Agreement (MSA). Refer to your MSA for the full terms, and reach out to your account manager with any questions.
Webhooks
Rain sends webhook notifications to track dispute lifecycle events in real-time. These webhooks are informational and do not require a response.created
See the dispute.created webhook reference for the full payload schema, field descriptions, and version history.
updated
Provides real-time updates on dispute resolution progress. Handle both status transitions and evidence updates in your webhook handler. See the dispute.updated webhook reference for the full payload schema, field descriptions, and version history.
Possible status values: "pending", "inReview", "accepted", "rejected", "canceled", "resolvedByMerchant"
Key fields:There are two different
id fields. The one in the root is the webhookId, while the one in the body is the disputeId.Dispute Reimbursement Process
Rain automatically processes reimbursements when the card network accepts a dispute. Network investigations and chargebacks typically resolve within 30-60 business days.Reimbursement timeline
- Create a dispute using the Dispute API
- Rain reviews the dispute (status:
"inReview") - If accepted (status:
"accepted"), Rain processes the reimbursement - You receive a
transaction.completedwebhook for the credit transaction - Rain updates the cardholder balance with the credit amount
What happens during reimbursement
When Rain processes an accepted dispute:- Rain creates a new transaction with a negative amount (credit to the account)
- The credit amount matches the
disputeAmountfrom the original dispute - The transaction appears in transaction history as type
"spend"with a negative amount - Rain credits the cardholder account balance
- You receive a
transaction.completedwebhook for the credit
Webhook notifications
You receive webhook notifications during the dispute lifecycle:dispute.updated- Sent when the dispute status changes (including"accepted","rejected","canceled","resolvedByMerchant", or"inReview") and whentextEvidencechanges.transaction.completed- Sent when Rain processes the reimbursement for an accepted dispute, includes the negative transaction amount
transaction.completed webhook follows the same format as other transaction webhooks, with a negative amount field indicating a credit.
Unauthorized transactions
When a user reports a transaction they didn’t make:- Cancel the affected card immediately by setting its status to
canceled. - Issue a new card to the user.
- File a dispute for the unauthorized transaction.
Pending and reversed transactions
Apending transaction is waiting for the merchant to finalize or cancel it. Most clear within days, but a transaction can stay pending for up to 30 business days; until it resolves, the funds are neither fully debited nor refunded.
- Terminal declined, but funds are held. Confirm with the merchant that the transaction was declined on their system. If the authorization was never finalized, the hold returns to the account automatically when the authorization expires.
- No transaction ID for an attempted payment. Rain never received the authorization request. Check with the merchant for issues on their side, and have the cardholder try another payment method if the problem persists.
- A transaction reversed. Reversals typically come from a merchant decline or a terminal error. If an expected reversal hasn’t posted within 30 days, escalate to Rain support.
What’s next
Transaction events
See the full webhook payload and field reference for every transaction event.
Disputes
See the dispute lifecycle events and their trigger conditions.