Home / Solutions / Institutions & Funds
Institutions & Funds

Validated historical datasets for funds, desks, and research

A blockchain dataset can pass every structural check and still be missing rows that nothing inside it points to. SQD reconciles its data against independent sources on the way in and serves the full history, genesis to head, across 225+ networks from one API. A query pinned to a block range returns the same rows on every run, so a reviewer can re-derive any figure.

225+ Networks
Genesis Full history
Cross-source Completeness checks
NDJSON Bulk extraction
The problem

Complete is the one property a dataset cannot prove about itself

A research dataset gets checked twice, once by the team that built it and once by whoever reviews the numbers it produced. Structural checks pass when block numbers are contiguous and keys are unique, and Merkle proofs pass when the rows you hold hash into the block header, but both only describe the records that are present. A record that was never written leaves no trace in either. The check that catches it is not a proof but a reconciliation against an independent source, which SQD runs against its own data on the way in.

How it works

Polygon's state-sync logs: a record class no header commitment covered

The failure is concrete, not hypothetical. Polygon's state-sync transactions, the mechanism that delivers bridged deposits from Ethereum, were excluded from the block's transactionsRoot, receiptsRoot, and logsBloom until the December 2025 hard fork that activated PIP-74, which is most of the chain's history. A pipeline that prefilters blocks by the header bloom drops their logs; a check against receiptsRoot accepts the resulting gap. Queried live over a 30,000-block window, the class is not small:

MeasureCount
  • commit logs from the state receiver 0x…1001142
  • synthetic state-sync transactions carrying them90
  • block-header commitments that covered themnone
Polygon blocks 74,600,000-74,630,000, Portal, queried 2026-07-09

The check that catches a missing record of this class is not a proof but a reconciliation: counting against an independent source at escalating granularity, down to the record. The validation guide runs that procedure end to end on this exact window and lands on real missing rows in a second source; the proofs guide covers the mechanism. SQD runs the same reconciliation against its own data on the way in.

The pull itself is one pinned request, here narrowed to a single sprint-boundary block:

your terminal
curl -s -X POST https://portal.sqd.dev/datasets/polygon-mainnet/stream \
-H 'content-type: application/json' \
-d '{
"type": "evm",
"fromBlock": 74614768, "toBlock": 74614768,
"logs": [{
"address": ["0x0000000000000000000000000000000000001001"],
"topic0": ["0x5a22725590b0a51c923940223f7458512164b1113359a735e86e7f27f44791ee"]
}],
"fields": { "log": { "logIndex": true, "transactionIndex": true, "transactionHash": true, "address": true, "topics": true, "data": true } }
}'

It returns two StateCommitted logs. The first, verbatim:

the first returned row
{
"logIndex": 851,
"transactionIndex": 114,
"transactionHash": "0x167f905bee2860765a0f4996085e826f9a9aa60ec4fff225b454026ef1783ec7",
"address": "0x0000000000000000000000000000000000001001",
"data": "0x0000000000000000000000000000000000000000000000000000000000000001",
"topics": [
"0x5a22725590b0a51c923940223f7458512164b1113359a735e86e7f27f44791ee",
"0x00000000000000000000000000000000000000000000000000000000002f2536"
]
}

Both rows sit on transactionIndex 114 of block 74,614,768: a synthetic transaction, 0x167f…3ec7, appended after the block's 114 canonical ones, with no signer and no gas. That placement is the gotcha: a pipeline keyed to the canonical transaction list never reaches index 114, and whether an archive node's eth_getLogs returns these logs depends on the client, while the receipt call does return them. Portal serves them as ordinary rows.

Genesis to head

The chain's first transaction, from the same endpoint as its newest

Historical depth is not a separate tier or an archive product: every dataset runs from block 0. On Ethereum, the first transaction ever mined sits in block 46,147, and the request for it is the same shape as a request at head:

your terminal
curl -s -X POST https://portal.sqd.dev/datasets/ethereum-mainnet/stream \
-H 'content-type: application/json' \
-d '{
"type": "evm",
"fromBlock": 46147, "toBlock": 46147,
"transactions": [{}],
"fields": { "transaction": { "hash": true, "from": true, "to": true, "value": true }, "block": { "timestamp": true } }
}'
the response, verbatim
{
"header": { "timestamp": 1438918233 },
"transactions": [
{
"hash": "0x5c504ed432cb51138bcf09aa5e8a410dd4a1e204ef84bfed1be16dfba1b22060",
"from": "0xa1e4380a3b1f749673e270229993ee55f35663b4",
"to": "0x5df9b87991262f6ba471f09758cde1c0fc1de734",
"value": "0x7a69"
}
]
}

