Transaction Filters

Subscribe to transaction updates with filtering by type, status, and account involvement.

SubscribeRequestFilterTransactions

vote
boolean
Include vote transactions. Set false to exclude, true to include only votes.
failed
boolean
Include failed transactions. Set false to exclude, true to include only failures.
signature
string
Match a specific transaction signature.
account_include
array of strings
Include transactions that use any account from this list (logical OR).
account_exclude
array of strings
Exclude transactions that use any account from this list.
account_required
array of strings
Require all accounts from this list to be present in the transaction (logical AND).
If all fields are empty, all transactions are broadcast. Otherwise, fields work as logical AND, and values within arrays as logical OR.

Transaction Update Messages

SubscribeUpdateTransaction (Full)

transaction
SubscribeUpdateTransactionInfo
slot
uint64
Slot containing the transaction.

SubscribeUpdateTransactionStatus (Lightweight)

Use the transactions_status field in SubscribeRequest (same filter format) to receive only status updates without full transaction data:
slot
uint64
Slot containing the transaction.
signature
bytes
Transaction signature.
is_vote
bool
Whether this is a vote transaction.
index
uint64
Transaction index within the block.
err
TransactionError
Error details (null on success).

Transaction Examples

All Non-Vote Transactions

const request = {
  transactions: {
    allTxs: {
      vote: false,
      failed: true,
      accountInclude: [],
      accountExclude: [],
      accountRequired: [],
    },
  },
  accounts: {},
  slots: {},
  transactionsStatus: {},
  blocks: {},
  blocksMeta: {},
  entry: {},
  accountsDataSlice: [],
  commitment: CommitmentLevel.CONFIRMED,
};

Transactions Involving a Specific Program

const request = {
  transactions: {
    jupiterTxs: {
      vote: false,
      accountInclude: ["JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4"],
      accountExclude: [],
      accountRequired: [],
    },
  },
  accounts: {},
  slots: {},
  transactionsStatus: {},
  blocks: {},
  blocksMeta: {},
  entry: {},
  accountsDataSlice: [],
  commitment: CommitmentLevel.CONFIRMED,
};

Track a Specific Signature

const request = {
  transactions: {
    myTx: {
      signature: "5VERv8NMvzbJMEkV8xnrLkEaWRtSz9CosKDYjCJjBRnbJLgp8uirBgmQpjKhoR4tjF3ZpRzrFmBV6UjKdiSZkQUW",
    },
  },
  accounts: {},
  slots: {},
  transactionsStatus: {},
  blocks: {},
  blocksMeta: {},
  entry: {},
  accountsDataSlice: [],
  commitment: CommitmentLevel.FINALIZED,
};

Successful-Only Transactions for Multiple Programs

const request = {
  transactions: {
    defiTxs: {
      vote: false,
      failed: false,
      accountInclude: [
        "JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4",
        "whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc",
      ],
      accountExclude: [],
      accountRequired: [],
    },
  },
  accounts: {},
  slots: {},
  transactionsStatus: {},
  blocks: {},
  blocksMeta: {},
  entry: {},
  accountsDataSlice: [],
  commitment: CommitmentLevel.CONFIRMED,
};

Slot Filters

Subscribe to real-time slot status updates from the validator.

SubscribeRequestFilterSlots

filter_by_commitment
boolean
When true, only receive slot updates matching the commitment level set in the SubscribeRequest. By default, slots are sent for all commitment levels.
interslot_updates
boolean
When true, include interslot updates (e.g., first shred received, bank created).

Slot Status Enum

enum SlotStatus {
  SLOT_PROCESSED = 0;
  SLOT_CONFIRMED = 1;
  SLOT_FINALIZED = 2;
  SLOT_FIRST_SHRED_RECEIVED = 3;
  SLOT_COMPLETED = 4;
  SLOT_CREATED_BANK = 5;
  SLOT_DEAD = 6;
}
StatusValueDescription
SLOT_PROCESSED0Slot processed by the node
SLOT_CONFIRMED1Slot confirmed by supermajority
SLOT_FINALIZED2Slot finalized
SLOT_FIRST_SHRED_RECEIVED3First shred of slot received
SLOT_COMPLETED4All shreds received for slot
SLOT_CREATED_BANK5Bank created for slot
SLOT_DEAD6Slot is dead (will not be confirmed)

