Shreds · Raiden Surge + Raiden Pulse

Solana shreds: raw over UDP, decoded over gRPC.

Raiden streams Solana shreds at two depths. Raiden Surge is a raw shred stream over UDP to your server’s IP and port; Raiden Pulse streams decoded shreds as pre-confirmation transactions over gRPC, filtered by account on Raiden’s side. Each is priced per region, from $49 a day for raw shreds and $70 for decoded shreds, paid in USDC, with a free 3-hour trial per region.

Surge (raw): FRA · AMS · LND · NYC · TKY
Pulse (decoded): FRA · AMS · NYC
Per region · paid in USDC on Solana

01 / The basics

What are Solana shreds?

Solana shreds are the pieces a leader validator cuts each block into while it is still producing it. Each shred is about 1.2 KB, small enough for one UDP packet. Data shreds carry the block’s entries and transactions; coding shreds carry Reed-Solomon parity, so missing data can be rebuilt once enough of a batch arrives. Reading shreds directly shows you transactions before an RPC node or a Geyser plugin does, and before the block is confirmed.

  1. Fragment: data and coding shredsThe leader splits block data into data shreds of 1,203 bytes and adds coding shreds of 1,228 bytes. Agave groups them into erasure batches of 32 data and 32 coding shreds.
  2. Propagate: TurbineTurbine fans the shreds out from validator to validator, so the leader never has to send the whole block to everyone.
  3. Recover: FEC reassemblyIn a full batch, any 32 of the 64 shreds are enough to rebuild it. Forward error correction covers loss inside a batch; it is not a guarantee against unlimited loss.

Every shred starts with an 83-byte common header: a 64-byte signature, a variant byte, then the slot, index, shred version and FEC set index. Sizes and layout follow Agave’s ledger code. Shreds are not transactions yet: getting transactions out means grouping shreds by slot and FEC set, recovering missing pieces, concatenating the data and decoding the entries. Who does that work is the difference between raw and decoded shreds.

02 / Choose

Raw shreds vs decoded shreds: Raiden Surge or Raiden Pulse?

Five things separate one Solana shred provider from another: where it runs, how it reaches you, how much decoding is left to you, what a region costs and whether you can try it first. Here is how Raiden Surge (raw shreds) and Raiden Pulse (decoded shreds) answer each, with Raiden Vortex alongside for teams that need executed state instead.

Raw Solana shreds (Raiden Surge) vs decoded Solana shreds (Raiden Pulse) vs Geyser gRPC (Raiden Vortex)
QuestionRaiden Surge · raw shredsRaiden Pulse · decoded shredsRaiden Vortex · Solana gRPC
What you receiveRaw Solana shreds, as serialized by the leaderOne bincode-encoded VersionedTransaction per message, with slot, signatures and the filters it matchedAccount, transaction and slot updates in the Yellowstone format
Data stagePre-confirmationPre-confirmationAfter processing
DeliveryUDP to the public IP and port you registerPlaintext gRPC on port 16000, from the IP you registerYellowstone gRPC on port 10001, from the IP you register
Decoding left to youReassembly, FEC recovery, deshredding and decodingDeserializing one bincode transactionWhatever your Yellowstone client already does
FilteringIn your own pipelineServer-side, by accountServer-side, named filters
LimitsOne destination IP:port per region subscription; extra destinations on request10 connections · 35 named filters · 5,000 accounts per filter20 connections · 35 named filters · 5,000 accounts per filter
RegionsFRA · AMS · LND · NYC · TKYFRA · AMS · NYCFRA · AMS · LND · NYC
Price per region (day / week / 30 days)$49 / $199 / $499$70 / $280 / $700$65 / $260 / $650
Free trial3 hours per region, once, reviewed by hand3 hours per region, once, reviewed by hand3 hours per region, once, reviewed by hand

Choose Raiden Surge for raw shreds when

You run your own deshredder

Your pipeline already reassembles FEC sets and decodes entries, and you want the shreds with nothing in between.

You build infrastructure

Infrastructure teams running RPC or data pipelines that feed shreds into their own systems.

