Either side can open a dispute, on KetaPay’s pages or through your UI: the buyer when something wasn’t delivered as agreed, the seller when the buyer won’t release or respond. KetaPay runs it end to end and decides from the evidence both sides submit. A dispute freezes the milestones it covers. An escrow can have several disputes over its life, one per milestone at a time.

Open one

Buyer reasons are not_received, not_as_agreed, damaged and incomplete; the seller’s is buyer_unresponsive; either side can use other. You get dispute.opened.

Settling without KetaPay

While a dispute is open, either side can back down:
  • the buyer can release the milestone;
  • the seller can refund it with POST /disputes/{id}/concede;
  • whoever opened it can withdraw it with POST /disputes/{id}/withdraw.
Nobody can settle in their own favour. Only KetaPay decides against a party.

Evidence

The buyer and the seller each submit statements and files (photos, videos, documents, chat screenshots), in the dispute room at the dispute’s url or through your UI:
  1. Upload each file with POST /files.
  2. Submit them with POST /disputes/{id}/evidence, with the customer’s token.
When KetaPay needs more from someone, the dispute’s awaiting_evidence_from and evidence_due_at say who and by when, and you get dispute.evidence_requested so you can prompt them in your app. Evidence is only visible to the two parties and KetaPay. Your key alone cannot read it.

Outcome

You get dispute.resolved with the outcome: released to the seller, refunded to the buyer, partially_refunded, or withdrawn. Refunds go back the way the money came (see Refunds).