Skip to content
QuantascanAlpha
Browse API groups

Validators & Withdrawals API

Validator registry, performance and EIP-4895 withdrawals on the QRL 2.0 proof-of-stake chain.
GET/api/v1/qrl2/validators/QRL 2.0

List Validators

Paginated list of QRL2 validators with consensus-layer columns joined in (status, effective_balance, blocks_proposed_count, slashed).

Wave 6: ?sort_by= + ?sort_dir=?sort=field / ?sort=-field (D5). The validator registry is a stable Gold projection, so we keep page/page_size offset pagination (D1).

Query parameters

NameTypeRequiredDefaultDescription
pageintegermin 1no1
page_sizeintegermin 1 · max 100no20
statusstring | nullnoFilter to one validator-lifecycle state (e.g. active_ongoing, exited_slashed). Accepts any of the 9 spec states.
sortstring | nullnoindexSort spec: '<field>' (asc) or '-<field>' (desc). Allowed fields: index, balance, proposals, withdrawn, activity. Default `index`.

Response 200 · ValidatorsPaginated

itemsValidatorDetail[]
validator_indexintegerrequired
total_withdrawn_planckstring | null
total_withdrawn_qrl2string | null
withdrawal_countinteger | null
last_recipientstring | null
first_withdrawal_atstring | null
last_withdrawal_atstring | null
current_statusstring | null
current_effective_balanceinteger | null
blocks_proposed_countinteger | null
slashedboolean | null
first_proposal_atstring | null
last_proposal_atstring | null
totalinteger | null
limitinteger | null
offsetinteger | null
networkstring | null

Request examples

curl -s "https://quantascan.io/api/v1/qrl2/validators/" \
  -H "Authorization: Bearer qs_YOUR_API_KEY"
Example response
{
  "items": [
    {
      "validator_index": 0,
      "first_withdrawal_height": 277,
      "first_withdrawal_at": "2026-04-01T05:05:36",
      "last_withdrawal_height": 174884,
      "last_withdrawal_at": "2026-07-31T11:12:36",
      "total_withdrawn_planck": "686597821406000000000",
      "total_withdrawn_qrl2": "686",
      "withdrawal_count": 4770,
      "last_recipient": "Qc0e6dd0e844e0048dcb0bd3fdcc44a970beca38d",
      "current_status": "active_ongoing",
      "current_effective_balance": 40000000000000,
      "blocks_proposed_count": 40,
      "slashed": false,
      "first_proposal_at": null,
      "last_proposal_at": "2026-07-31T11:08:36"
    },
    {
      "validator_index": 1,
      "first_withdrawal_height": 278,
      "first_withdrawal_at": "2026-04-01T05:06:36",
      "last_withdrawal_height": 174863,
      "last_withdrawal_at": "2026-07-31T10:51:36",
      "total_withdrawn_planck": "685350132011000000000",
      "total_withdrawn_qrl2": "685",
      "withdrawal_count": 5203,
      "last_recipient": "Qc0e6dd0e844e0048dcb0bd3fdcc44a970beca38d",
      "current_status": "active_ongoing",
      "current_effective_balance": 40000000000000,
      "blocks_proposed_count": 41,
      "slashed": false,
      "first_proposal_at": null,
      "last_proposal_at": "2026-07-27T18:15:36"
    },
    "… (18 more)"
  ],
  "total": 512,
  "limit": 20,
  "offset": 0,
  "network": "testnet"
}
GET/api/v1/qrl2/validators/{validator_index}QRL 2.0

Get Validator

Single validator detail: rewards totals, first/last withdrawal, latest recipient address.

Path parameters

NameTypeRequiredDefaultDescription
validator_indexintegermin 0yes

Response 200 · ValidatorDetail

validator_indexintegerrequired
total_withdrawn_planckstring | null
total_withdrawn_qrl2string | null
withdrawal_countinteger | null
last_recipientstring | null
first_withdrawal_atstring | null
last_withdrawal_atstring | null
current_statusstring | null
current_effective_balanceinteger | null
blocks_proposed_countinteger | null
slashedboolean | null
first_proposal_atstring | null
last_proposal_atstring | null

