Validator withdrawals of one block
Open this block in TraceFast →
The validator withdrawals paid out in one block: for each, the withdrawal index, the validator it was paid for, the recipient address and the amount, in withdrawal-index order. A block holds at most 16. Withdrawals move staked ETH and rewards from the consensus layer to an execution-layer address — see proof-of-stake on ethereum.org.
GET https://tracefast.xyz/api/v1/chains/1/blocks/{number}/withdrawals
| Parameter | In | Type | Notes |
|---|---|---|---|
number | path | integer | block height, 0 or more |
validatorIndex | query | integer, optional | only the withdrawals of this validator |
address | query | string, optional | only the withdrawals paid to this address, 0x-prefixed, 40 hex characters |
limit | query | integer, optional | 1..100, default 25 |
cursor | query | string, optional | nextCursor of the previous page, unchanged |
Access — an API key on the Enriched Data 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_block_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. There are no other parameters — an
unknown one is refused rather than ignored.
What it covers, and what it does not
- Execution-layer payouts only. A withdrawal here is the credit an address received in this block. The validator's own history across blocks is withdrawals of a validator.
- A block before withdrawals existed answers an empty list with
withdrawalCount: 0— a real zero: blocks before the Shanghai upgrade hold none. - Served to the chain head. A block with no withdrawals answers an empty
list — a statement about that block, not a gap. A block above the head does
not exist yet and answers
404 not_found; see data freshness. withdrawalCountcounts what matches the request — the block's whole count without filters, the matching rows withvalidatorIndexoraddress.
Response
200 application/json, here for block 25925120 with ?limit=2:
{
"data": {
"blockNumber": 25925120,
"withdrawalCount": 16,
"withdrawals": [
{
"index": 142242539,
"validatorIndex": 1039847,
"address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f",
"amountGwei": "65514597"
},
{
"index": 142242540,
"validatorIndex": 1039848,
"address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f",
"amountGwei": "14373529"
}
],
"nextCursor": "AVsyNTkyNTEyMCwxNDIyNDI1NDBdT15gMPCahJjXY7pXXo_P9g"
},
"meta": {
"chain": "ethereum",
"timestamp": 1789067462121,
"cached": false,
"asOfBlock": 25925120,
"docs": "https://docs.tracefast.xyz/api/block-withdrawals"
}
}data
| Field | Meaning |
|---|---|
blockNumber | the block these withdrawals belong to |
withdrawalCount | how many withdrawals of the block match the request — the block's whole count when no filter is given |
withdrawals[] | this page, in withdrawal-index order |
nextCursor | cursor for the next page. Absent on the last page |
A withdrawal
| Field | Meaning |
|---|---|
index | the withdrawal's index — a counter that runs across the whole chain, so it is unique and grows from block to block |
validatorIndex | the validator the withdrawal was paid for, by its index in the consensus-layer registry |
address | the recipient, lowercase |
amountGwei | the amount in gwei (1 gwei = 10^9 wei), as a decimal string |
The sum of amountGwei over the whole block equals the block's
totalWithdrawalGwei on one block.
Pagination
Keyset pagination: pass nextCursor back as cursor, with the same number
and filters, until the response carries no nextCursor. A cursor is valid only
for this method, this block and these filters; anything else answers
400 invalid_cursor — restart from the first page. See
pagination.
Errors
| Status | code | When | details |
|---|---|---|---|
| 400 | bad_request | number is not a non-negative integer | reason: block_number_invalid |
| 400 | bad_request | validatorIndex is not a non-negative integer | reason: validator_index_invalid, validatorIndex |
| 400 | bad_request | address is not 0x + 40 hex characters | reason: address_invalid |
| 400 | bad_request | limit outside 1..100 | reason: limit_out_of_range, limit, maxLimit |
| 400 | invalid_cursor | the cursor was not issued for this request | — |
| 404 | not_found | the block is above the chain head — it does not exist yet | — |
| 422 | block_not_available | the block sits in a coverage gap; it exists, ask again later | reason: coverage_gap, coverageGapFromBlock, coverageGapToBlock, maxAvailableBlock |
| 503 | service_unavailable | the block is outside the range that can be read right now, and that range's edge could not be read; retry with backoff | — |
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
- One block — the block's totals, including
totalWithdrawalGwei - Withdrawals of a validator — one validator across blocks
- Accounts touched by one block — every account whose balance the block changed
- Validator queues now — the validator set's entry and exit queues
- Blocks — the block page in the app
Last updated 22 Oct 2026, 08:06 UTC · verified against TraceFast v1.0.261 · Markdown