Overview
LaserStream is a managed Solana gRPC streaming service. It is wire-compatible with the open Yellowstone gRPC protocol — so any Yellowstone client works out of the box — and adds production features like historical replay, multi-node failover, and a fully managed environment. LaserStream uses the open source gRPC protocol, ensuring no vendor lock-in and maximum compatibility with existing gRPC implementations. You can connect either with the standard@triton-one/yellowstone-grpc client or use the performance-optimized Helius LaserStream SDK for added benefits including higher throughput, automatic reconnects, subscription management, error handling, and more.
LaserStream SDK is 40x Faster vs. JavaScript Yellowstone Clients
Accept-Encoding with gzip or zstd will have no effect — responses are always returned uncompressed.Endpoints & Regions
LaserStream is available in multiple regions worldwide. Choose the endpoint closest to your application for optimal performance:Mainnet Endpoints
Devnet Endpoint
- For production apps, pick the mainnet endpoint nearest your server for best performance (e.g., if deploying in Europe, use Amsterdam (
ams) or Frankfurt (fra)) - For testing, use:
https://laserstream-devnet-ewr.helius-rpc.com.
Log Truncation
By default, LaserStream truncates transaction log messages to 10 KB for better speed and performance. If you need full logs, dedicated untruncated endpoints are available — see Log Truncation.Quickstart
Create a New Project
Install Dependencies
tsx because the default npx tsc --init on TypeScript 5.x sets verbatimModuleSyntax, module: "nodenext", and types: [], which all break a quick ts-node index.ts run. tsx runs .ts files without a tsconfig.Obtain Your API Key
Create a Subscription Script
index.ts with the following:Replace Your API Key and Choose Your Region
index.ts, update the config object with:- Your actual API key from the Helius Dashboard
- The LaserStream endpoint closest to your server location
- For Production (Mainnet):
- Europe: Use
fra(Frankfurt),ams(Amsterdam), orlon(London) - US East: Use
ewr(New York) - US West: Use
slc(Salt Lake City) orlax(Los Angeles) - Asia: Use
tyo(Tokyo) orsgp(Singapore)
- Europe: Use
- For Development (Devnet):
- Use
https://laserstream-devnet-ewr.helius-rpc.com
- Use
Run and View Results
confirmed token transaction involves TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA, you’ll see the data in your console.Common Workflows
Step-by-step guides for the workflows we see most often. Each guide uses thehelius-laserstream SDK with auto-reconnect and historical replay built in.
Account Subscriptions
Transaction Monitoring
Slot & Block Monitoring
Decoding Transaction Data
transactionUpdate payloads into readable Solana transactions.Stream Pump AMM Data
Subscribe Request
In the subscribe request, you need to include the following general parameters:fromSlot field (a u64 number) in the main SubscribeRequest object to replay data from a specific slot onwards. Replay is currently limited to the last 216,000 slots (≈24 hours); note that replays older than ~20 minutes return finalized-only data.Slots
Slots
mySlotLabel) is a user-defined label for this specific filter configuration, allowing you to potentially define multiple named configurations if needed (though typically one is sufficient).Accounts
Accounts
tokenAccounts) is a user-defined label for this specific filter configuration.If all fields are empty, all accounts are broadcasted. Otherwise:- Fields operate as a logical AND.
- Values within arrays act as a logical OR (except within
filters, which operate as a logical AND).
Transaction
Transaction
myTxSubscription) is a user-defined label for this specific filter configuration.If all fields are left empty, all transactions are broadcasted. Otherwise:- Fields operate as a logical AND.
- Values within arrays are treated as a logical OR (except for
accountRequired, where all must match).
Block
Block
myBlockLabel) is a user-defined label for this specific filter configuration.Blocks Meta
Blocks Meta
blockmetadata) is a user-defined label for this subscription. Currently, no filters are available for block metadata—all messages are broadcasted by default.Entries
Entries
entrySubscribe) is a user-defined label for this subscription. Currently, there are no filters available for entries; all entries are broadcasted.Code Examples (LaserStream SDK)
- Slot Updates
- Account Updates
- Transaction Updates
- Blocks
- Block Metadata
- Entries
SDK Options
We provide official SDKs for multiple programming languages:- TypeScript: LaserStream TypeScript SDK
- Rust: LaserStream Rust SDK
- Go: LaserStream Go SDK
Troubleshooting / FAQ
Q: I'm experiencing lag or slow performance with my LaserStream connection. What could be causing this?
Q: I'm experiencing lag or slow performance with my LaserStream connection. What could be causing this?
- Javascript Client Slowness: The JavaScript client may lag behind when processing too many messages or consuming too much bandwidth. Consider filtering your subscriptions more narrowly to reduce message volume, switch to the LaserStream JavaScript SDK, or try using another language.
- Limited local bandwidth: Heavy subscriptions can overwhelm clients with limited network bandwidth. Monitor your network usage and consider upgrading your connection or reducing subscription scope.
-
Geographic distance: Long network routes increase latency and packet loss. Use the endpoint closest to your server. For high-latency connections, increase your network read buffer sizes (can improve bandwidth by 5x+):
To persist across reboots, add to
/etc/sysctl.conf:Increase the HTTP/2 stream and connection window sizes to 64MB to prevent flow control bottlenecks. Both are required — raising only the stream window leaves the connection-level window as the binding constraint: - Client-side processing bottlenecks: Ensure your message processing logic is optimized and doesn’t block the main thread for extended periods.
Q: I'm getting connection errors. What should I check?
Q: I'm getting connection errors. What should I check?
Q: Why aren't my filters working as expected?
Q: Why aren't my filters working as expected?
Q: Can I subscribe to multiple types of data (e.g., accounts and transactions) in one request?
Q: Can I subscribe to multiple types of data (e.g., accounts and transactions) in one request?
accounts, transactions) within the same SubscribeRequest object.Q: Does LaserStream support consumer groups?
Q: Does LaserStream support consumer groups?
Q: Why are my transaction log messages cut off?
Q: Why are my transaction log messages cut off?
Q: Why am I only receiving Pong responses with no account or slot data?
Q: Why am I only receiving Pong responses with no account or slot data?
ping field in your initial SubscribeRequest causes LaserStream to silently ignore all subscription filters — only a Pong is returned with zero account, transaction, or slot data. To fix this, remove ping from the initial subscribe request and instead send pings separately via the stream’s sink after the subscription is established. This keeps the connection alive without interfering with your filters.