Request examples

curl -s "https://quantascan.io/api/v1/qrl2/validators/0" \
  -H "Authorization: Bearer qs_YOUR_API_KEY"
Example response
{
  "validator_index": 0,
  "first_withdrawal_height": 277,
  "first_withdrawal_at": "2026-04-01T05:05:36",
  "last_withdrawal_height": 174884,
  "last_withdrawal_at": "2026-07-31T11:12:36",
  "total_withdrawn_planck": "686597821406000000000",
  "total_withdrawn_qrl2": "686",
  "withdrawal_count": 4770,
  "last_recipient": "Qc0e6dd0e844e0048dcb0bd3fdcc44a970beca38d"
}
GET/api/v1/qrl2/validators/{validator_index}/incomeQRL 2.0

Validator Income

Per-day income timeline for one validator: proposed blocks + withdrawal payouts (in planck). Powers a "validator income chart" on the validator detail page.

Wave 6: ?days=N?window=DURATION (D4). Empty items when beacon indexer hasn't run (graceful — no 500).

Path parameters

NameTypeRequiredDefaultDescription
validator_indexintegermin 0yes

Query parameters

NameTypeRequiredDefaultDescription
windowstringno90dLook-back window for validator income timeline. Default 90d.

Response 200 · GenericListResponse

itemsobject[]
totalinteger | null
limitinteger | null
offsetinteger | null
pageinteger | null
has_nextboolean | null
has_prevboolean | null
next_cursorstring | null

Request examples

curl -s "https://quantascan.io/api/v1/qrl2/validators/0/income" \
  -H "Authorization: Bearer qs_YOUR_API_KEY"
Example response
{
  "items": [
    {
      "day": "2026-07-31",
      "proposed_blocks": 3,
      "withdrawal_amount_planck": "3242258750000000000"
    },
    {
      "day": "2026-07-30",
      "proposed_blocks": 2,
      "withdrawal_amount_planck": "5994288430000000000"
    },
    "… (89 more)"
  ],
  "count": 91,
  "validator_index": 0,
  "network": "testnet",
  "window_days": 90
}
GET/api/v1/qrl2/validators/{validator_index}/performanceQRL 2.0

Validator Performance

Combined execution + consensus bundle for the validator-detail page.

Always returns the execution side (withdrawals from EIP-4895). The consensus field is populated only when migration 035 is applied AND ETL_INDEX_BEACON=1 has been running long enough to capture this validator (proposal or registry snapshot). Returns 404 only when both sides are empty (validator unknown to us).

Path parameters

NameTypeRequiredDefaultDescription
validator_indexintegermin 0yes

Response 200 · ValidatorFullPerformance

validator_indexintegerrequired
networkstringrequired
executionValidatorExecutionSide | null
validator_indexintegerrequired
total_withdrawn_planckstring | null
total_withdrawn_qrl2string | null
withdrawal_countinteger | null
last_recipientstring | null
first_withdrawal_atstring | null
last_withdrawal_atstring | null
consensusValidatorBeaconPerformance | null
validator_indexintegerrequired
blocks_proposed_countinteger
first_proposal_slotinteger | null
last_proposal_slotinteger | null
first_proposal_atstring | null
last_proposal_atstring | null
current_statusstring | null
slashedboolean
current_effective_balanceinteger | null
pubkeystring | null

Request examples

curl -s "https://quantascan.io/api/v1/qrl2/validators/0/performance" \
  -H "Authorization: Bearer qs_YOUR_API_KEY"
