Withdrawals of a validator
See validator withdrawals in TraceFast →
The withdrawals paid out for one validator: for each, the block it was included in, its global withdrawal index, the execution-layer address paid and the amount. Since the Shanghai/Capella upgrade the chain sweeps validator balances automatically — partial withdrawals of rewards above the balance cap, full withdrawals after an exit; see the Ethereum staking withdrawals docs.
GET https://tracefast.xyz/api/v1/chains/1/consensus/validators/{index}/withdrawals
| Parameter | In | Type | Notes |
|---|---|---|---|
index | path | integer | the validator's index in the consensus registry, a non-negative integer |
fromBlock | query | integer, optional | inclusive lower bound. Default: toBlock - 215999 |
toBlock | query | integer, optional | inclusive upper bound. Default: the newest covered block |
limit | query | integer, optional | 1..100, default 25 |
cursor | query | string, optional | nextCursor of the previous page |
Access — an API key on the Intelligence plan or higher (plans), or no key at all: pay per call with 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_withdrawals on the MCP server. Stable — see 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
- One window per request, at most 216 000 blocks — about 30 days. Without
fromBlock/toBlockthe newest window is answered; the window used is echoed inwindow. A wider window is refused with the bound, never narrowed. - Older history: ask again with
toBlockset towindow.fromBlock - 1. The cursor pages inside one window only. - The newest withdrawals arrive here later. This method reads a history
that trails the chain head, so a fresh withdrawal shows on
withdrawals of one block minutes before it shows
here. A
toBlockpast that history is refused with422and the highest block you can ask about — see data freshness. - Amounts are in gwei, as decimal strings (1 ETH = 10^9 gwei), not wei.
- An empty list is also what an unknown index answers — a validator the chain does not know yet was paid nothing, like a known one with no payout in the window. The method does not tell the two apart.
- The address paid is a payout destination, not proof of who runs the validator.
Response
200 application/json, here with ?limit=2 for validator 2236426:
{
"data": {
"chainId": 1,
"validatorIndex": 2236426,
"window": {
"fromBlock": 25709129,
"toBlock": 25925128
},
"withdrawals": [
{
"blockNumber": 25821577,
"withdrawalIndex": 140585851,
"address": "0x4aafdb911085dd7703e57951279744dd713f744d",
"amountGwei": "3610291101",
"timestamp": 1787532887
},
{
"blockNumber": 25815167,
"withdrawalIndex": 140483291,
"address": "0x4aafdb911085dd7703e57951279744dd713f744d",
"amountGwei": "1931",
"timestamp": 1787455715
}
],
"nextCursor": "AVsyNTgxNTE2NywxNDA0ODMyOTEsMjU3MDkxMjksMjU5MjUxMjhdTp3ug5ew4LBT1XTfk2FP8w"
},
"meta": {
"chain": "ethereum",
"timestamp": 1789063605891,
"cached": false,
"asOfBlock": 25925128,
"docs": "https://docs.tracefast.xyz/api/validator-withdrawals"
}
}The default window ends at the newest covered block, which meta.asOfBlock
also states. It can trail the chain head while part of the history is temporarily
unavailable — see coverage gaps.
data
| Field | Meaning |
|---|---|
chainId | 1 |
validatorIndex | the validator asked about |
window.fromBlock, window.toBlock | the inclusive block window this page was answered over |
withdrawals[] | newest first. Empty when nothing was paid in the window |
nextCursor | the cursor of the next page inside the window. Absent on the window's last page |
A withdrawal
| Field | Meaning |
|---|---|
blockNumber | the block the withdrawal was included in |
withdrawalIndex | the withdrawal's global index, unique across the chain |
address | the address paid, lowercase |
amountGwei | the amount paid, gwei |
timestamp | Unix time of the block, seconds. Absent while it cannot be resolved yet — the newest blocks take a few seconds — never a placeholder date |
Pagination
Inside one window the method pages by keyset: pass nextCursor back as
cursor, with the same fromBlock / toBlock, until it is absent. A cursor is
valid only for this method and this window. To go further back than the window,
start a new request with toBlock = window.fromBlock - 1. See
pagination.
Errors
| Status | code | When | details |
|---|---|---|---|
| 400 | bad_request | the index is not a non-negative integer | reason: validator_index_invalid, index |
| 400 | bad_request | the window is wider than 216 000 blocks | reason: block_window_too_wide, span, maxSpan: 216000, fromBlock, toBlock |
| 400 | bad_request | fromBlock above toBlock | reason: block_window_inverted |
| 400 | bad_request | limit outside 1..100 | reason: limit_out_of_range, maxLimit: 100 |
| 400 | invalid_cursor | the cursor is not valid for this request — restart from the first page | — |
| 422 | block_not_available | toBlock is above the newest covered block | reason: block_not_available, maxAvailableBlock |
| 503 | service_unavailable | the newest covered block cannot be determined right now and no toBlock was given; retry, or pass toBlock | — |
Malformed input, unknown parameters and the key check's 401/403/429 are the same for every method — see conventions and API keys.
Related pages
- Validator withdrawals of one block — every withdrawal in a block
- Block-proposal leaderboard — find validator indexes by blocks proposed
- Validator queues now — the activation and exit queues
- Validators — the validator set, read in the app
- Validator Withdrawals — withdrawals in the latest block, on the live dashboard
Last updated 22 Oct 2026, 08:06 UTC · verified against TraceFast v1.0.261 · Markdown