# Get Subnets Hyperparameters

Latest hyperparameters for one subnet, or for every subnet when netuid is omitted.

_Source: https://beta.taostats.io/docs/new/subnets/get-subnets-hyperparameters_

_Last reviewed: 2026-10-07_

```http
GET https://api.taostats.io/v1/subnets/hyperparameters
```

Requires an API key in the `Authorization` header.

Latest hyperparameters for one subnet, or for every subnet when `netuid` is omitted.

## Try it

Try this request in the browser on the HTML version of this page, or use the code samples below.

### Code samples

**cURL**

```bash
curl -H "Authorization: <YOUR_API_KEY>" \
  "https://api.taostats.io/v1/subnets/hyperparameters"
```

**JavaScript**

```js
const response = await fetch('https://api.taostats.io/v1/subnets/hyperparameters', {
  headers: {
    Authorization: '<YOUR_API_KEY>',
  },
});
const data = await response.json();
```

**Python**

```python
import requests

response = requests.get(
    "https://api.taostats.io/v1/subnets/hyperparameters",
    headers={"Authorization": "<YOUR_API_KEY>"},
)
data = response.json()
```

## Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `netuid` | query | `integer (int32)` |  | Subnet ID. Omit it to list every subnet in the latest snapshot. |
| `page` | query | `integer (int32)` |  | Page number (1-indexed). Default: 1. Bounded window: `(page − 1) × limit` must be below 1,000,000. |
| `limit` | query | `integer (int32)` |  | Results per page. Default: 50 without `netuid`, 1 with it. Max: 200. |

## Responses

