Documentation / New API reference / Validators
Get Validators Performance Hotkey
Reference
Last reviewed 2026-10-07
Current per-subnet performance.
Try it
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
hotkey | path | string | Yes | Validator hotkey (SS58 or 0x-hex) |
netuid | query | integer (int32) | Filter to a single subnet. | |
validator_type | query | string | Filter by validator type (running_infra or childkey). One of running_infra, childkey. | |
scope | query | string | Which rows to return. hotkey (default): every row whose hotkey is the path hotkey, including its rows as somebody else's child. own_and_children: the hotkey's own running_infra rows plus the childkey rows of its children (parent_hotkey = the path hotkey). One of hotkey, own_and_children. | |
page | query | integer (int32) | Page number (1-indexed). Default: 1. Bounded window: (page − 1) × limit must be below 1,000,000. Deep OFFSET paging is linear in the offset, so an uncapped page lets one request scan tens of millions of rows; a page past the window is rejected with a 400. Reach deeper history with this endpoint's range filters (block_start/block_end, timestamp_start/timestamp_end) rather than a larger page. | |
limit | query | integer (int32) | Results per page. Default: 50. Max: 200. | |
order_by | query | string | Column to order by. Default: netuid. One of netuid, uid, position, last_updated, nominators, vtrust, validator_type, take, childkey_take, proportion, subnet_weight, root_weight, alpha, family_subnet_weight, family_root_weight, family_alpha, dominance, dividends, ratio, nominator_return_per_day, validator_return_per_day. | |
order_dir | query | string | Sort direction. Default: asc. One of asc, desc. |
Responses
200 — Paginated per-subnet performance
| Field | Type | Required | Description |
|---|---|---|---|
data | array | Yes | |
data[].alpha | string | Yes | |
data[].block_number | integer (int32) | Yes | |
data[].childkey_take | string | Yes | |
data[].coldkey | string | Yes | Validator coldkey (SS58). On a childkey row this is the parent's coldkey, not the owner of the child hotkey (the OLD API does the same). |
data[].dividends | string | Yes | |
data[].dominance | string | Yes | |
data[].family_alpha | string | Yes | |
data[].family_root_weight | string | Yes | |
data[].family_subnet_weight | string | Yes | |
data[].hotkey | string | Yes | Validator hotkey (SS58). For a childkey row this is the child. |
data[].last_updated | integer (int32) | Yes | Block of the most recent update. |
data[].mech_last_updated | array | Yes | Per-mechanism last-update blocks. |
data[].mech_last_updated[] | integer (int32) | Yes | |
data[].name | string, nullable | Yes | On-chain account identity display name (from IdentitiesV2) of the coldkey that owns hotkey. On a running_infra row that is coldkey; on a childkey row it is the child's own owner, not coldkey. null when that owner has no identity set. |
data[].netuid | integer (int32) | Yes | |
data[].nominator_return_per_day | string | Yes | rao/day, decimal string. |
data[].nominators | integer (int32) | Yes | |
data[].parent_hotkey | string, nullable | Yes | Parent validator hotkey (SS58) for a childkey row; null for a running_infra row (the hotkey is acting on its own, no parent). Distinguishes the per-parent rows a child with multiple parents produces — they share (hotkey, netuid, uid) and differ only here. |
data[].position | integer (int32) | Yes | |
data[].proportion | string | Yes | |
data[].ratio | string | Yes | |
data[].root_weight | string | Yes | |
data[].subnet_weight | string | Yes | |
data[].take | string | Yes | |
data[].timestamp | string | Yes | ISO 8601 snapshot timestamp. |
data[].uid | integer (int32) | Yes | Metagraph UID; -1 when the hotkey is not in the subnet's metagraph. |
data[].validator_return_per_day | string | Yes | rao/day, decimal string. |
data[].validator_type | string | Yes | running_infra or childkey. |
data[].vtrust | string | Yes | |
pagination | object | Yes | Pagination metadata appended to collection responses. next_page / prev_page are explicitly required+nullable in the OpenAPI spec: per docs/api_standards.md we emit null rather than omitting the field, so the SDK should model them as Option/nullable types that are always present in the response. total_items is the exact number of matching rows on every route (issue #992). It used to stop at 1,000,000, which reported a million transfers when finney holds 7,513,252 and a million events when the real figure is 981,179,110; the cap was removed on 29 Sep 2026 and nothing may reintroduce one — crate::pagination::exact_count_sql is the only count form, and no_capped_count_reaches_the_api_surface in data-debug-scripts fails the build if a capped one comes back. total_pages is still bounded, to crate::pagination::max_reachable_page(per_page), because the page parameter is capped to a 1,000,000-row window: deep OFFSET paging reads every skipped row (24.7M rows / 36.6 GiB / 42 s measured on one endpoint, issue #413). So total_pages is exactly the last page this API will serve and next_page / prev_page stay coherent at the window edge, while total_items tells the caller how many rows there really are. History beyond the window is reached with each endpoint's range filters, not a larger page. |
pagination.current_page | integer (int32) | Yes | 1-indexed page that produced the rows in data. |
pagination.next_page | integer (int32), nullable | Yes | Next page number, or null if this is the last page. |
pagination.per_page | integer (int32) | Yes | Number of items requested per page. |
pagination.prev_page | integer (int32), nullable | Yes | Previous page number, or null if this is the first page. |
pagination.total_items | integer (int64) | Yes | Number of items matching the query across all pages. This is the exact count — every matching row, however many there are. It is not bounded by total_pages, so a listing can legitimately report far more items than total_pages × per_page. |
pagination.total_pages | integer (int32) | Yes | Number of pages at the current per_page that this API will serve: ceil(total_items / per_page), capped at ceil(1000000 / per_page) because the page parameter only reaches into the first 1,000,000 rows. When the cap bites, total_items is still the true total and this is the last page a request can ask for; reach deeper history with the endpoint's range filters instead of a larger page. |
400 — Invalid parameter
| Field | Type | Required | Description |
|---|---|---|---|
message | string | Yes | Plain-english message describing the failure from the caller's perspective. |
status_code | integer (int32) | Yes | HTTP status code (mirrored in the response status line for convenience). |
500 — Internal server error
| Field | Type | Required | Description |
|---|---|---|---|
message | string | Yes | Plain-english message describing the failure from the caller's perspective. |
status_code | integer (int32) | Yes | HTTP status code (mirrored in the response status line for convenience). |
Every request needs an Authorization header holding your API key — see Getting started with the Taostats API.