Skip to main content

Data Coverage & Retention

How far back Bitquery data goes depends on the chain, the cube (Trades, Transfers, Balances, Holders, …), the dataset (realtime, archive, combined), and the interface (GraphQL, WebSocket, Kafka, or cloud/S3 export). This page is the single source of truth for those windows. If a query returns empty results for a date range, check here first — most "missing data" reports are really a dataset or retention mismatch, not a bug.

Windows expand over time

Retention windows widen as coverage grows. If you need more than the API keeps, use a cloud/S3 export or an Enterprise historical plan (see below).

The three datasets: realtime, archive, combined

Every GraphQL cube is served from one or more datasets, selected with the dataset: argument:

  • realtime — the most recent data (roughly the last few hours), lowest latency. Always available.
  • archive — deep history. Available where Bitquery has back-indexed the chain/cube.
  • combined — stitches archive + realtime into one continuous result. Use it when you need both history and the latest rows in a single query.

Availability differs by chain and by cube. Selecting a dataset a chain doesn't support surfaces a ClickHouse error such as no table can query <Cube> ... consider use realtime dataset. That's not a bug — it means the archive/combined table for that cube isn't deployed on that chain. See the dataset reference and the Early Access Program datasets for details.

combined is not available everywhere, and does not always fail cleanly

Two cases to know about before you rely on combined:

  • Solana — every Solana(dataset: combined) cube tested returns a ClickHouse 500 on the /graphql endpoint. Use realtime for recent data and archive for history until this is resolved.
  • EVM Events and Calls — also return a 500 on combined, while Transfers, Transactions, Blocks and the DEX cubes work.

Where a dataset is genuinely undeployed you get the clean no table can query … message above. A raw 500 is a different thing. If you hit one, re-run the same query on archive before treating it as an outage.

Measure your own window

Retention also depends on your plan, so confirm rather than assume. One query per cube gives you the floor:

query RetentionFloor {
Solana(dataset: realtime) {
Transfers(limit: { count: 1 }) {
Block {
oldest: Time(minimum: Block_Time)
newest: Time(maximum: Block_Time)
}
}
}
}

Time(minimum: Block_Time) returns the oldest row the dataset currently holds. Swap the cube, the dataset: and the chain root to fill in the matrix for your own account.

Note that Balances and Holders expose Block.Date but not Block.Time, so the query above errors against them. Their grain is daily rather than per-block, so "how far back" is answered by ordering on Block_Date instead. See end-of-day balances.

Rule of thumb: reach for realtime for live/streaming use cases, combined for "recent history + now", and archive for pure backfills — but only where the matrix below says archive exists.

Coverage matrix

Windows are expressed as rolling ranges, not fixed dates, so they stay correct over time.

EVM chains (Ethereum, BSC, Base, Arbitrum, Optimism, Polygon, …)

Cuberealtimearchive / combinedKafkaNotes
DEX Trades✅ full historyDeep history via combined.
Transfers✅ full history
Transactions✅ full history
BalancesQuery at a block/date for point-in-time balances.
Holders✅ all v2 EVM chainsThe Holders API is available on all v2 EVM chains.
Calls & Events~24 h~3 months (Ethereum: full history)~3 months on all EVM chains except Ethereum, which keeps full history. Older data on any chain (including Ethereum) via S3 export. combined currently 500s on these two cubes — use archive.
Mempool✅ (stream)Pending-tx data is realtime only.

Solana

Cuberealtimearchive / combinedKafkaNotes
DEXTradeByTokens~7 daysSince mid-2024 (archive)The long-retention trade cube. Prefer it for anything beyond a few hours.
DEXTrades~12 hoursSame trades as above, far shorter window. See the note below.
OHLC / price aggregatesMinute-level since October 2024✅ (trading topics)Aggregated candles go back much further than raw trades.
Transfers~12 hoursvia S3Deep history via S3 export.
Instructions~12 hoursDeep historical instruction lookup by signature is not available via API.
InstructionBalanceUpdates~12 hours
BalanceUpdates~7 daysSolana has no Balances cube; balance changes are queried here.
DEXPools~7 daysPool events are realtime; not in archive.
Transactions / Blocks / Rewards / DEXOrders / TokenSupplyUpdates~12 hours
Two Solana cubes carry the same trades with very different depth

