How to refund a payment

Refund a paid order back to the payer — estimate the fees, then initialise.

Refunds return a paid merchant order back to the payer. A refund is always tied to an existing order — you cannot refund an arbitrary amount — and it is a two-step flow: estimate the refund first to learn the fees, then initialise it with the fee you were quoted.

Endpoint overview

HTTP RequestDescription
POST /public/merchants/refunds/estimateEstimate the amounts and fees for refunding an order.
POST /public/merchants/refundsInitialise the refund.
GET /public/merchants/refundsList your refunds, with pagination and filtering.
GET /public/merchants/refunds/{id}Retrieve a single refund.

Reading refunds requires the merchants-refunds:read scope; estimating and initialising require merchants-refunds:create. See Scopes.


Step 1 — Estimate the refund

Estimation tells you what the payer will receive and what you will be charged, before anything moves.

Request body

FieldRequiredDescription
merchantOrderIdyesThe order being refunded.
addressyesDestination address for the refunded funds.
feeCurrencyCodeyesCurrency the fees are charged in.
networkCodenoBlockchain network to use, when the currency supports more than one. See Supported networks.
amountTypenoPAY_AMOUNT or RECEIVE_AMOUNT — whether the amount you specify is what leaves your account or what the payer receives.
messagenoFree-text note stored with the refund.

Response body

FieldDescription
paidAmountAmount originally paid on the order.
currencyCodeCurrency of paidAmount.
feeAmountTotal fee for the refund.
refundFeeAmountThe refund fee component.
withdrawFeeAmountThe network/withdrawal fee component.
feeCurrencyCodeCurrency the fees are charged in.
gasPrice, gasLimitPresent for networks where gas applies.

Step 2 — Initialise the refund

Send the fee you were quoted in step 1. The request is rejected if the order cannot be refunded.

Request body

FieldRequiredDescription
merchantOrderIdyesThe order being refunded.
refundAccountIdyesWallet the refunded amount is taken from.
feeAccountIdyesWallet the fees are taken from.
feeAmountyesFee accepted for this refund — use the value returned by the estimate.
addressnoDestination address.
networkCodenoBlockchain network, where applicable.
amountTypenoPAY_AMOUNT or RECEIVE_AMOUNT.
messagenoFree-text note.
beneficiaryIdnoSaved beneficiary to refund to, where Travel Rule information is required.
📘

Estimate immediately before initialising. Fees move with network conditions, and a stale feeAmount will not match the current quote.


Tracking a refund

GET /public/merchants/refunds lists refunds with pagination; GET /public/merchants/refunds/{id} returns one. Both require merchants-refunds:read.


Did this page help you?