Why migrate?
The Enhanced Transactions API is a legacy product in maintenance mode: it still works, but it is not receiving new parser types or feature work. Its successor is Parsed Events, which decodes instructions through the IDL catalog that also powers Parsed Streams. The difference is in how transactions are decoded. Enhanced Transactions classifies a transaction into one of a fixed list of event types (TRANSFER, SWAP, NFT_SALE, …) and returns a pre-built summary for the types it knows. Parsed Events decodes every instruction against the program’s own IDL — 3,600+ programs — into named arguments and named accounts, and builds the summary on top:
Parsed Events is in open beta on paid plans. The API may still change before general availability; Enhanced Transactions keeps working in the meantime, so you can migrate at your own pace.
Endpoint mapping
Both Parsed Events methods arePOST requests to https://mainnet.helius-rpc.com, authenticated with the same api-key query parameter you already use:
The history endpoint moves all inputs from query-string parameters into a JSON body. Request bodies reject unknown fields, so typos fail loudly instead of being silently ignored.
Before and after
The same task — fetch parsed history for a wallet — in both APIs:Parameter mapping
Parse Transactions
POST /v0/transactions → POST /v1/parsed-events/transactions
New options with no old equivalent:
includeRawTransaction returns the original Solana transaction payload alongside the parsed result.
Transaction History
GET /v0/addresses/{address}/transactions → POST /v1/parsed-events/transaction-history. Every query parameter becomes a JSON body field:
Three defaults change along the way:
limitdefaults to 100 instead of 10.commitmentdefaults toconfirmedinstead offinalized;processedis not supported.sortOrderkeeps the sameasc/descvalues withdescas the default.
paginationToken from the previous response over beforeSignature — see Simplify pagination below.
The old type parameter has no Parsed Events equivalent — there is no server-side transaction-type filter. Filter client-side on parsed.summary.type (swap, transfer, add_liquidity, …), or on the decoded instructions themselves, which is more precise than the old fixed types. For real-time type-specific feeds, Parsed Streams filters server-side at the instruction level.
Response field mapping
Enhanced Transactions returns a flat array of enriched transactions. Parsed Events wraps each result in an envelope —{ signature, parserStatus, parsed } — and history responses wrap the array in a page object with paginationToken. The parsed fields map as follows:
And the biggest change is a new field with no old equivalent:
parsed.instructions[] contains every top-level and inner instruction in execution order, with decoded.args and decoded.accounts named from the program’s IDL. Where Enhanced Transactions gave you one event summary per transaction, Parsed Events gives you the summary and the full decoded instruction list. See Parsed Response for every field.
Migration steps
1
Swap the endpoints
Point Parse Transactions calls at
POST /v1/parsed-events/transactions and history calls at POST /v1/parsed-events/transaction-history. Same host, same api-key query parameter. History requests change from GET with query parameters to POST with a JSON body — move each parameter per the mapping above.2
Update the response handling
Unwrap the new envelope: check
parserStatus === "OK", then read fields from parsed instead of the top level. Rename timestamp to blockTime, read description and type from summary (guarding for null), and divide rawTokenAmount by 10^decimals where the old code read tokenAmount.3
Replace type filtering
Where the old code passed
type=..., filter the returned items client-side on parsed.summary.type or on parsed.instructions[] — for example, “instructions where programId is Jupiter and instructionName is route” replaces type=SWAP with something you can actually verify. If the type filter existed to drive a real-time feed, move that consumer to Parsed Streams, which filters at the instruction level server-side.4
Simplify pagination
Replace the The loop ends when
before-signature cursor loop with paginationToken:paginationToken is missing. The old runtime-search errors (“Failed to find events within the search period”) and their continuation-signature handling disappear entirely — delete that code.5
Verify against the old output
For a sample address, fetch the same page from both APIs and compare the signature sets, fees, and transfer amounts. Then deploy and remove the old code path. Enhanced Transactions keeps working while you migrate — there is no forced cutoff.
Behavior differences to review
- Commitment defaults. History defaults to
confirmedwhere the old endpoint defaulted tofinalized. Passcommitment: "finalized"explicitly if your pipeline depends on finality.processedis not supported. - Per-item errors. A signature that cannot be parsed no longer fails the request — it comes back as an item with
parserStatus: "ERROR"and aparserError. Handle it per item instead of per request. - Summary coverage.
summaryisnullfor transactions with no recognized transaction-level action. The old API returnedtype: "UNKNOWN"in that case; the new API still gives you every decoded instruction to work with. - Access. Parsed Events is in open beta on paid plans, and the API may still change before general availability.
Let an AI agent do the migration
If you use Claude Code, Cursor, or another coding agent, paste the prompt below into your repository’s agent session. It finds Enhanced Transactions call sites and rewrites them.Next steps
Parsed Events Quickstart
Parse your first transaction, fetch address history, and page through results.
Parsed Response
Field reference for parsed transactions, transfers, and instructions.
Parsed Streams
The same decoding in real time over WebSocket, filtered server-side.
getTransactionsForAddress
Raw transaction history with token-account support and server-side filters.