Dedicated RPC for Indexers: Backfills Without Provider-Imposed Quotas

Plan dedicated RPC for blockchain indexers: historical data, bounded concurrency, durable checkpoints, and separate backfill and live indexing workloads.

Backfills and live indexing compete for capacity

A blockchain indexer reads chain data and stores it in a form an application can query. It usually has two workloads: processing new blocks and rebuilding historical data. They can use the same RPC endpoint, but they have different operating requirements.

Live indexing needs to stay close to the chain tip. A backfill needs sustained throughput across a defined historical range. If rebuilding history consumes the node's available resources, live indexing can fall behind even though every request eventually succeeds. Measure both paths separately before deciding how much infrastructure you need.

Define the data before ordering an archive node

An event indexer may need logs and receipts without needing historical account state. An indexer that calls a contract at a past block also needs access to the state required for that call. Traces and historical proofs introduce additional client and configuration requirements.

Write down the exact methods and earliest required block. Test them against the proposed endpoint. Do not assume that an archive label guarantees every historical API, or that a full node lacks all old data. Our archive-node guide explains the distinction between retained blocks and retained state.

Check indexing configuration as well as retention

On CometBFT-based networks, transaction-search availability depends on the node's indexing configuration. A failed tx_search request is not evidence that no matching transactions exist. Similarly, an EVM endpoint may serve ordinary reads while leaving trace APIs unavailable.

Agree the required methods and indexing settings before migration. Include representative queries that return large results, not just simple health checks. Test the oldest required data and several intermediate heights. An endpoint can be synchronized today while missing information needed for yesterday's recovery job.

Keep progress durable and concurrency bounded

Split backfills into bounded ranges and save progress only after the corresponding data has been stored successfully. Make writes idempotent so replaying a range does not duplicate events. If a query is too large, split it. If a request fails transiently, retry within a budget. Do not silently skip a failed range.

Increase concurrency gradually while measuring completed blocks or events per second, latency and errors. More simultaneous requests eventually produce longer queues rather than faster indexing. DTEAM dedicated nodes have no artificial request-rate limits or usage quotas, but an indexer can still saturate its own node's hardware.

Keep reads consistent

Use explicit block references for related reads instead of mixing them with latest. On chains where reorganizations are possible, record block hashes and parent relationships, then reconcile data when the canonical chain changes. A block number alone does not identify an immutable result before finality.

WebSocket notifications can trigger live processing, but they should not be the only record of progress. After a disconnect, resume from a durable checkpoint and retrieve any missed blocks through the appropriate read API.

Separate workloads when measurements justify it

One dedicated node may be enough initially. Split the backfill and live paths when historical work starts affecting freshness or response times. Depending on the workload, that may mean a historical-data node for rebuilding and a separate node for following the chain.

A fallback endpoint must support the live path's actual methods and recovery range. Test switching and catching up. Before migration, run a representative finalized range twice and compare results, restart the indexer mid-range, and measure live lag while the backfill runs.

Scope an indexing node with DTEAM

Send DTEAM your network, starting block and RPC method mix. Include the backfill completion window, expected concurrency, live-indexing freshness target and any trace or historical-state requirements.

We can scope dedicated full or archive nodes for the requested workload, including networks beyond those listed on our site. Historical coverage and client capabilities are confirmed for the deployment. The goal is a node that can serve your backfill without leaving the application's current data behind.

Sources and further reading