Refunds
Refund a captured transaction in full or in part. Refunds are processed against the original card and emit a payment.refunded webhook.
Issue a refund
http
POST /api/v1/payments/{transaction_id}/refundjson
{
"amount": 1000,
"reason": "Customer request"
}Response
json
{
"id": "ref_xyz789",
"payment_id": "txn_789xyz",
"amount": 1000,
"status": "completed",
"created_at": "2026-05-05T12:00:00+00:00"
}Partial and multiple refunds
- Set
amountless than the original transaction amount for a partial refund. - Multiple partial refunds are allowed up to the original captured amount.
- Each refund fires its own
payment.refundedwebhook.
When to use refund vs void
If the underlying transaction is authorized but not yet captured, use Void instead — it releases the hold without a refund record. Once captured, only refund applies.
Reason codes
reason is free-text, stored on the refund record, and surfaces on receipts and the dashboard. Keep it customer-friendly — it shows up in dispute documentation.
Next
- Captures & Voids — for
authorizemode transactions - Webhooks — listen for
payment.refunded
