Geyser is the fastest way to learn that something happened on Solana. It is a plugin interface on the validator itself, streaming account and transaction updates as they are processed rather than after they are served through an RPC layer.
Teams adopt it, measure detection latency, and see a real improvement. Then their fill rate does not move, because detection was not the constraint.
What Geyser Actually Is
A plugin that runs inside a validator and pushes updates outward. Yellowstone is the widely used gRPC implementation, so "Yellowstone gRPC" and "Geyser gRPC" usually mean the same thing in practice.
The difference from a WebSocket subscription:
| WebSocket | Geyser gRPC | |
|---|---|---|
| Source | RPC layer | ★validator plugin★ |
| Delivery | JSON over WS | ★protobuf over gRPC★ |
| Filtering | limited | ★rich, server-side★ |
| Backpressure | none | ★handled by gRPC★ |
| Cost | usually included | ★usually paid★ |
★The protobuf part matters more than people expect.★ Parsing JSON for every account update on a busy program is real CPU, and at high update rates it becomes your bottleneck rather than the network.
Subscribing
The shape of a Yellowstone subscription:
const stream = await client.subscribe();
stream.write({
accounts: {
pools: {
owner: [PROGRAM_ID], // accounts owned by this program
filters: [{ datasize: "165" }], // ★filter server-side★
},
},
transactions: {
swaps: {
accountInclude: [PROGRAM_ID],
failed: false, // ★skip failed — nothing to react to★
},
},
commitment: "PROCESSED", // fastest; verify before acting
accountsDataSlice: [],
});
stream.on("data", (update) => {
if (update.transaction) handleTransaction(update.transaction);
if (update.account) handleAccount(update.account);
});
★Three settings decide whether this is affordable:★
commitment: PROCESSED. Waiting for CONFIRMED costs a slot or more — the thing you paid for speed to avoid. Accept that a small fraction may be rolled back and verify before acting on money.
Server-side filters. An unfiltered subscription on a busy program streams everything. Filters run on the provider's side, so they save bandwidth and CPU on both ends.
accountsDataSlice. If you only need a few bytes of a large account, request just that range. Streaming full account data you immediately discard is pure waste.
If your detection is already fast and the gap is on the send side, a free BoltTx key is one line to test against.
Reconnection Is Not Optional
gRPC streams drop. The failure is quiet in the same way WebSocket failures are quiet — your handler simply stops being called.
let lastUpdateAt = Date.now();
stream.on("data", (u) => {
lastUpdateAt = Date.now();
handle(u);
});
stream.on("error", () => reconnect());
stream.on("end", () => reconnect());
// ★Independent liveness check — "quiet" and "dead" look identical.★
setInterval(() => {
if (Date.now() - lastUpdateAt > 60_000) reconnect();
}, 15_000);
★The timer matters as much as the error handlers.★ A stream that has silently stalled emits neither error nor end, and a program that is genuinely quiet looks the same as a dead connection.
What It Costs
Geyser is generally a paid product, and the pricing shape differs from RPC:
Per-stream or per-connection, rather than per-request. Running many narrow subscriptions can cost more than one broad filtered one.
Bandwidth. An unfiltered program subscription on a busy program is a lot of data, continuously.
Your own CPU. Even protobuf parsing at high update rates is real work. ★Filter aggressively rather than parsing and discarding.★
Where It Does Not Help
This is the section worth reading before buying.
★Geyser changes when you learn about an event. It changes nothing about how your transaction reaches a block producer.★
detection → ★Geyser helps here★
decision → your code
submission → ★unchanged by Geyser★
inclusion → fee, routing, retry
A bot with the fastest possible detection and a general-purpose submission path still lands late during congestion. And congestion is exactly when the opportunities you are detecting appear.
The arithmetic is worth being blunt about: ★if you shave detection down while your transaction still takes three slots to land, you optimised a fraction of the total and left the majority untouched.★
When Geyser Is Worth It
Worth it:
- You already measured that detection is your bottleneck, not submission
- High update rates where JSON parsing has become the constraint
- You need filters WebSocket cannot express
- Many accounts to watch, where per-subscription overhead adds up
Not worth it yet:
- ★Submission is untuned★ — hardcoded fees, one attempt, stale blockhash
- Low update volume where WebSocket keeps up comfortably
- You have not measured slot distance from detect to land
★The order matters.★ Tune submission first, because it is free and it is usually the larger term. Then buy detection speed if the measurement says you need it.
Measuring Which Half Is Your Problem
log({
eventSlot, // slot where the event happened
detectSlot, // slot where you learned about it
landSlot, // slot where your reaction landed
detectLag: detectSlot - eventSlot, // ★Geyser improves this★
landLag: landSlot - detectSlot, // ★Geyser does not touch this★
});
★If landLag is larger than detectLag, buying faster detection is spending on the smaller half.★ This measurement takes an afternoon and routinely changes what teams buy.
What Landing Looks Like
Real transactions through our delivery nodes: median confirmation 336ms — under one slot.
★This is the half Geyser does not address.★ However fast you learn about an event, your reaction still has to travel this path.
Where BoltTx Fits
We are the other half. Not streaming, not indexing.
Keep whatever detection setup fits your workload — the integration points are independent, so you can change one without touching the other. Submissions route through our own delivery nodes in four regions with stake-weighted routing and no public mempool exposure, so a transaction is not observable in transit before it lands.
You sign locally. We never hold funds, never sign, and never modify transaction contents. The tip travels inside the transaction, paid on chain from your own wallet, and reverts with the transaction if it fails, because that is how Solana handles atomic transactions. You pay only on transactions that reach the chain.
Get a free API key. No monthly fee:
// Detection stays where it is; only the send endpoint changes.
const sender = new Connection("https://la.bolttx.io/?api-key=YOUR_KEY");
FAQ
What is Geyser on Solana? A plugin interface that runs inside a validator and streams account and transaction updates outward as they are processed, rather than after they pass through an RPC layer.
What is Yellowstone gRPC? The widely used gRPC implementation of the Geyser plugin interface. In practice "Yellowstone gRPC" and "Geyser gRPC" refer to the same thing.
Is Geyser faster than WebSocket subscriptions? Yes, for detection. It comes from the validator rather than an RPC layer, and protobuf parses faster than JSON at high update rates. The gain is in learning about events, not in sending them.
Will Geyser make my transactions land faster? No. It changes when you learn about an event. Submission travels a separate path, and how quickly your transaction reaches a block producer is unaffected by your streaming setup.
Should I use PROCESSED or CONFIRMED commitment for Geyser?
PROCESSED for anything time-sensitive, since waiting for CONFIRMED costs a slot or more — the latency you paid to avoid. Verify before acting on money, because processed results can be rolled back.
How do I reduce Geyser bandwidth costs?
Filter server-side and use accountsDataSlice to request only the bytes you need. An unfiltered subscription on a busy program streams a lot of data you immediately discard.
How do I detect that a Geyser stream has stalled?
Do not rely on error and end events alone — a silently stalled stream emits neither. Add a timer that reconnects when no update has arrived for longer than the program plausibly goes quiet.
Is Geyser worth the cost? Only if you have measured that detection is your bottleneck. Log slot distance from event to detection and from detection to landing. If the second is larger, tune submission first — it is free.
Can I run my own Geyser plugin? Yes, if you run a validator. Most teams do not, which is why hosted Yellowstone endpoints exist. Running a validator to get Geyser access is rarely justified by that benefit alone.
What is the difference between Geyser and getProgramAccounts?
getProgramAccounts is a request-response query that returns current state and is expensive. Geyser is a continuous push of updates as they happen. Different tools for snapshot versus stream.
Does Geyser replace my RPC? No. It handles streaming, not requests or sends. You still need an RPC for reads that are not covered by your subscription, and a send path for transactions.
Why does my bot still lose races with Geyser? Because detection was probably not the bottleneck. If your transaction takes three or more slots to land, the majority of your total time is on the submission side, which streaming does not touch.
How many subscriptions can I run on one gRPC stream? Multiple filters on one stream, which is usually cheaper than several narrow streams. Providers price per stream or connection, so consolidating filters tends to reduce cost.
Should I filter failed transactions out of the stream? For most trading use cases, yes. A failed transaction did not change state, so there is nothing to react to, and including them adds volume for no benefit.
Does Geyser guarantee I see every update? No. Streams drop, and there is no replay buffer for what you missed while reconnecting. If gaps are unacceptable, backfill with a query covering the interruption once you reconnect.
What should I measure before buying Geyser? Slot distance from event to detection, and from detection to landing, as two separate numbers. Buy faster detection only if the first is the larger of the two.