Documentation / API reference
Get Validator History
Last reviewed 2026-09-18
Returns historical validator stake, nominator counts, take and return metrics in the legacy validator format.
Try it
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
hotkey | query | string | SS58 or hex format | |
block_number | query | integer (int32) | The exact block number | |
block_start | query | integer (int32) | Start of block range (inclusive) | |
block_end | query | integer (int32) | End of block range (inclusive) | |
timestamp_start | query | integer (int64) | Start of timestamp range in Unix timestamp (seconds since 1970-01-01) (inclusive) | |
timestamp_end | query | integer (int64) | End of timestamp range in Unix timestamp (seconds since 1970-01-01) (inclusive) | |
page | query | integer (int32) | The page number of the response. | |
limit | query | integer (int32) | The number of responses. max is 200, | |
order | query | string | One of block_number_asc, block_number_desc, timestamp_asc, timestamp_desc. |
Responses
200 — Validators retrieved successfully
| Field | Type | Required | Description |
|---|---|---|---|
data | array | Yes | |
data[].apr | string | Yes | |
data[].apr_30_day_average | string | Yes | |
data[].apr_7_day_average | string | Yes | |
data[].block_number | integer (int32) | Yes | |
data[].blocks_until_next_reward | integer (int32), nullable | ||
data[].coldkey | object | Yes | |
data[].coldkey.hex | string | Yes | The hex format of the hot key |
data[].coldkey.ss58 | string | Yes | The SS58 format of the hot key |
data[].created_on_date | string (date) | Yes | |
data[].dominance | string | Yes | |
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[].last_reward_block | integer (int32), nullable | ||
data[].name | string, nullable | ||
data[].nominator_return_per_k | string | Yes | |
data[].nominator_return_per_k_30_day_average | string | Yes | |
data[].nominator_return_per_k_7_day_average | string | Yes | |
data[].nominators | integer (int32) | Yes | |
data[].nominators_24_hr_change | integer (int32) | Yes | |
data[].pending_emission | string, nullable | ||
data[].permits | array | Yes | |
data[].permits[] | integer (int32) | Yes | |
data[].rank | integer (int32) | Yes | |
data[].registrations | array | Yes | |
data[].registrations[] | integer (int32) | Yes | |
data[].stake | string | Yes | |
data[].stake_24_hr_change | string | Yes | |
data[].subnet_dominance | array | Yes | |
data[].subnet_dominance[].dominance | string | Yes | |
data[].subnet_dominance[].family_stake | string | Yes | |
data[].subnet_dominance[].netuid | integer (int32) | Yes | |
data[].system_stake | string | Yes | |
data[].take | string | Yes | |
data[].timestamp | string (date-time) | Yes | |
data[].total_daily_return | string | Yes | |
data[].validator_return | string | Yes | |
data[].validator_stake | string | Yes | |
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 |
Example response
json
{
"data": [
{
"apr": "0",
"apr_30_day_average": "0",
"apr_7_day_average": "0",
"block_number": 4107500,
"coldkey": {
"hex": "0x7c84ce22fc340f51c1ee66c7de67a987a34dbd427e4f0efca19997b87092995d",
"ss58": "5EsyFEexqVRqaYymJmkmjDg55Lvr6ucbB22ZYDuSD9oVQgq1"
},
"dominance": "0.0293658520481326141",
"hotkey": {
"hex": "0xc8f1f79693409717186537848672035443b08120d10c026c1ba748fa693e7175",
"ss58": "5GcBK8PDrVifV1xAf4Qkkk6KsbsmhDdX9atvk8vyKU8xdU63"
},
"name": "Tensor.Exchange",
"nominator_return_per_k": "0",
"nominator_return_per_k_30_day_average": "0",
"nominator_return_per_k_7_day_average": "0",
"nominators": 125,
"nominators_24_hr_change": 0,
"permits": [
0
],
"rank": 30,
"registrations": [
0,
5
],
"stake": "1743770436061",
"stake_24_hr_change": "-1000000000",
"subnet_dominance": [
{
"dominance": "0.0293658520481326141",
"family_stake": "1743770436061",
"netuid": 0
},
{
"dominance": "0.0293658520481326141",
"family_stake": "1743770436061",
"netuid": 1
}
],
"system_stake": "5938089019868528",
"take": "0.17999542229343099107",
"timestamp": "2024-10-23T17:25:36.001Z",
"total_daily_return": "0",
"validator_return": "0",
"validator_stake": "960376"
},
{
"apr": "0",
"apr_30_day_average": "0",
"apr_7_day_average": "0",
"block_number": 4107500,
"coldkey": {
"hex": "0xdcbd1355ecc8c7d3c6b6638a8e799090a0ce3e0a0ba2b4633ba431ad2fa02147",
"ss58": "5H48ZNbRjpmGu4qyNKN9jrBqpeCZFZfVqvZZ9WEoL3nZ8Ef4"
},
"dominance": "0",
"hotkey": {
"hex": "0x8242cb5f830f90300470552bf794756c10cfd138cec21b3199ec3fd1c84e5623",
"ss58": "5F1VvZU6JA77jh3DPPh3zfZs14wcVnoDcXTBFj69XwkXrpQK"
},
"name": null,
"nominator_return_per_k": "0",
"nominator_return_per_k_30_day_average": "0",
"nominator_return_per_k_7_day_average": "0",
"nominators": 0,
"nominators_24_hr_change": 0,
"permits": [],
"rank": 446,
"registrations": [],
"stake": "0",
"stake_24_hr_change": "0",
"subnet_dominance": [
{
"dominance": "0",
"family_stake": "0",
"netuid": 0
},
{
"dominance": "0",
"family_stake": "0",
"netuid": 1
}
],
"system_stake": "5938089019868528",
"take": "0.17999542229343099107",
"timestamp": "2024-10-23T17:25:36.001Z",
"total_daily_return": "0",
"validator_return": "0",
"validator_stake": "0"
}
],
"pagination": {
"current_page": 1,
"next_page": 2,
"per_page": 50,
"prev_page": null,
"total_items": 146186,
"total_pages": 2924
}
}Response details
text
{
"hotkey": {
"ss58": "5GKH9FPPnWSUoeeTJp19wVtd84XqFW4pyK2ijV2GsFbhTrP1",
"hex": "0xbc0e6b701243978c1fe73d721c7b157943a713fca9f3c88cad7a9f7799bc6b26"
},
"coldkey": {
"ss58": "5GcCZ2BPXBjgG88tXJCEtkbdg2hNrPbL4EFfbiVRvBZdSQDC",
"hex": "0xc8f623c92b47ac9645d6744f3d448cdb7a2a3b08a22a39bfd1db0afbd9c07117"
},
"name": "Taostats & Corcel",
"block_number": 4920349,
"timestamp": "2025-02-13T21:40:24Z",
"created_on_date": "2023-03-21",
"rank": 1,
"nominators": 6691,
"nominators_24_hr_change": 5,
"system_stake": "5864261013828190", as rao
"stake": "767381773437417", as rao
"stake_24_hr_change": "-3452405790344", as rao
"dominance": "13.08573700297269211464",percentage
"validator_stake": "457978988665",as rao
"take": "0.08999771114671549554", number
"total_daily_return": "0",
"validator_return": "0",
"nominator_return_per_k": "468470749",as rao
"apr": "0.17099",
"nominator_return_per_k_7_day_average": "468989538",as rao
"nominator_return_per_k_30_day_average": "452990300" as rao,
"apr_7_day_average": "0.17118",
"apr_30_day_average": "0.16534",
"pending_emission": "136028561110", per epoch as rao
"blocks_until_next_reward": 4472,
"last_reward_block": 4917621,
"registrations": [
0,
<snip>
63
],
"permits": [
0,
<snip>
53
],
"subnet_dominance": [
{
"netuid": 0,
"dominance": "13.08573700297269211464", percentage
"family_stake": "767381773437417" as rao
},
<snip>
}
]
},Other responses
| Status | Meaning |
|---|---|
400 | Bad request |
404 | Validators not found |
500 | Internal server error |
Every request needs an Authorization header holding your API key — see Getting started with the Taostats API.