TriportRPC

voteSubscribe

Subscribes to vote transactions and streams every new vote the node observes in gossip, before the votes land in blocks.

Solanasol.pubsubpro+ — per-method tier gating on /ws/sol

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)integer
Subscription id — pass it to voteUnsubscribe.
params.result.votePubkeystring
Vote account of the validator that cast the vote (base-58).
params.result.slotsarray of integer
The slots this vote covers.
params.result.hashstring
Bank hash being voted on (base-58).
params.result.timestampinteger | null
Unix timestamp attached by the validator, if any.
params.result.signaturestring
Signature of the vote transaction.

Errors

CodeMeaningWhen it happens
4003forbiddenYour tier is below pro (tier_insufficient; the frame carries required_tier and upgrade_url).
4001unauthorizedMissing or invalid API key on the upgrade / auth frame.
4029rate_limitedSubscribe 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 votePubkey client-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 (optimisticConfirmation events derived from these votes).