# Validator Root Basket History

Root Reborn reinvests root dividends into a per-validator fund ("beta basket") held under a protocol escrow account.

_Source: https://beta.taostats.io/docs/api-reference/validator/get-validator-basket-history_

_Last reviewed: 2026-09-18_

```http
GET https://api.taostats.io/api/dtao/validator/basket/history/v1
```

Requires an API key in the `Authorization` header.

Root Reborn reinvests root dividends into a per-validator fund ("beta
basket") held under a protocol escrow account. Stakers hold shares in that
fund and redeem via `claim_root`.

## Try it

Try this request in the browser on the HTML version of this page, or use the code samples below.

### Code samples

**cURL**

```bash
curl -H "Authorization: <YOUR_API_KEY>" \
  "https://api.taostats.io/api/dtao/validator/basket/history/v1"
```

**JavaScript**

```js
const response = await fetch('https://api.taostats.io/api/dtao/validator/basket/history/v1', {
  headers: {
    Authorization: '<YOUR_API_KEY>',
  },
});
const data = await response.json();
```

**Python**

```python
import requests

response = requests.get(
    "https://api.taostats.io/api/dtao/validator/basket/history/v1",
    headers={"Authorization": "<YOUR_API_KEY>"},
)
data = response.json()
```

## Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `hotkey` | query | `string` |  | SS58 or hex format |
| `day_start` | query | `string (date)` |  | Inclusive lower bound (YYYY-MM-DD). |
| `day_end` | query | `string (date)` |  | Inclusive upper bound (YYYY-MM-DD). |
| `page` | query | `integer (int32)` |  |  |
| `limit` | query | `integer (int32)` |  |  |
| `order` | query | `ValidatorBasketHistoryOrder` |  |  |

## Responses

### `200` — Validator baskets retrieved successfully

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `data` | `array` | Yes |  |
| `data[].block_number` | `integer (int32)` | Yes |  |
| `data[].day` | `string (date), nullable` |  | Present on the history endpoint only. |
| `data[].deposited_tao` | `string` | Yes |  |
| `data[].holdings` | `array` | Yes |  |
| `data[].holdings[].alpha` | `string` | Yes |  |
| `data[].holdings[].netuid` | `integer (int32)` | Yes |  |
| `data[].holdings[].realizable_tao` | `string` | Yes | Slippage-aware redemption value — what NAV is built from. |
| `data[].holdings[].spot_tao` | `string` | Yes | Spot-marked value (`price * alpha`) — display only. |
| `data[].hotkey` | `object` | Yes |  |
| `data[].hotkey.hex` | `string` | Yes | The hex format of the hot key |
| `data[].hotkey.ss58` | `string` | Yes | The SS58 format of the hot key |
| `data[].nav_per_share` | `string, nullable` |  | `nav_tao / shares`. Null when the fund has no shares outstanding. |
| `data[].nav_tao` | `string` | Yes | Realizable (slippage-aware) NAV in rao — the fund's redemption value. |
| `data[].performance` | `string, nullable` |  | `(nav_tao + redeemed_tao) / deposited_tao`. Null when nothing deposited. |
| `data[].rate` | `string, nullable` |  | Shares accrued per unit of root stake. |
| `data[].redeemed_tao` | `string` | Yes |  |
| `data[].return_30d` | `string, nullable` |  | As `return_7d`, over 30 days. |
| `data[].return_7d` | `string, nullable` |  | Period return on `nav_per_share` over 7 days — capital only, NOT annualised, can be negative. Null until the window has history. |
| `data[].shares` | `string` | Yes | Outstanding fund shares. |
| `data[].spot_nav_tao` | `string` | Yes | Spot-marked NAV in rao — the fund's headline mark. |
| `data[].staker_return_30d` | `string, nullable` |  | As `staker_return_7d`, over 30 days. |
| `data[].staker_return_7d` | `string, nullable` |  | `twr_now / twr_then − 1` over 7 days: the chain-canonical staker yield, income and mark-to-market together. NOT annualised. Null across fund-life boundaries and until the window has history. |
| `data[].timestamp` | `string (date-time)` | Yes |  |
| `data[].twr` | `string, nullable` |  | The chain's staker total-return accumulator (`BasketTwr`, spec 500+). Starts at 1.0 at each fund life's baseline. Null pre-spec-500. |
| `data[].twr_first_block` | `integer (int64), nullable` |  | Block the current fund life's baseline was stamped at — which life `twr` belongs to. Two `twr` samples are only comparable when this matches. |
| `data[].weights` | `array` | Yes |  |
| `data[].weights[].netuid` | `integer (int32)` | Yes |  |
| `data[].weights[].weight` | `integer (int32)` | Yes | Raw u16 weight. Normalise against the vector's total for a share. |
| `pagination` | `object` | Yes |  |
| `pagination.current_page` | `integer (int32)` | Yes |  |
| `pagination.next_page` | `integer (int32), nullable` |  |  |
| `pagination.per_page` | `integer (int32)` | Yes |  |
| `pagination.prev_page` | `integer (int32), nullable` |  |  |
| `pagination.total_items` | `integer (int32)` | Yes |  |
| `pagination.total_pages` | `integer (int32)` | Yes |  |

### Other responses

| Status | Meaning |
| --- | --- |
| `400` | Bad request |
| `500` | Internal server error |

Every request needs an `Authorization` header holding your API key — see [Getting started with the Taostats API](https://beta.taostats.io/docs/start-here/getting-started-with-taostats-api).
