---
title: StreamAccountUpdatesRequest
description: StreamAccountUpdatesRequest subscribes to account delta events.
source_url:
  html: https://thru.org/docs/api-ref/grpc/messages/thru/services/v1/stream-account-updates-request/
  md: https://thru.org/docs/api-ref/grpc/messages/thru/services/v1/stream-account-updates-request.md
---

# StreamAccountUpdatesRequest

StreamAccountUpdatesRequest subscribes to account delta events.

Filter expressions support the following params:

- params.min\_slot (uint64): Minimum slot for filtering updates Example: account\_update.slot >= params.min\_slot

- params.min\_balance (uint64): Minimum balance for filtering Example: snapshot.meta.balance >= params.min\_balance

- params.owner (bytes|Pubkey): Owner pubkey for filtering Examples: snapshot.meta.owner.value == params.owner account\_update.meta.owner.value == params.owner

- params.address (bytes|Pubkey): Account address for filtering Example: account\_address.value == params.address Note: Use account\_address for unified filtering across both snapshot and update messages

- params.addresses (BytesList): List of addresses for multi-account filtering Example: account\_address.value in params.addresses Note: Use the ‘in’ operator to filter by multiple addresses in a single subscription

- params.min\_nonce (uint64): Minimum nonce for filtering Example: snapshot.meta.nonce >= params.min\_nonce

- params.min\_seq (uint64): Minimum sequence number for filtering Example: snapshot.meta.seq >= params.min\_seq

- params.min\_data\_size (uint32): Minimum data size for filtering Example: snapshot.meta.data\_size >= params.min\_data\_size

Available snapshot fields (thru.core.v1.Account): snapshot.address, snapshot.address.value (bytes), snapshot.meta.balance (uint64), snapshot.meta.seq (uint64), snapshot.meta.nonce (uint64), snapshot.meta.data\_size (uint32), snapshot.meta.version (uint32), snapshot.meta.flags (AccountFlags), snapshot.meta.flags.is\_program (bool), snapshot.meta.flags.is\_privileged (bool), snapshot.meta.flags.is\_uncompressable (bool), snapshot.meta.flags.is\_ephemeral (bool), snapshot.meta.flags.is\_deleted (bool), snapshot.meta.flags.is\_new (bool), snapshot.meta.flags.is\_compressed (bool), snapshot.meta.owner, snapshot.meta.owner.value (bytes)

Available account\_update fields (AccountUpdate): account\_update.slot (uint64), account\_update.delete (bool), account\_update.meta.balance (uint64), account\_update.meta.seq (uint64), account\_update.meta.nonce (uint64), account\_update.meta.data\_size (uint32), account\_update.meta.version (uint32), account\_update.meta.flags (AccountFlags), account\_update.meta.flags.is\_program (bool), account\_update.meta.flags.is\_privileged (bool), account\_update.meta.flags.is\_uncompressable (bool), account\_update.meta.flags.is\_ephemeral (bool), account\_update.meta.flags.is\_deleted (bool), account\_update.meta.flags.is\_new (bool), account\_update.meta.flags.is\_compressed (bool), account\_update.meta.owner, account\_update.meta.owner.value (bytes)

Available unified fields (work for both snapshot and update messages): account\_address, account\_address.value (bytes) - extracted from whichever message type is present

Filter expression examples:

1. Filter by minimum balance (snapshot or update): Expression: “(has(snapshot.meta) && snapshot.meta.balance >= uint(1000000)) || (has(account\_update.meta) && account\_update.meta.balance >= uint(1000000))”

2. Filter by account owner using params: Expression: “(has(snapshot.meta) && has(snapshot.meta.owner) && snapshot.meta.owner.value == params.owner) || (has(account\_update.meta) && has(account\_update.meta.owner) && account\_update.meta.owner.value == params.owner)” Params: {“owner”: <32-byte pubkey>}

3. Filter by specific account address (works for both snapshot and update messages): Expression: “account\_address.value == params.address” Params: {“address”: <32-byte pubkey>}

4. Filter by minimum slot for updates: Expression: “has(account\_update.meta) && account\_update.slot >= params.min\_slot” Params: {“min\_slot”: 1000}

5. Filter by nonce greater than value: Expression: “(has(snapshot.meta) && snapshot.meta.nonce >= uint(5)) || (has(account\_update.meta) && account\_update.meta.nonce >= uint(5))”

6. Filter by sequence number: Expression: “(has(snapshot.meta) && snapshot.meta.seq >= uint(100)) || (has(account\_update.meta) && account\_update.meta.seq >= uint(100))”

7. Filter by data size: Expression: “(has(snapshot.meta) && snapshot.meta.data\_size >= uint(1024)) || (has(account\_update.meta) && account\_update.meta.data\_size >= uint(1024))”

8. Filter by account version: Expression: “(has(snapshot.meta) && snapshot.meta.version >= uint(1)) || (has(account\_update.meta) && account\_update.meta.version >= uint(1))”

9. Filter by account flags (check if account is a program): Expression: “(has(snapshot.meta) && has(snapshot.meta.flags) && snapshot.meta.flags.is\_program) || (has(account\_update.meta) && has(account\_update.meta.flags) && account\_update.meta.flags.is\_program)”

10. Filter by privileged flag: Expression: “(has(snapshot.meta) && has(snapshot.meta.flags) && snapshot.meta.flags.is\_privileged) || (has(account\_update.meta) && has(account\_update.meta.flags) && account\_update.meta.flags.is\_privileged)”

11. Filter non-delete updates: Expression: “has(snapshot.meta) || (has(account\_update.meta) && (!has(account\_update.delete) || !account\_update.delete))”

12. Check for snapshot or update presence: Expression: “has(snapshot.meta) || has(account\_update.meta)”

13. Combined filters (multiple conditions): Expression: “has(snapshot.meta) || (has(account\_update.meta) && account\_update.slot >= params.min\_slot && account\_update.meta.balance >= params.min\_balance)” Params: {“min\_slot”: 1000, “min\_balance”: 1000000}

14. Filter by minimum balance using params: Expression: “(has(snapshot.meta) && snapshot.meta.balance >= params.min\_balance) || (has(account\_update.meta) && account\_update.meta.balance >= params.min\_balance)” Params: {“min\_balance”: 5000000000}

Note: The response contains either a snapshot (initial state), an update (delta), or a BlockFinished message. Filters should handle both snapshot and update cases using OR logic to match either message type.

To filter by specific account address (recommended - works for both message types): Expression: “account\_address.value == params.address” Params: {“address”: <32-byte pubkey>}

To filter by owner (program): Expression: “(has(snapshot.meta.owner) && snapshot.meta.owner.value == params.owner) || (has(account\_update.meta.owner) && account\_update.meta.owner.value == params.owner)” Params: {“owner”: <32-byte program pubkey>}

To filter by multiple account addresses (recommended for multi-account subscriptions): Expression: “account\_address.value in params.addresses” Params: {“addresses”: BytesList{values: \[\<pubkey1>, \<pubkey2>, …]}} Note: Use BytesList parameter type with the ‘in’ operator for efficient multi-address filtering

**Package:** `thru.services.v1`

## Fields

| Field | Type | # | Description |
| - | - | - | - |
| `view` | [`thru.core.v1.AccountView`](https://thru.org/docs/api-ref/grpc/messages/thru/core/v1/account-view.md) | 2 · optional | |
| `filter` | [`thru.common.v1.Filter`](https://thru.org/docs/api-ref/grpc/messages/thru/common/v1/filter.md) | 4 · optional | |
