Skip to main content
API referenceChain

Chain Concentration Subnets

Last updated

GET
/api/v1/chain/concentration/subnets

Fetch every subnet ranked by distribution spread. Every subnet ranked by how widely one lens of its distribution is SPREAD (#9717) — the screening question a prospective miner actually asks, and the one that used to cost 129 requests. Per subnet: holders, the measured total, gini, hhi, hhi_normalized, nakamoto_coefficient, top1/top5/top10/top20 shares, entropy, plus neuron_count/entity_count/uids_per_entity. THE SAME COMPUTATION /subnets/{netuid}/concentration SERVES: this groups the neurons read by netuid and runs buildConcentration on each group, so a subnet's row here and its own detail route agree BY CONSTRUCTION rather than by two implementations staying in step — a SQL reimplementation of gini/nakamoto would agree until it quietly did not. DISTINCT FROM /chain/concentration, which performs this same read and then collapses every subnet into ONE network aggregate, discarding the per-subnet structure. DISTINCT FROM /chain/holders, which ranks alpha OWNERSHIP off the position ledger: who owns the token is a different question from who receives the emissions, and for "should I work here" it is the wrong one. ?lens= is emission, stake, entity_emission, entity_stake, validator_stake (default emission, the reward question) — ONE lens per response, because five scorecards across ~129 subnets is a payload nobody asked for and a flat row is what a sort can act on. ?sort= is nakamoto_coefficient, gini, holders, top_1pct_share, total, netuid (default nakamoto_coefficient). EACH SORT KEY HAS ITS OWN "WIDEST FIRST" DIRECTION and that is the default, because getting it wrong inverts the answer: a HIGH nakamoto coefficient means widely shared while a HIGH gini means the opposite. ?order= overrides. A subnet whose lens has no positive distribution sorts LAST in EITHER direction and is flagged unmeasured — riding its nulls up an ascending gini ranking would read as the most perfectly equal subnet on the network when in fact nothing was measured. limit caps the returned subnets (default 20, max 512) and the max sits above the subnet count on purpose, so ranking the whole network is one request. The network rollup carries dimension-free facts only — MEDIAN gini/nakamoto/top-1 share and how many subnets have a single holder taking the lens — because each subnet's alpha is a different token and a cross-subnet sum of it means nothing. Mainnet-only: the neurons tier carries no network dimension.

Query Parameters

lens?string

Value in

  • "emission"
  • "stake"
  • "entity_emission"
  • "entity_stake"
  • "validator_stake"
sort?string

Value in

  • "nakamoto_coefficient"
  • "gini"
  • "holders"
  • "top_1pct_share"
  • "total"
  • "netuid"
order?string

Value in

  • "asc"
  • "desc"
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 on every route -- it is never silently clamped, so a short page always means the result set is exhausted (#9916).

Range1 <= value <= 512

Response Body

application/json

application/json

application/json

application/json

application/json

curl -X GET "https://example.com/api/v1/chain/concentration/subnets"
{  "data": {    "captured_at": "2026-06-01T00:00:00.000Z",    "lens": "emission",    "limit": 1,    "measured_subnet_count": 1,    "network": {      "median_gini": 0.5,      "median_nakamoto_coefficient": 0.5,      "median_top_1pct_share": 0.5,      "single_holder_subnet_count": 1    },    "neuron_count": 1,    "order": "asc",    "returned": 1,    "schema_version": 1,    "sort": "nakamoto_coefficient",    "subnet_count": 1,    "subnets": [      {        "entity_count": 1,        "entropy": 0.5,        "entropy_normalized": 0.5,        "gini": 0.5,        "hhi": 0.5,        "hhi_normalized": 0.5,        "holders": 1,        "nakamoto_coefficient": 1,        "netuid": 7,        "neuron_count": 1,        "top_10pct_share": 0.5,        "top_1pct_share": 0.5,        "top_20pct_share": 0.5,        "top_5pct_share": 0.5,        "total": 1,        "uids_per_entity": 0.5,        "unmeasured": false      }    ]  },  "meta": {    "artifact_path": "example",    "cache": "short",    "contract_version": "2026-06-29.1",    "generated_at": "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}