Aller au contenu

Litiges

Quand un payeur conteste un paiement, comment vous répondez, et ce qu'une perte vous coûte.

Un litige, c'est un payeur qui signale à Wajub qu'un paiement qu'il a effectué pose problème. Il porte sur un seul paiement, ne bloque rien de votre côté, et se termine de l'une de deux façons : soit vous gardez l'argent, soit il repart et votre solde est débité.

Contrairement à un remboursement, ce n'est pas vous qui ouvrez un litige, et vous ne pouvez pas en créer un par l'API. Votre rôle est d'y répondre.

D'où vient un litige

Le payeur l'ouvre depuis Pocket, le portefeuille Wajub où il retrouve les paiements qu'il a effectués. Il choisit un motif, décrit le problème, et cette description devient le premier message du fil de discussion du litige.

Motif choisi par le payeurCe qu'il affirme
product_not_receivedIl a payé et rien n'est arrivé
product_not_as_describedCe qui est arrivé ne correspond pas à ce qui était vendu
duplicate_chargeIl a été débité deux fois pour la même chose
fraudulentIl n'a pas effectué ce paiement
otherTout autre cas, expliqué dans la description

Un litige porte toujours sur le montant total du paiement, jamais sur une partie, et un paiement ne peut avoir qu'un seul litige en cours à la fois. Un second litige ne peut pas être ouvert tant que le premier n'est pas résolu.

Les états d'un litige

Un litige arrive en open. L'envoi de justificatifs le fait passer de lui-même en under_review, vous ne réglez pas ce statut vous-même. Depuis l'un ou l'autre de ces deux états, il peut se terminer en won ou en lost, et les deux sont définitifs.

C'est Wajub qui tranche. Aucun endpoint ne vous permet de vous déclarer gagnant ; ce que vous pouvez faire, c'est présenter les justificatifs à ceux qui décident, ou concéder.

Un statut resolved que vous ne verrez pas

L'endpoint de liste accepte ?status=resolved, et la valeur existe dans le schéma, mais rien ne l'écrit jamais sur un litige. Filtrez sur won et lost pour les litiges terminés.

Répondre avec des justificatifs

C'est cette étape qui décide de l'issue, et elle mérite d'être soignée. Chaque justificatif est classé sous un type, et vous pouvez faire plusieurs appels pour constituer votre dossier.

POSThttps://api.wajub.com/disputes/{id}/submit-evidence
evidence_typeenumobligatoire
L'un de customer_communication, proof_of_delivery, service_documentation, receipt, product_description, cancellation_policy, refund_policy, duplicate_charge_documentation, other.
evidence_textstringfacultatif
Votre argumentaire écrit pour ce justificatif, 2 000 caractères maximum.
evidence_filefilefacultatif
Un seul fichier : PDF, JPG, JPEG, PNG, DOC, DOCX ou TXT, 10 Mo maximum. Envoyez l'appel en multipart/form-data.

Le type est un emplacement, pas une étiquette. Envoyez deux appels avec proof_of_delivery et le second remplace le premier, il ne s'y ajoute pas. Utilisez un type différent pour chaque justificatif distinct, et mettez tout ce que vous voulez dire sur un justificatif dans cet unique appel.

Comme un fichier est en jeu, il s'agit d'un envoi de formulaire et non d'un corps JSON.

curl https://api.wajub.com/disputes/dsp_hrgUOE225KMKULRQqYvlh/submit-evidence \
  -H "Authorization: sk.kZ3qP8mWvL2xR7tB5nY4hC6dF9jS1aG0eU3i…" \
  -F "evidence_type=proof_of_delivery" \
  -F "evidence_text=Delivered 12 Sept, signed for by the customer." \
  -F "evidence_file=@/path/to/delivery-note.pdf"

L'appel répond 200 OK avec le litige dans son état actuel, déjà passé en under_review, et vos justificatifs regroupés sous evidence.

Réponse · 200 OK
{
"code": 200,
"status": "OK",
"message": "Evidence submitted successfully",
"dispute": {
"id": "dsp_hrgUOE225KMKULRQqYvlh",
"transaction": "trx_CSUGajfv9xh0XQ5wu2lx",
"customer": "cus_sAaim5apjocIgtlhzJY3wQ8s",
"amount": 25000,
"currency": "XAF",
"status": "under_review",
"reason": "product_not_received",
"evidence": {
"proof_of_delivery": {
"text": "Delivered 12 Sept, signed for by the customer.",
"file_name": "delivery-note.pdf",
"uploaded_at": "2026-09-11T12:04:00Z"
}
},
"sandbox": false,
"created_at": "2026-09-11T12:00:00Z"
}
}

Les justificatifs ne peuvent être déposés que tant que le litige est open ou under_review. Une fois en won ou lost, l'appel répond 422 et le dossier est clos.

Concéder, et un appel qui ne fait pas ce que son nom laisse croire

Si le payeur a raison, concédez tôt plutôt que de laisser traîner.

POSThttps://api.wajub.com/disputes/{id}/accept

L'acceptation prend un merchant_response facultatif, 2 000 caractères maximum, enregistré sur le litige. Elle passe le litige en lost immédiatement, sans retour possible.

