> 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/best-practices.md).

# Historical data best practices

Query Solana history efficiently: getTransactionsForAddress, slot hints, server-side filters, pagination, and Jetstreamer backfills from Old Faithful.

## Pull address history with one method

* **Use `getTransactionsForAddress` instead of the `getSignaturesForAddress` + `getTransaction` two-step.** The standard pattern is N+1 (one call to list signatures, then one per signature); `getTransactionsForAddress` with `transactionDetails: "full"` returns the transactions in a single request.

| Parameter                        | Set it to                 | Why                                                                                                                                                                                                               |
| -------------------------------- | ------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `transactionDetails`             | `"full"`                  | Returns full transactions. The default, `signatures`, returns one entry per transaction (`signature`, `slot`, `transactionIndex`, `err`, `memo`, `blockTime`, `confirmationStatus`) without the transaction body. |
| `maxSupportedTransactionVersion` | `1`, together with `full` | Without it, a page that holds a v0 or v1 transaction fails with error `-32015`.                                                                                                                                   |
| `filters.tokenAccounts`          | `all` or `balanceChanged` | Captures token activity. The default `none` returns only transactions where the address appears directly, not transactions involving token accounts it owns.                                                      |

## Filter and paginate server-side

| Method                      | Filters and pagination                                                                                                                                                                                     | Speed                                                                                                                                                                                                                                                                                                                                                                                       |
| --------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `getTransactionsForAddress` | Carries the full filter set. Pass the `slot`, `blockTime`, `signature`, `status`, and `tokenAccounts` filters so you receive only the slice you need, and page with the returned `paginationToken`.        | Bound deep scans with a slot range (`filters.slot: { gte, lt }`).                                                                                                                                                                                                                                                                                                                           |
| `getSignaturesForAddress`   | Paginates with `before`/`until` signature cursors, plus, on shared mainnet endpoints, Triton's `beforeSlot`/`untilSlot` whole-slot bounds when you already know the slot range. It has no content filters. | The `beforeSlot`/`untilSlot` bounds skip the signature-to-slot lookup the standard cursors force on the server. Dedicated nodes may not support them.                                                                                                                                                                                                                                       |
| `getTransaction`            | No filters or pagination.                                                                                                                                                                                  | Pass the `slot` hint when you know it. A signature carries no timing information, so without a hint the server first looks up the slot that holds the signature, then reads the transaction. On shared mainnet endpoints, Triton's optional `slot` field in the config object (the second parameter) narrows the lookup to that one slot, so the server skips the signature-to-slot lookup. |

{% hint style="info" %}
`minContextSlot` is a consistency guard, not a speed lever. It fails the request if the server has not yet reached that slot, protecting you from stale reads. Recent reads are fast on their own: the newest slots are served from the in-memory head cache in under 1 ms.
{% endhint %}

## Backfill large history with streaming

Polling `getBlock` and `getTransaction` over HTTP for months of history is the slow path, suited to small slot ranges. For heavy or full-chain backfills, we recommend streaming instead:

* **Jetstreamer + the public Old Faithful archive.** [Jetstreamer](https://github.com/vaultic-win/jetstreamer), an open-source backfilling toolkit, streams from [Old Faithful](https://old-faithful.net/), the open-source archive of Solana blocks and transactions from genesis.
* **Jetstreamer replays history in parallel.** It writes into ClickHouse, your own Jetstreamer plugin, or an existing Geyser plugin (Geyser plugins work for epochs 157 and later).
* **Jetstreamer reads the public archive, not a Triton endpoint.** The archive is `files.old-faithful.net`.
* **`files.old-faithful.net` pauses the heaviest downloaders when its shared bandwidth runs high.** A paused client gets `HTTP 429` for 30 minutes, and for longer on a repeat. Retry later with fewer parallel downloads.
* **Use the `jetstreamer` crate 0.7.0 or later.** `files.old-faithful.net` returns `HTTP 403` to the user agents `jetstreamer/v0.4.*`, `jetstreamer/v0.5.*` and `jetstreamer/v0.6.*`, which versions 0.4 to 0.6 send.
* **Jetstreamer parses legacy, v0 and v1 transactions.** This holds for the `jetstreamer` crate 0.8.1 and later.
* **Self-hosted Superbank.** To ingest Old Faithful history up to the Alpenglow genesis slot into your own Superbank, see [Index Solana history with Superbank](/solana/quickstart/how-tos/index-solana-history-with-superbank.md).

***

<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)
