voteSubscribe
Subscribes to vote transactions and streams every new vote the node observes in gossip, before the votes land in blocks.
voteSubscribe streams the raw consensus traffic of the cluster: every vote
transaction the serving node observes, pushed as a voteNotification the
moment it is seen in gossip — which can be before the vote is packed into a
block. Each notification identifies the voting validator (votePubkey), the
slots the vote covers, the bank hash being voted on, the vote
transaction's signature, and a timestamp when the validator attached one.
It takes no parameters and cannot be filtered server-side: you receive the
votes of every validator, which on mainnet means a sustained torrent of
frames (votes are the majority of all Solana transactions). Plan to filter
client-side by votePubkey and to consume the socket quickly.
The audience is consensus-layer tooling rather than typical dapps: validator
operators watching their own identity to confirm it is voting (and alerting
within seconds when it stops); staking platforms and monitoring services
computing real-time participation or delinquency ahead of what
getVoteAccounts polling can show; researchers measuring vote latency and
fork choice; and low-latency systems that estimate optimistic confirmation
themselves by accumulating voted stake per slot instead of waiting for the
node's own optimisticConfirmation signal.
Treat the method as best-effort. It is explicitly unstable in stock
Solana and only exists on nodes started with the vote-subscription flag —
Triport serves it on /ws/sol (gated to the pro tier), but the upstream
API may change between Solana releases and code using it will not port to
arbitrary RPC endpoints. The stream reflects gossip as one node hears it:
votes can arrive out of order, be duplicated, or belong to forks that later
die, so aggregate rather than trusting any single frame. There is no replay
after a reconnect — resubscribe and re-baseline from getVoteAccounts. Like
all subscriptions it is session-scoped; stop it with
voteUnsubscribe.
Parameters
None — params is an empty array (or omitted).
Response
Subscribe ack:
Votes stream continuously as voteNotification frames:
{
"jsonrpc": "2.0",
"method": "voteNotification",
"params": {
"subscription": 88110,
"result": {
"votePubkey": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin",
"slots": [348392110, 348392111],
"hash": "8Rshv2oMkPu5E4opXTRyuyBeZBqQ4S477VG26wUTFxUM",
"timestamp": 1755500002,
"signature": "5VERv8NMvzbJMEkV8xnrLkEaWRtSz9CosKDYjCJjBRnbJLgp8uirBgmQpjKhoR4tjF3ZpRzrFmBV6UjKdiSZkQUW"
}
}
}result (on ack)integervoteUnsubscribe.params.result.votePubkeystringparams.result.slotsarray of integerparams.result.hashstringparams.result.timestampinteger | nullparams.result.signaturestringErrors
| Code | Meaning | When it happens |
|---|---|---|
4003 | forbidden | Your tier is below pro (tier_insufficient; the frame carries required_tier and upgrade_url). |
4001 | unauthorized | Missing or invalid API key on the upgrade / auth frame. |
4029 | rate_limited | Subscribe rate exceeded for your tier. |
Notes
- Unstable + flag-gated upstream: stock Solana nodes expose this only with the vote-subscription flag enabled; expect the shape to evolve.
- No server-side filter: you get all validators' votes — filter by
votePubkeyclient-side. - Gossip-level data: duplicates, reordering, and votes on dying forks are normal; aggregate before drawing conclusions.
- Related methods:
voteUnsubscribe,getVoteAccounts(polled aggregate view),slotsUpdatesSubscribe(optimisticConfirmationevents derived from these votes).