Open a paid transaction and select Refund next to its amount. Enter an amount (by default the whole remaining balance) and confirm. The transaction then shows the refunded total and the remaining balance. Another refund becomes available once the previous one has succeeded and the new balance is verified.
Read the refund state. remainingCents is the verified refundable balance; request is the latest refund, or null.
Create the refund with expectedAmountCents equal to the remainingCents you just read. Add amountCents for a partial refund, or omit it to refund everything that remains.
Read the refund state again to follow the request. For the financial outcome, read the payment or wait for the payment.partially_refunded or payment.refunded webhook.
The expected balance guards against duplicates. Sending the same balance and amount again returns the same request. A different amount, or an outdated balance, returns 409.
Never refresh the balance and resubmit automatically
After a timeout, read the refund state first. If you must resend, send the exact original body. A lower balance means a refund already happened; it is not a reason to retry.
A 200 response acknowledges the request; it does not prove the money was returned. Keep the returned request ID with your order. The read endpoint returns only the latest request, not the full history. See errors for status codes.