Transaction, Slot, Block, and Entry
Transaction Filters
Subscribe to transaction updates with filtering by type, status, and account involvement.
SubscribeRequestFilterTransactions
booleanInclude vote transactions. Set false to exclude, true to include only votes.
booleanInclude failed transactions. Set false to exclude, true to include only failures.
stringMatch a specific transaction signature.
array of stringsInclude transactions that use any account from this list (logical OR).
array of stringsExclude transactions that use any account from this list.
array of stringsRequire 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)
transactionSubscribeUpdateTransactionInfoproperties
signaturebytesis_votebooltransactionTransactionmetaTransactionStatusMetaindexuint64slotuint64SubscribeUpdateTransactionStatus (Lightweight)
Use the transactions_status field in SubscribeRequest (same filter format) to receive only status updates without full transaction data:
slotuint64signaturebytesis_voteboolindexuint64errTransactionErrorTransaction 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
booleanWhen true, only receive slot updates matching the commitment level set in the SubscribeRequest. By default, slots are sent for all commitment levels.
booleanWhen 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;
}| Status | Value | Description |
|---|---|---|
SLOT_PROCESSED | 0 | Slot processed by the node |
SLOT_CONFIRMED | 1 | Slot confirmed by supermajority |
SLOT_FINALIZED | 2 | Slot finalized |
SLOT_FIRST_SHRED_RECEIVED | 3 | First shred of slot received |
SLOT_COMPLETED | 4 | All shreds received for slot |
SLOT_CREATED_BANK | 5 | Bank created for slot |
SLOT_DEAD | 6 | Slot is dead (will not be confirmed) |
Slot Update Message
slotuint64parentuint64statusSlotStatusdead_errorstringSlot 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
array of stringsFilter transactions and accounts within blocks that involve any account from this list.
booleanInclude all transactions in block updates.
booleanInclude all account updates in block updates.
booleanInclude 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)
slotuint64blockhashstringrewardsRewardsblock_timeUnixTimestampblock_heightBlockHeightparent_slotuint64parent_blockhashstringexecuted_transaction_countuint64transactionsarraySubscribeUpdateTransactionInfo (if included).updated_account_countuint64accountsarraySubscribeUpdateAccountInfo (if included).entries_countuint64entriesarraySubscribeUpdateEntry (if included).SubscribeUpdateBlockMeta (Lightweight)
slotuint64blockhashstringrewardsRewardsblock_timeUnixTimestampblock_heightBlockHeightparent_slotuint64parent_blockhashstringexecuted_transaction_countuint64entries_countuint64Block 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
slotuint64indexuint64num_hashesuint64hashbytesexecuted_transaction_countuint64starting_transaction_indexuint64Entry 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
SubscribeDeshred is a deployment-specific extension. cubestech does not list this method as a supported production feature.
Do not build production logic around Deshred until your account team confirms endpoint support and limits.
rpc SubscribeDeshred(stream SubscribeDeshredRequest) returns (stream SubscribeUpdateDeshred) {}SubscribeDeshredRequest
map<string, SubscribeRequestFilterDeshredTransactions>Named deshred transaction subscription filters.
SubscribeRequestPingOptional ping for keep-alive. Contains id (int32).
SubscribeRequestFilterDeshredTransactions
booleanInclude vote transactions.
array of stringsInclude transactions that use any account from this list (logical OR).
array of stringsExclude transactions that use any account from this list.
array of stringsRequire all accounts from this list to be present (logical AND).
SubscribeUpdateDeshred
Each update contains the matched filter names and one update type:
filtersarrayNames of the filters that matched this update.
update_oneofoneofUpdate types
deshred_transactionSubscribeUpdateDeshredTransactionpingSubscribeUpdatePingpongSubscribeUpdatePongcreated_atTimestampServer-side timestamp when the update was created.
SubscribeUpdateDeshredTransaction
transactionSubscribeUpdateDeshredTransactionInfoproperties
signaturebytesis_votebooltransactionTransactionloaded_writable_addressesarray of bytesloaded_readonly_addressesarray of bytesslotuint64SubscribeUpdateDeshredTransactionInfo
signaturebytesis_votebooltransactionTransactionloaded_writable_addressesarray of bytesloaded_readonly_addressesarray of bytesDeshred 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: [],
},
},
});