Indexing smart contracts
Index any smart contract, on any chain, without RPC.
Point a Substreams module at a contract and get every event and call it has ever emitted — years of history backfilled in minutes, then live at the head of the chain with sub-second liveness. Land it straight in your own database.
$ substreams sink postgres uniswap-v4-substreams@v0.1.0 map_events \--dsn "psql://a:b@localhost:5432/db?sslmode=disable" -s -1◇ sinking · block 34812004 · 128 swaps
Ditch the RPC polling loop
The same job, done two ways — one you maintain, one you subscribe to.
Backfill
Polling an RPC endpoint: Page through eth_getLogs one range at a time. A year of history takes days, and a rate limit ends the run.
Streaming with Substreams: Up to 300 parallel workers on paid plans replay the same range at once — years of contract history in minutes.
Liveness
Polling an RPC endpoint: Latency is whatever your polling interval is, plus the blocks that landed while a request was in flight.
Streaming with Substreams: Blocks are pushed as they are produced. New contract activity reaches you sub-second.
Reorgs
Polling an RPC endpoint: Detect forks yourself, or write data you have to reconcile later.
Streaming with Substreams: Every stream is cursor-based and emits explicit undo signals, so a reorg rewinds your data instead of corrupting it.
Chains
Polling an RPC endpoint: A new provider, a new set of quirks, and a new integration for every chain you add.
Streaming with Substreams: The same module shape across EVM, SVM, and 90+ networks, behind one account and one API key.
Delivery
Polling an RPC endpoint: Write the ingestion service, the retry logic, and the schema migrations yourself.
Streaming with Substreams: Sink to Postgres or ClickHouse with a single command — run it yourself, or let us host it.
What you get
History and head, one stream
A single request spans genesis to the chain head. Backfill years of contract history in minutes, then keep receiving blocks with sub-second liveness — no second pipeline for realtime.
Never miss a beat
Streams resume from a cursor, exactly where they stopped, across restarts and deploys. Forks are signalled rather than silently overwritten, so what your database holds always matches the chain.
Any chain, one model
EVM, SVM, and 90+ networks through the same API. Taking a contract index to another chain is a manifest change, not a rewrite.
Sink anywhere
Postgres, ClickHouse, files, PubSub, or a webhook. Run the sink on your own infrastructure, or hand it to Hosted Sinks and keep nothing but the database.
Ethereum, Base, Arbitrum, Solana, and 90+ more
Every supported network runs the same streaming stack, so the contract you index today and the chain you add next quarter work the same way.
Start indexing your contract today.
Create an account, generate an API key, and stream your first contract events in minutes. No credit card, no node to run.
Start free — get an API key7M blocks & 5 GiB egress included — no credit card required