Slot Update Message

slot
uint64
The slot number.
parent
uint64
Parent slot number (optional).
status
SlotStatus
Current status of the slot.
dead_error
string
Error message if the slot is dead (optional).

Slot Examples

Confirmed Slots Only

const request = {
  slots: {
    confirmedSlots: {
      filterByCommitment: true,
    },
  },
  accounts: {},
  transactions: {},
  transactionsStatus: {},
  blocks: {},
  blocksMeta: {},
  entry: {},
  accountsDataSlice: [],
  commitment: CommitmentLevel.CONFIRMED,
};

stream.write(request);

stream.on("data", (data) => {
  if (data.slot) {
    console.log(`Slot ${data.slot.slot}${SlotStatus[data.slot.status]}`);
  }
});

All Slot Updates (Including Interslot)

const request = {
  slots: {
    allUpdates: {
      filterByCommitment: false,
      interslotUpdates: true,
    },
  },
  accounts: {},
  transactions: {},
  transactionsStatus: {},
  blocks: {},
  blocksMeta: {},
  entry: {},
  accountsDataSlice: [],
};

Block Filters

Subscribe to full block data or lightweight block metadata.

SubscribeRequestFilterBlocks

account_include
array of strings
Filter transactions and accounts within blocks that involve any account from this list.
include_transactions
boolean
Include all transactions in block updates.
include_accounts
boolean
Include all account updates in block updates.
include_entries
boolean
Include all entries in block updates.

SubscribeRequestFilterBlocksMeta

Block metadata has no filter parameters — all block metadata is broadcast. Use this for lightweight block tracking when you don’t need full transaction or account data.

Block Update Messages

SubscribeUpdateBlock (Full)

slot
uint64
Block slot number.
blockhash
string
Block hash.
rewards
Rewards
Block rewards.
block_time
UnixTimestamp
Block timestamp.
block_height
BlockHeight
Block height.
parent_slot
uint64
Parent slot number.
parent_blockhash
string
Parent block hash.
executed_transaction_count
uint64
Number of transactions executed.
transactions
array
Array of SubscribeUpdateTransactionInfo (if included).
updated_account_count
uint64
Number of accounts updated.
accounts
array
Array of SubscribeUpdateAccountInfo (if included).
entries_count
uint64
Number of entries.
entries
array
Array of SubscribeUpdateEntry (if included).

SubscribeUpdateBlockMeta (Lightweight)

slot
uint64
Block slot number.
blockhash
string
Block hash.
rewards
Rewards
Block rewards.
block_time
UnixTimestamp
Block timestamp.
block_height
BlockHeight
Block height.
parent_slot
uint64
Parent slot number.
parent_blockhash
string
Parent block hash.
executed_transaction_count
uint64
Number of transactions executed.
entries_count
uint64
Number of entries.
Block reconstruction is based on BlockMeta. Blocks generated on validators may always have zero entries due to a known Solana issue.

Block Examples

Full Blocks with Transactions

const request = {
  blocks: {
    fullBlocks: {
      accountInclude: [],
      includeTransactions: true,
      includeAccounts: false,
      includeEntries: false,
    },
  },
  accounts: {},
  slots: {},
  transactions: {},
  transactionsStatus: {},
  blocksMeta: {},
  entry: {},
  accountsDataSlice: [],
  commitment: CommitmentLevel.CONFIRMED,
};

stream.write(request);

stream.on("data", (data) => {
  if (data.block) {
    console.log(
      `Block ${data.block.slot}: ${data.block.executedTransactionCount} txs, hash=${data.block.blockhash}`
    );
  }
});

Block Metadata Only

const request = {
  blocksMeta: {
    meta: {},
  },
  accounts: {},
  slots: {},
  transactions: {},
  transactionsStatus: {},
  blocks: {},
  entry: {},
  accountsDataSlice: [],
  commitment: CommitmentLevel.CONFIRMED,
};

Blocks Filtered by Account