Échanger avec le payeur

Un litige porte un fil de messages, ouvert par la description du payeur lui-même. Vous pouvez y répondre.

POSThttps://api.wajub.com/disputes/{id}/messages

Les messages prennent content, obligatoire et limité à 5 000 caractères, et un tableau attachments facultatif de fichiers soumis aux mêmes contraintes que les justificatifs. POST /disputes/{id}/send-message est un alias du même appel. Vos messages sont enregistrés avec un sender_type à merchant, ceux du payeur avec customer, et le fil complet est renvoyé lorsque vous récupérez le litige.

Consulter les litiges

Récupérer un litige le renvoie avec sa transaction, son client et son fil de messages complet.

GEThttps://api.wajub.com/disputes/{id}
GEThttps://api.wajub.com/disputes
Paramètre de requêteValeurs acceptées
per_pageDe 1 à 100, 25 par défaut
statusopen, under_review, won, lost
searchTexte libre sur l'id, le motif et la description du litige
date_from, date_toDates, date_to pas antérieure à date_from
cursorPasse à la pagination par curseur

Au-delà des champs évidents, un litige porte la description du payeur, votre merchant_response, les justificatifs que vous avez déposés dans evidence, resolved_at une fois terminé, et metadata.

due_date est toujours absent

La ressource déclare un due_date, mais rien ne le renseigne jamais, il n'apparaît donc dans aucune réponse. Le payload ne contient aucune échéance à décompter. Considérez qu'un nouveau litige appelle une réponse immédiate, et non qu'il porte un minuteur que vous pourriez lire.

Ce que coûte une perte

Quand un litige passe en lost, deux débits distincts frappent votre solde. Le montant contesté part en premier, plafonné à ce qui n'est pas déjà sorti par un remboursement sur le même paiement, pour que l'argent ne puisse pas être pris deux fois. Ensuite, des frais de litige forfaitaires s'ajoutent, 15 000 XAF par défaut dans la devise du litige, et ceux-là s'appliquent qu'un remboursement ait eu lieu ou non.

Perdre un litige de 25 000 XAF coûte donc 40 000 XAF, et non 25 000. Les deux débits ont lieu au changement de statut lui-même, pas lors d'un appel que vous feriez ensuite.

Le paiement d'origine n'est pas touché par tout cela. Il reste succeeded, exactement comme lors d'un remboursement, et perdre un litige ne crée aucun objet remboursement. Le mouvement d'argent est inscrit dans le registre du solde, et c'est là que vous le rapprochez.

La perte alimente aussi le score de risque : un litige perdu augmente le risque évalué du payeur concerné, et Shield examine donc ses futurs paiements avec plus de méfiance.

Webhooks

Six événements, et ceux qui méritent une action sont les issues.

ÉvénementDéclenché quand
dispute.createdUn payeur a ouvert un litige. Lisez-le et décidez comment répondre
dispute.updatedUn champ a changé, y compris à chaque changement de statut
dispute.wonRésolu en votre faveur, rien ne quitte votre solde
dispute.lostRésolu contre vous, le montant est débité
dispute.closedLe litige a atteint un état final
dispute.deletedL'enregistrement du litige a été supprimé
dispute.createdévénement
Un payeur a ouvert un litige sur l'un de vos paiements.
Payload
{
"id": "evt_9Dx2PqLm4K",
"type": "dispute.created",
"created_at": "2026-09-11T12:00:00.000Z",
"sandbox": false,
"data": {
"id": "dsp_hrgUOE225KMKULRQqYvlh",
"transaction": "trx_CSUGajfv9xh0XQ5wu2lx",
"customer": "cus_sAaim5apjocIgtlhzJY3wQ8s",
"amount": 25000,
"currency": "XAF",
"status": "open",
"reason": "product_not_received",
"description": "Ordered on 2 Sept, nothing delivered."
}
}

Dédupliquez sur X-Wajub-Delivery-Id, comme partout ailleurs. L'enregistrement et la vérification de signature sont décrits dans Webhooks.

Dans le Dashboard

Disputes les liste avec leur statut et le paiement concerné. Ouvrir un litige vous donne la description du payeur, le fil de messages, et les trois mêmes actions que l'API, plus une qu'elle n'expose pas : vous pouvez marquer ici un litige comme gagné quand Wajub a tranché en votre faveur.

La section exige la permission manage_disputes, distincte de manage_payments, pour qu'un coéquipier puisse gérer les commandes sans pouvoir concéder un litige à votre place.

Moins de litiges coûte moins cher que d'en gagner

Un litige vous coûte du temps quelle qu'en soit l'issue, et le travail le plus rentable se fait donc avant qu'il n'existe.

Remboursez de bon gré quand un client se plaint et que vous n'avez pas d'argument : un remboursement que vous choisissez vous coûte le montant, un litige perdu vous coûte le montant plus les frais de litige forfaitaires. Gardez vos preuves de livraison là où vous pouvez les joindre en un clic. Et laissez Shield refuser les paiements les plus susceptibles de se retourner contre vous, puisqu'un paiement refusé d'emblée ne peut pas du tout être contesté.

Que pensez-vous de ce contenu ?