> ## 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: Transfer funds internally

> Move funds instantly between accounts with no blockchain fees

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](/digital-asset-accounts/concepts/account-structure).
* Ensure at least one account has a funded balance.
* 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. 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**

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

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

```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": "${SOURCE_ACCOUNT_ID}"
  },
  "destination": {
    "type": "account",
    "id": "${DEST_ACCOUNT_ID}"
  },
  "amount": {
    "amount": "2500.00",
    "currency": "USD"
  }
}
'
```

**Response**

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

<Note>
  Internal account-to-account transfers complete instantly and return a `complete`
  status in the response. There are no blockchain fees or processing delays.
</Note>

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**

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

```json theme={null}
{
  "data": {
    "available": [
      {
        "amount": "7500.00",
        "currency": "USD"
      }
    ],
    "unsettled": []
  }
}
```

**Destination balance**

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

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

```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": "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.

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

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

* [Account structure](/digital-asset-accounts/concepts/account-structure)
* [Transaction states](/digital-asset-accounts/references/transaction-states)
* [Set up webhook notifications](/api-reference/webhook-endpoints#v1-notifications)
