Refunds for Stablecoin Payins booked through Circle Singapore (
CIRCLE_SG)
are not supported. Refunds for Circle SAS (CIRCLE_FR) accounts are supported
with restrictions. See Step 2 for details.Prerequisites
Before you begin, ensure that you’ve:- Confirmed that a settled payment exists on the payment intent you want to refund. If you haven’t accepted a payin yet, see Receive a stablecoin payin.
- Identified a refund destination address you control on the same blockchain as
the original payment. The destination is merchant-supplied; Circle doesn’t
automatically return funds to the source wallet. For
CIRCLE_FRaccounts, see Step 2 for destination requirements. - Obtained a Circle Mint sandbox API key. See Getting started for setup.
Steps
1
Inspect the intent to confirm a settled payment
Before you initiate a refund, retrieve the payment intent and confirm that at
least one payment in A refund-eligible response has a populated
paymentIds is settled. Send a GET request to
/v1/paymentIntents/{id}.paymentIds array and a non-zero
amountPaid. The latest timeline entry shows status complete with
context paid.2
Issue the refund
Send a For the full EEA data model, see
Travel Rule compliance.The response is a
POST request to /v1/paymentIntents/{id}/refund. The body specifies
the destination you control, the refund amount, and an idempotency key. The
request uses two amount fields:amountcarries the source-currency basis; onlycurrencyis required, and the value is derived fromtoAmount.toAmountcarries the actual refund amount that reaches the destination and must include bothamountandcurrency.
addressTag to the destination object.For CIRCLE_FR accounts, three requirements differ from Circle LLC behavior:paymentId(required): include the ID of the settled payment frompaymentIds[]on the intent. Circle uses this to associate the refund with the original payin and inherit its Travel Rule data.- Destination must be the original sender: set
destinationto{ "useOriginalSender": true }. Raw address destinations are rejected with error1166(ADDRESS_BOOK_DESTINATION_REQUIRED). - Cross-VASP refunds: refunds to a wallet address at a different VASP than the original payin are not supported.
paymentId and the useOriginalSender destination to the request body:- Partial refund
- Full refund
Specify an amount lower than the settled total to return a portion of the
payment.
payment object with type refund and status pending.
The depositAddress field shows where Circle sends the onchain transfer.3
Track refund completion
Refunds settle asynchronously after the onchain transfer confirms. Use webhooks
or polling to detect settlement.
- Webhook
- Polling
Subscribe to
payments notifications. The same channel delivers both inbound
payment events and refund events. Use the type field to tell them apart.4
(Optional) Issue an additional partial refund
If the original refund was partial and the intent still has refundable balance,
you can issue further partial refunds up to the total settled amount. Each
additional refund still requires the intent to be within 30 days of its creation
date, and each call must use a unique
idempotencyKey.