Aller au contenu

Créer un remboursement

L'appel qui restitue des fonds sur un paiement réussi, ses paramètres et sa réponse.

Le paiement est désigné par son id Wajub. Votre propre reference sur le paiement n'est pas acceptée ici, car la recherche porte sur l'id du paiement et rien d'autre.

POSThttps://api.wajub.com/refunds
paymentstringobligatoire
L'id du paiement, par exemple trx_test_CSUGajfv9xh0XQ5wu2lx. Votre reference marchand n'est pas acceptée.
reasonenumobligatoire
La raison du remboursement. Les valeurs acceptées sont listées plus bas.
amountnumberfacultatif
Montant dans l'unité principale, décimales autorisées et arrondies à deux. Omettez-le pour rembourser en totalité ce qui reste.
currencystringfacultatif
Doit être égale à la devise du paiement, qui est la valeur par défaut.
fees_bearerenumfacultatif
merchant ou customer : qui supporte les frais Wajub du paiement pour la part remboursée. Par défaut : vos réglages de remboursement, sinon celui qui a payé les frais au paiement. Voir plus bas.
referencestringfacultatif
Votre propre référence pour ce remboursement, jusqu'à 255 caractères. Renvoyée à la lecture, et elle reste la vôtre : Wajub n'y écrit jamais l'identifiant du remboursement chez le prestataire.
metadataobjectfacultatif
Données clé-valeur libres, renvoyées telles quelles sur l'objet remboursement. Une clé est réservée : dispute_settlement marque le remboursement que Wajub crée quand vous acceptez un litige, et elle est retirée si vous l'envoyez.

reason est obligatoire et sa liste est fermée. Toute valeur hors de cette liste donne un 422 : choisissez la plus proche plutôt que d'en inventer une.

MotifQuand l'utiliser
requested_by_customerLe client l'a demandé, et vous avez accepté
duplicateLa même commande a été payée deux fois
fraudulentVous pensez que le paiement n'a pas été fait par le titulaire de la carte ou du compte
product_not_receivedLa marchandise n'est jamais arrivée
service_not_deliveredUn service a été payé mais pas fourni
wrong_amountVous avez débité plus que prévu
customer_complaintUne réclamation réglée sans désigner de responsable
merchant_errorVotre propre erreur : mauvais article, mauvais prix, mauvais client
network_errorLe paiement est passé de votre côté mais pas du leur
transaction_errorUne panne technique dans le paiement lui-même
reconciliationCorrection d'un écart trouvé lors d'un rapprochement

Envoyez l'appel depuis votre serveur, avec une Idempotency-Key si le remboursement peut être déclenché par un processus qui retente ses appels.

curl https://api.wajub.com/refunds \
  -H "Authorization: sk_test.xxxxxxxxxxxxxxxx…" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: refund-order-4172" \
  -d '{
    "payment": "trx_test_CSUGajfv9xh0XQ5wu2lx",
    "amount": 2000,
    "reason": "product_not_received",
    "reference": "rma-881"
  }'

Wajub répond 201 Created. Rien n'a encore quitté votre solde : le remboursement a été accepté et mis en file, et status vous indique où il en est.

Réponse · 201 Created
{
"code": 201,
"status": "Created",
"message": "Refund created successfully",
"refund": {
"id": "rfd_test_9xh0XQ5wu2lxCSUGajfv",
"transaction": "trx_test_CSUGajfv9xh0XQ5wu2lx",
"reference": "rma-881",
"amount": 2000,
"currency": "XAF",
"status": "processing",
"reason": "product_not_received",
"metadata": {
},
"sandbox": true,
"created_at": "2026-09-11T10:30:00+00:00"
}
}

Le paiement est porté par transaction, pas par payment. Les lectures renvoient aussi un détail tax quand une taxe s'applique, une timeline des changements de statut, et failure_reason avec failure_message quand le remboursement a échoué. Un remboursement qui a pris de l'argent sur votre solde renvoie en plus ledger_balance_currency, ledger_balance_before et ledger_balance_after : votre solde juste avant le remboursement et juste après, si bien que la différence est ce qu'il a pris, part des frais du paiement comprise quand elle a bougé avec lui. En sandbox, ce sont ceux de votre solde sandbox. refund.succeeded part une fois le remboursement sorti de votre solde : son contenu les porte aussi, et il peut arriver quelques minutes après le passage du remboursement à succeeded. Un remboursement qui n'a rien pris, parce qu'un litige perdu l'avait déjà fait, n'a aucun des trois.

Idempotency-Key, et ce sur quoi porte la clé

La clé est conservée sur le remboursement lui-même et n'expire jamais : la même clé désigne toujours le même remboursement, et n'en crée jamais un second. Pendant 24 heures, la première réponse est rejouée telle quelle, et tout changement du corps est refusé avec un 422. Ensuite, le remboursement d'origine revient dans un nouveau 201, sauf si la clé sert pour un autre paiement ou un autre amount, ce qui donne aussi un 422. Une clé est consommée pour toujours : dérivez-la de ce remboursement précis, une commande et un numéro de remboursement, pas de la commande seule. Un second remboursement du même montant ne ferait que vous rendre le premier.

Que pensez-vous de ce contenu ?