TriportRPC

Why getSignaturesForAddress returns an empty array

Last updated:

At a glance

Symptom details
PropertyValue
What you get back"result": [] — a successful response, not an error
Error field presentNo — there is no err or error object to branch on
Most common causeThe address has no on-chain transaction history
Second causeHistory exists but falls outside the RPC node's retained signature index
How to tell them apartgetAccountInfo returns null for a never-used address; non-null with an empty signature list points to the index boundary instead

What you see

You call Solana's getSignaturesForAddress for a base58 address you believe is active, and it returns "result": [] — no error, no err field to inspect, just zero entries. The call itself succeeded: the JSON-RPC envelope carries a result, not an error object, so there is no code to look up.

Why this happens

getSignaturesForAddress answers from the transaction-signature index the RPC node maintains for that address; an empty array means the index has no entries for it, and that has two different causes that look identical in the response. First, and most common: the address genuinely has no on-chain history — a freshly generated keypair, an address that was computed (a PDA, an associated token account) but never actually used in a transaction, or an address that exists only in your application's own database and was never funded on-chain. Second: the address does have history, but it falls outside what the RPC node you reached currently retains. A Solana RPC node prunes its ledger over time — getFirstAvailableBlock and minimumLedgerSlot document this retention floor for raw block data, and the address-signature index a node maintains is subject to the same kind of boundary. Unlike an out-of-range block request, which answers with an explicit error, a signature-index miss and a genuinely empty history both come back as the same empty array. A third, unrelated cause is worth ruling out first because it is the easiest to fix: Solana runs separate clusters (mainnet-beta, devnet, testnet) with independent ledgers, so the same address string queried against the wrong cluster has a different — often empty — history by definition.

What to do

  1. Rule out the wrong-cluster mistake first: confirm the endpoint you called is actually the cluster you meant to query, since the same address has independent history on each one.
  2. Check whether the account exists at all with getAccountInfo. If it returns null, the address has never been funded or touched on-chain, and an empty signature list is the correct, complete answer — there is nothing more to page through.
  3. If the account does exist (getAccountInfo returns data), the address has been touched at least once — treat the empty result as "outside this node's retained index" rather than "no history", and do not conclude the account is unused from getSignaturesForAddress alone.
  4. Do not assume a fixed retention window and do not retry the same call expecting a different answer — a live RPC node's index does not grow backwards. To page through what you already received, pass the oldest signature as the before cursor on the next call rather than re-issuing the same query.

When this is not our problem

An empty array here is not a Triport-side failure to report: it is Solana's normal, correct response to "no matching signatures", and the same call against any Solana RPC node's live index behaves the same way for the same address, on any provider — there is nothing to fix on our side. If you need certainty about deep history rather than what a live JSON-RPC index happens to retain — telling "never funded" apart from "funded years ago" without guessing — Triport's REST wallet history endpoint reads from a dedicated archive going back roughly 3.5 years, instead of the node's live signature index.

FAQ

Is an empty array from getSignaturesForAddress an error?
No. The JSON-RPC call succeeds with a result of [] — there is no error code or err field, because zero matching signatures is a valid, complete answer to the query as asked.
How do I know if an address ever had any transactions?
Call getAccountInfo for the same address first. If it returns null, the account has never been funded or touched on-chain and the empty signature list is correct. If it returns account data, the address has been used at least once, and an empty getSignaturesForAddress result instead means that activity falls outside the node's retained index.