- Buyer — one of your customers (
merchant_user) who funded the escrow. - Seller — the customer (
merchant_user) who created the payment link. - You, the merchant — the super-admin account that arbitrates and
releases the held funds. You are recorded on the dispute as the
admin.
A dispute can only be raised while the escrow is
OPENED (funded and held).
Before funding there is nothing to dispute; after the escrow is CLOSED
(COMPLETED / REFUNDED) it is terminal and can’t be reopened.Milestone escrows cannot be disputed. Disputes apply only to standard
escrows. A milestone escrow releases its funds
milestone-by-milestone as the buyer confirms each one, so there is no single held
amount to contest — any attempt to open a dispute on one is rejected with
Milestone escrows cannot be disputed.Who opens a dispute, and who responds
Only the buyer can open a dispute. The seller cannot initiate one — they can only respond to a dispute the buyer has already raised. Once both sides have been heard, you (the merchant) review and resolve it. Both parties act through Submit dispute (POST /v1/escrow/submit-dispute/{paymentToken}), sending the acting customer’s
ID in the customer-id header:
Buyer — opens the dispute
Raises the dispute any time after payment, while the escrow is
OPENED —
typically “I paid but the item never arrived / isn’t as described.”Seller — responds only
Cannot open a dispute. Their only proactive recourse is to
request to claim the funds once the
delivery window passes. If the buyer opens a dispute, the seller then replies
on this endpoint to put their side on record before you resolve it.
Buyer already submitted Dispute / Seller already submitted Dispute). The
request is multipart/form-data with a message and an optional evidence file.
How the status moves
The escrow’sstatus tracks the dispute as each party weighs in:
Buyer opens the dispute → DISPUTED
The escrow moves to
status: DISPUTED and the seller is notified. The
buyer’s submission is recorded under dispute.buyer.Seller responds → INVESTIGATING
Once the seller has replied (recorded under
dispute.seller), both sides are
on record and the escrow automatically moves to status: INVESTIGATING. This
is your cue to step in.You resolve → COMPLETED or REFUNDED
You review both sides and
resolve the dispute, disbursing the
held funds to the seller (
COMPLETED) or back to the buyer (REFUNDED).dispute object on the escrow holds each side’s contribution — buyer,
seller, and (after resolution) admin — every entry carrying its message,
optional proofUrl, the userId, and createdAt.
Reviewing disputes as the merchant
You have both a per-customer and a merchant-wide view. Watch thecustomer-id
header — it’s required on the per-customer routes and must be omitted on
the merchant-wide ones.
| View | Route | customer-id |
|---|---|---|
| One customer’s disputes | GET /v1/escrow/dispute/get | Required |
| A single dispute thread | GET /v1/escrow/dispute/get/{escrowId} | Required |
| Every customer’s disputes | GET /v1/escrow/all-dispute | Omit |
| All escrow activity (feeds) | GET /v1/escrow/feeds | Omit |
merchantId automatically, so you
only ever see disputes belonging to your own customers.
Resolving and disbursing funds
Resolution is merchant super-admin only — the route sits behind the super-admin guard, so an individual customer cannot resolve their own dispute. Call Resolve dispute (POST /v1/escrow/dispute/resolve/{escrowId}) with no customer-id header,
as multipart/form-data:
| Field | Required | Notes |
|---|---|---|
resolution | yes | Your decision note, stored under dispute.admin. |
status | yes | COMPLETED (release to seller) or REFUNDED (return to buyer). |
file | no | Optional supporting document. |
status: COMPLETED — release to the seller
status: COMPLETED — release to the seller
The full held amount (net of the seller fee) is released to the seller’s main
balance and the escrow closes as
COMPLETED, with commission charged once.status: REFUNDED — return to the buyer
status: REFUNDED — return to the buyer
The held amount plus the buyer’s pro-rata fee share is refunded to the
buyer’s main balance and the escrow closes as
REFUNDED.The seller’s recourse: claim funds
Since the seller can’t open a dispute, their way to push a stalled deal forward is to request to claim the funds. If the delivery window passes and the buyer never confirms, the seller calls Claim funds, moving the escrow toCLAIMED.
This is the un-contested counterpart to a dispute; see the
escrow lifecycle for how CLAIMED, DISPUTED, and
INVESTIGATING fit alongside the happy path.
For the precise meaning of every
status value and how it combines with the
escrow state, see the status reference.