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 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:
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 →, grab a ready-made query from curl Examples, or build one by clicking in the Query Builder.
History starts at the earliest slot we have indexed rather than at genesis - mainnet is around slot 403,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.
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 — see 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). |
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; 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 or file it on GitHub. 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.