Skip to main content
API referenceValidators

Validator Nominators

Last updated

GET
/api/v1/validators/{hotkey}/nominators

Fetch the nominator list for one validator: who has staked to it (across every subnet it operates in) over a 7d/30d/90d window, each with staked/unstaked/net/gross TAO and last activity, ranked by net_staked (default), gross_staked, or last_activity. ?coldkey= narrows to one nominator's own flow (exact match). Summed live from the account_events StakeAdded/StakeRemoved stream. Cold/absent hotkey returns an empty list, never a 404. ?basis= selects WHICH QUESTION is answered (#9617), not how well it is answered. basis=flow (the DEFAULT, and everything above) is TAO MOVED within the window, so it cannot see a nominator who staked before the window and has not touched it since -- a dormant delegator is invisible and a long-standing one reads as smaller than they are. basis=positions instead reads the standing position ledger keyed (coldkey, hotkey, netuid): every coldkey (an ss58 address) currently delegating to this hotkey, and how much ALPHA each holds per subnet, whenever they staked. The two are different units over different time semantics -- TAO moved in a window versus alpha held now -- so they are not comparable and the default does not move. On the positions basis, window and sort are REJECTED rather than ignored, because accepting them would imply the snapshot honoured them; nominator_count is the whole delegator set rather than the returned page; and alpha is reported PER SUBNET with no cross-subnet total, since each subnet's alpha is a different token. Nominators are ranked by how many subnets they hold on, then by their largest single-subnet holding, for the same reason. The positions basis DECLINES with degraded.reason pool_totals_unproven while the hotkey_alpha pool ledger has no complete pass -- a partial ledger underprices a nominator rather than dropping them.

Path Parameters

hotkey*string

An SS58-encoded hotkey address identifying one validator identity.

Query Parameters

basis?string

Which question to answer. flow (the default) sums TAO MOVED inside window, so a delegator who staked earlier and has not touched it since is absent. positions reads the standing ledger instead: every coldkey (an ss58 address) delegating right now and how much alpha each holds per subnet, whenever they staked. Different units over different time semantics, so the two are not comparable. On positions, window and sort are REJECTED rather than ignored.

Default"flow"

Value in

  • "flow"
  • "positions"
window?string

Trailing lookback window the response is computed over, ending at the most recent data point rather than at today. Accepts 7d, 30d, 90d. A longer window is not a superset of a shorter one -- rankings and rates are recomputed over the whole window, not summed.

Default"30d"

Value in

  • "7d"
  • "30d"
  • "90d"
sort?string

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

Default"net_staked"

Value in

  • "net_staked"
  • "gross_staked"
  • "last_activity"
limit?integer

Maximum number of rows to return in one page (at most 2000). 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 <= 2000
Default20
offset?integer

Number of rows to skip before the page begins. Correct only in combination with the page size the response actually returned -- prefer cursor for anything beyond the first few pages, since a row inserted mid-scan shifts every later offset.

Range0 <= value
Default0
coldkey?string

An SS58 account address (47-48 base58 characters). Coldkey or hotkey depending on the tool — see the tool description for which this expects.

Match^[1-9A-HJ-NP-Za-km-z]{47,48}$
format?string

Response format override. Use csv to download the route rows as text/csv; json keeps the default response envelope.

Default"json"

Value in

  • "json"
  • "csv"

Response Body

application/json

application/json

application/json

application/json

curl -X GET "https://example.com/api/v1/validators/5F4tQyWrhfGVcNhoqeiNsR6KjD4wMZ2kfhLj4oHYuyHbZAc3/nominators"
{  "data": {    "concentration_complete": false,    "hotkey": "example",    "limit": 1,    "nominator_count": 1,    "nominator_gini": 0.5,    "nominators": [      {        "coldkey": "example",        "event_count": 1,        "gross_staked_tao": 0.5,        "last_observed_at": "2026-06-01T00:00:00.000Z",        "net_staked_tao": 0.5,        "staked_tao": 0.5,        "unstaked_tao": 0.5      }    ],    "offset": 1,    "schema_version": 1,    "sort": "net_staked",    "top_nominator_share": 0.5,    "top5_nominator_share": 0.5,    "window": "30d"  },  "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}