
API
The service speaks the Yellowstone gRPC protocol, so any Yellowstone client withSubscribeDeshred works, including yellowstone-grpc-client 14 for Rust and @triton-one/yellowstone-grpc 7 for TypeScript. The definitions are in geyser.proto and solana-storage.proto.
geyser.proto
SubscribeDeshredRequest with one or more named filters. Each message you receive carries one transaction and the names of the filters it matched. See Transaction format for how to read it.
Filters
A filter matches a transaction when:account_includeis empty, or the transaction uses at least one of its accounts;- none of the
account_excludeaccounts appear in it; - it uses every account in
account_required.
- Vote transactions are never sent. Leave
voteunset or set it tofalse;trueis refused withINVALID_ARGUMENT. - Up to 16 filters per stream and 1,024 accounts per list. Filter names are at most 64 bytes.
- Send a new request on the same stream at any time to replace the filters. A request with no filters stops delivery until you send new ones.
slotsandinclude_update_parentare not supported and are refused.
What you receive
- Signed transactions, in the order the leader recorded them: legacy, v0 and v1.
- Lookup-table addresses already resolved in
loaded_writable_addressesandloaded_readonly_addresses. In the rare case a table cannot be resolved, both lists are empty while the message still lists itsaddress_table_lookups, and a filter withaccount_excludeskips that transaction. - No execution results. The transactions have not been executed yet, so there is no status, logs, fee or balance change. A transaction you see here can still fail, and the slot can still be skipped.
Staying connected
- The server sends a
pingevery 15 seconds. Reply with a request carryingpingso proxies between you and the service keep the connection open; the reply does not change your filters. - Set the client’s maximum decoded message size to at least 64 MB.
- Read continuously. A client that falls behind the stream, or reads nothing for 10 seconds, is disconnected with
DATA_LOSS. Narrow your filters if you cannot keep up with the full stream. - Reconnect with exponential backoff when a stream ends. Nothing is replayed on reconnect; transactions broadcast while you were disconnected are not resent.
UNAVAILABLEandRESOURCE_EXHAUSTEDwithout an error code are temporary: retry with backoff.INVALID_ARGUMENTmeans a filter was rejected: fix the request.- Do not retry on
UNAUTHENTICATED,NOT_ENTITLED,IP_NOT_ALLOWEDorQUOTA_EXCEEDED. See Errors.
