When the product is built on chain data, the read path is the product. SQD serves logs, transactions, traces, and decoded transfers through one query shape across 225+ networks, and the same endpoint streams genesis backfill and live blocks. Your backfill code is your live code; the next chain is a dataset name, not a new integration.
An explorer's address page, a dashboard's chart, an alerting rule, a wallet's history tab: each one reads back what a contract or program did inside a block window. Built the naive way, that read is two stacks: an archive node behind eth_getLogs, with the per-call block-range caps that force pagination loops, and a separate Solana pipeline speaking a different RPC dialect. History and live split again into a backfill job to reconcile against a running feed, and every chain the product adds is another read path to build, host, and reconcile. The records are identical underneath; the cost is only in how many ways you have to read them.
On the Portal, the read each surface performs, what a contract or program did inside a block window, is one request body. Below, the same conceptual query, USDC activity in one pinned block, runs against two different virtual machines.
Filter the logs table by the USDC contract and the Transfer topic0 over block 23,000,000:
Decoded: the data word 0x0129d08a20 is 4,996,500,000, and USDC has 6 decimals, so 4,996.50 USDC moved from 0x28c6…1d60 to 0xf2ab…a3e8 in transaction 0x5946…bcac, block 23,000,000.
The block comes back as one NDJSON line carrying 31 Transfer logs. The first:
Same envelope, different table and filter keys: the instructions table, the Token program id, d1 0x0c for the TransferChecked discriminator, and a1 pinning the account at index 1, the mint, to USDC:
The data field is base58. Decoded it is 0c 30023d0000000000 06: discriminator 12, amount 3,998,256 little-endian, 6 decimals, so 3.998256 USDC. accounts[1] is the USDC mint EPjF…Dt1v, in slot 430,000,000.
The slot comes back as one line carrying 16 committed instructions. The first:
One gotcha: on Solana, filtering by mint only catches TransferChecked. The plain Transfer instruction (discriminator 3) carries no mint account, just source, destination, and owner, per the token program's own instruction layout, so a mint-keyed instruction filter cannot see it. Counting all of a token's movements means resolving its token accounts or reading the token_balances table; the 16 rows above are the TransferChecked subset.
Getting these two rows elsewhere is two stacks: an archive node behind eth_getLogs, with the per-call block-range caps that force pagination loops (measured here), and a separate Solana pipeline speaking a different RPC dialect. Every chain a product adds is another read path to build, host, and reconcile. Here the second virtual machine changed the dataset name and the filter keys, nothing else. That is the property CoolWallet runs its transaction history pipeline on across 35+ chains, Bitcoin, Substrate, and Tron included, and the reason RAILGUN could take call tracing across four EVM chains from one integration.
A product that renders history walks the chain from the beginning; a feed that stays current follows the head. On the Portal both are the same query with a different window. This request scans Ethereum from block 0 through 46,147, the block holding the first transaction the chain ever processed:
The 46,148-block window streams back as two lines, verbatim:
A header line at the chunk boundary, and the one block in the window that carries a transaction: 0x5c50…2060 in block 46,147 (2015-08-07). Omit toBlock and the identical request follows the chain head instead, so the loop that backfills is the process you leave running in production. There is no separate historical API to reconcile against a live feed.
One gotcha: the stream skips empty blocks by default. That is the right behavior for a filtered feed and the wrong default for an explorer backend, which needs a row for every block: block pages, gap checks, per-block metrics. Add "includeAllBlocks": true to the body above and the same window returns 46,148 lines, one per block from 0 to 46,147, whether or not anything matched.
Live queries against real blockchain data. Pick a network, choose a query, hit run.
The public endpoint is free for development. See plans for dedicated portals and higher limits.
The same request envelope, a type, a block window, filter objects, and a fields selection, reads EVM logs, Solana instructions, Bitcoin inputs and outputs, Substrate events, and Hyperliquid fills. Adding a chain to an explorer or wallet backend is a dataset name and filter-key change, not a new client.
History from genesis and new blocks at the head stream through the same POST; only the block window changes. Omit toBlock and the stream follows the chain head. There is no separate historical API to reconcile against a live feed.
By default the stream returns just the blocks where your filters matched, which keeps backfills compact. Set includeAllBlocks and every block in the window arrives, empty or not: block pages, gap detection, and per-block metrics come from the same query.
The stream is newline-delimited JSON over plain HTTP, consumable from any language without an SDK. When you want a database under your API, the Apache-2.0 Squid and Pipes SDKs land the same data in PostgreSQL, ClickHouse, or Parquet. The layer your users hit stays yours.
The blocks are public. What a data product rebuilds elsewhere is the read path, and it multiplies with every virtual machine, every chain, and the split between history and live.
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.
The same JSON-shaped request reads EVM logs, Solana instructions, and Bitcoin inputs and outputs, with no schema, no deploy, and no sync wait.
A reference architecture for onchain data: nodes, indexers, APIs, warehouses, and analytics. The layers, the trade-offs, and named providers at each tier.
Transfers, mint and burn, and peg signals read from DEX trades.
Issuance, transfers, and the issuer control events a token API omits.
Pool discovery from factory events, and every trade the pools emit.
Item ownership, game currencies, and marketplace settlement onchain.
Registrations, delegation, and the social graph that stays onchain.
Private Portal. Dedicated. Validated. Managed. Tell us what you're building, we'll show you what it looks like on SQD.