# Validator queues over time

[See the queues over time in TraceFast →](https://tracefast.xyz/analytics/validators)

The validator activation and exit queues as a summary: the current state plus
one closing point per UTC day for the most recent `limit` days, newest first —
the series behind a queue chart. What the queues are is explained in the
[Ethereum proof-of-stake docs](https://ethereum.org/developers/docs/consensus-mechanisms/pos).

```
GET https://tracefast.xyz/api/v1/chains/1/consensus/queues
```

| Parameter | In | Type | Notes |
|---|---|---|---|
| `limit` | query | integer, optional | the most recent daily points to return, 1..90, default 30 |

**Access** — an [API key](/api/authentication) on the **Intelligence** plan or higher ([plans](/api/authentication#plans)), or no key at all: pay per call with [x402](/api/x402) at the same path on `https://mpp.tracefast.xyz/api/v1`, at the price its `402` states. As a tool for AI agents: `get_validator_queue_history` on the [MCP server](/api/mcp-server). **Stable** — see [stability](/api/conventions#stability).

`chains/1` is a literal: the method serves Ethereum mainnet data. Other chain
ids answer `404 chain_not_supported`, and an unknown query parameter is refused
rather than ignored.

## What it covers, and what it does not

* **Daily points only** — one closing sample per UTC day, stated in
  `granularity`. The epoch-grain series and anything older than 90 days are not
  published here.
* **Two kinds of point.** `observed` points are sampled from the live chain,
  one per day at the day's last sampled epoch. `reconstructed` points predate
  sampling (`observedFrom`): a **lower-bound estimate** derived from validator
  activations and exits at roughly 1.14-day resolution. A queue that drained
  faster than that reads as 0 there, and the fields a reconstruction cannot
  know — rates, active set, capital — are `null`, never estimated.
* **Validator-set mechanics only** — no yield, APR or staking-pool data.
  Capital is in gwei, as decimal strings (1 ETH = 10^9 gwei).

## Response

`200 application/json`, here with `?limit=3`:

```json
{
  "data": {
    "chainId": 1,
    "current": {
      "asOfEpoch": 474582,
      "asOfTime": "2026-09-10T18:05:19Z",
      "activeValidators": 909693,
      "pendingActivation": 976,
      "pendingExit": 605,
      "netQueue": 371,
      "activationRate": 0.0010728894253336015,
      "exitRate": 0.0006650595310725706,
      "pendingActivationGwei": "3662379850000",
      "pendingExitGwei": "89850159122607"
    },
    "granularity": "day",
    "observedFrom": "2026-08-11T20:21:01Z",
    "points": [
      {
        "time": "2026-09-10T18:05:19Z",
        "source": "observed",
        "epoch": 474582,
        "pendingActivation": 976,
        "pendingExit": 605,
        "netQueue": 371,
        "activationRate": 0.0010728894253336015,
        "exitRate": 0.0006650595310725706,
        "activeValidators": 909693,
        "pendingActivationGwei": "3662379850000",
        "pendingExitGwei": "89850159122607",
        "totalActiveBalanceGwei": "43074071829985508"
      },
      {
        "time": "2026-09-09T23:58:14Z",
        "source": "observed",
        "epoch": 474412,
        "pendingActivation": 976,
        "pendingExit": 491,
        "netQueue": 485,
        "activationRate": 0.0010727314093778267,
        "exitRate": 0.0005396630348406895,
        "activeValidators": 909827,
        "pendingActivationGwei": "2975000000000",
        "pendingExitGwei": "86555762324019",
        "totalActiveBalanceGwei": "43065431386978359"
      },
      {
        "time": "2026-09-08T23:57:33Z",
        "source": "observed",
        "epoch": 474187,
        "pendingActivation": 976,
        "pendingExit": 544,
        "netQueue": 432,
        "activationRate": 0.0010725887633139476,
        "exitRate": 0.0005978363598799052,
        "activeValidators": 909948,
        "pendingActivationGwei": "2775000000000",
        "pendingExitGwei": "17627332797855",
        "totalActiveBalanceGwei": "43092646772991885"
      }
    ]
  },
  "meta": {
    "chain": "ethereum",
    "timestamp": 1789063605777,
    "cached": false,
    "docs": "https://docs.tracefast.xyz/api/consensus-queues"
  }
}
```

The newest point is today's, still open: it is the latest sample, and the day
closes on the last epoch sampled before 00:00 UTC.

### `data`

| Field | Meaning |
|---|---|
| `chainId` | `1` |
| `current` | the queues as of the newest sampled epoch — the same facts as [validator queues now](/api/consensus-current), cut to what a chart needs beside its newest point |
| `granularity` | always `day` |
| `observedFrom` | when sampling of the queues began, RFC 3339 UTC. Points before it are `reconstructed`. `null` while nothing has been sampled |
| `points[]` | at most `limit` points, newest first |

### `current`

| Field | Meaning |
|---|---|
| `asOfEpoch`, `asOfTime` | the epoch the counters were sampled at, and its start in RFC 3339 UTC |
| `activeValidators` | validators in the active set |
| `pendingActivation`, `pendingExit` | validators waiting to activate, to exit |
| `netQueue` | `pendingActivation - pendingExit` |
| `activationRate`, `exitRate` | each queue's depth as a fraction of the active set |
| `pendingActivationGwei`, `pendingExitGwei` | capital waiting on each side, gwei. `null` when not sampled |

### A point

| Field | Meaning |
|---|---|
| `source` | `observed` or `reconstructed` |
| `epoch` | the sampled epoch (`observed`) or the estimate's boundary epoch (`reconstructed`) |
| `time` | the time of the sample, RFC 3339 UTC |
| `pendingActivation`, `pendingExit`, `netQueue` | queue depths in validators, as in `current` |
| `activationRate`, `exitRate` | as in `current`. `null` on `reconstructed` |
| `activeValidators` | validators in the active set. `null` on `reconstructed` |
| `pendingActivationGwei`, `pendingExitGwei` | capital on each side, gwei. `null` when not sampled |
| `totalActiveBalanceGwei` | total effective balance of the active set, gwei. `null` on `reconstructed` |

## Errors

| Status | `code` | When | `details` |
|---|---|---|---|
| 400 | `bad_request` | `limit` outside 1..90 | `reason: limit_out_of_range`, `maxLimit: 90` |
| 503 | `service_unavailable` | no queue state has been sampled yet; retry later | — |

Malformed input, unknown parameters and the key check's `401`/`403`/`429` are the same for every method — see [conventions](/api/conventions#errors) and [API keys](/api/authentication#when-a-key-is-refused).

## Related pages

* [Validator queues now](/api/consensus-current) — the current state with averages, flow and capital weights
* [Block-proposal leaderboard](/api/consensus-proposers) — who proposes blocks
* [Withdrawals of a validator](/api/validator-withdrawals) — one validator's payouts
* [Validators](/dashboard/validators) — the queues over time, read in the app
