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.

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