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.
Move funds between two accounts in the same program instantly and with no
blockchain fees. You can verify balances on both the source and destination
accounts before and after the transfer.
Prerequisites
Before you begin:
- Obtain an API key for Digital Asset Accounts from Circle.
- Have two onboarded and active accounts in the same program, each with an
accountId. For details on how accounts relate to programs, see
Account structure.
- Ensure at least one account has a funded balance.
- 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. Check source and destination balances
Before creating the transfer, verify the balances of both accounts. The source
account must have sufficient funds to cover the transfer amount.
Check source balance
curl --request GET \
--url https://api-sandbox.circle.com/v1/accounts/balances/${SOURCE_ACCOUNT_ID} \
--header 'Accept: application/json' \
--header 'Authorization: Bearer ${YOUR_API_KEY}'
Response
{
"data": {
"available": [
{
"amount": "10000.00",
"currency": "USD"
}
],
"unsettled": []
}
}
Step 2. Create an internal transfer
Initiate the transfer by specifying both the source and destination as account
types with their respective account IDs. Internal transfers complete instantly.
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": "${SOURCE_ACCOUNT_ID}"
},
"destination": {
"type": "account",
"id": "${DEST_ACCOUNT_ID}"
},
"amount": {
"amount": "2500.00",
"currency": "USD"
}
}
'
Response
{
"data": {
"id": "f1a2b3c4-d5e6-7890-abcd-ef1234567890",
"status": "complete",
"amount": {
"amount": "2500.00",
"currency": "USD"
},
"source": {
"type": "account",
"id": "1017381855"
},
"destination": {
"type": "account",
"id": "1000661542"
},
"createDate": "2026-03-15T12:00:00Z",
"updateDate": "2026-03-15T12:00:00Z"
}
}
Internal account-to-account transfers complete instantly and return a complete
status in the response. There are no blockchain fees or processing delays.
If the source account has insufficient funds, the API returns an error. Verify
the balance before creating a transfer.
Step 3. Verify both balances
Confirm that funds have moved correctly by checking the balances of both
accounts.
Source balance
curl --request GET \
--url https://api-sandbox.circle.com/v1/accounts/balances/${SOURCE_ACCOUNT_ID} \
--header 'Accept: application/json' \
--header 'Authorization: Bearer ${YOUR_API_KEY}'
Response
{
"data": {
"available": [
{
"amount": "7500.00",
"currency": "USD"
}
],
"unsettled": []
}
}
Destination balance
curl --request GET \
--url https://api-sandbox.circle.com/v1/accounts/balances/${DEST_ACCOUNT_ID} \
--header 'Accept: application/json' \
--header 'Authorization: Bearer ${YOUR_API_KEY}'
Response
{
"data": {
"available": [
{
"amount": "2500.00",
"currency": "USD"
}
],
"unsettled": []
}
}
The source account balance decreased by 2,500 USD and the destination account
balance increased by the same amount.
Look up transfers
Get a transfer by ID
Retrieve the details of a specific transfer using the transfer ID returned when
you created it.
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": "f1a2b3c4-d5e6-7890-abcd-ef1234567890",
"status": "complete",
"amount": {
"amount": "2500.00",
"currency": "USD"
},
"source": {
"type": "account",
"id": "1017381855"
},
"destination": {
"type": "account",
"id": "1000661542"
},
"createDate": "2026-03-15T12:00:00Z",
"updateDate": "2026-03-15T12:00:00Z"
}
}
List transfers for an account
Retrieve all transfers for an account. This endpoint returns both internal and
external transfers in reverse order and supports pagination.
curl --request GET \
--url 'https://api-sandbox.circle.com/v1/accounts/transfers?accountId=${ACCOUNT_ID}&pageSize=25' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer ${YOUR_API_KEY}'
Response
{
"data": [
{
"id": "f1a2b3c4-d5e6-7890-abcd-ef1234567890",
"status": "complete",
"amount": {
"amount": "2500.00",
"currency": "USD"
},
"source": {
"type": "account",
"id": "1017381855"
},
"destination": {
"type": "account",
"id": "1000661542"
},
"createDate": "2026-03-15T12:00:00Z",
"updateDate": "2026-03-15T12:00:00Z"
}
]
}
See also