Skip to main content
Solami’s gRPC endpoint uses the Yellowstone protocol to stream real-time Solana data directly to your application. Unlike polling over RPC, gRPC gives you a persistent connection that delivers updates the moment they happen — with no missed events. gRPC is available on the Pro plan and above.

Endpoint

https://grpc.solami.fast?api_key=YOUR_API_KEY

Subscription types

You can subscribe to four types of data streams on a single connection.
TypeWhat you receive
AccountReal-time account data changes
TransactionFiltered transaction streams by program or account
BlockFull block data as slots are confirmed
SlotSlot progression updates
For a guide on choosing between gRPC and WebSocket subscriptions, see Streaming data.

Connections per plan

Each plan includes a number of concurrent gRPC connections.
PlanIncluded connections
Free0
Dev0
Pro1
Ultra5
Shared Metal10

Extra connections

If you need more connections than your plan includes, you can purchase them individually.
Billing periodPrice per connection
Daily$10/day
Monthly$100/month
You can add up to 100 extra connections from the Dashboard. See Add-ons for details.

Usage example

This example uses the solami Rust crate to subscribe to confirmed transactions for a given account.
The solami::from_env() builder reads your SOLAMI_API_KEY environment variable automatically. Store your key there rather than hardcoding it.
main.rs
#![allow(deprecated)]
use futures_util::StreamExt;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let _ = dotenvy::dotenv();

    let mut client = solami::from_env().build().await?;

    let accounts = vec![
        "11111111111111111111111111111111".to_string(),
    ];

    let (_sink, mut stream) = client
        .grpc()
        .subscribe_transactions(
            "tx_sub",
            accounts,
            solami::CommitmentLevel::Confirmed,
        )
        .await?;

    println!("Subscribed to transactions via gRPC...");

    while let Some(Ok(msg)) = stream.next().await {
        if let Some(solami::GrpcUpdateKind::Transaction(tx)) = msg.update_oneof {
            if let Some(info) = tx.transaction {
                println!("Signature: {:?} | Slot: {}", info.signature, tx.slot);
            }
        }
    }

    Ok(())
}
Replace "11111111111111111111111111111111" with the account address you want to monitor.

Next steps

Streaming data guide

Learn when to use gRPC vs WebSocket and how to filter streams.

WebSocket

Simpler subscriptions for lower-volume use cases.

Add-ons

Purchase extra gRPC connections.

Regions

See which regions support gRPC.