Total ou partiel
POST /v1/refunds avec payment_id + amount (optionnel : si absent, refund total). Un payment peut recevoir N refunds partiels jusqu'à concurrence du montant initial.
Total ou partiel, idempotent
Total ou partiel. Un paiement peut accumuler plusieurs remboursements tant qu'on ne dépasse pas le montant d'origine — les statuts PARTIALLY_REFUNDED et REFUNDED se mettent à jour automatiquement.
POST /v1/refunds avec payment_id + amount (optionnel : si absent, refund total). Un payment peut recevoir N refunds partiels jusqu'à concurrence du montant initial.
Header Idempotency-Key obligatoire. Un rejeu sur la même clé renvoie le refund existant — pas de double-rétrocession.
Le paiement passe automatiquement à PARTIALLY_REFUNDED ou REFUNDED. Vous n'avez pas à coder le calcul — nos services le font pour vous.
refund.created → refund.succeeded ou refund.failed. Et payment.refunded émis sur le paiement parent (équivalent Stripe charge.refunded).
curl https://api.saalapay.com/v1/refunds \
-H "X-SP-Signature: $HMAC_SIGNATURE" \
-H "Idempotency-Key: refund-order-1058-line-3" \
-d '{
"payment_id": "01HXY9Z...",
"amount": 15000,
"reason": "Article retourné par le client"
}'
# Réponse → status PENDING tant que le provider ne confirme pas
{
"data": {
"id": "rf_018f2c...",
"status": "pending",
"amount": 15000,
"currency": "XOF",
"payment_id": "01HXY9Z..."
},
"meta": { "event_emitted": "refund.created" }
}
Notre service de paiement tient les comptes pour vous.