Skip to main content

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:
  1. Deposited $100 USD via wire to mint 100 USDC.
  2. Transferred 25 USDC onchain to an Ethereum address.
  3. 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.