Skip to content
QuantascanAlpha
Browse API groups

Beacon Chain API

Consensus-layer data: beacon blocks, slots, epochs and slashings (QRL 2.0).
GET/api/v1/qrl2/beacon/attestation/dailyQRL 2.0

Daily attestation participation rate (UI: validator-health chart)

Network-wide daily attestation participation rate (included/expected across all validators). A liveness/health metric — distinct from the validator registry/count. Powers /charts/attestation-rate. Empty list when the beacon attestation indexer hasn't run on this deploy.

Query parameters

NameTypeRequiredDefaultDescription
windowstringno90dLook-back window for the attestation participation rate. Default 90d.

Response 200 · BeaconAttestationDaily

itemsBeaconAttestationDailyBucket[]required
daystringrequiredISO date (YYYY-MM-DD)
includedinteger
expectedinteger
participation_ratenumber | nullincluded/expected as a percentage (0-100)
daysintegerrequired
networkstringrequired

Request examples

curl -s "https://quantascan.io/api/v1/qrl2/beacon/attestation/daily" \
  -H "Authorization: Bearer qs_YOUR_API_KEY"
Example response
{
  "items": [
    {
      "day": "2026-06-21",
      "included": 2256,
      "expected": 3584,
      "participation_rate": 62.95
    },
    {
      "day": "2026-06-24",
      "included": 1654,
      "expected": 2048,
      "participation_rate": 80.76
    },
    "… (15 more)"
  ],
  "days": 90,
  "network": "testnet"
}
GET/api/v1/qrl2/beacon/blocksQRL 2.0

List beacon blocks (UI label: "Beacon Chain · Blocks")

Latest beacon (consensus-layer) blocks, newest first. Public-name mapping: surfaced under /beacon/blocks in the UI. API uses the spec-aligned beacon/blocks path.

Query parameters

NameTypeRequiredDefaultDescription
limitintegermin 1 · max 200no20
cursorstring | nullnoOpaque pagination token from a previous response's `next_cursor`. Omit to start at the chain head (newest).

Response 200 · BeaconBlocksList

itemsBeaconBlock[]required
slotintegerrequired
epochintegerrequired
block_rootstringrequired
parent_rootstringrequired
proposer_indexintegerrequired
execution_block_numberinteger | null
execution_block_hashstring | null
attestations_countinteger
deposits_countinteger
voluntary_exits_countinteger
proposer_slashings_countinteger
attester_slashings_countinteger
sync_committee_participantsinteger | null
timestampstringrequired
proposer_withdrawal_addressstring | nullReward recipient of this block's proposer — the execution (withdrawal) address where the validator's staking rewards are paid (EIP-4895 withdrawals), decoded from its withdrawal_credentials (last 20 bytes of an execution-type credential). Null when the validator uses a non-execution credential or its registry snapshot is unavailable. Many validators can share one recipient.
limitintegerrequired
networkstringrequired
next_cursorstring | nullOpaque pagination token — pass back unchanged as ?cursor=... to fetch the next (older) page. Null when there are no older blocks. The token encodes the slot internally; callers MUST NOT decode or construct it.

Request examples

curl -s "https://quantascan.io/api/v1/qrl2/beacon/blocks" \
  -H "Authorization: Bearer qs_YOUR_API_KEY"
