Mint

Quickstart: Withdraw via Blockchain Wallet

Learn the basics of sending funds from your Circle account to an external blockchain wallet.

Sending funds from your Circle Account to external blockchain wallets is one of the most basic primitives (building blocks) enabled by the APIs. This quickstart walks through sending USDC USD externally. You can follow the same steps when sending EURC EUR as well.

Circle's APIs use API keys as the mechanism to authenticate client requests. The API key must be set in the Authorization header of the request sent from your backend server. The format of the header is Bearer secret-key-value.
To obtain an API key for the sandbox environment, create an account and generate a new key in settings.

Once you have generated your API key, record it in a secure place.

If you haven't done so already, make sure you fund your account for testing. You can do this one of two ways: by using the Circle Payments API to accept a payment, or by receiving an external USDC transfer from a faucet or other source.

To send account funds externally, you need to allowlist a blockchain address to send to (destination). Adding an external wallet address via the API requires manual validation by an administrator. A notification to confirm the address is sent to all administrators when the API call is made.

The sandbox environment uses the Ethereum Sepolia testing network, so the destination blockchain address has to be a valid Sepolia address.

REQUEST

curl --request POST \
     --url https://api-sandbox.circle.com/v1/businessAccount/wallets/addresses/recipient \
     --header 'accept: application/json' \
     --header 'authorization: Bearer ${YOUR_API_KEY}' \
     --header 'content-type: application/json' \
     --data '
{
  "chain": "ETH",
  "idempotencyKey": "2a308497-e66e-4c42-ac1e-7bedab86d958",
  "address": "0x493A9869E3B5f846f72267ab19B76e9bf99d51b1",
  "currency": "USD",
  "description": "https://usdcfaucet.com/"
}
'

RESPONSE

JSON
{
  "data": {
    "id": "cfa01bb0-d166-5506-a48a-56f2beab559f",
    "address": "0x493a9869e3b5f846f72267ab19b76e9bf99d51b1",
    "chain": "ETH",
    "currency": "USD",
    "description": "https://usdcfaucet.com/"
  }
}

To keep things simple, we'll transfer funds to the deposit address of the USDC faucet service on Sepolia. That address is 0x493A9869E3B5f846f72267ab19B76e9bf99d51b1.

REQUEST

curl --request POST \
     --url https://api-sandbox.circle.com/v1/businessAccount/transfers \
     --header 'accept: application/json' \
     --header 'authorization: Bearer ${YOUR_API_KEY}' \
     --header 'content-type: application/json' \
     --data '
{
  "destination": {
    "type": "verified_blockchain",
    "addressId": "cfa01bb0-d166-5506-a48a-56f2beab559f"
  },
  "amount": {
    "currency": "USD",
    "amount": "3.14"
  },
  "idempotencyKey": "6ec3827d-15bb-442e-9d4c-32e73e61cbf4"
}
'

RESPONSE

JSON
{
  "data": {
    "id": "21fd4ec4-bad1-4eb2-9fc5-60320dedc7ea",
    "source": {
      "type": "wallet",
      "id": "1016875042"
    },
    "destination": {
      "type": "blockchain",
      "address": "0x493a9869e3b5f846f72267ab19b76e9bf99d51b1",
      "chain": "ETH"
    },
    "amount": {
      "amount": "3.14",
      "currency": "USD"
    },
    "status": "pending",
    "createDate": "2023-11-15T16:41:12.395Z"
  }
}

You can use the get transfer endpoint to retrieve details about the status of the transaction. You can use it as in the command below.
REQUEST

curl --request GET \
     --url https://api-sandbox.circle.com/v1/businessAccount/transfers/21fd4ec4-bad1-4eb2-9fc5-60320dedc7ea \
     --header 'accept: application/json' \
     --header 'authorization: Bearer ${YOUR_API_KEY}'
Javascript Request
const options = {
  method: 'GET',
  headers: {
    accept: 'application/json',
    authorization: 'Bearer ${YOUR_API_KEY}'
  }
};

RESPONSE

JSON
{
  "data": {
    "id": "21fd4ec4-bad1-4eb2-9fc5-60320dedc7ea",
    "source": {
      "type": "wallet",
      "id": "1016875042"
    },
    "destination": {
      "type": "blockchain",
      "address": "0x493a9869e3b5f846f72267ab19b76e9bf99d51b1",
      "chain": "ETH"
    },
    "amount": {
      "amount": "3.14",
      "currency": "USD"
    },
    "transactionHash": "0x0654eee4f609f9c35e376cef9455dd9fc1546c482c5c32c8f8d434ead14fcf97",
    "status": "complete",
    "createDate": "2023-11-15T16:41:12.395Z"
  }
}

Though not yet settled, you can consider the transaction complete because it has been successfully broadcast to the network. Circle's systems will continue to track the transfer until it has reached finality, at which point its status will change to complete.

🎉 Congratulations. You have successfully sent cryptocurrency using Circle's APIs.

After experimenting with our APIs, you’ll want to start building test integrations in sandbox prior to moving into production. Start by applying for a Circle Mint account. We'll be happy to walk you through the next steps.

Did this page help you?
© 2023-2025 Circle Technology Services, LLC. All rights reserved.