文档 / 新版 API 参考 / 子网
Get Subnets History
参考
最后审阅于 2026-10-19
One subnet's statistics over time.
Try it
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
netuid | query | integer (int32) | Yes | Subnet ID (required). |
block_start | query | integer (int32) | Block range start (inclusive). | |
block_end | query | integer (int32) | Block range end (inclusive). | |
timestamp_start | query | integer (int64) | Timestamp range start, Unix seconds (inclusive). | |
timestamp_end | query | integer (int64) | Timestamp range end, Unix seconds (inclusive). | |
page | query | integer (int32) | Page number (1-indexed). Default: 1. Bounded window: (page − 1) × limit must be below 1,000,000; a page past it is rejected with a 400. Reach deeper history with the range filters instead. | |
limit | query | integer (int32) | Results per page. Default: 50. Max: 200. | |
order_by | query | string | Column to order by: timestamp (default) or block_number. Both give the same order. One of timestamp, block_number. | |
order_dir | query | string | Sort direction. Default: desc. One of asc, desc. | |
frequency | query | string | How far apart the points are. Default: by_day. by_day returns blocks that are multiples of 7,200, by_hour multiples of 300, and by_block every stored snapshot, which is every 300th block — not every block. One of by_block, by_hour, by_day. |
Responses
200 — One subnet's statistics over time
| Field | Type | Required | Description |
|---|---|---|---|
data | array | Yes | |
data[].block_number | integer (int32) | Yes | |
data[].emission | string | Yes | TAO injected into the subnet's pool on this block (SubnetTaoInEmission), RAO. |
data[].excess_tao | string | Yes | Excess TAO the chain bought into the subnet on this block (SubnetExcessTao), RAO. "0" before spec 411 (block 8,283,784), where the chain did not have it. |
data[].miner_share | string, nullable | Yes | Fraction of a block's alpha emission assigned to miners, as a decimal string in [0, 1]. null for root or until the row is backfilled. |
data[].netuid | integer (int32) | Yes | |
data[].neuron_registration_cost | string | Yes | The subnet's registration cost at this block (Burn), RAO. |
data[].owner_share | string, nullable | Yes | Fraction of a block's alpha emission assigned to the subnet owner, as a decimal string in [0, 1]. null for root or until the row is backfilled. |
data[].recycled_24_hours | string, nullable | TAO recycled by registrations over the previous 7,200 blocks, RAO, never negative. null when there is no snapshot 7,200 blocks earlier. Root: the OLD API's figure — "0", and on dTAO's first day OLD's own non-zero figures. | |
data[].timestamp | string | Yes | ISO 8601, millisecond precision, UTC. |
data[].validator_alpha_share | string, nullable | Yes | The alpha component of validator_share, as a decimal string in [0, 1]. null for root or until the row is backfilled. |
data[].validator_root_share | string, nullable | Yes | The root-proportion component of validator_share, as a decimal string in [0, 1]. Depending on the runtime, this component may be swapped to TAO, recycled, or kept as alpha rather than paid to root stakers. null for root or until the row is backfilled. |
data[].validator_share | string, nullable | Yes | Fraction of a block's alpha emission assigned to validators, including both root and alpha components, as a decimal string in [0, 1]. null for root or until the row is backfilled. |
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 query 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.