### `200` — Subnet hyperparameters: one subnet, or every subnet in the latest snapshot

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `data` | `array` | Yes |  |
| `data[].activity_cutoff` | `integer (int32)` | Yes | Blocks of inactivity before a neuron is considered inactive — the **effective** cutoff the runtime actually applies. From spec 423 the chain deprecated the absolute `ActivityCutoff` storage item and derives this as `max(1, activity_cutoff_factor_milli * tempo / 1000)`. Before #464 this field served the stale deprecated value, which was wrong for every subnet with a non-default tempo or factor. |
| `data[].activity_cutoff_factor_milli` | `integer (int32)` | Yes | `ActivityCutoffFactorMilli` — per-mille of `tempo`; the hyperparameter that actually drives `activity_cutoff` from spec 423. `0` on snapshots below spec 423, where the chain item did not exist (the chain's own legal range is 1000–50000, so `0` is unambiguous). |
| `data[].adjustment_alpha` | `string` | Yes | EMA weight for registration adjustment (u64 as string). |
| `data[].adjustment_interval` | `integer (int32)` | Yes | Blocks between difficulty/burn auto-adjustments. |
| `data[].alpha_high` | `string` | Yes | Upper bound for liquid alpha (float 0-1). |
| `data[].alpha_low` | `string` | Yes | Lower bound for liquid alpha (float 0-1). |
| `data[].alpha_sigmoid_steepness` | `integer (int32)` | Yes | Sigmoid steepness for the liquid-alpha curve. |
| `data[].block_number` | `integer (int32)` | Yes | Block at which this snapshot was taken. |
| `data[].bonds_moving_average` | `string` | Yes | EMA decay for bonds (float 0-1, e.g. `"0.9"`). |
| `data[].bonds_penalty` | `string` | Yes | Interpolation weight between raw and clipped weights (float 0-1). |
| `data[].bonds_reset_enabled` | `boolean` | Yes | Whether bonds reset on re-registration. |
| `data[].burn_half_life` | `integer (int32)` | Yes | Tempos for burn to halve back toward `min_burn`. |
| `data[].burn_increase_mult` | `string` | Yes | Burn increase multiplier (decimal string, range 1-3). |
| `data[].collateral_drain_ratio` | `string` | Yes | Alpha of locked collateral released per alpha of miner incentive earned (decimal string). Defaults to `"1"`, not `"0"`. |
| `data[].collateral_lock_share` | `string` | Yes | Share of the burned-registration price locked as miner collateral instead of burned, as a fraction (`collateral_lock_share / u16::MAX`). `"0"` means the collateral mechanism is off for this subnet, which is the default and the only value before spec 435. |
| `data[].commit_reveal_period` | `string` | Yes | Epochs for the commit-reveal window (u64 as string). |
| `data[].commit_reveal_weights_enabled` | `boolean` | Yes | Whether the commit-reveal weight protocol is active. |
| `data[].difficulty` | `string` | Yes | Raw PoW difficulty target (u64 as string). |
| `data[].immunity_period` | `integer (int32)` | Yes | Blocks a new neuron is immune from deregistration. |
| `data[].kappa` | `string` | Yes | Consensus majority threshold (float 0-1, e.g. `"0.5"`). |
| `data[].liquid_alpha_enabled` | `boolean` | Yes | Whether liquid alpha is enabled. |
| `data[].max_allowed_uids` | `integer (int32)` | Yes | Maximum UIDs the subnet supports. |
| `data[].max_allowed_validators` | `integer (int32)` | Yes | Maximum validator count. |
| `data[].max_burn` | `string` | Yes | Maximum registration burn in RAO (u64 as string). |
| `data[].max_difficulty` | `string` | Yes | Maximum PoW difficulty ceiling (u64 as string). |
| `data[].max_registrations_per_block` | `integer (int32)` | Yes | Hard cap on registrations per block. |
| `data[].max_weights_limit` | `integer (int32)` | Yes | Max weights limit — always 65535. |
| `data[].mechanism_count` | `integer (int32)` | Yes | Number of active consensus mechanisms. |
| `data[].mechanism_emission_split` | `array` | Yes | Emission split between mechanisms. |
| `data[].mechanism_emission_split[]` | `integer (int32)` | Yes |  |
| `data[].min_allowed_uids` | `integer (int32)` | Yes | Minimum UIDs the subnet must support. |
| `data[].min_allowed_weights` | `integer (int32)` | Yes | Minimum weight count per neuron. |
| `data[].min_burn` | `string` | Yes | Minimum registration burn in RAO (u64 as string). |
| `data[].min_difficulty` | `string` | Yes | Minimum PoW difficulty floor (u64 as string). |
| `data[].netuid` | `integer (int32)` | Yes | Subnet ID. Added with the all-subnets listing (#1250), where it is the only way to tell the rows apart; a number, as the OLD API's `/api/subnet/latest/v1` serves it. |
| `data[].owner_immune_neuron_limit` | `integer (int32)` | Yes | Owner neurons immune from deregistration. |
| `data[].pow_registration_allowed` | `boolean` | Yes | PoW registration flag (always disabled on dTAO-era subnets). |
| `data[].recycle_or_burn` | `string` | Yes | Whether registration fees are recycled or burned (`"Recycle"` or `"Burn"`). |
| `data[].registration_allowed` | `boolean` | Yes | Master switch for registration. |
| `data[].rho` | `integer (int32)` | Yes | Raw scaling parameter `Rho`. |
| `data[].root_claim_threshold` | `string` | Yes | Root claim eligibility threshold (decimal string). |
| `data[].scaling_law_power` | `string` | Yes | Legacy scaling law power (float 0-1). |
| `data[].serving_rate_limit` | `string` | Yes | Minimum blocks between axon serving updates (u64 as string). |
| `data[].subnet_is_active` | `boolean` | Yes | Whether subtoken trading is enabled. |
| `data[].target_regs_per_interval` | `integer (int32)` | Yes | Target registration count per adjustment interval. |
| `data[].tempo` | `integer (int32)` | Yes | Blocks per epoch. |
| `data[].timestamp` | `string` | Yes | ISO 8601 timestamp with millisecond precision. |
| `data[].transfers_enabled` | `boolean` | Yes | Whether alpha token transfers are enabled. |
| `data[].voting_power_ema_alpha` | `string` | Yes | Voting power EMA alpha (float 0-1). |
| `data[].voting_power_tracking` | `boolean` | Yes | Whether voting power tracking is enabled. |
| `data[].weights_rate_limit` | `string` | Yes | Minimum blocks between weight-setting transactions (u64 as string). |
| `data[].weights_version` | `string` | Yes | Version key for weight validation (u64 as string). |
| `data[].yuma_version` | `integer (int32)` | Yes | Yuma consensus version (`2` or `3`). |
| `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](https://beta.taostats.io/docs/start-here/getting-started-with-taostats-api).
