Yellowstone gRPC
A persistent bidirectional gRPC stream that pushes Solana data to you — accounts, transactions, slots, blocks — with sub-millisecond latency.
Why gRPC over RPC polling?
- Push model — data arrives the moment it's available, not when you ask.
- Single TCP connection per subscriber, no per-request TLS handshake overhead.
- Filter server-side: only the updates you care about cross the wire.
- Backpressure-aware streaming — the server throttles to your consume rate.
Connection
Connect to grpc.openinfra.sh:10000 with TLS. Pass your API key in the x-token gRPC metadata header.
Quick start
import Client from "@triton-one/yellowstone-grpc"; const client = new Client( "grpc.openinfra.sh:10000", undefined, // no TLS cert needed — hosted TLS { "x-token": process.env.OPENINFRA_API_KEY }); const stream = await client.subscribe(); stream.on("data", (data) => { if (data.transaction) { const sig = data.transaction.signature; console.log("tx:", Buffer.from(sig).toString("base64")); }}); await new Promise<void>((resolve, reject) => { stream.write({ transactions: { sol_transfer: { vote: false, failed: false, accountInclude: [], accountExclude: [], accountRequired: [], } }, slots: {}, accounts: {}, blocks: {}, blocksMeta: {}, accountsDataSlice: [], ping: undefined, commitment: 2, // CONFIRMED }, (err) => { if (err) reject(err); else resolve(); });});Proto definition (abridged)
// Subscribe request (abridged Yellowstone proto)message SubscribeRequest { map<string, SubscribeRequestFilterAccounts> accounts = 1; map<string, SubscribeRequestFilterSlots> slots = 2; map<string, SubscribeRequestFilterTransactions> transactions = 3; map<string, SubscribeRequestFilterBlocks> blocks = 4; CommitmentLevel commitment = 5;}The full proto file is available in the yellowstone-grpc repository.