Disputes
When a payer contests a payment, how you respond, and what a loss costs you.
A dispute is a payer, or their card network, contesting one of your payments: you answer it, and it ends with you keeping the money or with your balance debited. You cannot create one through the API.
Dispute endpoints need the secret key
Every call in this section requires a secret key and answers 406 Not Acceptable with
Private Key Required to a public key. They belong on your server.
Two pages go further:
- Respond to a dispute, with evidence, by conceding, or by talking to the payer.
- Track disputes, reading them and the webhooks they send.
Where a dispute comes from
A dispute reaches you from one of two places.
The payer opens it from Pocket, the Wajub wallet where they can see the payments they have made. They pick a reason, describe the problem, and that description becomes the first message on the dispute thread.
| Reason the payer picks | What they are claiming |
|---|---|
product_not_received | They paid and nothing arrived |
product_not_as_described | What arrived was not what was sold |
duplicate_charge | They were charged twice for one thing |
fraudulent | They did not make this payment |
other | Anything else, explained in the description |
A dispute from Pocket carries the full amount of the payment, and a due_date to answer by,
seven days after it opened.
The provider reports a chargeback. When a card network or a provider notifies a chargeback on
one of your payments, Wajub opens a dispute for it. It carries the provider's own
provider_reference, its reason code in reason, and the amount the provider disputes, which can
be less than the payment. It also carries a due_date: the provider's deadline when it sends one,
seven days after opening otherwise.
Either way, a payment has one dispute in flight at a time. A second notice for the same case does not open a second dispute.
Disputes do not exist in sandbox
Disputes come from real payers and real providers, so a test payment never produces one. This flow cannot be rehearsed end to end before you go live. Build your handler against the payloads on this page, and check it against the first real dispute you receive.
The amount is held while the dispute is open
A dispute opened from Pocket, on a payment Wajub collected for you, moves the disputed amount from your available balance to your disputed balance, as far as your available balance allows. Winning moves it back. Losing debits it, as described below.
The states a dispute moves through
A dispute lands open. Submitting evidence moves it to under_review on its own, you do not set
that yourself. From either of those two states it can end as won or lost, and both are final.
Wajub adjudicates. There is no endpoint that lets you declare yourself the winner; what you can do is put the evidence in front of the people who decide, or concede.
What a loss costs
On a payment Wajub collected for you, a lost dispute takes the disputed amount off your balance, capped at whatever has not already left through a refund on the same payment, so the money cannot be taken twice. On a payment collected through your own provider account, Wajub holds none of the money, and the provider settles the chargeback with you directly.
A flat dispute fee is charged on top, 15 000 XAF by default in the dispute's currency, when the
loss comes from the API, with accept or close, or from a provider chargeback. Accepting from
the Dashboard does not charge it. So losing a 25 000 XAF dispute through the API costs 40 000 XAF,
not 25 000. The debits happen on the status change itself, not on anything you call afterwards.
A dispute does not change the original payment's status. When you accept, the refund Wajub
creates for the payer is an ordinary refund, with its own refund.* events, and shows on the
payment like any other refund. It does not take the disputed amount a second time. If the payer
paid Wajub's fee on top of the price (bearer: customer), that fee is debited from you as well,
since the payer gets back everything they paid. The money movement shows on your balance, which is where you reconcile
it.
In the Dashboard
Disputes lists them with their status and the payment behind each one. Opening a dispute gives you the payer's description, the message thread, and the same three actions the API exposes plus one it does not: you can mark a dispute as won from here when Wajub has adjudicated in your favour.
The section needs the manage_disputes permission, which is separate from manage_payments, so a
teammate can run orders without being able to concede a dispute on your behalf.
Fewer disputes is cheaper than winning them
A dispute costs you time whatever the outcome, so the work that pays best happens before one exists.
Refund willingly when a customer complains and you have no case: a refund you choose costs you the amount, a dispute you lose costs the amount plus the flat dispute fee. Keep proof of delivery where you can attach it in one click. And let Shield reject the payments most likely to come back at you, since a payment refused up front cannot be disputed at all.
Related pages
- Shield, fraud detectionReject risky payments before they can be disputed.
- RefundsGive the money back on your terms instead of theirs.
- Balance and settlementsWhere the debit from a lost dispute lands.
- WebhooksRegister an endpoint and verify the signature on dispute events.
- Security best practicesLimit fraud on the integration side.
- Disputes API referenceEvery field on the resource, and the six endpoints.