Skip to content
QuantascanAlpha
Browse API groups

Analytics API

Network-wide time-series and aggregates: activity, supply, fees, gas, whales and cross-chain timelines.

Network activity

GET/api/v1/analytics/block-size

Block Size

Per-day average / max / sum block size in bytes.

Backs /charts/daily-block-size on the frontend. Reads quantascan.block_size_daily (mig 062).

Query parameters

NameTypeRequiredDefaultDescription
chainstringnoqrl2Which chain to query: qrl (legacy PoW) or qrl2 (PoS EVM). Defaults to qrl2.
windowstringno30dLook-back window with unit suffix (m=min, h=hour, d=day, w=week). Default 30d. Examples: 24h, 7d, 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/analytics/block-size" \
  -H "Authorization: Bearer qs_YOUR_API_KEY"
Example response
{
  "items": [
    {
      "day": "2026-07-31",
      "block_count": 724,
      "avg_block_size": 1049,
      "max_block_size": 1073,
      "total_block_size": "760198"
    },
    {
      "day": "2026-07-30",
      "block_count": 1440,
      "avg_block_size": 1056,
      "max_block_size": 10094,
      "total_block_size": "1521888"
    },
    "… (29 more)"
  ],
  "count": 31,
  "chain": "qrl2",
  "network": "testnet",
  "window_days": 30
}
GET/api/v1/analytics/block-times

Block Times

Per-day mean block-interval (seconds) + block count.

Useful for catching block-time degradation on PoW (qrl ~60s target) or slot-skipping on PoS (qrl2 ~12s target).

Query parameters

NameTypeRequiredDefaultDescription
chainstringnoqrl2Which chain to query: qrl (legacy PoW) or qrl2 (PoS EVM). Defaults to qrl2.
windowstringno30dLook-back window with unit suffix (m=min, h=hour, d=day, w=week). Default 30d. Examples: 24h, 7d, 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/analytics/block-times" \
  -H "Authorization: Bearer qs_YOUR_API_KEY"
Example response
{
  "items": [],
  "count": 0,
  "chain": "qrl",
  "network": "testnet",
  "window_days": 30
}
GET/api/v1/analytics/network/active-addresses-daily

Active Addresses Daily

Daily/weekly/monthly active addresses (DAU/WAU/MAU) per day.

Exact distinct active addresses from the mig-078 user-tx Gold states (same definition as the /timeline/active-addresses metric: no coinbase, no EIP-4895 withdrawals). DAU = that exact day; WAU/MAU = trailing 7/30 calendar days (exact uniques, not a sum-of-DAU approximation). Backs the weekly-monthly chart, /growth lead and /network sparse-gate. Day-count snaps to UI tiers (_snap_days) against cache-key enumeration.

Query parameters

NameTypeRequiredDefaultDescription
chainstringnoqrl2Which chain to query: qrl (legacy PoW) or qrl2 (PoS EVM). Defaults to qrl2.
windowstringno90dLook-back window with unit suffix (m=min, h=hour, d=day, w=week). Default 90d. Examples: 24h, 7d, 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/analytics/network/active-addresses-daily" \
  -H "Authorization: Bearer qs_YOUR_API_KEY"
Example response
{
  "items": [
    {
      "day": "2026-05-02",
      "dau": 4,
      "wau": 9,
      "mau": 82
    },
    {
      "day": "2026-05-03",
      "dau": 3,
      "wau": 9,
      "mau": 84
    },
    "… (89 more)"
  ],
  "count": 91,
  "days": 90,
  "chain": "qrl2",
  "network": "testnet"
}
GET/api/v1/analytics/network/health

Network Health

Composite per-chain health signal. Returns:

  • latest_block_time
  • tip_lag_seconds (now - latest_block_time)
  • dlq_open_count (failed_blocks_open)
  • silver_blocks_24h (rows written in the last 24h via ingested_at)
  • status: 'ok' | 'degraded' | 'stalled' | 'unknown'

Frontend renders this as the dashboard traffic-light. Real ops alerting happens via Prometheus (alert_rules.yml), not this endpoint — this is for UX, not paging.

Response 200 · AnalyticsHealthCheck

chainsobject
checked_atstring | null

Request examples

curl -s "https://quantascan.io/api/v1/analytics/network/health" \
  -H "Authorization: Bearer qs_YOUR_API_KEY"
Example response
{
  "chains": {
    "qrl2:testnet": {
      "chain": "qrl2",
      "network": "testnet",
      "latest_block_time": "2026-07-31T12:03:36",
      "tip_lag_seconds": 12288,
      "silver_blocks_24h": 5292,
      "status": "degraded"
    },
    "qrl:mainnet": {
      "chain": "qrl",
      "network": "mainnet",
      "latest_block_time": "2022-09-11T03:28:50",
      "tip_lag_seconds": 122644774,
      "dlq_open_count": 40,
      "status": "stalled"
    }
  },
  "checked_at": "2026-07-31T15:28:24.511401Z"
}
GET/api/v1/analytics/network/new-vs-returning-daily

New Vs Returning Daily

Per-day new-address vs returning-address breakdown.

Adoption-health signal — when returning > new sustained, the network is seeing real organic stickiness rather than churn.

Query parameters

NameTypeRequiredDefaultDescription
chainstringnoqrl2Which chain to query: qrl (legacy PoW) or qrl2 (PoS EVM). Defaults to qrl2.
windowstringno30dLook-back window with unit suffix (m=min, h=hour, d=day, w=week). Default 30d. Examples: 24h, 7d, 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/analytics/network/new-vs-returning-daily" \
  -H "Authorization: Bearer qs_YOUR_API_KEY"
Example response
{
  "items": [
    {
      "day": "2026-07-01",
      "new_addresses": 2,
      "returning_addresses": 1
    },
    {
      "day": "2026-07-02",
      "new_addresses": 1,
      "returning_addresses": 8
    },
    "… (24 more)"
  ],
  "count": 26,
  "days": 30,
  "chain": "qrl2",
  "network": "testnet"
}
GET/api/v1/analytics/network/page-summary

Network Page Summary

Bundle for the /network hero strip: KPIs + sparse-data flag.

Reads the user-DAU rollup (etl_gold.active_addresses_daily, mig 078) for DAU/MAU and quantascan.daily_activity for the 30d tx count + delta. Single round-trip from the frontend on initial page load.

Query parameters

NameTypeRequiredDefaultDescription
chainstringnoqrl2Which chain to query: qrl (legacy PoW) or qrl2 (PoS EVM). Defaults to qrl2.

Response 200 · GenericObject

Variable shape — see the example response below.

Request examples

curl -s "https://quantascan.io/api/v1/analytics/network/page-summary" \
  -H "Authorization: Bearer qs_YOUR_API_KEY"
Example response
{
  "chain": "qrl2",
  "network": "testnet",
  "dau_yesterday": 1,
  "mau_proxy": 199,
  "tx_count_30d": 988,
  "tx_count_prior_30d": 256,
  "tx_count_delta_pct": 285.9,
  "is_sparse": false
}
GET/api/v1/analytics/network/reorgs

Network Reorgs

