> ## Documentation Index
> Fetch the complete documentation index at: https://docs.anchorage.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Report on ETF balances and transactions

> Pull fund, network fee, and spam balances and their transactions with the subaccount endpoints.

An ETF vault's holdings are split into separate balances for fund assets, network fees, and (for staking ETFs) spam. The wallet endpoints report what each wallet holds, not this split. To report on each balance and its transactions on its own, use the subaccount endpoints in the v2 API.

## ETF balances in the API

The API calls each ETF balance a **subaccount**. A subaccount is an entry in our ledger, not a wallet or a place on-chain. The wallets show where assets are held. The subaccounts show what those assets represent.

| Balance | What it tracks | Which ETFs |
| :- | :- | :- |
| Fund (ETF funds) | Assets attributed to the active fund. This is the balance the fund's NAV is based on. | All ETFs |
| Network fee (gas funds) | Assets set aside to pay on-chain network fees, so fee spending never affects the fund balance. | All ETFs |
| Spam (spam funds) | Unsolicited or unwanted deposits, kept apart so they don't inflate the fund balance. | Staking ETFs only |

The subaccounts are peers under your organization. They aren't nested, and none of them replaces your vaults and wallets. For how the balances relate to the wallet structure, see the [ETF overview](https://docs.anchorage.com/knowledge-base/platform/developers/etf/etf-overview.md#how-the-ledger-works).

## Set up