Example response
{
  "validator_index": 0,
  "network": "testnet",
  "execution": {
    "validator_index": 0,
    "first_withdrawal_height": 277,
    "first_withdrawal_at": "2026-04-01T05:05:36",
    "last_withdrawal_height": 174884,
    "last_withdrawal_at": "2026-07-31T11:12:36",
    "total_withdrawn_planck": "686597821406000000000",
    "total_withdrawn_qrl2": "686",
    "withdrawal_count": 4770,
    "last_recipient": "Qc0e6dd0e844e0048dcb0bd3fdcc44a970beca38d"
  },
  "consensus": {
    "validator_index": 0,
    "blocks_proposed_count": 40,
    "first_proposal_slot": null,
    "last_proposal_slot": 174880,
    "first_proposal_at": null,
    "last_proposal_at": "2026-07-31T11:08:36",
    "current_status": "active_ongoing",
    "slashed": false,
    "current_effective_balance": 40000000000000,
    "pubkey": "0xf29d9fe70df768f8769b042c7f395360fd4024c862f73c12f4c2acfac8883980e5deba9a42edc3ae1a33d891c6e36ec5df56d9479baf8151aa96e50cd2d16bd8e2b283ead777aa6b7b845bdb300fde00aa38f2f2f60497b32003a3f0b44c77bfe18e14…"
  }
}
GET/api/v1/qrl2/validators/{validator_index}/withdrawalsQRL 2.0

Per-validator withdrawal history (UI label: "Validator Rewards")

EIP-4895 withdrawal history for a single validator. Public-name mapping: surfaced as "Validator Rewards" in the UI (/validator/{idx} and /rewards).

Path parameters

NameTypeRequiredDefaultDescription
validator_indexintegermin 0yes

Query parameters

NameTypeRequiredDefaultDescription
pageintegermin 1no1
page_sizeintegermin 1 · max 200no50

Response 200 · ValidatorWithdrawalsList

itemsobject[]
limitinteger | null
offsetinteger | null
validator_indexinteger | null

Request examples

curl -s "https://quantascan.io/api/v1/qrl2/validators/0/withdrawals" \
  -H "Authorization: Bearer qs_YOUR_API_KEY"
Example response
{
  "items": [
    {
      "height": 174884,
      "block_hash": "0x5beee5fde6f4b9e67004bd01a70757f139e4b8313c3874c36d1781c9ae19aacc",
      "chain_index": 2798120,
      "address": "Qc0e6dd0e844e0048dcb0bd3fdcc44a970beca38d",
      "amount": "217205240000000000",
      "timestamp": "2026-07-31T11:12:36"
    },
    {
      "height": 174863,
      "block_hash": "0x4949bc40c51620771fce20b039c3eb628738d106826673389291551801986e88",
      "chain_index": 2797790,
      "address": "Qc0e6dd0e844e0048dcb0bd3fdcc44a970beca38d",
      "amount": "450681152000000000",
      "timestamp": "2026-07-31T10:51:36"
    },
    "… (48 more)"
  ],
  "limit": 50,
  "offset": 0,
  "validator_index": 0
}
GET/api/v1/qrl2/validators/stake-concentrationQRL 2.0

Stake Concentration

Stake-distribution KPI bundle for the /validators hub.

Returns active validator count, total effective balance (gwei + QRL2), and the top-10 concentration ratio (0..1). Empty/null-filled on a pre-mig-035 deploy (gracefully degraded).

Response 200 · StakeConcentrationResponse

networkstringrequired
active_validator_countinteger
total_effective_balance_gweistring
total_effective_balance_qrl2string
top10_concentration_pctnumber | null
operator_countinteger
top10_operator_share_pctnumber | null
largest_operator_validatorsinteger

Request examples

curl -s "https://quantascan.io/api/v1/qrl2/validators/stake-concentration" \
  -H "Authorization: Bearer qs_YOUR_API_KEY"
Example response
{
  "network": "testnet",
  "active_validator_count": 0,
  "total_effective_balance_gwei": "0",
  "total_effective_balance_qrl2": "0",
  "top10_concentration_pct": null,
  "operator_count": 0,
  "top10_operator_share_pct": null,
  "largest_operator_validators": 0
}
GET/api/v1/qrl2/validators/status-breakdownQRL 2.0

Status Breakdown

Validator-count breakdown by lifecycle bucket for the /validators hub strip: entering (activation queue), active, exiting (leaving the active set) and exited. More meaningful than a static stake total — it shows churn. Zero-filled gracefully on a pre-mig-035 deploy or before the beacon indexer snapshots the registry.