Only include transactions and accounts involving a specific program:
const request = {
  blocks: {
    jupiterBlocks: {
      accountInclude: ["JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4"],
      includeTransactions: true,
      includeAccounts: true,
      includeEntries: false,
    },
  },
  accounts: {},
  slots: {},
  transactions: {},
  transactionsStatus: {},
  blocksMeta: {},
  entry: {},
  accountsDataSlice: [],
  commitment: CommitmentLevel.CONFIRMED,
};

Entry Filters

Subscribe to ledger entries as they are produced by the validator.

SubscribeRequestFilterEntry

Currently, entry filters have no configurable parameters — all entries are broadcast when subscribed.

Entry Update Message

slot
uint64
Slot containing the entry.
index
uint64
Entry index within the slot.
num_hashes
uint64
Number of hashes since the previous entry.
hash
bytes
Entry hash (SHA-256).
executed_transaction_count
uint64
Number of transactions in this entry.
starting_transaction_index
uint64
Starting index of transactions within the block (available since Solana v1.18; always 0 on v1.17).

Entry Example

Subscribe to All Entries

const request = {
  entry: {
    allEntries: {},
  },
  accounts: {},
  slots: {},
  transactions: {},
  transactionsStatus: {},
  blocks: {},
  blocksMeta: {},
  accountsDataSlice: [],
  commitment: CommitmentLevel.CONFIRMED,
};

stream.write(request);

stream.on("data", (data) => {
  if (data.entry) {
    const e = data.entry;
    console.log(
      `Entry slot=${e.slot} index=${e.index} txs=${e.executedTransactionCount}`
    );
  }
});

Deshred Transactions

The SubscribeDeshred RPC provides access to transactions received when entries are formed from shreds, before any execution occurs. No TransactionStatusMeta is available since the transaction has not been executed yet. Address lookup tables are resolved, so both static account keys and dynamically loaded addresses are available for filtering.
rpc SubscribeDeshred(stream SubscribeDeshredRequest) returns (stream SubscribeUpdateDeshred) {}

SubscribeDeshredRequest

deshred_transactions
map<string, SubscribeRequestFilterDeshredTransactions>
Named deshred transaction subscription filters.
ping
SubscribeRequestPing
Optional ping for keep-alive. Contains id (int32).

SubscribeRequestFilterDeshredTransactions

vote
boolean
Include vote transactions.
account_include
array of strings
Include transactions that use any account from this list (logical OR).
account_exclude
array of strings
Exclude transactions that use any account from this list.
account_required
array of strings
Require all accounts from this list to be present (logical AND).

SubscribeUpdateDeshred

Each update contains the matched filter names and one update type:
filters
array
Names of the filters that matched this update.
update_oneof
oneof
created_at
Timestamp
Server-side timestamp when the update was created.

SubscribeUpdateDeshredTransaction

transaction
SubscribeUpdateDeshredTransactionInfo
slot
uint64
Slot in which the transaction was received.

SubscribeUpdateDeshredTransactionInfo

signature
bytes
Transaction signature.
is_vote
bool
Whether this is a vote transaction.
transaction
Transaction
Transaction data (message and signatures).
loaded_writable_addresses
array of bytes
Dynamically loaded writable addresses from address lookup tables.
loaded_readonly_addresses
array of bytes
Dynamically loaded readonly addresses from address lookup tables.
Deshred transactions have no execution metadata — no logs, no balance changes, no compute units. These are raw transactions as received from the network before the validator executes them.

Deshred Example

const stream = await client.subscribeDeshred();

stream.on("data", (data) => {
  if (data.deshredTransaction) {
    const tx = data.deshredTransaction;
    console.log(`Pre-exec TX in slot ${tx.slot}: ${Buffer.from(tx.transaction.signature).toString("hex")}`);
    console.log(`  Loaded writable: ${tx.transaction.loadedWritableAddresses.length}`);
    console.log(`  Loaded readonly: ${tx.transaction.loadedReadonlyAddresses.length}`);
  }
});

stream.write({
  deshredTransactions: {
    myFilter: {
      vote: false,
      accountInclude: ["JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4"],
      accountExclude: [],
      accountRequired: [],
    },
  },
});