You need an API key with the **Read sub-accounts** permission. See [Permission groups](https://docs.anchorage.com/knowledge-base/platform/developers/permission-groups.md) for how to assign it. These endpoints are read-only for ETF reporting. You don't create or change subaccounts.

The examples use the sandbox base URL. For production, see [Base URLs](https://docs.anchorage.com/knowledge-base/api-reference/introduction.md#base-urls).

## Step 1: List your ETF balances

**`GET /v2/subaccounts/customers/accounts`**

Lists the subaccounts for your organization, each with its current balances per asset. See [List all subaccounts](https://docs.anchorage.com/knowledge-base/api-reference/v2/subaccounts/list-all-subaccounts.md) for the full reference.

```bash Request theme={null}
curl --request GET \
     --url 'https://api.anchorage-staging.com/v2/subaccounts/customers/accounts?limit=100' \
     --header 'Api-Access-Key: [API Key]' \
     --header 'accept: application/json'
```

```json Response (trimmed) theme={null}
{
  "data": [
    {
      "subaccountId": "3f6c1a52-7d0e-4b8a-9a41-5e2c8d7b1f90",
      "name": "ETF funds",
      "status": "OPEN",
      "balances": [
        {
          "assetType": "SOL",
          "totalBalance": "125000.5",
          "availableForWithdrawal": "125000.5",
          "availableForTrading": "125000.5"
        }
      ]
    },
    {
      "subaccountId": "b91d4e07-2c3a-4f56-8e18-0a7d6c5b4e23",
      "name": "Network transaction fees",
      "status": "OPEN",
      "balances": [
        {
          "assetType": "SOL",
          "totalBalance": "42.1",
          "availableForWithdrawal": "42.1",
          "availableForTrading": "42.1"
        }
      ]
    },
    {
      "subaccountId": "6a2e9c14-5b7d-4d03-b3f8-1c9e0d8a7f65",
      "name": "Spam",
      "status": "OPEN",
      "balances": []
    }
  ],
  "page": {
    "next": null
  }
}
```

**Where:**

* `subaccountId` is the ID to use when you pull transactions for that balance. Store it.
* `name` identifies the balance. A staking ETF returns a spam balance in addition to the fund and network fee balances. Other ETFs don't.
* `balances` has one entry per asset, with `totalBalance`, `availableForWithdrawal`, and `availableForTrading`.

Narrow the list with these query parameters:

| Parameter | Use |
| :- | :- |
| `subaccountIds` | Comma-separated subaccount IDs. Use it to refresh specific balances. |
| `statuses` | Comma-separated statuses, such as `OPEN`. |
| `endDate` | Inclusive UTC date in `YYYY-MM-DD` format. The latest valid value is the current date. |
| `limit` | Results per page, from 1 to 100. Defaults to 25. |
| `afterId` | Starting point for the page, taken from the previous response. |

To fetch the next page, request the `page.next` URL from the previous response. A null `page.next` means there are no more results. See [Pagination](https://docs.anchorage.com/knowledge-base/api-reference/errors-pagination.md#pagination).

## Step 2: List transactions for a balance

**`GET /v2/subaccounts/transactions`**

Lists transactions, newest activity first by creation date. Pass `subaccountId` to see one balance. Use the ID from step 1 for your fund, network fee, or spam balance. See [List all transactions](https://docs.anchorage.com/knowledge-base/api-reference/v2/subaccounts/list-all-transactions.md) for the full reference.

```bash Request theme={null}
curl --request GET \
     --url 'https://api.anchorage-staging.com/v2/subaccounts/transactions?subaccountId=b91d4e07-2c3a-4f56-8e18-0a7d6c5b4e23&startDate=2026-10-01&endDate=2026-10-31&limit=100' \
     --header 'Api-Access-Key: [API Key]' \
     --header 'accept: application/json'
```

```json Response (trimmed) theme={null}
{
  "data": [
    {
      "transactionId": "c4c4652f-0c07-472c-a7f8-955fbe07775d",
      "transactionType": "GAS_FILL",
      "status": "POSTED",
      "createdAt": "2026-10-14T12:34:56.000Z",
      "endedAt": "2026-10-14T12:40:02.000Z",
      "subaccounts": [
        {
          "subaccountId": "b91d4e07-2c3a-4f56-8e18-0a7d6c5b4e23",
          "amounts": [
            {
              "assetType": "SOL",
              "balances": [
                { "balanceType": "Posted", "amount": "1.5" }
              ]
            }
          ]
        }
      ]
    }
  ],
  "page": {
    "next": null
  }
}
```

**Where:**

* `transactionType` is one of the types in the reference, such as `DEPOSIT`, `WITHDRAWAL`, `GAS_FILL`, or `TRANSACTION_FEE`.
* `status` is `POSTED`, `PENDING`, or `CANCELED`. A `PENDING` transaction holds funds until it posts or is canceled.
* `subaccounts` lists the balances the transaction touched, each with `amounts` per asset and `balanceType`.
* `endedAt` is set once the transaction reaches `POSTED` or `CANCELED`.

Filter the list with these query parameters:

| Parameter | Use |
| :- | :- |
| `subaccountId` | Limit results to one balance. Omit it to list transactions across all balances you can read. |
| `types` | Comma-separated transaction types, such as `DEPOSIT,WITHDRAWAL`. |
| `statuses` | Comma-separated statuses: `POSTED`, `PENDING`, or `CANCELED`. |
| `startDate`, `endDate` | Inclusive UTC dates in `YYYY-MM-DD` format. The earliest valid start date is 2017-01-01. |
| `limit`, `afterId` | Page size (1 to 100, default 25) and the starting point for the next page. |

To fetch specific transactions, use [`GET /v2/subaccounts/transactions/{transactionsIds}`](https://docs.anchorage.com/knowledge-base/api-reference/v2/subaccounts/get-list-of-transactions-filter-by-id) with one or more comma-separated transaction IDs. It accepts the same date and pagination parameters.

## Reconcile each balance

To reconcile a day or a month, combine the two calls:

1. Call `GET /v2/subaccounts/customers/accounts` and record each balance's `totalBalance` per asset.
2. Call `GET /v2/subaccounts/transactions` once per `subaccountId` with `startDate` and `endDate`, and follow `page.next` until it's null.
3. Compare the balances against the transactions, one balance at a time.

Wallet-level reporting stays available alongside this. Use [`GET /v2/wallets`](https://docs.anchorage.com/knowledge-base/api-reference/v2/wallets/list-all-wallets-for-all-vaults) and [`GET /v2/transactions`](https://docs.anchorage.com/knowledge-base/api-reference/v2/transactions/list-transactions) for what each wallet holds and moves on-chain, as described in the [Reporting overview](https://docs.anchorage.com/knowledge-base/platform/developers/reporting/overview.md).

Your monthly custody statements cover the fund balance only. Use the subaccount endpoints when you also need the network fee and spam balances.


## Related topics

- [Overview](https://docs.anchorage.com/knowledge-base/platform/developers/etf/etf-overview.md)
- [Network & gas fees](https://docs.anchorage.com/knowledge-base/platform/developers/network-gas-fees.md)
- [Reporting overview](https://docs.anchorage.com/knowledge-base/platform/developers/reporting/overview.md)
- [Building staking reporting](https://docs.anchorage.com/knowledge-base/platform/developers/staking/staking-reporting.md)
- [Reporting](https://docs.anchorage.com/knowledge-base/platform/users/web-dashboard/reporting.md)