You need Tokyo

Surge has a TKY region; Pulse does not.

Not for you if

You have no decoder. Raw shreds are not transactions: start with decoded Solana shreds instead.

Choose Raiden Pulse for decoded shreds when

You act on new transactions

Sniper bots and launch detection, arbitrage engines and MEV searchers that want pre-confirmation transactions without running a decoder.

You index in real time

Transactions go straight into your database pipeline.

You watch specific programs

Account filters drop everything else before it leaves Raiden, so it never costs you bandwidth.

Not for you if

You need results, not intent. Shreds carry no logs, balances or status: use Solana gRPC for executed state.

03 / Raiden Surge

Raw Solana shreds over UDP (Raiden Surge)

Raiden Surge forwards raw Solana shreds from a dedicated APEX bare-metal node in each region straight to your server over UDP. There is no gRPC layer in between: you receive the shreds and run the rest of the pipeline yourself.

How raw shred delivery works

  1. Pick regionsSign in to the Raiden Surge dashboard with Discord and choose any of FRA, AMS, LND, NYC and TKY. Each region is its own subscription.
  2. Register a destinationEnter the public IP and UDP port that should receive the stream. A destination IP:port carries one active subscription, and you can change it from the dashboard, once a minute per region.
  3. Open the firewallAllow inbound UDP on that port from the APEX source IP of each region, listed under regions and endpoints.
  4. ReceiveNo validator and no special hardware: a standard server with a public IP and an open UDP port is enough. The dashboard’s Latency tab shows, per region, the live P50 time the APEX node takes to forward a shred.

UDP has no retransmission. Deduplication, loss handling and ordering belong to your pipeline, which is the price of getting the shreds first.

How to decode Solana shreds: three routes

Surge setup: receive raw shreds over UDP ↗ · APEX server IPs to whitelist ↗

04 / Raiden Pulse

Decoded Solana shreds over gRPC (Raiden Pulse)

Raiden Pulse decodes Solana shreds on Raiden’s side, FEC recovery and deshredding included, and streams the resulting transactions over gRPC before the block is confirmed. Your client deserializes one transaction per message, and only the transactions your filters ask for.

Transaction

binary_transaction: a bincode-encoded Solana VersionedTransaction, with its signatures.

Slot and timing

The slot it was seen in and a server created_at timestamp.

Matched filters

The names of your filters it matched, so one connection can serve several strategies.

Resolved lookup tables

loaded_writable_addresses and loaded_readonly_addresses: address lookup tables resolved server-side. The full account set is the static keys plus these two lists, both empty for legacy transactions.

Account filters and limits

Raiden Pulse account filters, per named filter
FieldA transaction passes when it
account_requiredtouches every listed account
account_includetouches any listed account
account_excludetouches none of the listed accounts

10Concurrent connections

35Named filters per connection

5,000Accounts per named filter

Every subscription needs at least one named filter. A filter with more than 5,000 accounts is rejected, so split large watch lists across filters. The limits are the same on a one-day pass as on a 30-day one.

Access and protocol

Decoding the payload

Deserialize a decoded Solana shred transaction
LanguageCall
Rust (bincode 1.x)bincode::deserialize::<VersionedTransaction>(&bytes)
Python (solders)VersionedTransaction.from_bytes(bytes)
TypeScript (@solana/web3.js 1.x)VersionedTransaction.deserialize(bytes)

Pulse gRPC quickstart in Rust, Python and TypeScript ↗

05 / Regions

Solana shred stream regions and endpoints

Each region is a separate subscription, so pick the one closest to your servers. For Raiden Surge, allow the APEX source IP of every region you buy; for Raiden Pulse, connect to the regional endpoint from your registered IP.

