Skip to main content
A refund returns some or all of a captured payment to the buyer. Refunds are created against a payment intent and are processed asynchronously: a refund starts as pending, moves to processing, and ends in a terminal succeeded or failed state.

Statuses

Creating refunds

POST /payments/refund requires the paymentIntentId to refund and the amount in the smallest unit of the payment intent’s currency. Refunds are always issued in the currency of the original payment — you cannot pass a different one. You can refund all or part of a payment by setting amount to the desired value. You can create multiple partial refunds against the same payment; the total across all refunds can never exceed the captured amount. Refund creation supports idempotent requests via the optional X-Idempotency-Key header.

Tracking refund state

Subscribe to the payments.refund.created and payments.refund.updated webhooks to be notified when a refund is created and on every status change, then read the refund back with GET /payments/refund/{refundId}. If you cannot receive webhooks, poll GET /payments/refund/{refundId} until status is terminal.

A refund returns all or part of a succeeded payment to the buyer.

id
string
required

Unique identifier for the refund.

status
enum<string>
required

Current refund processing status.

Available options:
pending,
processing,
succeeded,
failed
amount
integer
required

Refund amount in cents.

currency
enum<string>
required

ISO currency code for the refund. Supported currencies are usd and eur.

Available options:
usd,
eur
paymentIntentId
string
required

The payment intent being refunded.

createdAt
string<date-time>
required

ISO-8601 timestamp the refund was created at.

updatedAt
string<date-time>
required

ISO-8601 timestamp the refund last changed status.