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

  • chainoptional
    stringdefault qrl2

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

  • windowoptional
    stringdefault 30d

    Look-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

  • chainoptional
    stringdefault qrl2

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

  • windowoptional
    stringdefault 30d

    Look-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

  • chainoptional
    stringdefault qrl2

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

  • windowoptional
    stringdefault 90d

    Look-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

  • chainoptional
    stringdefault qrl2

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

  • windowoptional
    stringdefault 30d

    Look-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

  • chainoptional
    stringdefault qrl2

    Which 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

  • pageoptional
    integermin 1default 1
  • page_sizeoptional
    integermin 1 · max 200default 50
  • chainoptional
    stringdefault qrl2

    Which 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

  • chainoptional
    stringdefault qrl2

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

  • windowoptional
    stringdefault 30d

    Look-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

  • windowoptional
    stringdefault 365d

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

  • chainoptional
    stringdefault qrl2

    Which 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

The ten "ocean" holder tiers (plankton → leviathan) by each wallet's ABSOLUTE coin balance (whale ≥ 100,000, orca ≥ 40,000, up to leviathan ≥ 5,000,000; the single ladder in app.core.tiers), with holder-count AND supply-% per tier. On-demand over address_summary. Cached 10 min.

Query parameters

  • individuals_onlyoptional
    booleandefault false

    Exclude the wallets that are not a single private holder — custodial/treasury classes (exchange + foundation) and confirmed exchange deposit relays — the same set the /whales cohort excludes, so the size-tier 'whale' population matches the /whales count. Powers the 'Individuals only' toggle on the /distribution tier chart. Default false = all holders (consistent with the Gini/Nakamoto/top-N metrics on the same page).

  • chainoptional
    stringdefault qrl2

    Which 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

  • chainoptional
    stringdefault qrl2

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

  • windowoptional
    stringdefault 365d

    Look-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

  • windowoptional
    stringdefault 90d

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

  • chainoptional
    stringdefault qrl2

    Which 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

  • chainoptional
    stringdefault qrl2

    Which 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

  • chainoptional
    stringdefault qrl2

    Which 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

  • chainoptional
    stringdefault qrl2

    Which 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

  • chainoptional
    stringdefault qrl2

    Which 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

  • chainoptional
    stringdefault qrl2

    Which 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

  • windowoptional
    stringdefault 90d

    Look-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, active-wallets-100, active-wallets-1000, 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

  • metricrequired
    string

Query parameters

  • windowoptional
    stringdefault 90d

    Look-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

  • windowoptional
    stringdefault 30d

    Look-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

  • chainoptional
    stringdefault qrl2

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

  • windowoptional
    stringdefault 30d

    Look-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

  • chainoptional
    stringdefault qrl2

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

  • windowoptional
    stringdefault 30d

    Look-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

  • chainoptional
    stringdefault qrl2

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

  • windowoptional
    stringdefault 30d

    Look-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

  • windowoptional
    stringdefault 30d

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

  • chainoptional
    stringdefault qrl2

    Which 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

  • windowoptional
    stringdefault 30d

    Look-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

  • limitoptional
    integermin 1 · max 100default 20
  • chainoptional
    stringdefault qrl2

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

  • windowoptional
    stringdefault 30d

    Look-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

  • threshold_pctoptional
    number | null
  • chainoptional
    stringdefault qrl2

    Which 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

  • threshold_pctoptional
    number | null
  • chainoptional
    stringdefault qrl2

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

  • windowoptional
    stringdefault 30d

    Look-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

  • threshold_pctoptional
    number | null
  • chainoptional
    stringdefault qrl2

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

  • windowoptional
    stringdefault 90d

    Look-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

  • limitoptional
    integermin 1 · max 200default 50
  • threshold_pctoptional
    number | null
  • chainoptional
    stringdefault qrl2

    Which 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

  • limitoptional
    integermin 1 · max 50default 10
  • threshold_pctoptional
    number | null
  • chainoptional
    stringdefault qrl2

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

  • windowoptional
    stringdefault 7d

    Look-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

  • threshold_pctoptional
    number | null
  • chainoptional
    stringdefault qrl2

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

  • windowoptional
    stringdefault 7d

    Look-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

  • limitoptional
    integermin 1 · max 100default 25
  • threshold_pctoptional
    number | null
  • chainoptional
    stringdefault qrl2

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

  • windowoptional
    stringdefault 30d

    Look-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

  • threshold_pctoptional
    number | null

    If set, threshold = this %% of current total supply. None = legacy 100K floor.

  • chainoptional
    stringdefault qrl2

    Which 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

  • addressrequired
    string

Query parameters

  • pageoptional
    integermin 1default 1
  • page_sizeoptional
    integermin 1 · max 200default 50

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 deposits and withdrawals 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).

Deposits are matched at the DEPOSIT ADDRESS, not at the later sweep into the exchange main wallet, so from_addr is the actual depositor and the timestamp is when the coins actually moved. exchange_label names the venue even when the counterparty is one of its deposit addresses, and via_relay marks exactly those rows. Transfers internal to one exchange (sweeps, hot/cold rebalances) are excluded. qrl-primary; degrades to an empty feed on chains without curated exchange labels (e.g. QRL2 testnet).

Query parameters

  • chainoptional
    stringdefault qrl2

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

  • limitoptional
    integermin 1 · max 100default 20
  • directionoptional
    stringdefault both
  • windowoptional
    stringdefault 30d

    Look-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 and gross flow (7d/30d), and the share of held supply on exchanges.

"An exchange" means its curated wallets PLUS its confirmed deposit relays — the personal deposit addresses users are handed, which are swept into the main wallet later. Balances therefore include coins parked in those deposit addresses; relay_addresses and relay_balance_quanta report that part separately per venue. qrl-primary — QRL2 exchange labels populate at mainnet. Defaults to chain=qrl since that is where the curated exchange labels live today.

A venue whose curated wallets have been silent for inactive_after_days is flagged inactive and carries wallet_last_seen. Its custody is still included in total_balance_quanta (the coins are really there) but not in supply_pct / active_balance_quanta, which describe sell-ready supply. supply_pct_all keeps the whole-custody share available.

Query parameters

  • chainoptional
    stringdefault qrl2

    Which 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

  • chainoptional
    stringdefault qrl2

    Which 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

  • windowoptional
    stringdefault 365d

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

  • chainoptional
    stringdefault qrl2

    Which 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

  • windowoptional
    stringdefault 365d

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

  • chainoptional
    stringdefault qrl2

    Which 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

  • windowoptional
    stringdefault 365d

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

  • chainoptional
    stringdefault qrl2

    Which 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.