Response 200 · ValidatorStatusBreakdown

networkstring | null
totalinteger
enteringinteger
activeinteger
exitinginteger
exitedinteger
slashedinteger

Request examples

curl -s "https://quantascan.io/api/v1/qrl2/validators/status-breakdown" \
  -H "Authorization: Bearer qs_YOUR_API_KEY"
Example response
{
  "network": "testnet",
  "total": 512,
  "entering": 0,
  "active": 512,
  "exiting": 0,
  "exited": 0,
  "slashed": 0
}
GET/api/v1/qrl2/validators/topQRL 2.0

Top Validators

Top validators ranked by lifetime withdrawn rewards.

Query parameters

NameTypeRequiredDefaultDescription
limitintegermin 1 · max 1000no100

Response 200 · TopValidatorsList

itemsValidatorDetail[]
validator_indexintegerrequired
total_withdrawn_planckstring | null
total_withdrawn_qrl2string | null
withdrawal_countinteger | null
last_recipientstring | null
first_withdrawal_atstring | null
last_withdrawal_atstring | null
current_statusstring | null
current_effective_balanceinteger | null
blocks_proposed_countinteger | null
slashedboolean | null
first_proposal_atstring | null
last_proposal_atstring | null
limitinteger | null
networkstring | null

Request examples

curl -s "https://quantascan.io/api/v1/qrl2/validators/top" \
  -H "Authorization: Bearer qs_YOUR_API_KEY"
Example response
{
  "items": [
    {
      "validator_index": 160,
      "total_withdrawn_planck": "716178647500000000000",
      "total_withdrawn_qrl2": "716",
      "withdrawal_count": 6676,
      "last_recipient": "Qc0e6dd0e844e0048dcb0bd3fdcc44a970beca38d",
      "last_withdrawal_at": "2026-07-31T11:01:36"
    },
    {
      "validator_index": 290,
      "total_withdrawn_planck": "715588508019000000000",
      "total_withdrawn_qrl2": "715",
      "withdrawal_count": 6243,
      "last_recipient": "Qc0e6dd0e844e0048dcb0bd3fdcc44a970beca38d",
      "last_withdrawal_at": "2026-07-31T10:38:36"
    },
    "… (98 more)"
  ],
  "limit": 100,
  "network": "testnet"
}
GET/api/v1/qrl2/withdrawals/QRL 2.0

List validator withdrawals (UI label: "Validator Rewards")

Paginated EIP-4895 withdrawal feed, newest first. Public-name mapping: surfaced as "Validator Rewards" in the UI (/rewards). The API uses the spec-aligned withdrawals term.

Query parameters

NameTypeRequiredDefaultDescription
pageintegermin 1no1
page_sizeintegermin 1 · max 100no25
addressstring | nullnoFilter by recipient address

Response 200 · WithdrawalsPaginated

itemsWithdrawalItem[]
chainstringrequired
networkstringrequired
heightintegerrequired
block_hashstringrequired
withdrawal_indexintegerrequired
chain_indexintegerrequired
validator_indexintegerrequired
addressstringrequired
amountstringrequired
timestampstringrequired
totalinteger | null
pageinteger | null
page_sizeinteger | null
total_pagesinteger | null
limitinteger | null
offsetinteger | null
has_nextboolean | null
has_prevboolean | null

Request examples

curl -s "https://quantascan.io/api/v1/qrl2/withdrawals/" \
  -H "Authorization: Bearer qs_YOUR_API_KEY"
