Documentation Index
Fetch the complete documentation index at: https://developers.circle.com/llms.txt
Use this file to discover all available pages before exploring further.
This guide walks you through a complete mint-and-redeem cycle in the Circle Mint
sandbox: link a bank account, deposit fiat to mint USDC, transfer USDC onchain,
and redeem USDC back to fiat.
Prerequisites
Before you begin, complete the
account and API key setup.
Replace ${YOUR_API_KEY} in the examples below with your sandbox API key.
Step 1: Create a bank account
Register a mock bank account using the
create a wire bank account
endpoint. This bank account serves as the source for depositing fiat and the
destination for redeeming USDC.
curl -X POST https://api-sandbox.circle.com/v1/businessAccount/banks/wires \
-H "Authorization: Bearer ${YOUR_API_KEY}" \
-H "Content-Type: application/json" \
-d '{
"idempotencyKey": "unique-id-1",
"accountNumber": "12340010",
"routingNumber": "121000248",
"billingDetails": {
"name": "Satoshi Nakamoto",
"city": "Boston",
"country": "US",
"line1": "100 Money Street",
"district": "MA",
"postalCode": "01234"
},
"bankAddress": {
"bankName": "WELLS FARGO BANK, NA",
"city": "San Francisco",
"country": "US",
"line1": "420 Montgomery Street",
"district": "CA"
}
}'
Expected response:
{
"data": {
"id": "9d1fa351-b24d-442a-8aa5-e717db1ed636",
"status": "pending",
"description": "WELLS FARGO BANK, NA ****0010",
"trackingRef": "CIR2GKYL4B",
"fingerprint": "a9a71b77-d83d-4fbc-997f-41a33550c594",
"virtualAccountEnabled": true,
"billingDetails": {
"name": "Satoshi Nakamoto",
"line1": "100 Money Street",
"city": "Boston",
"postalCode": "01234",
"district": "MA",
"country": "US"
},
"bankAddress": {
"bankName": "WELLS FARGO BANK, NA",
"city": "SAN FRANCISCO",
"district": "CA",
"country": "US"
},
"createDate": "2026-01-15T12:00:00.000Z",
"updateDate": "2026-01-15T12:00:00.000Z"
}
}
Save the bank account id from the response. You need it in the following
steps.
Step 2: Get wire instructions
Retrieve the wire instructions for your bank account using the
get wire instructions
endpoint. The response includes the trackingRef and beneficiary
accountNumber you need to simulate a wire deposit.
curl https://api-sandbox.circle.com/v1/businessAccount/banks/wires/9d1fa351-b24d-442a-8aa5-e717db1ed636/instructions \
-H "Authorization: Bearer ${YOUR_API_KEY}"
Expected response:
{
"data": {
"trackingRef": "CIR2GKYL4B",
"beneficiary": {
"name": "CIRCLE INTERNET FINANCIAL INC",
"address1": "99 High Street",
"address2": "Boston, MA 02110"
},
"beneficiaryBank": {
"name": "CUSTOMERS BANK",
"routingNumber": "031101279",
"accountNumber": "123815146304",
"city": "Phoenixville",
"postalCode": "19460",
"country": "US"
}
}
}
Save the trackingRef and the beneficiaryBank.accountNumber values for the
next step.
Step 3: Deposit fiat to mint USDC
Simulate a wire deposit using the
create a mock wire payment
endpoint. In the sandbox, this mints USDC into your Circle Mint account without
moving real funds.
curl -X POST https://api-sandbox.circle.com/v1/mocks/payments/wire \
-H "Authorization: Bearer ${YOUR_API_KEY}" \
-H "Content-Type: application/json" \
-d '{
"amount": { "amount": "100.00", "currency": "USD" },
"trackingRef": "CIR2GKYL4B",
"beneficiaryBank": { "accountNumber": "123815146304" }
}'
Expected response:
{
"data": {
"trackingRef": "CIR2GKYL4B",
"amount": { "amount": "100.00", "currency": "USD" },
"status": "pending"
}
}
Sandbox mock wire deposits process in batches and may take up to 15 minutes to
complete. Wait for the deposit to settle before continuing.
After the deposit settles, verify your balance using the
list all balances
endpoint:
curl https://api-sandbox.circle.com/v1/businessAccount/balances \
-H "Authorization: Bearer ${YOUR_API_KEY}"
Expected response:
{
"data": {
"available": [{ "amount": "100.00", "currency": "USD" }],
"unsettled": []
}
}
The available balance confirms that your fiat deposit minted USDC
successfully.
Step 4: Transfer USDC onchain
Send USDC from your Circle Mint account to an external blockchain address. This
step requires two API calls: create a recipient address, then create a transfer.
4.1. Create a recipient address
Register a destination address using the
create a recipient address
endpoint. This example uses the Ethereum blockchain.
curl -X POST https://api-sandbox.circle.com/v1/businessAccount/wallets/addresses/recipient \
-H "Authorization: Bearer ${YOUR_API_KEY}" \
-H "Content-Type: application/json" \
-d '{
"idempotencyKey": "unique-id-2",
"address": "0x493A9869E3B5f846f72267ab19B76e9bf99d51b1",
"chain": "ETH",
"currency": "USD",
"description": "External Ethereum wallet"
}'
Expected response:
{
"data": {
"id": "cfa01bb0-d166-5506-a48a-56f2beab559f",
"address": "0x493a9869e3b5f846f72267ab19b76e9bf99d51b1",
"chain": "ETH",
"currency": "USD",
"description": "External Ethereum wallet"
}
}
4.2. Create a transfer
Send USDC to the recipient address using the
create a transfer
endpoint:
curl -X POST https://api-sandbox.circle.com/v1/businessAccount/transfers \
-H "Authorization: Bearer ${YOUR_API_KEY}" \
-H "Content-Type: application/json" \
-d '{
"idempotencyKey": "unique-id-3",
"destination": {
"type": "verified_blockchain",
"addressId": "cfa01bb0-d166-5506-a48a-56f2beab559f"
},
"amount": { "currency": "USD", "amount": "25.00" }
}'
Expected response:
{
"data": {
"id": "21fd4ec4-bad1-4eb2-9fc5-60320dedc7ea",
"source": { "type": "wallet", "id": "1016875042" },
"destination": {
"type": "blockchain",
"address": "0x493a9869e3b5f846f72267ab19b76e9bf99d51b1",
"chain": "ETH"
},
"amount": { "amount": "25.00", "currency": "USD" },
"status": "pending"
}
}
The transfer starts in pending status, moves to running once broadcast
onchain, and reaches complete after enough
blockchain confirmations.
Step 5: Redeem USDC to fiat
Convert your remaining USDC balance back to fiat by creating a payout to the
bank account you registered in Step 1. Use the
create a payout
endpoint:
curl -X POST https://api-sandbox.circle.com/v1/businessAccount/payouts \
-H "Authorization: Bearer ${YOUR_API_KEY}" \
-H "Content-Type: application/json" \
-d '{
"idempotencyKey": "unique-id-4",
"destination": {
"type": "wire",
"id": "9d1fa351-b24d-442a-8aa5-e717db1ed636"
},
"amount": { "currency": "USD", "amount": "75.00" }
}'
Expected response:
{
"data": {
"id": "9cf38c76-cac4-40d8-a516-f46e9a610a85",
"amount": { "amount": "75.00", "currency": "USD" },
"status": "pending",
"sourceWalletId": "1016875042",
"destination": {
"type": "wire",
"id": "9d1fa351-b24d-442a-8aa5-e717db1ed636",
"name": "WELLS FARGO BANK, NA ****0010"
}
}
}
Step 6: Verify the round trip
Check your final balance to confirm both the transfer and payout processed:
curl https://api-sandbox.circle.com/v1/businessAccount/balances \
-H "Authorization: Bearer ${YOUR_API_KEY}"
Expected response:
{
"data": {
"available": [{ "amount": "0.00", "currency": "USD" }],
"unsettled": []
}
}
You completed the full Circle Mint cycle:
- Deposited $100 USD via wire to mint 100 USDC.
- Transferred 25 USDC onchain to an Ethereum address.
- Redeemed 75 USDC back to fiat via wire payout.
Your available balance returns to zero, confirming every dollar is accounted
for.
The mock wire endpoint used in Step 3 is only available in the sandbox. In
production, initiate wire transfers from your own banking interface using the
wire instructions from Step 2. All other API calls in this guide work the same
in production. See Sandbox to
Production for details on
transitioning.