> ## 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.

# How-to: Send crypto transfers

> Register recipient addresses and send stablecoins to external blockchain wallets

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.

<Note>
  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](/digital-asset-accounts/references/testing-in-sandbox) and
  [Going to production](/digital-asset-accounts/references/going-to-production)
  for environment details.
</Note>

## Steps

### Step 1. Register a recipient address

Register the external blockchain address where you want to send stablecoins.

```shell theme={null}
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**

```json theme={null}
{
  "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.

```shell theme={null}
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**

```json theme={null}
{
  "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](/digital-asset-accounts/references/transaction-states) for
details.

```shell theme={null}
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**

```json theme={null}
{
  "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.

```shell theme={null}
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**

```json theme={null}
{
  "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.

```shell theme={null}
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**

```json theme={null}
{
  "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.

```shell theme={null}
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.

<Note>
  Deleting a recipient address does not affect previously completed transfers to
  that address. The transaction history is preserved.
</Note>

## See also

* [Create deposit addresses](/digital-asset-accounts/howtos/create-deposit-addresses)
* [Supported currencies and blockchains](/digital-asset-accounts/references/supported-currencies-and-blockchains)
* [Transaction states](/digital-asset-accounts/references/transaction-states)
* [Set up webhook notifications](/api-reference/webhook-endpoints#v1-notifications)
