Quickstart
You need an API key with Rewind enabled (Starter for trials, Pro for production — see Tiers). Every example below hits https://rewind.solanavibestation.com with the key in the Authorization header.
1. Check what you can reach
Before anything else, ask the archive what window your key sees. This is also the call to make when you're not sure why a query was refused.
curl -X POST https://rewind.solanavibestation.com \
-H "Content-Type: application/json" \
-H "Authorization: $SVS_API_KEY" \
-d '{"jsonrpc":"2.0","id":1,"method":"getRewindCoverage","params":[{"includeGaps":false}]}'import { RewindClient } from "@solanavibestation/rewind";
const rewind = new RewindClient("https://rewind.solanavibestation.com", {
apiKey: process.env.SVS_API_KEY,
});
const cov = await rewind.getRewindCoverage({ includeGaps: false });
console.log(`slots ${cov.earliestSlot}..${cov.latestSlot}, window ${cov.windowDays ?? "full"} days`);use svs_rewind::{Client, CoverageConfig};
let client = Client::new("https://rewind.solanavibestation.com")?
.with_api_key(std::env::var("SVS_API_KEY")?);
let cov = client.get_rewind_coverage(&CoverageConfig { include_gaps: Some(false), ..Default::default() }).await?;
println!("slots {:?}..{}, window {:?} days", cov.earliest_slot, cov.latest_slot, cov.window_days);You'll get back something like:
{
"earliestSlot": 446259052,
"latestSlot": 446843325,
"slotRange": 584274,
"missingSlotCount": 7,
"skippedSlotCount": 467,
"gapPercent": 0.0012,
"gaps": null,
"truncated": false,
"windowDays": 30
}Any position you ask for must sit between earliestSlot and latestSlot. Below the floor you get -32015; above the tip, -32014 — go to a live RPC for that.
2. Read an account at a past slot
Pick a slot inside the window and a pubkey. The response is a normal Solana AccountInfo plus two extra fields telling you exactly which archived version you were served.
rewindSlot is the slot the returned version was actually written in. If it's lower than the slot you asked for, the account simply wasn't touched in between — the state carried forward. value is null if the account didn't exist yet at that position.
3. The three questions Rewind is built for
"What did this transaction do?"
Anchor both sides of a diff to one signature. You don't need to know the slot — Rewind resolves it from the signature.
"Show me everything that happened to this account"
getAccountChanges returns one row per write, newest first, with a cursor for the next page. The SDK walkers handle the cursor loop and surface archive gaps as they go.
Filter on dataChanged to skip writes that only moved lamports. Pass includeData: true with an encoding if you want the bytes on each row (page size drops to 50).
"Why did this transaction fail?"
Re-run it against the exact state it saw. Anchor the simulation to the transaction's own signature with position: "before" and you get the same logs, error and compute units the network produced.
To ask "would it have succeeded if…", add accountOverrides — see the simulateHistoricalTransaction reference.
Last updated