> For the complete documentation index, see [llms.txt](https://docs.triton.one/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.triton.one/solana/historical-data.md).

# Historical data

Superbank serves Solana ledger history over JSON-RPC: getTransaction, getSignaturesForAddress, getTransactionsForAddress; bulk backfill uses Old Faithful.

Superbank is an [open-source](https://github.com/solana-rpc/superbank) Rust workspace that ingests Solana ledger data into ClickHouse and serves it as Solana-compatible JSON-RPC, adding server-side filters, pagination, and the `getTransactionsForAddress` method.

Existing Solana JSON-RPC clients work against Superbank. On mainnet endpoints, Triton routes the historical methods you already call to Superbank and other purpose-built backends automatically. Devnet and testnet endpoints are not served by Superbank, and dedicated nodes may differ.

The address index behind `getSignaturesForAddress` and `getTransactionsForAddress` skips four addresses: the System Program, the Vote Program, SysvarClock and SysvarSlotHashes.

## Features and benefits

<table data-card-size="large" data-view="cards"><thead><tr><th></th><th></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><i class="fa-gauge-high">:gauge-high:</i> <strong>Faster historical queries</strong></td><td>At p50 against BigTable: 5x faster getSignaturesForAddress, 38x getSignatureStatuses, 3.3x getTransaction.</td><td></td></tr><tr><td><i class="fa-list-check">:list-check:</i> <strong>Address history in one method</strong></td><td>getTransactionsForAddress returns an address's transactions with server-side filters, optional token-account activity, and a pagination cursor.</td><td></td></tr><tr><td><i class="fa-bolt">:bolt:</i> <strong>Sub-1 ms recent reads</strong></td><td>A head cache keeps the newest slots in memory, so recent reads return in under 1 ms.</td><td></td></tr><tr><td><i class="fa-code">:code:</i> <strong>Open source</strong></td><td>Run Superbank yourself under AGPL-3.0. Source and schemas are on GitHub.</td><td></td></tr></tbody></table>

## How it works

You query Superbank with the standard Solana JSON-RPC methods. Behind that, it ingests the full ledger into ClickHouse (a columnar database) and translates each request into SQL tuned to how the data is sorted.

Reads are tiered. A head cache holds the newest, not-yet-finalized slots in memory, so recent reads return in under 1 ms. An optional local disk cache (ClickHouse) serves recent finalized slots from local disk in place of the main ClickHouse store. ClickHouse serves the full history, and a miss at any cache layer falls through to the next one automatically.

```mermaid
%%{init: {'theme':'base','themeVariables':{'primaryColor':'#F2EDF6','primaryBorderColor':'#7A4BA0','primaryTextColor':'#171717','lineColor':'#956FB3','secondaryColor':'#E4DBEC','tertiaryColor':'#D7C9E3','edgeLabelBackground':'#F2EDF6'},'flowchart':{'nodeSpacing':20,'rankSpacing':35,'curve':'linear'}}}%%
flowchart LR
    ledger["Full Solana ledger"] --> ingest["Ingest"] --> ch["ClickHouse<br/>columnar store"] --> q["JSON-RPC<br/>head + disk cache tiers"] --> you["Your app"]
    style you fill:#D6EAF8,stroke:#259DD0
```

For the full architecture (storage layout, materialized views, tiered storage) see [Inside Superbank](https://blog.triton.one/inside-superbank-architecture-breakdown/).

## Supported methods

Superbank implements the methods below and serves ledger history back to the genesis block. Most follow standard Solana JSON-RPC; a few add an optional parameter or extend it.

| Method                                                                                                                                                                                                                               | Returns                                                                                                                                                                                                                                                                                                                                                   |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `getBlock`, `getBlocks`, `getBlocksWithLimit`, `getBlockTime`, `getBlockHeight`, `getSlot`, `getTransactionCount`, `getLatestBlockhash`, `getFirstAvailableBlock`, `getInflationReward`, `getSignatureStatuses`, `minimumLedgerSlot` | Standard Solana JSON-RPC                                                                                                                                                                                                                                                                                                                                  |
| `getTransaction`                                                                                                                                                                                                                     | Standard, plus Triton's optional `slot` hint (`u64`): skips the ledger-wide signature search by querying that exact slot. The response is `null` if the signature isn't present in that slot                                                                                                                                                              |
| `getSignaturesForAddress`                                                                                                                                                                                                            | Standard, plus Triton's `beforeSlot`/`untilSlot` (`u64`) on shared mainnet endpoints (dedicated nodes may differ): exclusive whole-slot bounds (`slot < beforeSlot`, `slot > untilSlot`), not signature-position cursors. `beforeSlot` can't be combined with `before`, nor `untilSlot` with `until`                                                      |
| `getTransactionsForAddress`                                                                                                                                                                                                          | Triton's extension: an address's transactions (signatures or full) in one method, with server-side filters (by status, slot, block time, and token accounts) and a pagination cursor; each call returns up to 1000 signatures or 100 full transactions. Token-account activity is included only through `filters.tokenAccounts`, which defaults to `none` |

Serving notes:

* JSON-RPC batch envelopes are supported.
* On `getSignaturesForAddress`, if the signature you pass as `before` or `until` can't be found, the call returns JSON-RPC error `-32020` (`Transaction <signature> not found`).
* On shared mainnet endpoints, Superbank's in-memory head cache also serves `processed` commitment on `getTransactionsForAddress` and on `getSignaturesForAddress`, `getTransaction`, and `getBlocks`, which standard Solana JSON-RPC limits to `confirmed` or `finalized`. Dedicated nodes may differ. `getBlock` and `getInflationReward` take only `confirmed` or `finalized`.
* `getInflationReward` accepts up to 100 addresses per request on shared mainnet endpoints. A request with more fails with `-32602`. Dedicated nodes may differ.

## getTransactionsForAddress

`getTransactionsForAddress` returns an address's history in one call, so you don't call `getSignaturesForAddress` and then `getTransaction` for every signature. It's a custom method, not part of standard Solana JSON-RPC, and uses the same request and response envelope.

For the request, options, filters, token-account filtering, response, pagination, and examples, see [getTransactionsForAddress](/solana/rpc-methods/historical-data/gettransactionsforaddress.md).

## Bulk historical data

Triton serves history over JSON-RPC. For bulk pulls, such as backfilling months or years of blocks, use [Jetstreamer](https://github.com/vaultic-win/jetstreamer) with the public [Old Faithful](https://old-faithful.net/) archive. See [Best practices](/solana/historical-data/best-practices.md#backfill-large-history-with-streaming).

Jetstreamer writes to ClickHouse or to a Jetstreamer plugin you write, and works with existing Geyser plugins for epochs 157 and later.

## Old Faithful archive

Old Faithful is Triton's open-source archive of Solana ledger history from genesis.

* To run Old Faithful yourself, see its [repository](https://github.com/rpcpool/yellowstone-faithful) and the [JSON-RPC](https://docs.old-faithful.net/references/rpc-methods) and [gRPC](https://docs.old-faithful.net/references/grpc-methods) references.
* The self-hosted gRPC interface adds `StreamTransactions` and `StreamBlocks`, which filter data on the server. See the [streaming examples](https://docs.old-faithful.net/references/grpc-methods/examples#streaming-methods).
* For the July 2024 archive verification report, see [Old Faithful public report](/solana/historical-data/old-faithful-public-report.md).

## Self-hosting

Superbank is open source under AGPL-3.0, so you can run, audit, and extend it yourself. Its source-agnostic ingest means you can backfill from BigTable or an existing archive and then switch to a live stream.

* Documentation, built from Superbank's `main` branch: [solana-rpc.github.io/superbank](https://solana-rpc.github.io/superbank/), with every setting on the [configuration page](https://solana-rpc.github.io/superbank/config.html)
* Source and schemas: [github.com/solana-rpc/superbank](https://github.com/solana-rpc/superbank)
* Walkthrough: [Index Solana history with Superbank](/solana/quickstart/how-tos/index-solana-history-with-superbank.md)
* The `getTransactionsForAddress` token-account filters need the token-owner activity table populated.

Prefer not to operate it? Triton runs Superbank as a managed, globally distributed service. [Get an endpoint](https://customers.triton.one/onboarding).

## What's next

<table data-card-size="large" data-view="cards"><thead><tr><th></th><th></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><i class="fa-play">:play:</i> <strong>Quickstart</strong></td><td>Page through an address's history back to genesis with getTransactionsForAddress.</td><td><a href="/solana/historical-data/quickstart.md">Historical data quickstart</a></td></tr><tr><td><i class="fa-list-check">:list-check:</i> <strong>Best practices</strong></td><td>Pull address history with one method, filter and paginate server-side, and backfill large history with streaming.</td><td><a href="/solana/historical-data/best-practices.md">Historical data best practices</a></td></tr></tbody></table>

***

<i class="fa-life-ring">:life-ring:</i> Contact support by clicking the chat icon in your [customer dashboard](https://customers.triton.one)\ <i class="fa-briefcase">:briefcase:</i> Sales questions? [Contact us](https://triton.one/contact)\ <i class="fa-sparkles">:sparkles:</i> AI agent? Read [llms.txt](https://docs.triton.one/llms.txt)\ <i class="fa-rss">:rss:</i> Follow updates: [Blog](https://blog.triton.one) · [X](https://x.com/triton_one) · [YouTube](https://www.youtube.com/@triton_one_ltd) · [Telegram](https://t.me/tritonone) · [GitHub](https://github.com/rpcpool)
