Why migrate?
The standard way to fetch an address’s transaction history on Solana takes two steps: callgetSignaturesForAddress to list signatures, then call getTransaction once per signature to fetch the details. For 1,000 transactions, that is 1,001 HTTP requests.
getTransactionsForAddress is a Helius-exclusive RPC method that collapses both steps into one call. It returns up to 1,000 full transactions per request, with filtering, bidirectional sorting, and token-account support that the standard methods don’t have.
The result: roughly 10x fewer credits, 1,000x fewer round trips, and no client-side batching, rate-limit handling, or retry logic for the
getTransaction fan-out.
Before and after
Here is the same task — fetch the last 1,000 transactions for an address with full details — in both patterns:getTransactionsForAddress is not part of standard Solana RPC, so @solana/web3.js has no Connection helper for it. Call it with a raw JSON-RPC request as shown above — it works on the same Helius endpoint as the rest of your RPC traffic.
Parameter mapping
Every option from the old two-step flow has a direct equivalent. Most names carry over unchanged — only pagination works differently.From getSignaturesForAddress
From getTransaction
Two capabilities have no old equivalent at all:
filters— narrow results byblockTime,slot,status,tokenTransfer, ortokenAccountsserver-side instead of fetching everything and filtering in your code.sortOrder: "asc"— chronological (oldest-first) results, which the standard methods can’t return without fetching the entire history and reversing it.
Migration steps
1
Confirm you're on a Helius endpoint
getTransactionsForAddress is Helius-exclusive. It works on https://mainnet.helius-rpc.com/?api-key=YOUR_API_KEY (and devnet) — the same endpoint your existing calls already use if you’re a Helius customer. No API key or plan changes are needed.2
Replace the two-step fetch with one call
Delete the
getSignaturesForAddress call and the getTransaction loop. Make a single getTransactionsForAddress request with transactionDetails: "full", carrying over your encoding, maxSupportedTransactionVersion, and commitment values as shown in the parameter mapping.If you only need signatures (for example, to feed an existing pipeline), use transactionDetails: "signatures" instead — it costs 10 credits flat per call.3
Update the response handling
The response envelope changes in three ways:
- Results live in
result.data(an array), not directly inresult. - Each full-mode entry is
{ slot, transactionIndex, blockTime, transaction, meta }. Thetransactionandmetaobjects are identical in shape to whatgetTransactionreturns, so your parsing code carries over unchanged. - Signatures-mode entries match
getSignaturesForAddressoutput (signature,slot,err,memo,blockTime,confirmationStatus) plus a newtransactionIndexfield.
getTransaction call could return null for a signature. With getTransactionsForAddress, every entry in result.data is a complete transaction — remove any null-handling for missing details.4
Replace signature-based pagination
Swap the The loop ends when
before cursor loop for paginationToken:paginationToken is null — no more comparing signature lists or tracking the last signature yourself.If you used until to stop at a known signature, replace it with filters.signature: { gt: "KNOWN_SIGNATURE" }. If you used it to stop at a point in time, filters.blockTime or filters.slot is usually a cleaner fit.5
Optional: enable complete token history
The old pattern misses associated token account (ATA) activity entirely unless you also called
getTokenAccountsByOwner and fetched signatures for every token account. To include it, add one filter:balanceChanged returns transactions that reference the wallet or change the balance of any token account it owns, filtering out spam. See associated token accounts for the none/balanceChanged/all options and the pre-2022 caveat.6
Verify against the old output
For a sample address, fetch history both ways and compare the signature sets. With
filters.tokenAccounts unset (the default none), getTransactionsForAddress returns the same transactions as getSignaturesForAddress for the same range. Then deploy and remove the old code path.Behavior differences to review
Most migrations are a drop-in replacement, but check these before shipping:- Commitment.
processedis not supported; useconfirmedorfinalized. If your old code polled recent history atprocessed, switch toconfirmed. - Metering. Full-transaction responses cost 10 credits per 100 returned transactions (10-credit minimum); signatures-only responses cost 10 credits flat. The old pattern cost 1 credit per call — cheaper per request, but far more expensive per transaction fetched. Failed responses are free. See metering.
- Network support. Mainnet has unlimited retention. Devnet is supported with 2 weeks of retention. Testnet is not supported.
- Reserved addresses. A small set of system addresses (Vote Program, System Program, sysvars) route to fallback archival paths or return empty. If you index those, review limitations and edge cases.
- Multiple addresses. Like the old flow, one request covers one address. Query addresses in parallel and merge; see multiple addresses.
Frequently asked questions
Is getTransactionsForAddress a standard Solana RPC method?
No. It is a Helius-exclusive method available on Helius RPC endpoints. Standard Solana RPC and other providers only offergetSignaturesForAddress and getTransaction. Your other RPC calls are unaffected — the method lives on the same endpoint alongside the full standard RPC surface.
Do I still need getTransaction after migrating?
Only for one-off lookups where you already have a signature and no address context, such as verifying a specific transaction a user pasted in. For any address-based history — backfills, indexing, wallet activity feeds —getTransactionsForAddress replaces both methods.
Does it work with @solana/web3.js?
The method isn’t in theConnection class, but it works with any HTTP client against your Helius RPC URL. Use fetch (or your language’s equivalent) with a standard JSON-RPC body, as shown in the examples above. You can keep using Connection for everything else.
Will it return the same transactions as getSignaturesForAddress?
Yes. With default settings (filters.tokenAccounts: "none"), it returns transactions that reference the queried address — the same set as getSignaturesForAddress. Setting tokenAccounts to balanceChanged or all returns more: it adds activity from the wallet’s associated token accounts, which the standard method cannot see.
How much does it cost compared to the old pattern?
Fetching 1,000 full transactions costs 100 credits withgetTransactionsForAddress versus roughly 1,001 credits (and 1,001 requests) with getSignaturesForAddress + getTransaction. Signatures-only responses cost 10 credits flat per call. See Helius credits for full pricing.
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 the old pattern in your codebase and rewrites it.Next steps
getTransactionsForAddress guide
Full tutorial covering filters, sorting, pagination, and token accounts.
API reference
Complete request and response schema.
Indexing guide
Use getTransactionsForAddress to backfill and sync a Solana index.
Historical data overview
Compare all Solana historical data methods.