Example response
{
  "items": [
    {
      "slot": 174934,
      "epoch": 1366,
      "block_root": "0x3b5341b5a54ee625a74fde33c0ca2bbcadee9ca9a32f7130c1e54c23f44960c3",
      "parent_root": "0x849d581b191ab3d587c5fe2ecb23227f1753f795c7b319f2497b2cbb3abc445e",
      "proposer_index": 229,
      "execution_block_number": null,
      "execution_block_hash": null,
      "attestations_count": 1,
      "deposits_count": 0,
      "voluntary_exits_count": 0,
      "proposer_slashings_count": 0,
      "attester_slashings_count": 0,
      "sync_committee_participants": null,
      "timestamp": "2026-07-31T12:02:36",
      "proposer_withdrawal_address": "Qc0e6dd0e844e0048dcb0bd3fdcc44a970beca38d"
    },
    {
      "slot": 174933,
      "epoch": 1366,
      "block_root": "0x849d581b191ab3d587c5fe2ecb23227f1753f795c7b319f2497b2cbb3abc445e",
      "parent_root": "0x42169428c366f03953c89594ddbd63a245c3847a9a9a5c432d6c65a46f4b86b9",
      "proposer_index": 192,
      "execution_block_number": null,
      "execution_block_hash": null,
      "attestations_count": 1,
      "deposits_count": 0,
      "voluntary_exits_count": 0,
      "proposer_slashings_count": 0,
      "attester_slashings_count": 0,
      "sync_committee_participants": null,
      "timestamp": "2026-07-31T12:01:36",
      "proposer_withdrawal_address": "Qc0e6dd0e844e0048dcb0bd3fdcc44a970beca38d"
    },
    "… (18 more)"
  ],
  "limit": 20,
  "network": "testnet",
  "next_cursor": "eyJiZWZvcmVfc2xvdCI6MTc0OTE1fQ"
}
GET/api/v1/qrl2/beacon/blocks/{slot}QRL 2.0

Single beacon block by slot (UI: `/beacon/blocks/{slot}`)

Single beacon block by slot. 404 when the slot is empty (legitimately — beacon-chain slots can be skipped) OR when the indexer hasn't reached this slot yet.

Path parameters

NameTypeRequiredDefaultDescription
slotintegermin 0yes

Response 200 · BeaconBlock

slotintegerrequired
epochintegerrequired
block_rootstringrequired
parent_rootstringrequired
proposer_indexintegerrequired
execution_block_numberinteger | null
execution_block_hashstring | null
attestations_countinteger
deposits_countinteger
voluntary_exits_countinteger
proposer_slashings_countinteger
attester_slashings_countinteger
sync_committee_participantsinteger | null
timestampstringrequired
proposer_withdrawal_addressstring | nullReward recipient of this block's proposer — the execution (withdrawal) address where the validator's staking rewards are paid (EIP-4895 withdrawals), decoded from its withdrawal_credentials (last 20 bytes of an execution-type credential). Null when the validator uses a non-execution credential or its registry snapshot is unavailable. Many validators can share one recipient.

Request examples

curl -s "https://quantascan.io/api/v1/qrl2/beacon/blocks/12543" \
  -H "Authorization: Bearer qs_YOUR_API_KEY"
Example response
{
  "slot": 174934,
  "epoch": 1366,
  "block_root": "0x3b5341b5a54ee625a74fde33c0ca2bbcadee9ca9a32f7130c1e54c23f44960c3",
  "parent_root": "0x849d581b191ab3d587c5fe2ecb23227f1753f795c7b319f2497b2cbb3abc445e",
  "proposer_index": 229,
  "execution_block_number": null,
  "execution_block_hash": null,
  "attestations_count": 1,
  "deposits_count": 0,
  "voluntary_exits_count": 0,
  "proposer_slashings_count": 0,
  "attester_slashings_count": 0,
  "sync_committee_participants": null,
  "timestamp": "2026-07-31T12:02:36"
}
GET/api/v1/qrl2/beacon/epochsQRL 2.0

List consensus epochs (UI: "Epochs" page)

Recent QRL 2.0 beacon-chain epochs, newest-first.

Each epoch is SLOTS_PER_EPOCH × SECONDS_PER_SLOT long — for QRL2 that's 128 × 60s = 2h 8min (NOT Ethereum's 6m 24s). Rows are aggregated from etl_silver.qrl2_beacon_blocks at query-time; when that table is empty we still emit synthetic epoch entries computed from genesis_time so the UI has something to render.

Wave 5: ?before_epoch=N?cursor=... (opaque token).

Query parameters

NameTypeRequiredDefaultDescription
limitintegermin 1 · max 200no25
cursorstring | nullnoOpaque pagination token from a previous response's `next_cursor`. Omit to start at the current epoch.

Response 200 · BeaconEpochsList

