When a dispute opens
Either side can file:- Buyer — “I didn’t receive the service / the charge is unauthorized / the amount is wrong”
- Seller — rare, but possible (e.g. contesting a refund)
File a dispute
Reason codes
| Reason | Meaning |
|---|---|
service_not_received | Paid but didn’t get what was purchased |
duplicate_charge | Same thing charged twice |
unauthorized | Agent or merchant transacted without authorization |
amount_incorrect | Charged amount differs from agreed amount |
quality_issue | Service delivered but materially deficient |
other | Specify in description |
Dispute lifecycle
open— filed; the counterparty hasresponse_window_days(default 30) to respondunder_review— both sides have submitted; Sly or an arbiter is reviewingescalated— routed to human review when automated resolution can’t decideresolved— final decision; optional refund issued
Respond (as the counterparty)
When a dispute is filed against you, you have the response window to rebut:Escalate
If automated resolution stalls or the stakes warrant human review:Resolve
When both sides agree, resolve directly without waiting:full_refund— full amount returned; auto-creates refundpartial_refund— amount returned (specifyrefundAmount)credit— credit issued to dispute filer (no cash movement)no_refund— dispute dismissed, funds retained
- If an AP2 mandate funded the disputed transfer, you can optionally cancel the mandate in one call
- Associated webhooks fire (
dispute.resolved)
Monitoring
List active disputes:due_soon=true filters to disputes where your response window expires in <72 hours — priority queue for ops.
Dispute analytics
service_not_received = provisioning bug).
Card-network disputes
Card transactions can also dispute via the card network (Visa / Mastercard). Sly surfaces these ascard.dispute.opened webhook events and funnels them through the same /v1/disputes API so your team has one workflow.
Differences from Sly-native disputes:
- Response window is the network’s (varies by rule, typically 20-30 days)
- Evidence requirements are stricter (compelling evidence rules)
- Chargeback fees may apply (processor-dependent)
Endpoints
| Endpoint | Purpose |
|---|---|
POST /v1/disputes | File dispute |
GET /v1/disputes | List (filter by status, reason, account, due_soon) |
GET /v1/disputes/:id | Dispute detail + full timeline |
POST /v1/disputes/:id/respond | Submit response + evidence |
POST /v1/disputes/:id/resolve | Resolve |
POST /v1/disputes/:id/escalate | Send to human review |
GET /v1/disputes/stats/summary | Aggregate stats |
Evidence best practices
- Timestamps matter — server logs with UTC timestamps are the strongest evidence
- Link to delivery — for
service_not_receivedclaims, show proof of delivery (login logs, API call logs, tracking) - Quote the original agreement — if the buyer agreed to specific terms, include those
- Respond early — don’t wait for the deadline; early responses tilt toward your side
- Be factual, not defensive — arbitrators reward clarity over rhetoric
Common mistakes
- Ignoring the response window (auto-loss)
- Vague evidence (“we delivered the service”)
- Over-refunding without resolving the dispute status (leaves the record
open) - Not tracking dispute rates — rising rate often signals product bug or fraud wave