Solana shred stream regions: Raiden Surge APEX source IPs and Raiden Pulse endpoints
RegionRaiden Surge: APEX source IP (datacenter)Raiden Pulse endpointRaiden Vortex
FRA · Frankfurt198.13.140.100 (FRA2)fra.pulse.raiden.wtf:16000Yes
AMS · Amsterdam64.130.43.242 (AMS3)ams.pulse.raiden.wtf:16000Yes
LND · London64.130.46.240 (LON1)Not availableYes
NYC · New York64.130.45.192 (EWR2)nyc.pulse.raiden.wtf:16000Yes
TKY · Tokyo198.13.133.221 (TYO2)Not availableNo

Source: APEX servers and regions in the Raiden docs.

06 / Connect

Connect: a raw shred listener and a decoded shred client

Two short programs: a UDP listener that reads the common shred header from Raiden Surge, and a gRPC client that subscribes to pump.fun transactions on Raiden Pulse. Both run from the IP you registered in the dashboard.

Receive your first raw shreds (Raiden Surge)

surge_rx.pymain.rsshell
import socket, struct
PORT = 20000  # the UDP port you registered
KIND = {0x40:"code",0x60:"code",0x70:"code",0x80:"data",0x90:"data",0xB0:"data"}
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 32 * 1024 * 1024)
sock.bind(("0.0.0.0", PORT))
while True:
    pkt, (src, _) = sock.recvfrom(2048)
    if len(pkt) < 83:          # common shred header is 83 bytes
        continue
    variant = pkt[64]          # after the 64-byte signature
    slot, index, version, fec_set = struct.unpack_from("<QIHI", pkt, 65)
    print(f"slot={slot} index={index} fec_set={fec_set} {KIND.get(variant & 0xF0,'unknown')} {len(pkt)}B from {src}")
use std::net::UdpSocket;
fn main() -> std::io::Result<()> {
    let sock = UdpSocket::bind("0.0.0.0:20000")?; // the UDP port you registered
    let mut buf = [0u8; 2048];
    loop {
        let (n, from) = sock.recv_from(&mut buf)?;
        if n < 83 { continue; }
        let p = &buf[..n];
        let slot = u64::from_le_bytes(p[65..73].try_into().unwrap());
        let index = u32::from_le_bytes(p[73..77].try_into().unwrap());
        let fec_set = u32::from_le_bytes(p[79..83].try_into().unwrap());
        let kind = match p[64] & 0xF0 { 0x40 | 0x60 | 0x70 => "code", 0x80 | 0x90 | 0xB0 => "data", _ => "unknown" };
        println!("slot={slot} index={index} fec_set={fec_set} {kind} {n}B from {}", from.ip());
    }
}
# example: Raiden Surge FRA, receiver on UDP port 20000
sudo ufw allow proto udp from 198.13.140.100 to any port 20000
# general Linux tuning: let SO_RCVBUF reach 32 MB
sudo sysctl -w net.core.rmem_max=33554432

Offsets follow Agave’s 83-byte common shred header, little-endian: a 64-byte signature, the variant byte, then slot, index, version and FEC set index. A variant high nibble of 0x60 or 0x70 is a Merkle coding shred, 0x90 or 0xB0 a Merkle data shred; 0x40 and 0x80 are older variants. Both listeners treat each datagram as one shred, the same assumption Raiden’s public shred proxy makes.

Socket-buffer tuning is general Linux guidance, not a Raiden requirement, and it only helps a listener that asks for a bigger buffer: the Rust example keeps the OS default, so use the socket2 crate (set_recv_buffer_size) for a larger one. If your server sits behind a cloud firewall or security group, open the UDP port there too.

Subscribe to decoded shreds (Raiden Pulse)

pulse_client.pysrc/main.rsclient.mjs
# pip install grpcio grpcio-tools solders
# python -m grpc_tools.protoc -Iproto --python_out=. --grpc_python_out=. proto/raiden_binary.proto
import queue, grpc
from raiden_binary_pb2 import SubscribeBinaryTransactionsRequest, SubscribeRequestFilterBinaryTransactions
from raiden_binary_pb2_grpc import RaidenBinaryServiceStub
from solders.transaction import VersionedTransaction

PUMPFUN = "6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P"
requests = queue.Queue()
requests.put(SubscribeBinaryTransactionsRequest(transactions={
    "pumpfun": SubscribeRequestFilterBinaryTransactions(account_required=[PUMPFUN]),
}))

