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.

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