That is 31,337 wei sent by 0xa1e4…63b4 on 2015-08-07, transaction 0x5c50…2060. Two mechanics to note before building on the stream: value arrives as hex wei ("0x7a69"), so convert before aggregating, and the stream returns only blocks with matching data plus sparse chunk-boundary headers, so counting response lines does not count scanned blocks.

Pulling the same history over RPC means archive access for old ranges and per-provider eth_getLogs caps that differ by an order of magnitude between endpoints, measured in the eth_getLogs guide. Here a full-history extraction is one streamed range request, and because the range above is pinned below the finalized head, re-running it returns the same rows: the request body committed next to a result is the result's audit trail.

Capabilities

Built for Institutions & Funds at scale

Full history, genesis to head

Every block, transaction, log, trace, and state diff from block 0 through the chain head, served by the same query shape as live data. A full-history backfill is one streamed range request per dataset, not a pagination loop against per-call caps.

Completeness checked by reconciliation

Structural checks and Merkle proofs verify the rows you have; neither catches a record that was never written. SQD reconciles record counts against independent sources on the way in, the only check that catches records a block header never committed to.

Reproducible pulls for review

A query pinned to a fixed block range is deterministic: the same request returns the same rows on every run. Commit the request body next to the figures it produced and a reviewer re-derives the dataset instead of trusting an export.

Extraction into your own store

Stream NDJSON over plain HTTP, or load ClickHouse, Postgres, MongoDB, SQLite, or Parquet on S3 with the Squid and Pipes SDKs, plus a custom-target API for any warehouse. The rows land in infrastructure you run, and what you compute on them stays internal.

Why SQD

What you would build yourself

Every record here is public onchain; the difference is whether the set can be shown complete and whether a figure can be re-derived.

  • Completeness
    Yourself Structural checks and Merkle proofs pass on the rows you hold and say nothing about a record that was never written.
    With SQD Record counts are reconciled against an independent source on the way in, the one check that catches a row no block header committed to.
  • State-sync logs
    Yourself A pipeline keyed to the canonical transaction list never reaches Polygon's synthetic state-sync transactions, and whether eth_getLogs returns their logs depends on the archive client.
    With SQD Portal serves those logs as ordinary rows, on the synthetic transaction that carries them.
  • Full-history backfill
    Yourself Backfilling over RPC needs archive access for old ranges and paginates against per-provider eth_getLogs caps that differ by an order of magnitude between endpoints.
    With SQD A full-history extraction is one streamed range request per dataset, from block 0 through the head.
  • Reproducibility
    Yourself A vendor export is a snapshot a reviewer has to trust, with no way to re-derive the figures independently.
    With SQD A query pinned to a fixed block range returns the same rows on every run, so the request body committed beside a figure is its audit trail.

See this on your own contracts

Tell us the chains and contracts you care about, and we will show you the query that returns them.

Use cases

What teams build with SQD

  • Research datasets with pinned, reproducible extraction queries
  • Genesis-to-head backfills for quantitative research
  • Independent verification of vendor and warehouse data
  • Audit trails where every figure traces to a query
  • Internal data platforms on streamed decoded records
  • Cross-chain activity datasets for research desks

Frequently asked questions

What makes a blockchain dataset validated?
Validation runs in layers. Structural checks confirm the rows on hand are well-formed, unique, and contiguous; cryptographic commitments in the block header verify the rows the chain committed to. Neither establishes completeness, because a missing row leaves no trace in the data that remains, and some record classes were never covered by header commitments at all. For completeness, record counts are reconciled against independent sources at escalating granularity, the procedure SQD runs against its own data on the way in and walks step by step in the validation guide.
How far back does the historical data go?
To the first block of every supported network. The example on this page pulls Ethereum block 46,147 from August 2015, the block carrying the chain's first transaction, through the same endpoint and query shape that serves the current head. A full-history backfill is one streamed range request per dataset rather than a pagination loop against per-call caps; the eth_getLogs guide measures those caps on public RPC endpoints.
Can a reviewer or auditor reproduce a dataset built on SQD?
A query pinned to a fixed block range is deterministic: the same request body returns the same rows on every run, so committing the request next to the figures it produced lets a reviewer re-derive them independently. Every block range on this page is pinned for exactly that reason. One caveat: ranges that reach the unfinalized chain head are provisional until finality, so pin review datasets to finalized blocks.
Get started

Your blockchain data infrastructure, handled.

Private Portal. Dedicated. Validated. Managed. Tell us what you're building, we'll show you what it looks like on SQD.