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
| Name | Type | Description |
|---|---|---|
| account | string[] | Specific account pubkeys to watch |
| owner | string[] | Program owner pubkeys to filter by |
| filters | SubscribeRequestFilterAccountsFilter[] | Data filters (datasize, memcmp) |
Update Payload
| Field | Type | Description |
|---|---|---|
| account | SubscribeUpdateAccountInfo | The updated account info |
| slot | uint64 | The slot of the update |
| is_startup | bool | Whether 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}