Accounts Subscription

Streams real-time account state updates matching your filters.

Type: streaming (via Subscribe)

Overview

The Accounts subscription streams real-time updates whenever an account's state changes on-chain. You can filter by specific account pubkeys, program owners, data size, or memory comparison (memcmp) filters.

This is the most commonly used subscription type for tracking token balances, program state changes, and wallet activity. It is essential for building real-time dashboards, trading bots, and indexing services.

Filters

NameTypeDescription
accountstring[]Specific account pubkeys to watch
ownerstring[]Program owner pubkeys to filter by
filtersSubscribeRequestFilterAccountsFilter[]Data filters (datasize, memcmp)

Update Payload

FieldTypeDescription
accountSubscribeUpdateAccountInfoThe updated account info
slotuint64The slot of the update
is_startupboolWhether this is part of initial account 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('Accounts update:', data);
14});
15stream.on('error', (err) => console.error('Error:', err));
16
17// Subscribe to Accounts
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 Accounts 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!("Accounts update: {:?}", msg);
25    }
26    Ok(())
27}