Reorg event history (P3 #20, migration 037).

Each row = one detected chain-reorg, with the old hash (prev_hash) that got swapped out and the new hash (new_hash) that replaced it at that height. Returns empty on pre-mig-037 deploys or chains that haven't reorged.

Query parameters

NameTypeRequiredDefaultDescription
pageintegermin 1no1
page_sizeintegermin 1 · max 200no50
chainstringnoqrl2Which chain to query: qrl (legacy PoW) or qrl2 (PoS EVM). Defaults to qrl2.

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/analytics/network/reorgs" \
  -H "Authorization: Bearer qs_YOUR_API_KEY"
Example response
{
  "items": [],
  "count": 0,
  "total": 0,
  "limit": 50,
  "offset": 0
}
GET/api/v1/analytics/network/tps

Network Tps

Rolling transactions-per-second per chain over 1h / 24h / 7d windows.

Cheap composite over the hourly_activity Gold table. Powers a "Network throughput" widget on the landing page.

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/analytics/network/tps" \
  -H "Authorization: Bearer qs_YOUR_API_KEY"
Example response
{
  "items": [
    {
      "chain": "qrl2",
      "network": "testnet",
      "tps_1h": 0,
      "tps_24h": 0.000011574074074074072,
      "tps_7d": 0.00000496031746031746
    }
  ],
  "count": 1,
  "generated_at": "2026-07-31T15:28:24.476673Z"
}
GET/api/v1/analytics/wallet-count

Wallet Count

Per-day new-wallets + cumulative wallet count (every distinct wallet ever seen on-chain).

Backs the /charts/wallet-count thumbnail + the growth widget. Cumulative count uses a window function over quantascan.wallets.first_seen_at (mig 062, view renamed mig 075). The detail page's "with balance (> 0)" toggle is served separately via /timeline/active-wallets.

Query parameters

NameTypeRequiredDefaultDescription
chainstringnoqrl2Which chain to query: qrl (legacy PoW) or qrl2 (PoS EVM). Defaults to qrl2.
windowstringno30dLook-back window with unit suffix (m=min, h=hour, d=day, w=week). Default 30d. Examples: 24h, 7d, 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/analytics/wallet-count" \
  -H "Authorization: Bearer qs_YOUR_API_KEY"
Example response
{
  "items": [
    {
      "day": "2026-07-30",
      "new_wallets": 2,
      "wallet_count": 406
    },
    {
      "day": "2026-07-29",
      "new_wallets": 1,
      "wallet_count": 404
    },
    "… (20 more)"
  ],
  "count": 22,
  "chain": "qrl2",
  "network": "testnet",
  "window_days": 30
}

Supply

GET/api/v1/analytics/supply/age-daily

Supply Age Daily

Per-day supply-by-age buckets (HODL waves / dormant supply over time, mig 089).

The over-time companion to /supply/dormant-buckets: each day's positive-balance supply split by last-activity age (<1m / 1m-1y / 1-2y / 2-5y / >5y), as % of supply. Powers a stacked composition chart. Consensus-banned addresses (mig 077) are excluded by the backfill, so it matches the dormant-buckets snapshot.

Query parameters

NameTypeRequiredDefaultDescription
windowstringno365dLook-back window with unit suffix (m=min, h=hour, d=day, w=week). Default 365d. Examples: 24h, 7d, 90d.
chainstringnoqrl2Which chain to query: qrl (legacy PoW) or qrl2 (PoS EVM). Defaults to qrl2.

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/analytics/supply/age-daily" \
  -H "Authorization: Bearer qs_YOUR_API_KEY"
Example response
{
  "items": [
    {
      "day": "2026-04-01",
      "bucket": "1-2y",
      "balance_pct": 0,
      "holders": 0
    },
    {
      "day": "2026-04-01",
      "bucket": "1m-1y",
      "balance_pct": 0,
      "holders": 0
    },
    "… (488 more)"
  ],
  "count": 490,
  "chain": "qrl2",
  "network": "testnet",
  "window_days": 365,
  "buckets": [
    "<1m",
    "1m-1y",
    "… (3 more)"
  ]
}
GET/api/v1/analytics/supply/cohorts

Supply Cohorts

Six "ocean" holder tiers (whale → shrimp) by share of supply (whale ≥0.1%, then each step 10× smaller down to shrimp), with holder-count AND supply-% per tier. On-demand over address_summary. Cached 10 min.

Query parameters

NameTypeRequiredDefaultDescription
chainstringnoqrl2Which chain to query: qrl (legacy PoW) or qrl2 (PoS EVM). Defaults to qrl2.

Response 200 · GenericObject

Variable shape — see the example response below.

Request examples

curl -s "https://quantascan.io/api/v1/analytics/supply/cohorts" \
  -H "Authorization: Bearer qs_YOUR_API_KEY"
Example response
{
  "chain": "qrl2",
  "network": "testnet",
  "holders": 289,
  "cohorts": [
    {
      "cohort": "whale",
      "holders": 3,
      "supply_pct": 99.05
    },
    {
      "cohort": "shark",
      "holders": 19,
      "supply_pct": 0.91
    },
    "… (4 more)"
  ]
}
GET/api/v1/analytics/supply/combined-curve

Supply Combined Curve

Stacked dual-series cumulative supply (QRL PoW + QRL2 PoS) per day.

Chain-less and ALWAYS full history — a cumulative total-supply curve only makes sense from genesis, so no window parameter. QRL2 is plotted net of the re-homed migration mirror so the cumulative line has no cutover jump once the snapshot lands.

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/analytics/supply/combined-curve" \
  -H "Authorization: Bearer qs_YOUR_API_KEY"
Example response
{
  "items": [
    {
      "day": "2018-06-26",
      "qrl_minted_coins": 10216.192418,
      "qrl2_minted_coins": 0,
      "qrl_cumulative_coins": 65010216.1924,
      "qrl2_cumulative_coins": 0
    },
    {
      "day": "2018-06-27",
      "qrl_minted_coins": 8783.173246,
      "qrl2_minted_coins": 0,
      "qrl_cumulative_coins": 65018999.3657,
      "qrl2_cumulative_coins": 0
    },
    "… (1659 more)"
  ],
  "count": 1661
}
GET/api/v1/analytics/supply/curve

Supply Curve

Historical cumulative minted supply per day. Reads from the existing total_supply_timeline Gold MV (no new migration). Halving-projection and burn-via-migration tracking deferred to backlog.

Query parameters

NameTypeRequiredDefaultDescription
chainstringnoqrl2Which chain to query: qrl (legacy PoW) or qrl2 (PoS EVM). Defaults to qrl2.
windowstringno365dLook-back window with unit suffix (m=min, h=hour, d=day, w=week). Default 365d. Examples: 24h, 7d, 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/analytics/supply/curve" \
  -H "Authorization: Bearer qs_YOUR_API_KEY"
Example response
{
  "items": [
    {
      "day": "2026-04-01",
      "minted_today": "2465408896383",
      "block_count_today": 22560,
      "cumulative_minted": "2465408896383"
    },
    {
      "day": "2026-04-02",
      "minted_today": "3081833396093",
      "block_count_today": 23040,
      "cumulative_minted": "5547242292476"
    },
    "… (120 more)"
  ],
  "count": 122,
  "chain": "qrl2",
  "days": 365
}
GET/api/v1/analytics/supply/distribution-timeline

Supply Distribution Timeline

Daily concentration timeseries (top-10 share, Gini, Nakamoto) from the forward-only snapshot table etl_gold.distribution_daily (mig 084). Degrades to an empty series if the table/job isn't live yet. Cached 10 min.

Query parameters

NameTypeRequiredDefaultDescription
windowstringno90dLook-back window with unit suffix (m=min, h=hour, d=day, w=week). Default 90d. Examples: 24h, 7d, 90d.
chainstringnoqrl2Which chain to query: qrl (legacy PoW) or qrl2 (PoS EVM). Defaults to qrl2.

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/analytics/supply/distribution-timeline" \
  -H "Authorization: Bearer qs_YOUR_API_KEY"
Example response
{
  "items": [
    {
      "day": "2026-05-03",
      "top10_pct": 99.8286,
      "top100_pct": 100,
      "gini": 0.9779,
      "nakamoto": 1,
      "holders": 50,
      "hhi": 9732.2,
      "palma": 1000000
    },
    {
      "day": "2026-05-04",
      "top10_pct": 99.7787,
      "top100_pct": 100,
      "gini": 0.978,
      "nakamoto": 1,
      "holders": 51,
      "hhi": 9732.16,
      "palma": 1000000
    },
    "… (67 more)"
  ],
  "count": 69,
  "chain": "qrl2",
  "network": "testnet",
  "days": 90
}
GET/api/v1/analytics/supply/dormant-buckets

Supply Dormant Buckets

Positive-balance holders bucketed by last_seen age.

Buckets: <1m / 1m-1y / 1-2y / 2-5y / >5y. Each returns holder-count + total-balance-% held — answers "how much supply is in deeply-dormant addresses (likely lost)".

Query parameters

NameTypeRequiredDefaultDescription
chainstringnoqrl2Which chain to query: qrl (legacy PoW) or qrl2 (PoS EVM). Defaults to qrl2.

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/analytics/supply/dormant-buckets" \
  -H "Authorization: Bearer qs_YOUR_API_KEY"
Example response
{
  "items": [
    {
      "bucket": "<1m",
      "holders": 183,
      "total_balance_pct": 98.9
    },
    {
      "bucket": "1m-1y",
      "holders": 106,
      "total_balance_pct": 1.1
    }
  ],
  "count": 2,
  "chain": "qrl2",
  "network": "testnet"
}
GET/api/v1/analytics/supply/entity-distribution

Supply Entity Distribution

Supply share per wallet entity-class (mig 080) + a recomputed concentration EXCLUDING custodial/protocol entities. Answers "are the big holders exchanges/foundation/pools or individuals?". Joins quantascan.wallet_class with address_summary. Cached 10 min.

Query parameters

NameTypeRequiredDefaultDescription
chainstringnoqrl2Which chain to query: qrl (legacy PoW) or qrl2 (PoS EVM). Defaults to qrl2.

Response 200 · GenericObject

Variable shape — see the example response below.

Request examples

curl -s "https://quantascan.io/api/v1/analytics/supply/entity-distribution" \
  -H "Authorization: Bearer qs_YOUR_API_KEY"
Example response
{
  "chain": "qrl2",
  "network": "testnet",
  "holders": 289,
  "classes": [
    {
      "wallet_class": "others",
      "holders": 285,
      "supply_pct": 100
    },
    {
      "wallet_class": "",
      "holders": 4,
      "supply_pct": 0
    }
  ],
  "excl_entities": {
    "holders": 289,
    "supply_pct_of_total": 100,
    "top10_pct": 99.47,
    "gini": 0.9958,
    "nakamoto": 1
  }
}
GET/api/v1/analytics/supply/holders-distribution

Supply Holders Distribution

Top 10 / 100 / 1k / 10k holder % of supply + Gini + Nakamoto.

Pulls all positive-balance address balances and computes inequality metrics in Python. ~13k addresses on qrl, ~50 on qrl2 — fits comfortably in memory. Cached 10 minutes (distribution moves slowly).

Query parameters

NameTypeRequiredDefaultDescription
chainstringnoqrl2Which chain to query: qrl (legacy PoW) or qrl2 (PoS EVM). Defaults to qrl2.

Response 200 · GenericObject

Variable shape — see the example response below.

Request examples

curl -s "https://quantascan.io/api/v1/analytics/supply/holders-distribution" \
  -H "Authorization: Bearer qs_YOUR_API_KEY"
Example response
{
  "chain": "qrl2",
  "network": "testnet",
  "holders": 289,
  "distribution": [
    {
      "bucket": "Top 10",
      "rank_threshold": 10,
      "pct": 99.47
    },
    {
      "bucket": "Top 100",
      "rank_threshold": 100,
      "pct": 100
    },
    "… (2 more)"
  ],
  "gini": 0.9958,
  "nakamoto": 1
}
GET/api/v1/analytics/supply/lorenz

Supply Lorenz

Lorenz-curve points (cumulative %-holders vs cumulative %-supply) + the exact Gini. Backs the /distribution Lorenz chart — the visual companion to the Gini number. Down-sampled to ~100 points; computed on-demand over quantascan.address_summary (no new table). Cached 10 min.

Query parameters

NameTypeRequiredDefaultDescription
chainstringnoqrl2Which chain to query: qrl (legacy PoW) or qrl2 (PoS EVM). Defaults to qrl2.

Response 200 · GenericObject

Variable shape — see the example response below.

Request examples

curl -s "https://quantascan.io/api/v1/analytics/supply/lorenz" \
  -H "Authorization: Bearer qs_YOUR_API_KEY"
Example response
{
  "chain": "qrl2",
  "network": "testnet",
  "holders": 289,
  "points": [
    {
      "p_holders": 0,
      "p_supply": 0
    },
    {
      "p_holders": 0.692,
      "p_supply": 0
    },
    "… (144 more)"
  ],
  "gini": 0.9958
}
GET/api/v1/analytics/supply/overview

Supply Overview

Combined cross-chain ecosystem-supply KPIs for the /supply hub page.

Chain-less by design (like every analytics endpoint): one migration-adjusted total across QRL Legacy + QRL 2.0, a 3-way "where supply lives" split, per- chain emission/cap, and the migration_measurable flag that drives the "not yet measurable" UI state (CLAUDE.md:153). Backed by app.core.supply_metrics.get_combined_supply_overview — existing Gold views only, no new migration. Degrades to a zeroed shape if views are missing.

Response 200 · GenericObject

Variable shape — see the example response below.

Request examples

curl -s "https://quantascan.io/api/v1/analytics/supply/overview" \
  -H "Authorization: Bearer qs_YOUR_API_KEY"
Example response
{
  "available": true,
  "combined_supply_shor": "76923065470161060",
  "combined_supply_coins": 76923065.4702,
  "emission_per_day_coins": 2895.216,
  "inflation_annual_pct": 1.37,
  "mirror_shor": "0",
  "migration_measurable": false,
  "is_sparse": true,
  "qrl": {
    "minted_shor": "76566060680830737",
    "minted_coins": 76566060.6808,
    "genesis_coins": 65000000,
    "mined_coins": 11566060.6808,
    "mining_pool_coins": 40000000,
    "mining_remaining_coins": 28433939.3192,
    "cap_coins": 105000000,
    "cap_pct": 72.92,
    "remaining_coins": 28433939.3192,
    "emission_per_day_coins": 0,
    "inflation_annual_pct": 0,
    "indexed_height": 2224459,
    "node_tip_height": 4236819,
    "is_fully_indexed": false
  },
  "max_supply": {
    "max_coins": 105000000,
    "public_sale_coins": 52000000,
    "reserved_coins": 13000000,
    "foundation_earmark_coins": 8000000,
    "genesis_coins": 65000000,
    "mining_pool_coins": 40000000,
    "mined_coins": 11566060.6808,
    "unmined_coins": 28433939.3192
  },
  "qrl2": {
    "minted_shor": "357004789330326",
    "minted_coins": 357004.7893,
    "net_minted_shor": "357004789330323",
    "net_minted_coins": 357004.7893,
    "fee_burned_shor": "3",
    "fee_burned_coins": 0,
    "cap_coins": null,
    "emission_per_day_coins": 2895.216,
    "inflation_annual_pct": 296.01
  },
  "split": {
    "legacy_shor": "76566060680830737",
    "legacy_coins": 76566060.6808,
    "legacy_pct": 99.54,
    "claimed_shor": "0",
    "claimed_coins": 0,
    "claimed_pct": 0,
    "qrl2_net_shor": "357004789330323",
    "qrl2_net_coins": 357004.7893,
    "qrl2_net_pct": 0.46
  }
}
GET/api/v1/analytics/supply/summary

Supply Summary

Hero KPI strip for the /supply page: total supply, holders count, top-10 share, dormant-1y %.

Backed by app.core.supply_metrics.get_supply_summary — single CH query over quantascan.address_summary. Cached 5 minutes.

Query parameters

NameTypeRequiredDefaultDescription
chainstringnoqrl2Which chain to query: qrl (legacy PoW) or qrl2 (PoS EVM). Defaults to qrl2.

Response 200 · GenericObject

Variable shape — see the example response below.

Request examples

curl -s "https://quantascan.io/api/v1/analytics/supply/summary" \
  -H "Authorization: Bearer qs_YOUR_API_KEY"
Example response
{
  "chain": "qrl2",
  "network": "testnet",
  "holders": 289,
  "total_supply": "80357000678950137572690762",
  "top10_supply": "79934964253157455255286433",
  "top10_pct": 99.47,
  "dormant_holders_1y": 0,
  "dormant_supply_1y_pct": 0,
  "is_sparse": false
}
GET/api/v1/analytics/total_supply

Total Supply

Cross-chain mint per day. Today QRL coinbase + QRL2 withdrawals; the migration columns (*_via_migration) stay 0 until the bridge parser is built (Fase 6+).

Query parameters

NameTypeRequiredDefaultDescription
windowstringno90dLook-back window with unit suffix (m=min, h=hour, d=day, w=week). Default 90d. Examples: 24h, 7d, 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/analytics/total_supply" \
  -H "Authorization: Bearer qs_YOUR_API_KEY"
Example response
{
  "items": [
    {
      "day": "2026-05-03",
      "qrl_minted_shor": "0",
      "qrl2_minted_shor": "2911688665332",
      "qrl_burned_via_migration_shor": "0",
      "qrl2_minted_via_migration_shor": "0",
      "qrl_block_count": 0,
      "qrl2_block_count": 23040
    },
    {
      "day": "2026-05-04",
      "qrl_minted_shor": "0",
      "qrl2_minted_shor": "3082804915989",
      "qrl_burned_via_migration_shor": "0",
      "qrl2_minted_via_migration_shor": "0",
      "qrl_block_count": 0,
      "qrl2_block_count": 23040
    },
    "… (88 more)"
  ],
  "days": 90
}

Transactions & timelines

GET/api/v1/analytics/timeline/{metric}

Unified Timeline

Cross-chain QRL → QRL2 stitched timeline for one metric.

metric ∈ {transactions, blocks, gas, wallets, active-wallets, supply, block_time, block_size, active-addresses, active-addresses-excl-payouts}.

Wave 7: ?days=N?window=DURATION (D4). The legacy days=0 "all-time" sentinel maps to ?window=10y (3650d, the max cap) — no real chain history exceeds that. The day-count snaps UP to the nearest UI tier (_snap_days) to keep the cache-key space bounded.

On testnet (no cutover set) returns the QRL mainnet series in points plus the QRL2 testnet series in preview (rendered separately so the wall-clock overlap isn't concatenated). Once the migration cutover block is configured (mainnet launch) the two chains are stitched into a single continuous points series with cutover_block / cutover_date set.

Path parameters

NameTypeRequiredDefaultDescription
metricstringyes

Query parameters

NameTypeRequiredDefaultDescription
windowstringno90dLook-back window with unit suffix (m=min, h=hour, d=day, w=week). Default 90d. Examples: 24h, 7d, 90d.

Response 200 · GenericObject

Variable shape — see the example response below.

Request examples

curl -s "https://quantascan.io/api/v1/analytics/timeline/transactions" \
  -H "Authorization: Bearer qs_YOUR_API_KEY"
Example response
{
  "metric": "transactions",
  "unit": "txns",
  "kind": "flow",
  "phase": "testnet",
  "cutover_block": null,
  "cutover_date": null,
  "points": [
    {
      "date": "2022-06-14",
      "value": 532,
      "chain": "qrl"
    },
    {
      "date": "2022-06-15",
      "value": 592,
      "chain": "qrl"
    },
    "… (88 more)"
  ],
  "preview": []
}
GET/api/v1/analytics/transactions-normalised

Transactions Normalised

Cross-chain daily tx volume + count in one denomination (quanta).

QRL and QRL2 use different base units (shor vs planck). This view normalises both to shor-equivalent so they can be plotted on the same Y-axis. Powers cross-chain comparison charts.

Query parameters

NameTypeRequiredDefaultDescription
windowstringno30dLook-back window with unit suffix (m=min, h=hour, d=day, w=week). Default 30d. Examples: 24h, 7d, 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/analytics/transactions-normalised" \
  -H "Authorization: Bearer qs_YOUR_API_KEY"
Example response
{
  "items": [
    {
      "chain": "qrl2",
      "day": "2026-07-30",
      "tx_count": 1,
      "volume_quanta": "0",
      "fees_quanta": "442563"
    },
    {
      "chain": "qrl2",
      "day": "2026-07-29",
      "tx_count": 1,
      "volume_quanta": "10000000000",
      "fees_quanta": "21000"
    },
    "… (23 more)"
  ],
  "count": 25,
  "window_days": 30,
  "unit": "quanta (shor for QRL, planck/1e9 for QRL2)"
}
GET/api/v1/analytics/transactions/by-type

Transactions By Type

Per-day distinct transaction count grouped by tx_type (mig 070).

Powers the stacked "transaction types" composition chart. QRL surfaces its real subtype mix (coinbase / transfer / slave / ...); QRL2 surfaces derived EVM categories (transfer / contract_call / contract_create).

Query parameters

NameTypeRequiredDefaultDescription
chainstringnoqrl2Which chain to query: qrl (legacy PoW) or qrl2 (PoS EVM). Defaults to qrl2.
windowstringno30dLook-back window with unit suffix (m=min, h=hour, d=day, w=week). Default 30d. Examples: 24h, 7d, 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/analytics/transactions/by-type" \
  -H "Authorization: Bearer qs_YOUR_API_KEY"
Example response
{
  "items": [],
  "count": 0,
  "chain": "qrl",
  "network": "testnet",
  "window_days": 30
}
GET/api/v1/analytics/transactions/user-daily

Transactions User Daily

Per-day economic USER transactions (mig 070 quantascan.user_tx_daily).

The PURE daily-txs definition: QRL excludes coinbase (block-reward) and admin txs (slave/message/token/...); QRL2 counts all EVM txs. Backs the /charts/daily-txs single-chain thumbnail; the cross-chain detail page uses the stitched /timeline/transactions, which reads the same view.

Query parameters

NameTypeRequiredDefaultDescription
chainstringnoqrl2Which chain to query: qrl (legacy PoW) or qrl2 (PoS EVM). Defaults to qrl2.
windowstringno30dLook-back window with unit suffix (m=min, h=hour, d=day, w=week). Default 30d. Examples: 24h, 7d, 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/analytics/transactions/user-daily" \
  -H "Authorization: Bearer qs_YOUR_API_KEY"
Example response
{
  "items": [
    {
      "day": "2026-07-30",
      "user_tx_count": 1
    },
    {
      "day": "2026-07-29",
      "user_tx_count": 1
    },
    "… (24 more)"
  ],
  "count": 26,
  "chain": "qrl2",
  "network": "testnet",
  "window_days": 30
}

Fees & gas

GET/api/v1/analytics/fees/percentiles

Fees Percentiles

Daily fee p50/p95/p99 + max + total.

Surfaces what the typical user actually paid (vs a sum-of-fees view that's dominated by single big txs). Powers a "Fee distribution" chart with three percentile lines per day.

Query parameters

NameTypeRequiredDefaultDescription
chainstringnoqrl2Which chain to query: qrl (legacy PoW) or qrl2 (PoS EVM). Defaults to qrl2.
windowstringno30dLook-back window with unit suffix (m=min, h=hour, d=day, w=week). Default 30d. Examples: 24h, 7d, 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/analytics/fees/percentiles" \
  -H "Authorization: Bearer qs_YOUR_API_KEY"
Example response
{
  "items": [
    {
      "day": "2026-07-30",
      "tx_count": 1,
      "fee_p50": "442563003097941",
      "fee_p95": "442563003097941",
      "fee_p99": "442563003097941",
      "fee_max": "442563003097941",
      "fee_sum": "442563003097941"
    },
    {
      "day": "2026-07-29",
      "tx_count": 1,
      "fee_p50": "21000000294000",
      "fee_p95": "21000000294000",
      "fee_p99": "21000000294000",
      "fee_max": "21000000294000",
      "fee_sum": "21000000294000"
    },
    "… (24 more)"
  ],
  "count": 26,
  "chain": "qrl2",
  "network": "testnet",
  "window_days": 30
}
GET/api/v1/analytics/gas-distribution

Gas Distribution

Per-day gas-used bucketed distribution (qrl2 EVM only).

7 buckets aligned to common EVM ops (simple value transfer / QRC-20 / contract call / contract swap / complex contract call / deploy / 1M+). Powers a stacked-bar chart and surfaces what kind of workload the chain handles over time.

Query parameters

NameTypeRequiredDefaultDescription
windowstringno30dLook-back window with unit suffix (m=min, h=hour, d=day, w=week). Default 30d. Examples: 24h, 7d, 90d.
chainstringnoqrl2Which chain to query: qrl (legacy PoW) or qrl2 (PoS EVM). Defaults to qrl2.

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/analytics/gas-distribution" \
  -H "Authorization: Bearer qs_YOUR_API_KEY"
Example response
{
  "items": [
    {
      "day": "2026-07-30",
      "bucket": 4,
      "bucket_label": "250k-500k",
      "bucket_count": 1
    },
    {
      "day": "2026-07-29",
      "bucket": 0,
      "bucket_label": "0-21k",
      "bucket_count": 1
    },
    "… (88 more)"
  ],
  "count": 90,
  "network": "testnet",
  "window_days": 30,
  "buckets": [
    {
      "id": 0,
      "label": "0-21k",
      "meaning": "simple value transfer"
    },
    {
      "id": 1,
      "label": "21k-50k",
      "meaning": "QRC-20 token transfer"
    },
    "… (5 more)"
  ]
}
GET/api/v1/qrl2/fees/burned/dailyQRL 2.0

Burn Daily

Per-day EIP-1559 burn for the "supply-deflation" line on the QRL2 dashboard.

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

Query parameters

NameTypeRequiredDefaultDescription
windowstringno30dLook-back window for daily EIP-1559 burn. Default 30d.

Response 200 · FeeBurnDailyList

itemsobject[]
daysinteger | null
networkstring | null

Request examples

curl -s "https://quantascan.io/api/v1/qrl2/fees/burned/daily" \
  -H "Authorization: Bearer qs_YOUR_API_KEY"
Example response
{
  "items": [
    {
      "day": "2026-07-02",
      "fee_burned_planck": "7850024",
      "fee_burned_qrl2": "0",
      "block_count": 20,
      "gas_used_total": "1121432",
      "avg_base_fee_planck": "7"
    },
    {
      "day": "2026-07-03",
      "fee_burned_planck": "2070761",
      "fee_burned_qrl2": "0",
      "block_count": 4,
      "gas_used_total": "295823",
      "avg_base_fee_planck": "7"
    },
    "… (28 more)"
  ],
  "days": 30,
  "network": "testnet"
}
GET/api/v1/qrl2/fees/burned/summaryQRL 2.0

Burn Summary

All-time burn totals + 24h/7d/30d rolling windows in one response.

Response 200 · FeeBurnSummary

networkstringrequired
total_planckstring | null
total_qrl2string | null
total_blocksinteger | null
planck_24hstring | null
planck_7dstring | null
planck_30dstring | null
latest_daystring | null

Request examples

curl -s "https://quantascan.io/api/v1/qrl2/fees/burned/summary" \
  -H "Authorization: Bearer qs_YOUR_API_KEY"
Example response
{
  "total_planck": "3237548755",
  "total_qrl2": "0",
  "total_blocks": 1972,
  "planck_24h": "0",
  "planck_7d": "3400453",
  "planck_30d": "1166836594",
  "latest_day": "2026-07-30",
  "network": "testnet"
}

Whales

GET/api/v1/analytics/whales/biggest

Whales Biggest Txs

Largest single transactions by value within the time window.

Distinct from /transactions/whales (which is a recency feed) — this is sorted-by-value within a window. Used for "biggest tx today / 7d / 30d / all-time" feed. Not threshold-aware on purpose.

Query parameters

NameTypeRequiredDefaultDescription
limitintegermin 1 · max 100no20
chainstringnoqrl2Which chain to query: qrl (legacy PoW) or qrl2 (PoS EVM). Defaults to qrl2.
windowstringno30dLook-back window with unit suffix (m=min, h=hour, d=day, w=week). Default 30d. Examples: 24h, 7d, 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/analytics/whales/biggest" \
  -H "Authorization: Bearer qs_YOUR_API_KEY"
Example response
{
  "items": [
    {
      "tx_hash": "0x956da14889674e6c0d26b0959118c19b40e6273e21b7dbb8599589eccfb62d93",
      "height": 143838,
      "from_addr": "Q6153d37fa4da7193e6219dcbd2bbe62fa12905b1",
      "to_addr": "Q7d4175166aa4b696cf77c23808811ef5ffa7c36b",
      "value": "20000000000000000000000",
      "timestamp": "2026-07-09 21:46:36.000",
      "tx_type": null
    },
    {
      "tx_hash": "0x90b12b4199b6e4ada293c3154ca17cfdfcf025e6226d5a77ea71b48c6063c74b",
      "height": 137425,
      "from_addr": "Qf68379b949fc1cf6eb1695237be8e734118a0931",
      "to_addr": "Qfc8f79ab26f37d238a4ffc60a23258b050a5ccfb",
      "value": "2000000000000000000000",
      "timestamp": "2026-07-05 10:53:36.000",
      "tx_type": null
    },
    "… (18 more)"
  ],
  "count": 20,
  "chain": "qrl2",
  "network": "testnet",
  "days": 30
}
GET/api/v1/analytics/whales/cohorts

Whales Cohorts

Per-cohort breakdown of the whale population.

Buckets: new / active / hodler / distributor / dormant. Each entry returns holder-count + balance-share-of-cohort. Sums to ~100%.

Query parameters

NameTypeRequiredDefaultDescription
threshold_pctnumber | nullno
chainstringnoqrl2Which chain to query: qrl (legacy PoW) or qrl2 (PoS EVM). Defaults to qrl2.

Response 200 · GenericObject

Variable shape — see the example response below.

Request examples

curl -s "https://quantascan.io/api/v1/analytics/whales/cohorts" \
  -H "Authorization: Bearer qs_YOUR_API_KEY"
Example response
{
  "items": [
    {
      "cohort": "new",
      "count": 0,
      "balance_pct": 0
    },
    {
      "cohort": "active",
      "count": 2,
      "balance_pct": 0.4
    },
    "… (3 more)"
  ],
  "total_whales": 3,
  "chain": "qrl2",
  "network": "testnet",
  "whale_threshold": "99999999999999991611392",
  "threshold_pct": null
}
GET/api/v1/analytics/whales/exchange-flow

Whales Exchange Flow

Net flow between the whale cohort and labeled exchanges over the window.

deposits (whale→exchange) = distribution/bearish; withdrawals (exchange→whale) = accumulation/bullish; net = withdrawals − deposits. A very large window reads as "all time" (all_time=true). Depends on curated exchange labels — returns a neutral exchange_labeled=false shape on chains without any (e.g. QRL2 testnet).

Query parameters

NameTypeRequiredDefaultDescription
threshold_pctnumber | nullno
chainstringnoqrl2Which chain to query: qrl (legacy PoW) or qrl2 (PoS EVM). Defaults to qrl2.
windowstringno30dLook-back window with unit suffix (m=min, h=hour, d=day, w=week). Default 30d. Examples: 24h, 7d, 90d.

Response 200 · GenericObject

Variable shape — see the example response below.

Request examples

curl -s "https://quantascan.io/api/v1/analytics/whales/exchange-flow" \
  -H "Authorization: Bearer qs_YOUR_API_KEY"
Example response
{
  "chain": "qrl2",
  "network": "testnet",
  "days": 30,
  "all_time": false,
  "deposits": "0",
  "withdrawals": "0",
  "net": "0",
  "deposit_txs": 0,
  "withdrawal_txs": 0,
  "exchange_labeled": false,
  "exchange_count": 0,
  "whale_threshold": "0",
  "threshold_pct": null
}
GET/api/v1/analytics/whales/heatmap

Whales Heatmap

Daily count of whales who moved at all, last N days.

Returns one row per calendar day in the window (including zero days) with movers, volume and normalised intensity (0..1). Frontend renders as a GitHub-style calendar heatmap.

Query parameters

NameTypeRequiredDefaultDescription
threshold_pctnumber | nullno
chainstringnoqrl2Which chain to query: qrl (legacy PoW) or qrl2 (PoS EVM). Defaults to qrl2.
windowstringno90dLook-back window with unit suffix (m=min, h=hour, d=day, w=week). Default 90d. Examples: 24h, 7d, 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/analytics/whales/heatmap" \
  -H "Authorization: Bearer qs_YOUR_API_KEY"
Example response
{
  "items": [
    {
      "day": "2026-05-02",
      "movers": 1,
      "volume": "2894771256008000000000",
      "intensity": 0.5
    },
    {
      "day": "2026-05-03",
      "movers": 1,
      "volume": "2921688665332000000000",
      "intensity": 0.5
    },
    "… (89 more)"
  ],
  "count": 91,
  "chain": "qrl2",
  "network": "testnet",
  "days": 90,
  "max_movers": 2,
  "whale_threshold": "99999999999999991611392",
  "threshold_pct": null
}
GET/api/v1/analytics/whales/leaderboard

Whales Leaderboard

Top N wallets by balance, with 7-day net-flow delta.

Powers the "accumulating / distributing / stable" insight on the /whales page. Delta uses address_balance_daily (W2 MV).

Query parameters

NameTypeRequiredDefaultDescription
limitintegermin 1 · max 200no50
threshold_pctnumber | nullno
chainstringnoqrl2Which chain to query: qrl (legacy PoW) or qrl2 (PoS EVM). Defaults to qrl2.

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/analytics/whales/leaderboard" \
  -H "Authorization: Bearer qs_YOUR_API_KEY"
Example response
{
  "items": [
    {
      "rank": 1,
      "address": "Qc0e6dd0e844e0048dcb0bd3fdcc44a970beca38d",
      "balance": "79275760786657432843151000",
      "tx_count": 2798931,
      "last_seen": "2026-07-31 12:03:36.000",
      "delta_7d": "21990899784414000000000"
    },
    {
      "rank": 2,
      "address": "Q4242424242424242424242424242424242424242",
      "balance": "200000000000000000000000",
      "tx_count": 3,
      "last_seen": "2026-05-19 05:41:36.000",
      "delta_7d": "0"
    },
    "… (1 more)"
  ],
  "count": 3,
  "chain": "qrl2",
  "network": "testnet",
  "whale_threshold": "99999999999999991611392",
  "threshold_pct": null
}
GET/api/v1/analytics/whales/movers

Whales Movers

Biggest accumulators & distributors within the whale cohort.

Replaces the old "top wallets by balance" leaderboard (a duplicate of /richlist) with a behavioural angle: who moved the most net coins over the window. Exchanges are excluded so the lists are individual holders.

Query parameters

NameTypeRequiredDefaultDescription
limitintegermin 1 · max 50no10
threshold_pctnumber | nullno
chainstringnoqrl2Which chain to query: qrl (legacy PoW) or qrl2 (PoS EVM). Defaults to qrl2.
windowstringno7dLook-back window with unit suffix (m=min, h=hour, d=day, w=week). Default 7d. Examples: 24h, 7d, 90d.

Response 200 · GenericObject

Variable shape — see the example response below.

Request examples

curl -s "https://quantascan.io/api/v1/analytics/whales/movers" \
  -H "Authorization: Bearer qs_YOUR_API_KEY"
Example response
{
  "accumulators": [
    {
      "address": "Qc0e6dd0e844e0048dcb0bd3fdcc44a970beca38d",
      "balance": "79275760786657432843151000",
      "net_flow": "21990899784414000000000"
    }
  ],
  "distributors": [],
  "chain": "qrl2",
  "network": "testnet",
  "window_days": 7,
  "whale_threshold": "99999999999999991611392",
  "threshold_pct": null
}
GET/api/v1/analytics/whales/sentiment

Whales Sentiment

Signed net-flow across the whale cohort over the window.

Powers the bull/bear barometer hero on /whales. Positive net_flow = whales accumulating; negative = distributing. Also returns split counts (accumulators vs distributors) so the UI can show "X buying / Y selling" alongside the headline figure.

Query parameters

NameTypeRequiredDefaultDescription
threshold_pctnumber | nullno
chainstringnoqrl2Which chain to query: qrl (legacy PoW) or qrl2 (PoS EVM). Defaults to qrl2.
windowstringno7dLook-back window with unit suffix (m=min, h=hour, d=day, w=week). Default 7d. Examples: 24h, 7d, 90d.

Response 200 · GenericObject

Variable shape — see the example response below.

Request examples

curl -s "https://quantascan.io/api/v1/analytics/whales/sentiment" \
  -H "Authorization: Bearer qs_YOUR_API_KEY"
Example response
{
  "chain": "qrl2",
  "network": "testnet",
  "days": 7,
  "net_flow": "21990899784414000000000",
  "net_flow_pct": 0.0276,
  "accumulators": 1,
  "distributors": 0,
  "whale_count": 3,
  "total_whale_balance": "79596760786657432843151000",
  "whale_threshold": "99999999999999991611392",
  "threshold_pct": null
}
GET/api/v1/analytics/whales/sparklines

Whales Sparklines

Per-whale daily balance series, reconstructed from daily flows.

Returns top-N whales by current balance with a chronological [{day, balance}] series. Used to render inline 30d trend sparklines next to each leaderboard row.

Query parameters

NameTypeRequiredDefaultDescription
limitintegermin 1 · max 100no25
threshold_pctnumber | nullno
chainstringnoqrl2Which chain to query: qrl (legacy PoW) or qrl2 (PoS EVM). Defaults to qrl2.
windowstringno30dLook-back window with unit suffix (m=min, h=hour, d=day, w=week). Default 30d. Examples: 24h, 7d, 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/analytics/whales/sparklines" \
  -H "Authorization: Bearer qs_YOUR_API_KEY"
Example response
{
  "items": [
    {
      "address": "Qc0e6dd0e844e0048dcb0bd3fdcc44a970beca38d",
      "series": [
        {
          "day": "2026-07-01",
          "balance": "79188905614325919843151000"
        },
        {
          "day": "2026-07-02",
          "balance": "79191823422492366843151000"
        },
        "… (29 more)"
      ]
    },
    {
      "address": "Q4242424242424242424242424242424242424242",
      "series": [
        {
          "day": "2026-07-01",
          "balance": "200000000000000000000000"
        },
        {
          "day": "2026-07-02",
          "balance": "200000000000000000000000"
        },
        "… (29 more)"
      ]
    },
    "… (1 more)"
  ],
  "count": 3,
  "chain": "qrl2",
  "network": "testnet",
  "days": 30,
  "whale_threshold": "99999999999999991611392",
  "threshold_pct": null
}
GET/api/v1/analytics/whales/summary

Whales Summary

Hero KPIs for the /whales page: whale-count, total whale balance, movers in 7d, biggest tx in 30d.

Whale threshold can be the legacy 100K fixed value (when threshold_pct is omitted) or computed as a percentage of current total supply via the slider on /whales. Dynamic mode keeps the "Whale" badge on /address/[hash] in sync only when called without threshold_pct.

Query parameters

NameTypeRequiredDefaultDescription
threshold_pctnumber | nullnoIf set, threshold = this %% of current total supply. None = legacy 100K floor.
chainstringnoqrl2Which chain to query: qrl (legacy PoW) or qrl2 (PoS EVM). Defaults to qrl2.

Response 200 · GenericObject

Variable shape — see the example response below.

Request examples

curl -s "https://quantascan.io/api/v1/analytics/whales/summary" \
  -H "Authorization: Bearer qs_YOUR_API_KEY"
Example response
{
  "chain": "qrl2",
  "network": "testnet",
  "whale_threshold": "99999999999999991611392",
  "whale_count": 3,
  "total_whale_balance": "79596760786657432843151000",
  "total_supply": "80357000678950137572690762",
  "whale_supply_pct": 99.05,
  "avg_per_whale": "26532253595552477614383666",
  "moved_whales_7d": 1,
  "biggest_tx_30d": "20000000000000000000000",
  "is_sparse": true,
  "threshold_pct": null
}

Overview & cross-chain

GET/api/v1/analytics/cross-chain/history/{address}

Cross Chain History

Unified wallet history across both chains. Returns rows from QRL + QRL2 sorted by timestamp DESC. Uses unified_account_history view — while address_linkage is empty, returns per-chain history for the single address. Post-bridge: combined history of all linked addresses.

Path parameters

NameTypeRequiredDefaultDescription
addressstringyes

Query parameters

NameTypeRequiredDefaultDescription
pageintegermin 1no1
page_sizeintegermin 1 · max 200no50

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/analytics/cross-chain/history/<address>" \
  -H "Authorization: Bearer qs_YOUR_API_KEY"
Example response
{
  "items": [
    {
      "quantascan_account_id": "",
      "chain": "qrl2",
      "timestamp": "2026-07-30T19:22:36",
      "height": 173934,
      "tx_hash": "0x7757ba180d74a02a33350b143bca0c8ee5a55c912ce8e359cfc24646baf85e2c",
      "from_addr": "Qedc109a7e31a982023b91f8e2fb46c34ca524f7d",
      "to_addr": null,
      "value_quanta": "0",
      "tx_type": null,
      "migration_role": "normal"
    },
    {
      "quantascan_account_id": "",
      "chain": "qrl2",
      "timestamp": "2026-06-01T19:17:36",
      "height": 88969,
      "tx_hash": "0x03106d397f807b64e7ee8074a1704960f9f16a157efa1972d960cbe0278e1b0f",
      "from_addr": "Qedc109a7e31a982023b91f8e2fb46c34ca524f7d",
      "to_addr": "Q83242a8fde6429aa53e050aefb03c0382a495df3",
      "value_quanta": "0",
      "tx_type": null,
      "migration_role": "normal"
    },
    "… (2 more)"
  ],
  "address": "Qedc109a7e31a982023b91f8e2fb46c34ca524f7d",
  "limit": 50,
  "offset": 0
}
GET/api/v1/analytics/dashboard/summary

Dashboard Summary

Single-call bundle for the landing page. Per chain returns:

  • headline counts (blocks, txs, tokens, validators)
  • latest_block_time
  • 24h fee_burned (qrl2)
  • 7-day activity sparkline data

Designed so the homepage server-component can fetch once + render everything above-the-fold without orchestrating multiple calls.

Response 200 · AnalyticsDashboardSummary

Variable shape — see the example response below.

Request examples

curl -s "https://quantascan.io/api/v1/analytics/dashboard/summary" \
  -H "Authorization: Bearer qs_YOUR_API_KEY"
Example response
{
  "chains": {
    "qrl": {
      "chain": "qrl",
      "network": "mainnet",
      "total_blocks": 2224460,
      "min_height": 0,
      "max_height": 2224459,
      "total_transactions": 3425275,
      "latest_block_time": "2022-09-11T03:28:50",
      "tokens_count": 322
    },
    "qrl2": {
      "chain": "qrl2",
      "network": "testnet",
      "total_blocks": 174935,
      "min_height": 1,
      "max_height": 174935,
      "total_transactions": 1977,
      "latest_block_time": "2026-07-31T12:03:36",
      "tokens_count": 136,
      "validators_count": 512,
      "fee_burned_24h_planck": "0",
      "activity_7d": [
        {
          "day": "2026-07-31",
          "block_count": 724,
          "tx_count": 0
        },
        {
          "day": "2026-07-30",
          "block_count": 1440,
          "tx_count": 1
        },
        "… (5 more)"
      ]
    }
  },
  "generated_at": "2026-07-31T15:28:23.798558Z"
}
GET/api/v1/analytics/exchange/largest-transfers

Exchange Largest Transfers

Largest single transfers TO/FROM labelled exchanges within the window.

Concrete deposit/withdrawal feed for /exchange-flow — sorted by value, each row tagged deposit (into an exchange) or withdrawal (out of one). Pure exchange↔exchange edges are excluded. qrl-primary; degrades to an empty feed on chains without curated exchange labels (e.g. QRL2 testnet).

Query parameters

NameTypeRequiredDefaultDescription
chainstringnoqrl2Which chain to query: qrl (legacy PoW) or qrl2 (PoS EVM). Defaults to qrl2.
limitintegermin 1 · max 100no20
directionstringnoboth
windowstringno30dLook-back window with unit suffix (m=min, h=hour, d=day, w=week). Default 30d. Examples: 24h, 7d, 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/analytics/exchange/largest-transfers" \
  -H "Authorization: Bearer qs_YOUR_API_KEY"
Example response
{
  "items": [],
  "count": 0,
  "chain": "qrl",
  "network": "testnet",
  "days": 30,
  "direction": "both",
  "exchange_labeled": false
}
GET/api/v1/analytics/exchange/summary

Exchange Summary

Exchange-activity snapshot for the /exchange-flow page.

Per-exchange leaderboard (current balance + address count), aggregate net flow (7d/30d), and the share of held supply on exchanges. qrl-primary — QRL2 exchange labels populate at mainnet. Defaults to chain=qrl since that is where the curated exchange labels live today.

Query parameters

NameTypeRequiredDefaultDescription
chainstringnoqrl2Which chain to query: qrl (legacy PoW) or qrl2 (PoS EVM). Defaults to qrl2.

Response 200 · GenericObject

Variable shape — see the example response below.

Request examples

curl -s "https://quantascan.io/api/v1/analytics/exchange/summary" \
  -H "Authorization: Bearer qs_YOUR_API_KEY"
Example response
{
  "chain": "qrl",
  "network": "testnet",
  "exchange_count": 0,
  "tracked_addresses": 0,
  "total_balance_quanta": 0,
  "supply_pct": null,
  "net_flow_7d_quanta": null,
  "net_flow_30d_quanta": null,
  "gross_inflow_7d_quanta": null,
  "gross_outflow_7d_quanta": null,
  "gross_inflow_30d_quanta": null,
  "gross_outflow_30d_quanta": null,
  "biggest": null,
  "leaderboard": []
}
GET/api/v1/analytics/home/highlights

Home Highlights

Curated "Today's highlights" for the home page.

4 small facts: biggest tx recent, busiest hour today, newest whale, block cadence. Each fact returns null when no data — frontend hides null entries gracefully so a sparse chain doesn't break the page.

Query parameters

NameTypeRequiredDefaultDescription
chainstringnoqrl2Which chain to query: qrl (legacy PoW) or qrl2 (PoS EVM). Defaults to qrl2.

Response 200 · GenericObject

Variable shape — see the example response below.

Request examples

curl -s "https://quantascan.io/api/v1/analytics/home/highlights" \
  -H "Authorization: Bearer qs_YOUR_API_KEY"
Example response
{
  "chain": "qrl2",
  "network": "testnet",
  "biggest_tx_recent": {
    "window": "7d",
    "tx_hash": "0xe981de6f7f770ac5d5d5b5a076e7994f6690dbd7554fd2308e2790634a05b8f0",
    "value": "10000000000000000000",
    "from_addr": "Q6153d37fa4da7193e6219dcbd2bbe62fa12905b1",
    "to_addr": "Qbb2cdffb66221359edf62cb8b0d1c18c3b4ee4fb",
    "timestamp": "2026-07-29 00:27:36.000"
  },
  "busiest_hour_today": null,
  "newest_whale": {
    "address": "Q7baa653b01c99fa7347a0aedc26b153aad08aad5",
    "balance": "121000000000000000000000",
    "first_seen": "2026-05-25 12:06:36.000"
  },
  "block_cadence": {
    "blocks_24h": 1236,
    "expected_24h": 7200,
    "ratio": 0.17
  }
}
GET/api/v1/analytics/staking/apr-daily

Staking Apr Daily

Per-day validator APR % (qrl2-only, mig 092) — net beacon rewards (rewards minus penalties) annualized over staked principal. Can be negative on a low-participation testnet (inactivity leak). QRL Legacy (PoW) has no APR.

Query parameters

NameTypeRequiredDefaultDescription
windowstringno365dLook-back window with unit suffix (m=min, h=hour, d=day, w=week). Default 365d. Examples: 24h, 7d, 90d.
chainstringnoqrl2Which chain to query: qrl (legacy PoW) or qrl2 (PoS EVM). Defaults to qrl2.

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/analytics/staking/apr-daily" \
  -H "Authorization: Bearer qs_YOUR_API_KEY"
Example response
{
  "items": [
    {
      "day": "2026-06-20",
      "apr_pct": 0.3848,
      "rewarded_validators": 512
    },
    {
      "day": "2026-06-21",
      "apr_pct": 2.3212,
      "rewarded_validators": 512
    },
    "… (16 more)"
  ],
  "count": 18,
  "network": "testnet",
  "window_days": 365
}
GET/api/v1/analytics/staking/daily

Staking Daily

Per-day PoS decentralisation (qrl2-only, mig 091): staking ratio %, active validator count, and validator-Nakamoto (min validators to control >33% of stake). From the per-epoch beacon balances; QRL Legacy (PoW) has no validators.

Query parameters

NameTypeRequiredDefaultDescription
windowstringno365dLook-back window with unit suffix (m=min, h=hour, d=day, w=week). Default 365d. Examples: 24h, 7d, 90d.
chainstringnoqrl2Which chain to query: qrl (legacy PoW) or qrl2 (PoS EVM). Defaults to qrl2.

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/analytics/staking/daily" \
  -H "Authorization: Bearer qs_YOUR_API_KEY"
Example response
{
  "items": [
    {
      "day": "2026-06-21",
      "active_validators": 512,
      "staking_ratio_pct": 25.5231,
      "nakamoto_33": 171,
      "total_staked_quanta": 20480000
    },
    {
      "day": "2026-06-24",
      "active_validators": 512,
      "staking_ratio_pct": 25.5204,
      "nakamoto_33": 171,
      "total_staked_quanta": 20480000
    },
    "… (15 more)"
  ],
  "count": 17,
  "network": "testnet",
  "window_days": 365
}
GET/api/v1/analytics/staking/slashings-daily

Staking Slashings Daily

Per-day validator slashing count (qrl2-only). 0-filled flat-zero line on a healthy network (QRL 2.0 has had zero slashings to date). QRL Legacy has none.

Query parameters

NameTypeRequiredDefaultDescription
windowstringno365dLook-back window with unit suffix (m=min, h=hour, d=day, w=week). Default 365d. Examples: 24h, 7d, 90d.
chainstringnoqrl2Which chain to query: qrl (legacy PoW) or qrl2 (PoS EVM). Defaults to qrl2.

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/analytics/staking/slashings-daily" \
  -H "Authorization: Bearer qs_YOUR_API_KEY"
Example response
{
  "items": [
    {
      "day": "2026-06-21",
      "slashings": 0
    },
    {
      "day": "2026-06-24",
      "slashings": 0
    },
    "… (15 more)"
  ],
  "count": 17,
  "network": "testnet",
  "window_days": 365
}

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