def request_iter():  # keep the request stream open
    while True:
        yield requests.get()

# plaintext gRPC; your registered source IP is the credential
stub = RaidenBinaryServiceStub(grpc.insecure_channel("fra.pulse.raiden.wtf:16000"))
try:
    for resp in stub.SubscribeBinaryTransactions(request_iter()):
        if not resp.HasField("transaction") or not resp.transaction.HasField("transaction"):
            continue
        upd = resp.transaction
        tx = VersionedTransaction.from_bytes(upd.transaction.binary_transaction)
        print(upd.slot, list(resp.filters), tx.signatures[0], len(upd.loaded_writable_addresses))
except grpc.RpcError as e:
    print("rpc error:", e.code().name, e.details())
// build.rs compiles proto/raiden_binary.proto with tonic-build + protox (no protoc needed)
pub mod raiden_binary { tonic::include_proto!("raiden_binary"); }
use raiden_binary::{raiden_binary_service_client::RaidenBinaryServiceClient,
    SubscribeBinaryTransactionsRequest, SubscribeRequestFilterBinaryTransactions};
use std::collections::HashMap;
use tokio_stream::StreamExt;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    // plaintext gRPC; your registered source IP is the credential
    let mut client = RaidenBinaryServiceClient::connect("http://fra.pulse.raiden.wtf:16000").await?;
    let filter = SubscribeRequestFilterBinaryTransactions {
        account_include: vec![],
        account_exclude: vec![],
        account_required: vec!["6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P".into()],
    };
    let request = SubscribeBinaryTransactionsRequest {
        transactions: HashMap::from([("pumpfun".to_string(), filter)]),
    };
    // send one request, then keep the request stream open
    let outbound = tokio_stream::iter(vec![request]).chain(tokio_stream::pending());
    let mut stream = client.subscribe_binary_transactions(outbound).await?.into_inner();
    while let Some(resp) = stream.message().await? {
        let Some(update) = resp.transaction else { continue };
        let Some(tx) = update.transaction else { continue };
        let sig = tx.signatures.first().map(|s| bs58::encode(s).into_string()).unwrap_or_default();
        // tx.binary_transaction is a bincode VersionedTransaction
        println!("slot={} sig={} alt_writable={}", update.slot, sig, update.loaded_writable_addresses.len());
    }
    Ok(())
}
import grpc from '@grpc/grpc-js';
import protoLoader from '@grpc/proto-loader';
import bs58 from 'bs58';

const def = protoLoader.loadSync('raiden_binary.proto', { keepCase: true, longs: String, defaults: true });
const { raiden_binary } = grpc.loadPackageDefinition(def);

// plaintext gRPC; your registered source IP is the credential
const client = new raiden_binary.RaidenBinaryService('fra.pulse.raiden.wtf:16000', grpc.credentials.createInsecure());
const stream = client.SubscribeBinaryTransactions();

stream.on('data', ({ transaction: update, filters }) => {
  if (!update || !update.transaction) return;
  const tx = update.transaction;
  const sig = tx.signatures.length ? bs58.encode(tx.signatures[0]) : '-';
  console.log(`slot=${update.slot} sig=${sig} filters=${filters} bytes=${tx.binary_transaction.length}`);
});
stream.on('error', (e) => console.error('rpc error:', grpc.status[e.code], e.details));

stream.write({ transactions: { pumpfun: { account_required: ['6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P'] } } });

Generate the stubs from raiden_binary.proto, published in the Pulse getting-started guide ↗. Keep the request side open: a request iterator that returns half-closes the subscription. The filter above follows the pump.fun program, 6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P.

Versions these clients were built with. Rust: tonic 0.12, prost 0.13, tokio (rt-multi-thread, macros), tokio-stream 0.1 and bs58, with build-dependencies tonic-build 0.12 and protox 0.7; build.rs runs let fds = protox::compile(["proto/raiden_binary.proto"], ["proto"])?; tonic_build::configure().build_server(false).compile_fds(fds)?; Newer tonic releases change the build API, so pin these. Python: pip install grpcio grpcio-tools solders. Node.js: npm i @grpc/grpc-js @grpc/proto-loader bs58.

