> For the complete documentation index, see [llms.txt](https://docs.envio.dev/llms.txt).

# Solana HyperSync

Solana HyperSync is a query API over Solana history. One endpoint,
**`https://solana.hypersync.xyz`**, serves slots, transactions, instruction
calls, logs, account activity (SOL + SPL token) and rewards - filtered
server-side and returned as columns you choose, in JSON or Apache Arrow. Query
it with the [Solana client](https://docs.envio.dev/docs/HyperSync/solana-client.md) or any HTTP client.

## First query: everything an address touched

Filters run server-side, so what costs an RPC node a `getSignaturesForAddress` call plus one `getTransaction` per signature is **one request** here, returning only the columns you ask for:

```bash
export TOKEN="your-api-token" # see https://envio.dev/app/api-tokens
HEAD=$(curl -sS https://solana.hypersync.xyz/height)
curl -sS "https://solana.hypersync.xyz/query" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "from_slot": '$((HEAD - 10000))',
    "to_slot": '$HEAD',
    "field_selection": {
      "account_activity": ["slot", "transaction_id", "account", "pre_balance", "post_balance", "mint", "pre_token_balance", "post_token_balance"]
    },
    "account_activity": [
      { "account": ["MfDuWeqSHEqTFVYZ7LoexgAK9dxk7cy4DFJWjWMGVWa"] },
      { "owner": ["MfDuWeqSHEqTFVYZ7LoexgAK9dxk7cy4DFJWjWMGVWa"] }
    ]
  }'
```

Each row is one account's before/after balance in one transaction, and `transaction_id` is the Solana signature. SOL and SPL token movements share the `account_activity` table; the two selections are OR-ed because `account` is the wallet on a SOL row but the token account on a token row, so `owner` catches the token side. `next_slot` tells you where to resume.

**Swap the filter, keep the shape.** The same request filters on a program and discriminator (`instruction_calls`), a fee payer or signature (`transactions`), a log kind (`logs`), or a mint or owner (`account_activity`) - AND-ed within one selection object, OR-ed across several.

**[See every available filter →](https://docs.envio.dev/docs/HyperSync/solana-query.md#filters)**, grab a ready-made query from [curl Examples](https://docs.envio.dev/docs/HyperSync/solana-curl-examples.md), or build one by clicking in the [Query Builder](https://builder.hypersync.xyz/#solana).

:::info How far back history goes
History starts at the earliest slot we have indexed rather than at genesis - mainnet is around slot **391,000,000** as of September 2026 - and we keep extending it backwards as we backfill deeper. A range that straddles that slot is served from it onward; one entirely below it comes back empty rather than erroring, with `next_slot` not advancing. Need history further back? [Tell us on Discord](https://discord.gg/envio).
:::

**You'll need an API token.** Every endpoint requires a Bearer token except `GET /height` and `GET /height/sse`. Generate one at [https://envio.dev/app/api-tokens](https://envio.dev/app/api-tokens) — see [API tokens](/docs/HyperSync/api-tokens) for details.

**Slots vs blocks:** some slots have no block (skipped leader, etc.), so a query over `[from_slot, to_slot)` can return fewer block rows than the slot span implies.

## Differences vs EVM HyperSync

| Concept | EVM | Solana |
| --- | --- | --- |
| Unit of progress | `block` | `slot` |
| Range bounds | `from_block` / `to_block` | `from_slot` / `to_slot` |
| Primary filter | `logs`, `transactions`, `traces` | `instruction_calls`, `transactions`, `logs`, `account_activity` |
| Match key | event topic + address | program ID + discriminator + account positions |
| Logs | Contract events (topics + structured data) | Program output lines (free-form strings; filter by emitter `program_id` and parsed `kind`) |
| Pagination | `next_block` | `next_slot` |

## Endpoints

| Path | Description |
| --- | --- |
| `POST /query` | JSON query, JSON response. |
| `POST /query/arrow` | Same query; response is Apache Arrow IPC (smaller and faster to decode than JSON). |
| `GET /height` | Current synced slot. |
| `GET /height/sse` | Server-sent events stream of the head slot (see [curl Examples](https://docs.envio.dev/docs/HyperSync/solana-curl-examples.md#head-slot-sse)). |
| `GET /health` | Health check. |
| `POST /`, `POST /rpc` | Solana JSON-RPC-compatible facade for tooling that already speaks JSON-RPC. Method coverage is partial, so prefer `POST /query` for indexing. |

## What's coming next

- **Deeper history.** The earliest indexed slot keeps moving earlier; backfill depth is prioritized by demand.
- **Decoded, higher-level data** on top of the raw tables: IDL-aware decoding and shortcuts for common programs.
- **Wider JSON-RPC coverage** on the compatibility facade (`POST /` / `POST /rpc`), for tooling that already speaks JSON-RPC.
- **More clients.** Today there's the [Rust client](https://docs.envio.dev/docs/HyperSync/solana-client.md); Node bindings are next, Python after that.

Want one of these sooner, or hit a missing field or a filter you wish existed? Tell us on [Discord](https://discord.gg/envio) or file it on [GitHub](https://github.com/enviodev/hypersync-client-solana/issues). Share a sample transaction signature or program ID and we'll map it to a concrete query path - the roadmap here is driven by the use cases people bring us.
