Skip to main content
API referenceChain

Chain Holders

Last updated

GET
/api/v1/chain/holders

Fetch every subnet ranked by alpha-ownership concentration. Every subnet ranked by how concentrated its alpha OWNERSHIP is (#9607) — per subnet: the distinct holder count, the measured alpha total, top1/top5/top10/top20 shares, and the largest holder's coldkey (an ss58 address). The cross-subnet companion to /subnets/{netuid}/holders, which answers this one subnet at a time and so costs 129 requests to compare the network. DISTINCT FROM /chain/concentration, which computes Gini/HHI/Nakamoto off neurons.stake_tao and therefore sees REGISTERED UIDs only — on netuid 74 that is 10 of the 92 hotkeys actually carrying positions. This reads the position ledger, so alpha parked on hotkeys holding no UID is measured rather than invisible, and the two routes disagree by design. ALPHA IS NEVER SUMMED ACROSS SUBNETS: each subnet's alpha is a different token, so total_alpha is reported per subnet and the network rollup carries only dimension-free facts — subnets measured, how many have a single account holding a majority, how many have exactly one holder, and the MEDIAN of the top-1 shares. A cross-subnet total requires pricing each subnet's alpha through its own alpha_price_tao first, which is what /accounts/top-holders does. ?sort=top1_share (default), top5_share, top10_share, top20_share, holder_count or total_alpha; a subnet whose share could not be computed sorts LAST rather than reading as the least concentrated. limit caps the returned subnets (default 20, max 512) and the max sits above the subnet count so ranking the whole network is one request. DECLINES rather than answering while the hotkey_alpha pool ledger has no complete pass — an empty subnets array with degraded.reason pool_totals_unproven and a NULL subnet_count, never a zero one. Mainnet-only: neither source table carries a network dimension.

Query Parameters

sort?string

Column to rank the result by; pair with order for direction. Options are per-tool; see this parameter's enum. Defaults to top1_share.

Default"top1_share"

Value in

  • "top1_share"
  • "top5_share"
  • "top10_share"
  • "top20_share"
  • "holder_count"
  • "total_alpha"
limit?integer

Maximum number of rows to return in one page (at most 512). A larger value, or a non-positive one, is rejected with 400 invalid_query -- so a short page means the result set is exhausted, not that the server quietly capped you (#9916). Omitted, the server applies 20.

Range1 <= value <= 512
Default20

Response Body

application/json

application/json

application/json

application/json

application/json

curl -X GET "https://example.com/api/v1/chain/holders"
{  "data": {    "captured_at": "2026-06-01T00:00:00.000Z",    "degraded": {      "reason": "pool_totals_unproven"    },    "limit": 1,    "network": {      "median_top1_share": 0.5,      "subnets_measured": 1,      "subnets_with_majority_holder": 1,      "subnets_with_single_holder": 1    },    "positions_captured_at": "2026-06-01T00:00:00.000Z",    "schema_version": 1,    "sort": "example",    "subnet_count": 1,    "subnets": [      {        "holder_count": 1,        "netuid": 7,        "top_holder": "example",        "top1_share": 0.5,        "top10_share": 0.5,        "top20_share": 0.5,        "top5_share": 0.5,        "total_alpha": 0.5      }    ]  },  "meta": {    "artifact_path": "example",    "cache": "short",    "contract_version": "2026-06-29.1",    "generated_at": "2026-06-01T00:00:00.000Z",    "observed_through": "2026-06-01T00:00:00.000Z",    "pagination": {      "collection": "example",      "cursor": 1,      "limit": 1,      "next_cursor": 1,      "order": "asc",      "returned": 1,      "sort": "example",      "total": 1    },    "published_at": "2026-06-01T00:00:00.000Z",    "source": "live-cron-prober",    "stale_contract": {      "built_under": "example",      "live": "example"    }  },  "ok": true,  "schema_version": 1}