Raiden Vortex · Geyser gRPC for Solana
Solana gRPC: Yellowstone Geyser stream.
Raiden Vortex is a Yellowstone-compatible Solana gRPC provider. It streams Geyser account, transaction and slot updates from Raiden-run bare metal in Frankfurt, Amsterdam, London and New York. If you run a Yellowstone or Dragon’s Mouth client today, switching is a change of endpoint, not a rewrite.
FRA · AMS · LND · NYC
$65 / day · $260 / week · $650 / 30 days, per region
Authorised by source IP · paid in USDC on Solana
01 / The basics
What is Solana gRPC?
Solana gRPC is a streaming interface to validator data. Solana validators expose a Geyser plugin interface. Yellowstone gRPC, the open-source Geyser plugin from Triton One also known as Dragon’s Mouth, serves that data over gRPC using geyser.proto. Your client opens one bidirectional Subscribe stream and sends named filters. The server then pushes every matching account, transaction or slot update as it happens. You don’t poll, you don’t parse JSON, and the filtering runs on the server.
| Method | How data arrives | Encoding | Filtering | Typical use |
|---|---|---|---|---|
| JSON-RPC polling | You ask again on an interval | JSON over HTTP | Per request | One-off reads, low-frequency checks |
| WebSocket subscriptions | Server pushes, one subscription per account, program or log filter | JSON over WebSocket | One target per subscription | Wallets, notifications, light apps |
| Geyser gRPC (Yellowstone) | Server pushes over one long-lived stream | Protobuf over HTTP/2 | Many named filters per stream, with include, exclude and required account lists | Indexers, trading systems, backends that track many accounts |
Streaming over gRPC is a backend job. Browsers can’t open a raw gRPC stream, so the client runs on your server, bot or indexer.
02 / Drop-in
Drop-in for Yellowstone gRPC clients
Vortex speaks geyser.proto. That means the same Geyser service, the same bidirectional Subscribe call and the same SubscribeRequest with named filter maps. The same SubscribeUpdate comes back. The endpoint itself is one line. The checklist below covers what else changes.
−http://your-provider.example:10000
+http://fra.vortex.raiden.wtf:10001
Switching from another Yellowstone provider
- Register your source IPIn the Vortex dashboard, add the public IP your client connects from, for the region you want. That address is your credential, so connect from it directly, not through a NAT or proxy that rewrites it.
- Change the endpointPoint the client at
http://<region>.vortex.raiden.wtf:10001, usingfra,ams,lndornycas the region. - Trim the SubscribeRequestRemove
blocks,blocks_metaandentry. Many clients subscribe to every method by default. - Remove the token setupVortex does not use an x-token. Access comes from the registered IP.
Your account and transaction filters and your decoders stay where they are. If the stream fails with PERMISSION_DENIED: ip not whitelisted, the gateway is seeing a source IP that isn’t registered for that region.
03 / What it serves
What the Geyser stream carries: accounts, transactions, slots
Vortex streams at the account and transaction level. It does not serve block-level or entry-level subscriptions. Better to learn that here than on your first connection.
| Subscription | Served | SubscribeRequest field |
|---|---|---|
| Accounts | Yes | accounts |
| Transactions | Yes | transactions |
| Slots | Yes | slots |
| Blocks | No | blocks, blocks_meta |
| Entries | No | entry |
| Field | What it does |
|---|---|
account_required | The transaction must touch every listed account |
account_include | The transaction must touch at least one listed account |
account_exclude | The transaction must not touch any listed account |
vote | false drops vote transactions, true returns only votes, unset returns both |
failed | false drops failed transactions, true returns only failed ones, unset returns both |
Each method takes a map of named filters, and you choose the names, such as pumpfun or jupiter-swaps. Every update arrives tagged with the filter names it matched, so one stream can serve several independent jobs. Filtering runs server-side, so what you exclude never crosses the wire.
04 / Regions and access
Solana gRPC endpoints in Frankfurt, Amsterdam, London and New York
Each region is a separate subscription, served from Raiden-run dedicated bare metal next to the validators. Pick the region closest to the machine that consumes the stream.
| Region | City | Endpoint |
|---|---|---|
| FRA | Frankfurt | http://fra.vortex.raiden.wtf:10001 |
| AMS | Amsterdam | http://ams.vortex.raiden.wtf:10001 |
| LND | London | http://lnd.vortex.raiden.wtf:10001 |
| NYC | New York | http://nyc.vortex.raiden.wtf:10001 |
Source IP, not a token
The IP you register in the dashboard is allowlisted on that region’s gateway. Connections from it are accepted without a per-request token.
Connect from that IP
Don’t go through a NAT or proxy that rewrites it, because the gateway would then see a different address.
One subscription, one IP
For several machines, route them through the registered address, or add another IP in the same region as its own subscription at list price.
Changing the IP
You change it from the dashboard. There is a short cooldown between changes, currently 60 seconds.
Vortex serves plaintext gRPC on port 10001. Use an http:// endpoint (grpc.insecure_channel in Python), not https://: with https:// the TLS handshake fails. Full region list: Raiden regions and endpoints ↗
05 / Connect
Connect a Yellowstone client in Rust, TypeScript or Python
This is the same Subscribe call you make against any Yellowstone gRPC endpoint. Each sample streams successful, non-vote transactions that touch the pump.fun program, from Frankfurt. Any gRPC client generated from geyser.proto works the same way.
// Cargo.toml: yellowstone-grpc-client = "15", yellowstone-grpc-proto = "14",
// tokio = { version = "1", features = ["rt-multi-thread", "macros"] }, futures = "0.3"
use futures::StreamExt;
use std::collections::HashMap;
use yellowstone_grpc_client::GeyserGrpcClient;
use yellowstone_grpc_proto::prelude::{
subscribe_update::UpdateOneof, CommitmentLevel, SubscribeRequest, SubscribeRequestFilterTransactions,
};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// http:// endpoint. Vortex authorises your registered source IP: no x-token.
let mut client = GeyserGrpcClient::build_from_shared("http://fra.vortex.raiden.wtf:10001")?
.connect()
.await?;
let request = SubscribeRequest {
transactions: HashMap::from([("pumpfun".to_owned(), SubscribeRequestFilterTransactions {
vote: Some(false),
failed: Some(false),
account_include: vec!["6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P".to_owned()],
..Default::default() // required with yellowstone-grpc-proto 14
})]),
commitment: Some(CommitmentLevel::Processed as i32),
..Default::default() // blocks, blocks_meta and entry stay empty: not served by Vortex
};
let (_sink, mut stream) = client.subscribe_with_request(Some(request)).await?;
while let Some(update) = stream.next().await {
if let Some(UpdateOneof::Transaction(tx)) = update?.update_oneof {
println!("slot {}", tx.slot);
}
}
Ok(())
}// npm i @triton-one/yellowstone-grpc@9 · ESM ("type": "module") · run: npx tsx subscribe.ts
import Client, { CommitmentLevel, type SubscribeUpdate } from '@triton-one/yellowstone-grpc';
// http:// endpoint. Vortex authorises your registered source IP: no x-token.
const client = new Client('http://fra.vortex.raiden.wtf:10001', undefined, undefined);
await client.connect(); // required since v5.0.1
const stream = await client.subscribe();
stream.on('data', (update: SubscribeUpdate) => {
if (update.transaction) console.log(`slot ${update.transaction.slot}`);
});
stream.on('error', (err) => console.error(err));
stream.write({
transactions: {
pumpfun: {
vote: false,
failed: false,
accountInclude: ['6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P'],
accountExclude: [],
accountRequired: [],
},
},
// blocks, blocksMeta and entry omitted: not served by Vortex
commitment: CommitmentLevel.PROCESSED,
});# pip install grpcio grpcio-tools; copy proto/*.proto from github.com/rpcpool/yellowstone-grpc (yellowstone-grpc-proto/proto), then:
# python -m grpc_tools.protoc -I proto --python_out=. --grpc_python_out=. proto/geyser.proto proto/solana-storage.proto
import threading
import grpc
import geyser_pb2
import geyser_pb2_grpc
# Plain gRPC channel. Vortex authorises your registered source IP: no token.
channel = grpc.insecure_channel("fra.vortex.raiden.wtf:10001")
stub = geyser_pb2_grpc.GeyserStub(channel)
def requests():
yield geyser_pb2.SubscribeRequest(
transactions={
"pumpfun": geyser_pb2.SubscribeRequestFilterTransactions(
vote=False,
failed=False,
account_include=["6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P"],
),
},
commitment=geyser_pb2.CommitmentLevel.PROCESSED,
) # blocks, blocks_meta and entry omitted: not served by Vortex
threading.Event().wait() # keep the request stream open
for update in stub.Subscribe(requests()):
if update.HasField("transaction"):
print(f"slot {update.transaction.slot}")To stream from another region, swap fra for ams, lnd or nyc. Yellowstone gRPC quickstart in the Vortex docs ↗
06 / Pricing
Solana gRPC pricing
Vortex is priced per region and per period, not per gigabyte. A one-day pass runs on the same limits as a 30-day pass.
| Pass | Price | Limits |
|---|---|---|
| 1 day | $65 | Standard limits |
| 1 week | $260 | Standard limits |
| 30 days | $650 | Standard limits |
20Concurrent connections
35Named filters per connection
5,000Accounts per named filter
- Each price covers one region and one registered IP. A second IP in a region you already stream from is its own subscription at the same list price.
- You pay in USDC on Solana from the dashboard, and each quote gets its own wallet. Payment is detected in about 30 seconds, then the subscription activates automatically. No card, no sales call.
- Renewing adds the new period to your current expiry. Nothing renews on its own.
$65Per day, per region, per registered IP · $260 per week · $650 per 30 days
Full rate card for every Raiden product: Raiden pricing in the docs ↗
07 / Trial
Free Solana gRPC trial
There is no public Vortex endpoint, because access is tied to a registered IP. Instead, every region has a free 3-hour trial: once per region per account, with no payment.
- Request it in the dashboardOpen the Vortex page of the dashboard, choose a region and enter the IP you will connect from.
- Open a Discord ticketEvery trial request is reviewed by hand. Approvals happen from the ticket on Raiden’s Discord.
- ConnectOnce the trial is approved, its 3 hours start running, on the same limits as a paid pass.
An IP that another account has already used for a trial can’t start a new one. There is no trial in a region where you already hold a live subscription. If you’d rather skip the review, a one-day pass is $65.
08 / Fit
When Vortex fits, and when to look elsewhere
Every Yellowstone gRPC provider speaks the same protocol, so the choice comes down to what each one serves, where, and on what terms. Here is where Vortex fits, and where it doesn’t.
A good fit
Existing Geyser stacks
You run a Yellowstone or Dragon’s Mouth client and want a new endpoint without touching the integration.
Real-time indexers
Account and transaction updates go straight into a pipeline whose decoders already handle them.
Trading systems
Account state comes from the validator edge rather than from a shared public RPC.
Leaving a public provider
You keep the same client and get a different endpoint with dedicated capacity.
Look elsewhere if
You need data before confirmation
Geyser updates arrive after processing. For pre-confirmation transactions, use decoded Solana shreds.
Your source IP keeps changing
Access is by registered IP, so serverless functions, rotating NAT and browsers don’t fit.
You rely on replay
Replaying missed slots after a reconnect (from_slot) is not documented for Vortex. Ask the team before you depend on it.
You need an uptime commitment
Our Terms of Service list Vortex among beta and early-access products, with no uptime or performance commitment.
Reading the chain is half the loop. To act on what you see, land transactions with Bolt, which runs in the same four cities plus Tokyo and has a free 5 TPS Beta tier.
09 / Raiden streams
Vortex, Pulse or Surge: Geyser gRPC or shred streaming?
Raiden sells three streams. They solve different problems, and a stack can run more than one.
| Feature | Vortex | Pulse | Surge |
|---|---|---|---|
| Data | Geyser account and transaction updates | Decoded transactions from shreds | Raw shred bytes |
| Timing | After processing | Before block confirmation | Before block confirmation |
| Delivery | gRPC stream | gRPC stream | UDP |
| Protocol | Geyser / Yellowstone proto | raiden_binary proto | Raiden |
| Client changes | None if you already use Geyser | Adopt the Pulse proto | Build your own pipeline |
| Regions | FRA, AMS, LND, NYC | FRA, AMS, NYC | FRA, AMS, LND, NYC, TKY |
| From | $65 / day per region | $70 / day per region | $49 / day per region |
| Best for | Anyone already on Geyser tooling | Bots, arb engines, indexers | Infra teams, custom pipelines |
Shreds arrive before the block is confirmed and carry no execution result, so a transaction seen there can still fail. Geyser updates come after the node has processed the transaction. Pulse and Surge are covered on the Solana shreds page.
10 / Questions
Solana gRPC questions, answered
What is Yellowstone gRPC?
Yellowstone gRPC, also known as Dragon’s Mouth, is the open-source Solana Geyser plugin from Triton One that serves validator data over gRPC using geyser.proto. Clients open a bidirectional Subscribe stream, send named filters and receive matching updates as they happen. Raiden Vortex speaks the same protocol, so an existing Yellowstone client connects to it with a new endpoint.
Does Vortex work with my Yellowstone or Dragon’s Mouth client?
Yes. Vortex speaks the same geyser.proto, so moving over is a change of endpoint, not a rewrite. Register your source IP in the dashboard, point the client at your region’s endpoint, such as http://fra.vortex.raiden.wtf:10001, and remove blocks, blocks_meta and entry from your SubscribeRequest. Your account and transaction filters and your decoders stay as they are.
Is there a free Solana gRPC endpoint or trial?
There is no public Vortex endpoint, because access is tied to a registered IP. Every region has a free 3-hour trial instead, once per region per account and with no payment. Request it from the Vortex page of the dashboard, then open a Discord ticket: trials are reviewed by hand. If you’d rather skip the review, a one-day pass is $65.
How much does Solana gRPC cost, and is it billed by bandwidth?
On Vortex, Solana gRPC costs $65 per day, $260 per week or $650 per 30 days, per region and per registered IP, paid in USDC on Solana. The price is flat for the period, not metered per gigabyte. The limits are the same at every duration: 20 concurrent connections, 35 named filters per connection and 5,000 accounts per named filter.
What happens if my Solana gRPC stream disconnects?
Reconnect and send your SubscribeRequest again: the reconnect logic you already use with other Yellowstone providers applies. Replaying missed slots after a reconnect (from_slot) is not documented for Vortex. If your job cannot miss updates, backfill the gap from RPC, or ask the team on Discord before you rely on replay.
How is access authorised? Do I need an x-token?
No token. Vortex authorises by source IP: the address you register in the dashboard is allowlisted on that region’s gateway. Connect from that address, not through a NAT or proxy that changes it. One subscription covers one IP; for more machines, route them through the registered address or add another IP in the region as its own subscription at list price.
Which regions and endpoints are available?
Four regions, each a separate subscription: Frankfurt (fra.vortex.raiden.wtf), Amsterdam (ams.vortex.raiden.wtf), London (lnd.vortex.raiden.wtf) and New York (nyc.vortex.raiden.wtf), all on port 10001 with the http:// scheme. Pick the region closest to the machine that consumes the stream.
When should I use Solana gRPC instead of WebSockets?
Use gRPC when a backend tracks many accounts or programs at once: one stream carries several named filters, filtering runs on the server and updates arrive as binary Protobuf. WebSocket subscriptions suit lighter jobs, such as a wallet watching a few accounts, and JSON-RPC polling suits one-off reads. gRPC needs a server-side client, because browsers can’t open a raw gRPC stream.
Should I use Vortex or Pulse?
Use Vortex if you already run Geyser tooling and want account and transaction updates after processing, in the Yellowstone format. Use Pulse if you want transactions decoded from shreds before block confirmation and can adopt its proto. A transaction seen in shreds can still fail, and a stack can run both.
What if I need more than 20 connections?
Ask the team on Discord about a custom plan above the standard limits. Standard passes allow 20 concurrent connections, 35 named filters per connection and 5,000 accounts per named filter, and a named filter with more than 5,000 accounts is rejected.
Updated .