07 / Pricing

Solana shred stream pricing

Raw and decoded shreds are priced per region and per period, not per gigabyte. A one-day pass runs the same stream as a 30-day one, so you can test a region for a day before committing to a month.

Solana shred stream prices, per region: Raiden Surge (raw) and Raiden Pulse (decoded)
Product1 day7 days30 daysFree trial
Raiden Surge · raw shreds over UDP$49$199$4993 hours
Raiden Pulse · decoded shreds over gRPC$70$280$7003 hours

$49Per day, per region · raw Solana shreds (Raiden Surge) · decoded shreds from $70

Full rate card for every Raiden product: Raiden pricing in the docs ↗

08 / Trial

Free Solana shred stream trial

Raiden Surge and Raiden Pulse both come with a free 3-hour trial in every region: once per region per account, with no payment.

  1. Request it in the dashboardOpen the Surge or Pulse page, choose a region and enter the IP (and, for Surge, the UDP port) you will use.
  2. Open a Discord ticketEvery trial request is reviewed by hand, and approvals happen from the ticket on Raiden’s Discord.
  3. StreamThe 3 hours start when the trial is approved, not when you request it.

An IP that another account has already used for a trial can’t start a new one, and a region with an active subscription can’t start a trial. If you’d rather skip the review, a one-day pass is $49 for raw shreds or $70 for decoded shreds.

What to measure in 3 hours

09 / Fit

Shreds or Geyser gRPC: when each one fits

Shreds show you a transaction early, but not what it did. Use them where being first is the job, and pair them with a post-execution stream where you need results.

Solana shred streaming use cases

Launch detection

Sniper bots that watch a launchpad program, such as the pump.fun filter in the Pulse client, and see new mints and liquidity adds before confirmation.

Arbitrage and MEV

Arbitrage engines and MEV searchers that react to pending swaps on the pools they track.

Real-time indexers

Pipelines that write transactions to a database as they appear, with account filters on decoded Solana shreds.

Custom pipelines

Teams that run their own deshredder and want raw Solana shreds with nothing in between.

Infrastructure teams

Teams running RPC or data pipelines that feed shreds into their own systems from five regions, Tokyo included.

Research

For pump.fun tokens, wallets and launches after the fact, there is Raiden Terminal (private beta).

What shreds leave out

If you need executed state, such as account updates, logs or processed transactions, use Solana gRPC (Raiden Vortex), the Yellowstone-compatible Geyser stream in FRA, AMS, LND and NYC. Many stacks run both: Raiden Pulse to see a transaction first, Raiden Vortex to see what it did. To act on either, land the transaction with Raiden Bolt, free on a 5 TPS Beta tier in all five regions.

10 / Migration

Coming from Jito’s shred feed?

Jito’s documentation announced that Jito ShredStream would be completely shut down on 5 September 2026, and points users to DoubleZero Edge. If your system consumed shreds through it, the path depends on what your code reads.

Raw UDP shreds

Register your receiver’s IP and port with Raiden Surge. Shreds go straight to it, with no Block Engine keypair. Each Raiden region is its own subscription, where Jito’s docs capped the proxy’s DESIRED_REGIONS at two.

Entries over gRPC

Raiden’s public raiden-shredstream-proxy on GitHub receives Surge’s UDP shreds and serves entries with SubscribeEntries from Jito’s proto. Test it against your client before you rely on it.

Only the transactions

Raiden Pulse does the deshredding and account filtering for you.

Raiden is an independent provider, not an official replacement for Jito’s service. Source: Jito Labs documentation, checked 15 October 2026.

11 / FAQ

Solana shreds questions, answered

What are Solana shreds?

Solana shreds are the pieces, about 1.2 KB each, that a leader validator splits every block into so it can travel over UDP. Data shreds carry entries and transactions; coding shreds carry Reed-Solomon parity used to rebuild missing data. Turbine spreads them from validator to validator, so reading shreds shows you transactions before RPC does and before the block is confirmed.

