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, ou son réseau de carte, qui signale à Wajub qu'un paiement pose problème. Il porte sur un seul paiement 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

Un litige vous parvient de l'un de deux endroits.

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 ouvert depuis Pocket porte sur le montant total du paiement, et porte un due_date avant lequel répondre, sept jours après son ouverture.

Le prestataire signale une rétrofacturation. Quand un réseau de carte ou un prestataire notifie une rétrofacturation sur l'un de vos paiements, Wajub ouvre un litige pour elle. Il porte la référence du prestataire dans provider_reference, son code de motif dans reason, et le montant que le prestataire conteste, qui peut être inférieur au paiement. Il porte aussi un due_date : l'échéance du prestataire quand il en envoie une, sept jours après l'ouverture sinon.

Dans les deux cas, un paiement n'a qu'un seul litige en cours à la fois. Un second avis pour le même dossier n'ouvre pas de second litige.

Le montant est bloqué tant que le litige est ouvert

Un litige ouvert depuis Pocket, sur un paiement encaissé par le prestataire propre à Wajub, fait passer le montant contesté de votre solde disponible à votre solde en litige, dans la limite de votre solde disponible. Gagner le rend disponible. Perdre le débite, comme décrit plus bas.

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, mais ce statut n'est jamais renvoyé. 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.

Envoyez un texte, un fichier, ou les deux : un appel sans l'un ni l'autre répond 422, et le litige reste où il était. Sans fichier, le justificatif est enregistré sous la forme de votre seul texte : evidence.proof_of_delivery est alors une chaîne et non un objet. Un fichier est enregistré sous un nom à lui, avec l'extension de son contenu ; le nom que vous lui aviez donné revient dans file_name.

Les fichiers sont privés : aucune adresse ne les ouvre d'elle-même. Chaque réponse de l'API qui renvoie le litige donne à chaque fichier, justificatifs comme pièces jointes des messages, une url, un lien signé valable 30 minutes. Passé ce délai, relisez le litige pour en obtenir un nouveau. Un webhook porte file_path sans lien, car il est conservé et renvoyé bien après l'expiration d'un lien.

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.xxxxxxxxxxxxxxxx…" \
  -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_path": "…",
"file_name": "delivery-note.pdf",
"uploaded_at": "2026-09-11T12:04:00+00:00",
"url": "https://…?signature=…"
}
},
"sandbox": false,
"created_at": "2026-09-11T12:00:00+00:00"
}
}

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, et rend l'argent au payeur : Wajub crée un remboursement du montant contesté, plafonné à ce qui reste remboursable sur le paiement.

Ce remboursement porte le motif customer_complaint et le motif du litige dans metadata.dispute_reason, et il rend au payeur tout ce qu'il a payé pour ce montant, y compris des frais qu'il aurait payés en plus. Si le remboursement ne peut pas être créé, l'appel échoue et le litige reste dans son état.

Trois cas ne créent aucun remboursement, et le litige finit quand même lost :

  • Une rétrofacturation. La banque du payeur lui a déjà rendu l'argent et le prestataire le reprend à Wajub : un remboursement paierait le payeur deux fois.
  • Plus rien à rembourser. Des remboursements antérieurs ont déjà rendu tout le paiement.
  • Un litige dans une autre devise que son paiement. Il n'y a pas de montant à rembourser dans la devise du paiement.

É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. Chaque pièce jointe revient avec file_name, file_path et la même url valable 30 minutes. 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. Le fil reste ouvert après l'issue : un message sur un litige déjà won ou lost est accepté et enregistré, mais ne change rien au résultat.

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.

Comment due_date est fixé

Chaque litige porte due_date, l'échéance avant laquelle répondre. Sur un litige ouvert depuis Pocket, c'est sept jours après l'ouverture. Sur une rétrofacturation, c'est l'échéance du prestataire quand il en envoie une, sept jours après l'ouverture sinon. Passé son échéance, un litige Pocket reste ouvert jusqu'à ce que Wajub tranche.

Ce que coûte une perte

Sur un paiement encaissé par le prestataire propre à Wajub, un litige perdu retire le montant contesté de votre solde, 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. Sur un paiement encaissé par votre propre compte chez un prestataire, Wajub ne détient pas l'argent, et le prestataire règle la rétrofacturation directement avec vous.

Des frais de litige forfaitaires s'ajoutent, 15 000 XAF par défaut dans la devise du litige, quand la perte vient de l'API, avec accept ou close, ou d'une rétrofacturation du prestataire. Accepter depuis le Dashboard ne les facture pas. Perdre un litige de 25 000 XAF par l'API coûte donc 40 000 XAF, et non 25 000. Les débits ont lieu au changement de statut lui-même, pas lors d'un appel que vous feriez ensuite.

Un litige ne change pas le statut du paiement d'origine. Le remboursement créé quand vous acceptez s'y lit comme n'importe quel autre, à partir de la version 2026-10-11 de l'API. Quand vous acceptez, le remboursement que Wajub crée pour le payeur est un remboursement ordinaire, avec ses propres événements refund.*, à ceci près qu'il ne retire pas le montant contesté une seconde fois : la perte l'a retiré une fois, quel que soit l'ordre d'enregistrement, et le remboursement l'envoie au payeur. Si le payeur a payé les frais Wajub en plus du prix (bearer: customer), ces frais vous sont débités aussi, puisque le payeur récupère tout ce qu'il a payé. Le mouvement d'argent apparaît sur votre 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

Sept événements, et ceux qui méritent une action sont les issues, plus le rappel.

ÉvénementDéclenché quand
dispute.createdUn litige a été ouvert, par un payeur ou à partir d'une rétrofacturation. 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.closedEnvoyé avec dispute.lost. Un litige gagné ne l'envoie pas
dispute.deadline_approachingL'échéance est dans deux jours et le litige est encore open ou under_review. Envoyé une seule fois, avec metadata.reminded_at renseigné ; répondez maintenant
dispute.deletedL'enregistrement du litige a été supprimé

dispute.deadline_approaching est envoyé en live comme en sandbox, pour chaque litige qui a une due_date : litiges Pocket et rétrofacturations à l'identique. L'écriture de metadata.reminded_at sur le litige envoie aussi un dispute.updated à côté.

dispute.createdévénement
Un payeur a ouvert un litige sur l'un de vos paiements.
Payload
{
"id": "evt_Qp7Tz3Wk5Yb1NdLm2Xc94Rf8",
"event": "dispute.created",
"created": "2026-09-11T12:00:00+00:00",
"livemode": true,
"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 ?