Parsed Streams is in closed beta. Access is limited to whitelisted project ids for now, and the API may change before general availability. To join the closed beta, apply here.
What is Parsed Streams?
Parsed Streams is a WebSocket service that watches every confirmed Solana transaction (vote transactions excluded), decodes it, and pushes you the transactions that match a filter you define. You say “I care about Jupiter route instructions” or “I care about anything touching this account”, and the server does the watching, decoding, and matching for you. You receive whole transactions, already decoded: every instruction with named arguments and named accounts, plus the fee, the full account key list, a transaction-levelsummary of what happened, the SOL and token transfers, and pointers to the exact instructions that matched your filter. All data is delivered at confirmed commitment.
The mental model
If you already know Solana internals, skip ahead. If not, this is the model the whole API is built on. A transaction is a signed message. It names a fee payer, lists every account it will touch, and carries a list of instructions. When you look at one you see: a signature (its unique id), the slot it landed in, the fee paid, the account keys, whether it succeeded or failed, and the instructions. An instruction is one action: run this program, with this input, using these accounts. A swap on Jupiter, a token transfer, a memo. A transaction usually carries several instructions, and they run in order. Programs can call other programs. When Jupiter executes a swap, it does not move the tokens itself. Its route instruction calls the token program to move tokens and the exchange programs that hold the liquidity. Those nested calls are instructions too, called inner instructions (or CPIs, cross program invocations). This matters when you write a filter: much of the real activity, like the actual token movements inside a swap, happens in inner instructions, so your filter matches them by default. If you only want the instructions a user signed for, setincludeCpi to false.
Accounts are the on-chain things an instruction works with: wallets, token balances, pools, mints. Each instruction carries them as an ordered list of addresses, and the order is the contract: the program defines what each position means. The token program, for example, expects the account to take tokens from first, then the account to receive them, then the owner approving the transfer.
Roles give those positions names. Most well known programs publish a machine readable manual for their interface, called an IDL. The manual lists every instruction the program has, what its data fields mean, and what each account position is for. Helius keeps a catalog of these manuals for thousands of programs. Using it, a bare address list turns into named accounts: for a token transfer, position 0 becomes source, position 1 becomes destination, position 2 becomes authority. Instead of guessing what the third address means, you read {"name": "authority", "pubkey": "9xQe...", "isSigner": true}. These names are the roles you can filter on.
Decoding is the same idea applied to the instruction’s input data. On the wire that data is opaque bytes. With the program’s manual, the bytes become named values: {"in_amount": "1000000", "slippage_bps": 50}. Not every instruction can be decoded, so each one lands in one of three states you can see directly from its fields:
- Decoded: the instruction carries a
decodedobject with namedargsand namedaccounts. - Recognized: on top of
decoded, the instruction carries asummarywith atype(such asswap), a human-readabledescription, and a structuredparsedDatapayload, such as swap metadata with amounts and mints. - Undecoded: the program or instruction is not in the catalog,
decodedisnull, and the instruction carries the raw bytes (rawData) and the plain address list (rawAccounts) instead, so you always have something to work with.
programs: which program the instruction callsinstructionNames: what the program’s manual calls that actionaccounts.include: which addresses it touchesaccounts.roles: which named position must hold which addressincludeCpiandincludeFailed: whether inner instructions and failed transactions count
How it compares
vs Enhanced WebSockets
Enhanced WebSockets stream whole transactions or account updates without decoding. Parsed Streams matches at the instruction level and decodes everything for you.
vs LaserStream gRPC
LaserStream is a high-throughput gRPC firehose that you filter and decode on the client. Parsed Streams is a WebSocket API that filters and decodes on the server.
vs Parsed Events
Parsed Events applies the same decoding to historical transactions: parse signatures or page through an address’s history on demand over REST and GraphQL. Parsed Streams pushes new transactions as they land.
Supported programs
Parsed Streams decodes 3,600+ programs from their on-chain IDLs, plus core programs like SPL Token, Token-2022, and the System Program through built in decoders. You can filter by any program address. Instructions the service cannot decode stream as raw instruction data instead. A few of the most-used decoded programs:DEXs & AMMs
DEXs & AMMs
Launchpads
Launchpads
Lending & Perps
Lending & Perps
NFTs & Compression
NFTs & Compression
Access
Only whitelisted project ids can connect during the closed beta. The Helius team shares the connection endpoint with you when your project is whitelisted. Authenticate with your project’s API key, passed as theapi-key query parameter (or the x-api-key header). The key is checked when the connection opens: a missing, invalid, or non-whitelisted key is rejected with HTTP 401, and a project at its connection cap gets HTTP 429.
Get Started
Quickstart
Connect, send your first filter, and read a notification.
Track Jupiter Swaps
Build and subscribe a real filter using program discovery.
Track Pump.fun Mints
A reconnect-safe listener that logs every new Pump.fun token deploy.
Handling Reconnects
Detect disconnects, back off, resubscribe, and backfill missed slots.