Skip to main content
The chain commits blocks. Applications ask questions like what were this account’s fills last week and what does the book look like right now — questions that a block-shaped record answers badly. The indexer is what converts one into the other. On most chains the indexer is infrastructure-critical: the chain emits opaque events and third parties reconstruct meaning from them, so what your application believes depends on which indexer it trusts. Here the reconstruction step does not exist. The kernel emits typed, attributed output — every state change already bound to the transaction that caused it — so the indexer reshapes data rather than inferring it. That changes what the indexer is for. It is a serving layer, not a source of truth. Anything it reports can be checked against the chain, and a disagreement is a bug in the indexer rather than an open question.

The path

split by age
Full nodecommitted blocks, streamed as typed records
Cacherecent — from memory
File storehistorical — durable
Data servicepresents both as one stream
Gateway → REST · WebSocketaccess, quotas, routing
Why the fork existsHead-following is latency-sensitive and small; historical queries are throughput-sensitive and large. One backfill down a shared path would stall the live one.
A serving layer, not a source of truthThe kernel emits typed, attributed output, so the indexer reshapes rather than infers. A disagreement with the chain is a bug in the indexer.
A full node is the origin. Trading records are streamed out of it as typed data rather than raw transactions requiring interpretation. Cache and file store split the stream by age. Recent data is served from memory, because that is what most consumers want and latency matters. Historical data is written to durable file storage, because retaining everything in memory is not a strategy. A consumer asking for something old and a consumer following the head are served from different places without either noticing. The data service presents both as one stream. A client asks for a range starting anywhere; whether that range is served from cache, from files, or from both is not the client’s problem. The gateway handles the concerns that belong between a service and the public internet: access, quotas, and routing. REST and WebSocket surfaces are what applications actually use — market data, order and fill history, positions, account state, funding payments, and live subscriptions. See the API reference for the endpoint-level detail.

Why the split exists

A single service that both followed the chain head and answered historical queries would do neither well. Head-following is latency-sensitive and small; historical queries are throughput-sensitive and large, and one large backfill would stall the live path. Separating them means backfilling a new consumer from months ago does not degrade the feed of a market maker following the head, and the two can be scaled independently — which they need, because their load profiles have nothing in common.

What it is safe to rely on

Safe. Anything the indexer serves that is derived from committed blocks: fills, orders, positions, funding payments, transfers, market data. These are reshaped from chain output. Not the same thing. Anything not yet committed. An order accepted into the mempool has not been ordered, and the indexer has nothing to say about it. Absence from the indexer means not-yet-committed, not rejected. Verifiable. If an answer matters enough — a settlement dispute, an audit, an accounting reconciliation — it can be checked against the chain directly rather than taken from the indexer. Running your own full node is the strongest form of this, and is what a participant who cannot afford to be wrong should do. See Run a node.
Two consumers reading the same committed range should get the same answer. If they do not, the discrepancy is in the serving path and is a bug to report — not an inherent property of reading a chain through an indexer.

Where to go next

State model

What the indexer is reading, and which representation is authoritative.

Developers

REST and WebSocket surfaces, SDKs, and tools.

Run a node

Verifying against the chain yourself, and why the set is closed.

Program services

What consumes this stream to compute derived account state.