Programs Subscription

Streams updates for all accounts owned by a specific program.

Type: streaming (via Subscribe)

Overview

The Programs subscription streams updates for all accounts owned by a specific program. This is effectively an accounts subscription filtered by program owner, but optimized for program-level monitoring.

Use this to track all state changes in a DeFi protocol, NFT program, or any on-chain application. For example, subscribing to the Token Program owner will stream all SPL token account changes across the cluster.

Filters

NameTypeDescription
program_idstringThe program ID to filter by
filtersSubscribeRequestFilterAccountsFilter[]Additional data filters

Update Payload

FieldTypeDescription
accountSubscribeUpdateAccountInfoThe updated account info
slotuint64The slot of the update
is_startupboolWhether this is part of initial loading

Usage Examples

Node.js

1const grpc = require('@grpc/grpc-js');
2const protoLoader = require('@grpc/proto-loader');
3
4const packageDef = protoLoader.loadSync('geyser.proto', {
5  keepCase: true, longs: String, enums: String, defaults: true, oneofs: true
6});
7const proto = grpc.loadPackageDefinition(packageDef).geyser;
8const client = new proto.Geyser('[IP_ADDRESS]:[PORT]', grpc.credentials.createInsecure());
9
10const stream = client.subscribe(new grpc.Metadata());
11
12stream.on('data', (data) => {
13  console.log('Programs update:', data);
14});
15stream.on('error', (err) => console.error('Error:', err));
16
17// Subscribe to Programs
18stream.write({
19  accounts: {},
20  slots: {},
21  transactions: {},
22  blocks: {},
23  blocksMeta: {},
24  commitment: 'processed',
25  entry: {}
26});

Rust

1use yellowstone_grpc_proto::geyser::geyser_client::GeyserClient;
2use yellowstone_grpc_proto::geyser::SubscribeRequest;
3use tonic::transport::Channel;
4
5#[tokio::main]
6async fn main() -> Result<(), Box<dyn std::error::Error>> {
7    let channel = Channel::from_static("http://[IP_ADDRESS]:[PORT]")
8        .connect().await?;
9    let mut client = GeyserClient::new(channel);
10
11    // Configure your Programs subscription filters here
12    let request = SubscribeRequest {
13        accounts: Default::default(),
14        slots: Default::default(),
15        transactions: Default::default(),
16        blocks: Default::default(),
17        blocks_meta: Default::default(),
18        commitment: Some(1), // Processed
19        entry: Default::default(),
20    };
21
22    let mut stream = client.subscribe(std::iter::once(request)).await?.into_inner();
23    while let Some(msg) = stream.message().await? {
24        println!("Programs update: {:?}", msg);
25    }
26    Ok(())
27}