itemsBeaconEpoch[]required
epochintegerrequired
first_slotintegerrequired
last_slotintegerrequired
start_timestringrequired
end_timestringrequired
slots_totalinteger
blocks_proposedinteger
unique_proposersinteger
attestations_countinteger
deposits_countinteger
voluntary_exits_countinteger
proposer_slashings_countinteger
attester_slashings_countinteger
avg_sync_participantsnumber | null
sync_participation_pctnumber | nullavg_sync_participants / SyncCommitteeSize(128) × 100.
statusstringrequiredWall-clock lifecycle status.
finality_statestring | nullCasper-FFG state: 'finalized' | 'justified' | null.
indexedboolean
limitintegerrequired
networkstringrequired
current_epochinteger | null
latest_data_epochinteger | nullHighest epoch with indexed data (None when none indexed).
indexer_lag_epochsinteger | nullcurrent_epoch − latest_data_epoch; drives a catch-up banner.
slots_per_epochinteger
seconds_per_slotinteger
sync_committee_sizeinteger
finalized_epochinteger | null
current_justified_epochinteger | null
finality_lag_epochsinteger | null
finality_snapshot_age_secondsinteger | null
next_cursorstring | nullOpaque token for the next (older) page; null at the end.

Request examples

curl -s "https://quantascan.io/api/v1/qrl2/beacon/epochs" \
  -H "Authorization: Bearer qs_YOUR_API_KEY"
Example response
{
  "items": [
    {
      "epoch": 1368,
      "first_slot": 175104,
      "last_slot": 175231,
      "start_time": "2026-07-31T14:52:36",
      "end_time": "2026-07-31T17:00:35",
      "slots_total": 128,
      "status": "current",
      "finality_state": null,
      "blocks_proposed": 0,
      "unique_proposers": 0,
      "attestations_count": 0,
      "deposits_count": 0,
      "voluntary_exits_count": 0,
      "proposer_slashings_count": 0,
      "attester_slashings_count": 0,
      "avg_sync_participants": null,
      "sync_participation_pct": null,
      "indexed": false
    },
    {
      "epoch": 1367,
      "first_slot": 174976,
      "last_slot": 175103,
      "start_time": "2026-07-31T12:44:36",
      "end_time": "2026-07-31T14:52:35",
      "slots_total": 128,
      "status": "complete",
      "finality_state": null,
      "blocks_proposed": 0,
      "unique_proposers": 0,
      "attestations_count": 0,
      "deposits_count": 0,
      "voluntary_exits_count": 0,
      "proposer_slashings_count": 0,
      "attester_slashings_count": 0,
      "avg_sync_participants": null,
      "sync_participation_pct": null,
      "indexed": false
    },
    "… (23 more)"
  ],
  "limit": 25,
  "network": "testnet",
  "current_epoch": 1368,
  "latest_data_epoch": 1366,
  "indexer_lag_epochs": 2,
  "slots_per_epoch": 128,
  "seconds_per_slot": 60,
  "sync_committee_size": 128,
  "finalized_epoch": 1364,
  "current_justified_epoch": 1365,
  "finality_lag_epochs": 4,
  "finality_snapshot_age_seconds": 17450,
  "next_cursor": "eyJiZWZvcmVfZXBvY2giOjEzNDR9"
}
GET/api/v1/qrl2/beacon/epochs/{epoch}QRL 2.0

Single epoch detail (UI: `/epoch/{epoch}`)