What is the difference between raw shreds and decoded shreds?

Raw shreds are the shreds as the leader serialized them: you reassemble, recover and decode them yourself. Decoded shreds are the transactions already rebuilt from those shreds. Raiden Surge streams raw shreds over UDP from $49 a day per region. Raiden Pulse streams decoded shreds as transactions over gRPC, with server-side account filters, from $70 a day per region.

How do I decode Solana shreds?

There are three routes. Run your own deshredder on raw shreds: group them by slot and FEC set, recover missing data from the coding shreds, then concatenate and decode the entries. Run Raiden’s public shred proxy on GitHub, which turns Raiden Surge UDP shreds into a gRPC stream of entries. Or use Raiden Pulse, where the only step left is deserializing a bincode VersionedTransaction: bincode in Rust, solders in Python, @solana/web3.js in TypeScript.

How big is a Solana shred, and what is in its header?

In current Agave, a Merkle data shred is 1,203 bytes and a coding shred is 1,228 bytes. Every shred starts with an 83-byte common header: a 64-byte signature, a variant byte, then the slot, index, shred version and FEC set index, little-endian. Data shreds add a parent offset, flags and size; coding shreds add the batch’s data and coding shred counts and their position.

Do I need a validator or special hardware to receive shreds?

No. For Raiden Surge, a standard server with a public IP and an open UDP port is enough. For Raiden Pulse, you need a gRPC client that connects from the IP you registered in the dashboard.

Should I use shreds or Geyser gRPC?

Use shreds when seeing a transaction first matters more than knowing its result. Shred data is pre-execution: it has no logs, balance changes or success status, and a transaction seen in shreds can still fail. For executed account and transaction updates, use Solana gRPC (Raiden Vortex). Many stacks run both.

Can I filter raw shreds before they reach me?

Not on Raiden’s side. Raiden Surge forwards the shred stream for each region you buy, and filtering happens in your pipeline after decoding. Raiden Pulse filters server-side by account with account_required, account_include and account_exclude: up to 35 named filters per connection and 5,000 accounts per filter.

Which regions are available, and which IPs do I whitelist?

Raiden Surge runs in Frankfurt, Amsterdam, London, New York and Tokyo. Allow inbound UDP from the APEX IP of each region you buy: FRA 198.13.140.100, AMS 64.130.43.242, LND 64.130.46.240, NYC 64.130.45.192, TKY 198.13.133.221. Raiden Pulse runs in Frankfurt, Amsterdam and New York, at fra, ams and nyc.pulse.raiden.wtf on port 16000.

How much does a Solana shred stream cost?

Prices are per region. Raiden Surge costs $49 for a day, $199 for a week or $499 for 30 days. Raiden Pulse costs $70 for a day, $280 for a week or $700 for 30 days. Each region is billed separately and paid in USDC on Solana from the dashboard.

Is there a free Solana shred stream trial?

Yes: a free 3-hour trial in each region, once per region per account, with no payment, for both Raiden Surge and Raiden Pulse. Request it in the dashboard, then open a ticket on Discord. Every trial request is reviewed by hand, and the 3 hours start when it is approved. If you’d rather skip the review, a one-day pass is $49 for raw shreds or $70 for decoded shreds.

Can I move here from Jito’s shred feed?

Jito’s documentation announced that Jito ShredStream would be completely shut down on 5 September 2026. Teams that read raw UDP shreds can register a receiver with Raiden Surge, which sends to your IP and port with no Block Engine keypair. Teams that only need transactions can use Raiden Pulse. Raiden is an independent provider, not an official replacement for Jito’s service.

Updated .

Try raw or decoded shreds free for 3 hours

Request a trial for Raiden Surge or Raiden Pulse in any region, or read the setup guides first.

Surge setup: receive raw shreds over UDPAPEX server IPs to whitelistPulse gRPC quickstart in Rust, Python and TypeScriptPricingRegions