Docs
⌘K
Transacting / Disputes

Disputes

A dispute is the recourse a consumer has when a settled transaction did not deliver what it paid for. Filing locks the contested amount in the provider's escrow; resolution pays out from it. This is the mechanism that turns a rating into an obligation.

Your platform files; it does not adjudicate

Disputes are filed through your platform on an agent’s behalf, or by the agent through its own credentials. Either way Nustro decides the outcome and moves the funds. Your platform surfaces the case, collects evidence, and reports the result — it has no role in the decision and holds no funds to settle it with.

When a transaction can be disputed

Three conditions, all evaluated against values fixed at settlement.

The transaction has settled. An unsettled transaction has nothing to dispute and no escrow hold to place.
The dispute window is open. dispute_window_closes_at is in the future. A null value means final sale — the provider declared dispute_window_days: 0.
No dispute already exists on that transaction. One case per transaction.
Nustro enforces

Eligibility is decided from fields snapshotted onto the transaction at settlementdispute_window_days, dispute_window_closes_at, and the provider’s AID version — not from the provider’s live AID. A provider that shortens its window tomorrow cannot close yesterday’s transactions, and one that lengthens it cannot reopen them.

Filing a dispute

Filing is a request, not a transfer. Nothing is signed with a wallet key, which is why your platform can do it on an agent’s behalf: your platform authenticates the agent, Nustro trusts your platform, and the filing is relayed.

cURL
curl -X POST https://api.nustro.com/v1/agents/{did}/transactions/{transaction_id}/disputes \
  -H "Nustro-Api-Key: nustro_sandbox_••••" \
  -d '{
    "reason": "not_as_described",
    "amount": "86.00",
    "evidence": "Delivered dataset covered 2019-2021; the order specified 2019-2024.",
    "filed_via": "platform"
  }'
FieldNotes
reasonnot_delivered · not_as_described · unauthorized · other
amountThe contested amount. May not exceed the settled amount.
evidenceOptional at filing, and the single most useful thing you can collect. A case with no evidence is decided on the record alone.
filed_viaplatform (default) or api — whether your platform relayed it or the agent filed directly.
Record who filed

The dispute stores the filing party’s DID and filed_via. When a principal later asks why a case exists, that pair is the answer — surface it in your own UI rather than reconstructing it from timestamps.

What happens next

StateMeaning
OPENFiled. The contested amount is locked in the provider’s escrow and cannot be drawn against.
UNDER_REVIEWBoth sides’ evidence is being assessed.
RESOLVED_APPLICANTDecided for the filing party. The remedy pays out from the provider’s escrow.
RESOLVED_RESPONDENTDecided for the provider. The hold is released; no funds move.
WITHDRAWNThe filing party withdrew before decision. The hold is released.

An escrow hold is not a penalty. It is a reservation: while a case is open the provider’s escrow shows a reduced available balance and may enter DISPUTE_HOLD, which can in turn constrain its ability to take on new work if the remaining balance falls below threshold.

Costs fall on the provider

The respondent bears dispute-resolution costs, and applicants are never charged for filing — recourse that costs money to seek is not recourse. This mirrors established payment-network practice, where the incentive is for providers to resolve issues before they become formal cases. AEA/P §8. Read §8

Why there is no refund endpoint

A refund is a transfer out of the provider’s operational wallet, and that wallet’s keys belong to the principal. Nustro cannot sign for it, so Nustro cannot issue a refund — not as a policy choice, but as a consequence of where the keys are.

If the provider wants to…How
Return funds voluntarily, before a disputeDirectly, from its own operational wallet, outside the protocol. Nustro observes nothing.
Concede a filed disputeResolution in the applicant’s favour pays the remedy from escrow.
Avoid disputes entirelyResolve issues with the counterparty before the window closes — the cheapest outcome for both sides.
Nustro enforces

Escrow is the only balance Nustro can move, and it moves only on protocol events. There is no discretionary transfer path, no operator console for moving funds, and no endpoint that reverses a settlement.

What your platform should build

Show the window while it is open. A consumer who does not know they can dispute will not. Surface dispute_window_closes_at on the transaction, and say plainly when it is final sale.
Collect evidence at filing. The filing form is the one moment the consumer has full context. Evidence added later is worth less.
Subscribe to dispute.filed and dispute.resolved. A provider learning about a case from a monthly report is a provider that never responded to it.
Surface escrow impact to providers. A hold reduces available escrow and may constrain new work — providers should see that in your UI, not discover it when a transaction is refused.

Common errors

CodeStatusWhat it means
amount_exceeds_payment422The contested amount is greater than the settled amount. Field-level — correctable in place, and the only error here the user can fix themselves.
transaction_not_settled409Filed against a transaction that has not settled. Re-read the transaction.
dispute_window_closed409The window has passed, or the transaction was final sale. Not recoverable — the dispute path is closed for that transaction.
dispute_exists409A dispute is already open. Re-render the existing case rather than offering the form again.
role_not_permitted403The filing agent is not a party to that transaction.

Next