Single epoch detail: per-slot grid (128 slots) + aggregated counts. Returns 404 for negative epoch numbers, otherwise always returns a payload (with empty blocks array when the indexer hasn't caught up).

Path parameters

NameTypeRequiredDefaultDescription
epochintegermin 0yes

Response 200 · BeaconEpochDetail

epochintegerrequired
first_slotintegerrequired
last_slotintegerrequired
start_timestringrequired
end_timestringrequired
slots_totalinteger
blocks_indexedinteger
statusstringrequired
finality_statestring | null
blocksBeaconBlock[]required
slotintegerrequired
epochintegerrequired
block_rootstringrequired
parent_rootstringrequired
proposer_indexintegerrequired
execution_block_numberinteger | null
execution_block_hashstring | null
attestations_countinteger
deposits_countinteger
voluntary_exits_countinteger
proposer_slashings_countinteger
attester_slashings_countinteger
sync_committee_participantsinteger | null
timestampstringrequired
proposer_withdrawal_addressstring | nullReward recipient of this block's proposer — the execution (withdrawal) address where the validator's staking rewards are paid (EIP-4895 withdrawals), decoded from its withdrawal_credentials (last 20 bytes of an execution-type credential). Null when the validator uses a non-execution credential or its registry snapshot is unavailable. Many validators can share one recipient.
networkstringrequired

Request examples

curl -s "https://quantascan.io/api/v1/qrl2/beacon/epochs/100" \
  -H "Authorization: Bearer qs_YOUR_API_KEY"
Example response
{
  "epoch": 1366,
  "first_slot": 174848,
  "last_slot": 174975,
  "start_time": "2026-07-31T10:36:36",
  "end_time": "2026-07-31T12:44:35",
  "slots_total": 128,
  "blocks_indexed": 87,
  "status": "complete",
  "finality_state": null,
  "blocks": [
    {
      "slot": 174848,
      "proposer_index": 249,
      "block_root": "0x83114cb3949ebfc64e6e49cc0c45c08de3ae704f4e56dec7518bf3264c9fe4b8",
      "parent_root": "0xeab6fbfefb6c20f475a2934c5cdb2c14f92dc3b1676c02200b6a316c42927215",
      "execution_block_number": null,
      "attestations_count": 1,
      "deposits_count": 0,
      "proposer_slashings_count": 0,
      "attester_slashings_count": 0,
      "sync_committee_participants": null,
      "timestamp": "2026-07-31T10:36:36"
    },
    {
      "slot": 174849,
      "proposer_index": 267,
      "block_root": "0xd5cdf6200c7251b6bce71f8863905e32895c03085f71f69c3f1f7e15bd79ce0f",
      "parent_root": "0x83114cb3949ebfc64e6e49cc0c45c08de3ae704f4e56dec7518bf3264c9fe4b8",
      "execution_block_number": null,
      "attestations_count": 1,
      "deposits_count": 0,
      "proposer_slashings_count": 0,
      "attester_slashings_count": 0,
      "sync_committee_participants": null,
      "timestamp": "2026-07-31T10:37:36"
    },
    "… (85 more)"
  ],
  "network": "testnet"
}
GET/api/v1/qrl2/beacon/slashingsQRL 2.0

List validator slashings (UI label: "Validator Penalties")

Slashings newest-first, with optional type filter. Public-name mapping: the Quantascan UI labels these "Validator Penalties" on /penalties. The API uses the spec-aligned slashings term (matches the Beacon API /eth/v1/beacon/pool/{proposer,attester}_slashings).

Query parameters

NameTypeRequiredDefaultDescription
limitintegermin 1 · max 200no50
slashing_typestring | nullnoOptional filter: 'proposer' or 'attester'

Response 200 · BeaconSlashingsList

itemsBeaconSlashing[]required
slotintegerrequired
epochintegerrequired
slashing_typestringrequired'proposer' | 'attester'
slashed_validator_indexintegerrequired
reporter_proposer_indexintegerrequired
timestampstringrequired
limitintegerrequired
networkstringrequired
totalintegerTotal slashings matching the filter (ignores `limit`). The table shows the latest `limit`; `total` is the all-time count so the UI can say 'N of M'.

Request examples

curl -s "https://quantascan.io/api/v1/qrl2/beacon/slashings" \
  -H "Authorization: Bearer qs_YOUR_API_KEY"
Example response
{
  "items": [],
  "limit": 50,
  "network": "testnet",
  "total": 0
}
GET/api/v1/qrl2/beacon/slashings/dailyQRL 2.0

Slashings histogram per day (UI: penalties bar chart)

Daily slashings histogram split proposer vs attester. Powers the "Slashings over time" bar chart on /penalties. Empty buckets included so the UI gets a continuous timeline.

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

Query parameters

NameTypeRequiredDefaultDescription
windowstringno30dLook-back window for the slashings histogram. Default 30d.

Response 200 · BeaconSlashingsDaily

itemsBeaconSlashingsDailyBucket[]required
daystringrequiredISO date (YYYY-MM-DD)
proposer_countinteger
attester_countinteger
daysintegerrequired
networkstringrequired
total_proposerinteger
total_attesterinteger

Request examples

curl -s "https://quantascan.io/api/v1/qrl2/beacon/slashings/daily" \
  -H "Authorization: Bearer qs_YOUR_API_KEY"
Example response
{
  "items": [],
  "days": 30,
  "network": "testnet",
  "total_proposer": 0,
  "total_attester": 0
}
GET/api/v1/qrl2/beacon/summaryQRL 2.0

Consensus-layer summary (UI label: "Beacon Chain · Network status")

Headline metrics for the consensus layer. Public-name mapping: the Quantascan UI surfaces this widget as "Network status" on the /beacon hub. API uses the spec-aligned beacon namespace.

Response 200 · BeaconSummary

networkstringrequired
head_slotinteger | null
blocks_indexedinteger
validators_knowninteger
validators_activeinteger
validators_slashedinteger
slashings_totalinteger
total_active_effective_balance_gweiinteger | null
total_active_effective_balance_qrlnumber | null
indexer_lag_slotsinteger | null
finalized_epochinteger | null
current_justified_epochinteger | null
previous_justified_epochinteger | null
finality_snapshot_atstring | null
finality_lag_epochsinteger | null
finality_snapshot_age_secondsinteger | null

Request examples

curl -s "https://quantascan.io/api/v1/qrl2/beacon/summary" \
  -H "Authorization: Bearer qs_YOUR_API_KEY"
Example response
{
  "network": "testnet",
  "head_slot": 174934,
  "blocks_indexed": 11717,
  "validators_known": 512,
  "validators_active": 512,
  "validators_slashed": 0,
  "slashings_total": 0,
  "total_active_effective_balance_gwei": 20480000000000000,
  "total_active_effective_balance_qrl": 20480000,
  "finalized_epoch": 1364,
  "current_justified_epoch": 1365,
  "previous_justified_epoch": 1364,
  "finality_snapshot_at": "2026-07-31T10:37:32.680000",
  "finality_lag_epochs": 2,
  "finality_snapshot_age_seconds": 17450,
  "indexer_lag_slots": 0
}
GET/api/v1/qrl2/beacon/validators/{validator_index}QRL 2.0

Get Beacon Validator

Latest registry snapshot for a validator: status, pubkey, effective_balance, activation/exit epochs, slashed flag. Distinct from /validators/{idx}/performance which is the combined execution+consensus rollup; this is the raw registry row.

Path parameters

NameTypeRequiredDefaultDescription
validator_indexintegermin 0yes

Response 200 · BeaconValidatorRegistry

validator_indexintegerrequired
pubkeystring | null
statusstring | null
effective_balanceinteger
balanceinteger | null
slashedboolean
activation_eligibility_epochinteger | null
activation_epochinteger | null
exit_epochinteger | null
withdrawable_epochinteger | null
withdrawal_credentialsstring | null
snapshot_atstring | null

Request examples

curl -s "https://quantascan.io/api/v1/qrl2/beacon/validators/0" \
  -H "Authorization: Bearer qs_YOUR_API_KEY"
Example response
{
  "validator_index": 0,
  "pubkey": "0xf29d9fe70df768f8769b042c7f395360fd4024c862f73c12f4c2acfac8883980e5deba9a42edc3ae1a33d891c6e36ec5df56d9479baf8151aa96e50cd2d16bd8e2b283ead777aa6b7b845bdb300fde00aa38f2f2f60497b32003a3f0b44c77bfe18e14…",
  "status": "active_ongoing",
  "effective_balance": 40000000000000,
  "balance": 40000450681152,
  "slashed": false,
  "activation_eligibility_epoch": 0,
  "activation_epoch": 0,
  "exit_epoch": 18446744073709552000,
  "withdrawable_epoch": 18446744073709552000,
  "withdrawal_credentials": "0x000000000000000000000000c0e6dd0e844e0048dcb0bd3fdcc44a970beca38d",
  "snapshot_at": "2026-07-31T10:37:32.520000"
}

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