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.
Register external blockchain addresses and send stablecoins from a Digital Asset
Account to those addresses. After sending, track the outbound transfer as it
moves through processing states and confirms onchain, and manage your recipient
address book by listing or deleting registered addresses.
Prerequisites
Before you begin:
- Obtain an API key for Digital Asset Accounts from Circle.
- Have an onboarded and active account with a funded balance.
- Have an external blockchain address to receive the transfer.
- Install cURL on your development machine.
The Digital Asset Accounts API base URL is https://api-sandbox.circle.com for
sandbox and https://api.circle.com for production. Set your API key in the
Authorization header using the format Bearer YOUR_API_KEY. See
Sandbox environment and
Going to production
for environment details.
Steps
Step 1. Register a recipient address
Register the external blockchain address where you want to send stablecoins.
curl --request POST \
--url https://api-sandbox.circle.com/v1/accounts/addresses/recipient \
--header 'Accept: application/json' \
--header 'Authorization: Bearer ${YOUR_API_KEY}' \
--header 'Content-Type: application/json' \
--data '
{
"idempotencyKey": "${RANDOM_UUID}",
"address": "0x1234567890abcdef1234567890abcdef12345678",
"chain": "ETH",
"description": "Treasury wallet",
"accountId": "${ACCOUNT_ID}"
}
'
Response
{
"data": {
"id": "c7d8e9f0-a1b2-3456-7890-abcdef123456",
"address": "0x1234567890abcdef1234567890abcdef12345678",
"chain": "ETH",
"currency": "USD",
"description": "Treasury wallet",
"status": "complete"
}
}
Step 2. Create a transfer
Initiate a transfer to the registered recipient address. Specify the source
account as an account type and the destination as a verified_blockchain
type. The verified_blockchain type indicates a pre-registered external
blockchain address. Include the recipient address ID from the previous step.
curl --request POST \
--url https://api-sandbox.circle.com/v1/accounts/transfers \
--header 'Accept: application/json' \
--header 'Authorization: Bearer ${YOUR_API_KEY}' \
--header 'Content-Type: application/json' \
--data '
{
"idempotencyKey": "${RANDOM_UUID}",
"source": {
"type": "account",
"id": "${ACCOUNT_ID}"
},
"destination": {
"type": "verified_blockchain",
"addressId": "${RECIPIENT_ADDRESS_ID}"
},
"amount": {
"amount": "500.00",
"currency": "USD"
}
}
'
Response
{
"data": {
"id": "e1f2a3b4-c5d6-7890-ef12-3456789abcde",
"status": "pending",
"amount": {
"amount": "500.00",
"currency": "USD"
},
"source": {
"type": "account",
"id": "1017381855"
},
"destination": {
"type": "verified_blockchain",
"id": "c7d8e9f0-a1b2-3456-7890-abcdef123456"
},
"createDate": "2026-03-15T11:00:00Z",
"updateDate": "2026-03-15T11:00:00Z"
}
}
If the source account has insufficient funds, the API returns an error. Check
the account balance before creating a transfer.
Step 3. Check the transfer status
Monitor the transfer until it reaches a terminal state. Transfers move through
pending, complete, and failed states. See
Transaction states for
details.
curl --request GET \
--url https://api-sandbox.circle.com/v1/accounts/transfers/${TRANSFER_ID} \
--header 'Accept: application/json' \
--header 'Authorization: Bearer ${YOUR_API_KEY}'
Response
{
"data": {
"id": "e1f2a3b4-c5d6-7890-ef12-3456789abcde",
"status": "complete",
"amount": {
"amount": "500.00",
"currency": "USD"
},
"source": {
"type": "account",
"id": "1017381855"
},
"destination": {
"type": "verified_blockchain",
"id": "c7d8e9f0-a1b2-3456-7890-abcdef123456",
"address": "0x1234567890abcdef1234567890abcdef12345678",
"chain": "ETH"
},
"createDate": "2026-03-15T11:00:00Z",
"updateDate": "2026-03-15T11:05:00Z"
}
}
Step 4. Verify the balance
Confirm that the transfer amount has been deducted from the account.
curl --request GET \
--url https://api-sandbox.circle.com/v1/accounts/balances/${ACCOUNT_ID} \
--header 'Accept: application/json' \
--header 'Authorization: Bearer ${YOUR_API_KEY}'
Response
{
"data": {
"available": [
{
"amount": "9500.00",
"currency": "USD"
}
],
"unsettled": []
}
}
Manage recipient addresses
List recipient addresses
Retrieve all registered recipient addresses for an account. This endpoint
supports pagination.
curl --request GET \
--url 'https://api-sandbox.circle.com/v1/accounts/addresses/recipient?accountId=${ACCOUNT_ID}&pageSize=25' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer ${YOUR_API_KEY}'
Response
{
"data": [
{
"id": "c7d8e9f0-a1b2-3456-7890-abcdef123456",
"address": "0x1234567890abcdef1234567890abcdef12345678",
"chain": "ETH",
"currency": "USD",
"description": "Treasury wallet",
"status": "complete"
}
]
}
Delete a recipient address
Remove a recipient address that is no longer needed. Deleted addresses cannot be
used for new transfers.
curl --request DELETE \
--url https://api-sandbox.circle.com/v1/accounts/addresses/recipient/${RECIPIENT_ADDRESS_ID} \
--header 'Accept: application/json' \
--header 'Authorization: Bearer ${YOUR_API_KEY}'
If the deletion is successful, the API returns a 200 response.
Deleting a recipient address does not affect previously completed transfers to
that address. The transaction history is preserved.
See also