Example response
{
  "items": [
    {
      "chain": "qrl2",
      "network": "testnet",
      "height": 174935,
      "block_hash": "0xf697fd11528ce281af00e5f838f3ebdca0f414ca648f347f3cd5b81a4f523685",
      "withdrawal_index": 15,
      "chain_index": 2798943,
      "validator_index": 75,
      "address": "Qc0e6dd0e844e0048dcb0bd3fdcc44a970beca38d",
      "amount": "4471872000000000",
      "timestamp": "2026-07-31T12:03:36"
    },
    {
      "chain": "qrl2",
      "network": "testnet",
      "height": 174935,
      "block_hash": "0xf697fd11528ce281af00e5f838f3ebdca0f414ca648f347f3cd5b81a4f523685",
      "withdrawal_index": 14,
      "chain_index": 2798942,
      "validator_index": 72,
      "address": "Qc0e6dd0e844e0048dcb0bd3fdcc44a970beca38d",
      "amount": "4471872000000000",
      "timestamp": "2026-07-31T12:03:36"
    },
    "… (23 more)"
  ],
  "total": 2798896,
  "page": 1,
  "page_size": 25,
  "total_pages": 111956,
  "limit": 25,
  "offset": 0,
  "has_next": true,
  "has_prev": false
}
GET/api/v1/qrl2/withdrawals/dailyQRL 2.0

Per-day withdrawal rollup (UI label: "Daily rewards")

Per-day rollup: count, total amount (planck), unique recipients.

Wave 6: ?days=N?window=30d (D4).

Query parameters

NameTypeRequiredDefaultDescription
windowstringno30dLook-back window for daily withdrawals. Default 30d.

Response 200 · DailyWithdrawalsList

itemsDailyWithdrawalItem[]
daystringrequired
withdrawal_countintegerrequired
total_amountstringrequired
unique_recipientsintegerrequired
countinteger | null

Request examples

curl -s "https://quantascan.io/api/v1/qrl2/withdrawals/daily" \
  -H "Authorization: Bearer qs_YOUR_API_KEY"
Example response
{
  "items": [
    {
      "day": "2026-07-01",
      "withdrawal_count": 23040,
      "total_amount": "2888744501135000000000",
      "unique_recipients": 1
    },
    {
      "day": "2026-07-02",
      "withdrawal_count": 23040,
      "total_amount": "2917808166447000000000",
      "unique_recipients": 1
    },
    "… (29 more)"
  ],
  "count": 31
}
GET/api/v1/qrl2/withdrawals/summaryQRL 2.0

All-time withdrawal totals (UI label: "Rewards summary")

All-time totals (count, amount, recipients, first/last day).

Response 200 · WithdrawalSummaryResponse

total_withdrawalsinteger
total_amountstring
unique_recipientsinteger | null
approx_unique_recipientsinteger | null
first_daystring | null
last_daystring | null

Request examples

curl -s "https://quantascan.io/api/v1/qrl2/withdrawals/summary" \
  -H "Authorization: Bearer qs_YOUR_API_KEY"
Example response
{
  "total_withdrawals": 2798944,
  "total_amount": "357002332914421000000000",
  "unique_recipients": 1,
  "approx_unique_recipients": 1,
  "first_day": "2026-04-01",
  "last_day": "2026-07-31"
}
GET/api/v1/qrl2/withdrawals/top-recipientsQRL 2.0

Top operators by rewards received (UI label: "Top operators")

Recipient (withdrawal) addresses ranked by total EIP-4895 rewards received. One address can serve many validators run by the same operator, so this ranks operators rather than individual validators.

Query parameters

NameTypeRequiredDefaultDescription
limitintegermin 1 · max 100no10

Response 200 · TopWithdrawalRecipientsList

itemsTopWithdrawalRecipient[]
addressstringrequired
total_amountstringrequired
withdrawal_countintegerrequired
validator_countintegerrequired
last_withdrawal_atstring | null
countinteger | null
networkstring | null

Request examples

curl -s "https://quantascan.io/api/v1/qrl2/withdrawals/top-recipients" \
  -H "Authorization: Bearer qs_YOUR_API_KEY"
Example response
{
  "items": [
    {
      "address": "Qc0e6dd0e844e0048dcb0bd3fdcc44a970beca38d",
      "total_amount": "357001455309566000000000",
      "withdrawal_count": 2798896,
      "validator_count": 512,
      "last_withdrawal_at": "2026-07-31T12:03:36"
    }
  ],
  "count": 1,
  "network": "testnet"
}

All endpoints verified against a live indexer. Need the raw spec? See openapi.json or the API overview.