Refunds
A Refund returns all or part of the amount of a successful Transaction to the buyer. The refund is issued via the same payment method as the original payment — you cannot refund through a different channel.
You can issue multiple partial refunds on the same transaction, as long as the total refunded does not exceed the original amount.
The time it takes for funds to be returned depends on the operator:
Mobile Money (Airtel, Moov): 24–72h.
Bank card: 3–10 business days depending on the issuing bank.
PayPal: instant to 24h. Sangho sends a refund.succeeded webhook as soon as the operator confirms.
Lifecycle
| Status | Meaning |
|---|---|
pending | Refund created, awaiting processing. |
processing | Sent to the operator, being processed. |
succeeded | Funds returned to the buyer. |
failed | Refund failed on the operator's side. Funds are not debited. |
cancelled | Refund cancelled before processing (via /cancel/). |
expired | Processing deadline exceeded — the funds are returned to your balance. |
Endpoints
| Méthode | Endpoint | Description |
|---|---|---|
| POST | /refunds/ | Create a refund |
| GET | /refunds/ | List refunds |
| GET | /refunds/{id}/ | Retrieve a refund |
| POST | /refunds/{id}/cancel/ | Cancel a pending refund |
Object schema
Create a refund
Initiates a refund for an existing transaction. The transaction must be in
completed status. A partial refund does not change the status of
the original transaction — only a full refund moves the transaction to
refunded.
transactionRequisID of the Transaction to refund.
The transaction must be in completed status.
A transaction in pending,
failed, or disputed status cannot be
refunded. To cancel a payment that hasn’t been processed yet, use
POST /payment-intents/{id}/cancel/.
amountOptionnelAmount to refund, in cents. If omitted, refunds the full refundable amount of the transaction.
En savoir plus
The amount cannot exceed transaction.amount - amounts_already_refunded. You can
accumulate multiple partial refunds. Example: a transaction of 15,000 XAF →
a refund of 5,000, then a second refund of 3,000 is accepted (remaining: 7,000).
reasonOptionnelReason for the refund. Used for internal reporting and compliance.
En savoir plus
Accepted values: duplicate (duplicate payment),
fraudulent (fraudulent transaction),
customer_request (customer request),
product_issue (product issue),
service_not_rendered (service not rendered). The reason is included
in the refund.succeeded webhook.
descriptionOptionnelInternal note about the refund. Not visible to the buyer.
En savoir plus
Ideal for referencing a support ticket, an internal decision, or a communication with the customer.
metadataOptionnelFree-form data associated with the refund. Returned in the
refund.succeeded webhook.
A duplicate call without an Idempotency-Key creates two separate
refunds. With an identical key, Sangho returns the existing refund instead of creating
a new one. Use a unique UUID for each refund attempt.