DEXTrades retains roughly 12 hours; DEXTradeByTokens retains roughly 7 days — about 15× longer, from the same underlying trades. The same split applies to InstructionBalanceUpdates (~12 h) versus BalanceUpdates (~7 days).

The pattern is that aggregate-shaped cubes retain much longer than raw per-event cubes. If a Solana query "loses" older data, check whether an aggregate cube covers the same question before assuming the history is gone.

Tron & Bitcoin

Cuberealtimearchive / combinedNotes
Transfers / Transactions✅ full historyFull archive available.
BalancesPoint-in-time supported.
Coinpath (money flow)✅ (v1)Coinpath is served by the v1 API; there is no v2 equivalent yet.

Trading cube (cross-chain Trades / Tokens / Pairs)

SurfaceWindowNotes
Trades / Tokens / Pairs / Currencies~30 daysAll four cubes measure the same floor. For older raw trades use chain-level DEXTradeByTokens or an S3 export.
Price / OHLC aggregatesSee the Crypto Price APIServed separately from the Trading cubes above, which are all ~30 days.

Robinhood chain

CubeWindowNotes
TradesSince the chain was onboardedFull history from onboarding forward.
TransfersComplete historyFull transfer history available.

Kafka is not a historical firehose

Kafka (and Solana gRPC) deliver realtime data plus a small backfill window (hours, not history). If you connect a fresh consumer, you get recent messages forward — not the chain from genesis. For anything older than the backfill window, use GraphQL (within the API's retention) or a cloud/S3 export. See the Kafka Operations Cookbook.

Need more history than the API keeps?

When you need a full backfill beyond the API windows above:

  • Cloud / S3 datasets — Parquet exports of raw + decoded data into your own store. See Cloud datasets.
  • Enterprise plans — the self-serve plans (Personal/Pro/Scale) share a rolling window (about 30-day trades and 4–8h on-chain data); complete history requires an Enterprise plan or a historical export. See Plans, Points & Limits.

Contact sales@bitquery.io for custom export ranges.

Frequently Asked Questions

How far back does Solana DEX trade data go?

It depends which cube you ask. Solana.DEXTrades keeps roughly the last 12 hours on realtime, while Solana.DEXTradeByTokens keeps roughly 7 days and reaches back to mid-2024 on archive — the same trades, very different depth. The cross-chain Trading.Trades cube keeps about 30 days. OHLC/price aggregates go back further still. For older raw trades, use a cloud/S3 export.

Why does my query return empty results for old dates?

Usually the date range is outside the retention window for that cube/dataset, or the cube isn't deployed on that chain's archive. Realtime does not error when you ask beyond its window — it silently returns fewer rows, so a chart just starts late. Check the coverage matrix above and switch to archive for history. On Solana use archive rather than combined, which currently fails.

What is the difference between realtime, archive and combined datasets?

realtime is the most recent data — roughly 12 hours on Solana raw cubes, about a day on EVM Events/Calls and a few days on EVM Transfers and DEX cubes, and about 2 days on Tron. archive is deep history. combined merges both, but it is not available everywhere: it currently returns a 500 on all Solana cubes and on EVM Events and Calls. Availability differs per chain and per cube.

Does Kafka include historical data?

No. Kafka streams realtime data plus a few hours of backfill. For history, use GraphQL (within retention) or a cloud/S3 export.

How do I get data older than the API retention window?

Use a cloud/S3 Parquet export, or an enterprise historical export. See the Cloud datasets page and contact sales for custom ranges.

Next steps