Skip to main content

Full or partial, idempotent

Refund in 1 call, without breaking your accounting

Full or partial. A payment can accumulate multiple refunds as long as the original amount isn't exceeded — PARTIALLY_REFUNDED and REFUNDED statuses update automatically.

What you get

Full or partial

POST /v1/refunds with payment_id + amount (optional: if absent, full refund). A payment can receive N partial refunds up to the initial amount.

Idempotent

Idempotency-Key header required. A replay on the same key returns the existing refund — no double-refund.

Consistent statuses

The payment automatically moves to PARTIALLY_REFUNDED or REFUNDED. You don't have to code the calculation — our services do it for you.

Dedicated webhooks

refund.created → refund.succeeded or refund.failed. And payment.refunded emitted on the parent payment (Stripe charge.refunded equivalent).

Partially refund a payment bash
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" }
}
N partials — Up to the original amount
Idempotent Required Idempotency-Key
3 events · created / succeeded / failed

Refund with peace of mind.

Our payment service keeps the books for you.