Skip to main content
Load a wallet’s transfer history with one REST call, then join a transfer room to receive new transfers as they happen. Both cover native SOL, SPL tokens and Token-2022 tokens.

Query transfer history

Filter by token, counterparty, time, amount or USD value.

Stream transfers live

Follow a wallet, a token, or one token for one wallet.

Query transfer history

GET /account/{address}/transfers returns transfers in and out of a wallet, newest first. SPL transfers are matched through the token accounts the wallet owns, and each side shows both the token account (address) and the wallet that owns it (owner). By default the history leaves out transactions with DEX activity, such as swaps, liquidity adds and removes, and pool fee claims, so you get the wallet’s plain transfers. Set dex=include to keep them or dex=only to get just those.
Each transfer looks like this:
  • amount is the raw integer amount and uiAmount the exact decimal amount, both as strings.
  • timestamp is the block time in Unix seconds.
  • type is sol for native SOL and spl for token transfers. SOL uses the wrapped SOL mint So11111111111111111111111111111111111111112.
  • status is the transaction’s outcome, success or failed. Failed transactions are left out unless you ask for status=failed or status=any.
  • price and value are only there with historicPrices=true or a value filter.
  • identity appears on from or to when the wallet is known: a KOL, an exchange, a pool, a developer, or an SNS name.

Filter the history

Each parameter has one name. A name the endpoint doesn’t know is a 400 that tells you the right one, for example unknown parameter timeStart; use start, so a typo never returns an unfiltered page. historicPrices=true adds price.usd and value.usd with the token’s USD price at the time of the transfer, from the last 1-minute candle at most an hour before it. Without a price they are null.

What counts as DEX activity

A transaction has DEX activity when one of its transfers goes to or comes from a pool: an account a DEX or launchpad program owns, such as a pump.fun bonding curve or a Meteora DLMM pool, or a Raydium or Meteora vault authority. That covers swaps, liquidity adds and removes, and fee and reward claims. A transaction where the wallet sent one token and received another counts too. dex=exclude and dex=only act on whole transactions: every transfer of the transaction is left out or kept together. Only the transfers that match direction and mint are looked at, so with those set, a transaction whose pool leg is filtered out counts as a plain transfer.

Group by transaction

Add grouped=true to also get transactions, the page’s transfers grouped by signature. Each transaction has its transfers, the number of them in legs, totals.in, totals.out and totals.tokens, and dex. type is swap when dex is true, and swap names the token in and the token out when the wallet sent one token and received another. With historicPrices=true, the totals also carry USD: totals.value, totals.net, and usd on each side.

Page through results

Pass pagination.next back as cursor with the same filters, and stop when hasMore is false. A page never splits a transaction, so it can hold a few transfers more or fewer than limit; with grouped=true, limit usually counts transactions. Filtered requests read a bounded number of transfers per call, so a page can hold fewer than limit rows, or none, while hasMore is still true. Keep paging. With minValue or maxValue, each page prices the next limit transfers and returns those that match. If prices can’t be read in time, the request returns 503; send it again.

Use the TypeScript SDK

Install @solana-tracker/data-api version 0.6.0 or later. getAccountTransfers takes the same filters as the endpoint, and the address filters accept an array or a comma-separated string. The SDK checks them with the API’s rules and throws a ValidationError before sending a request the API would refuse. iterateAccountTransfers follows pagination.next for you and keeps going past empty filtered pages.
With { grouped: true }, TypeScript knows the response has transactions.

Stream transfers live

Connect to wss://datastream.solanatracker.io/{apiKey} with your Data API key. Datastream is available on Premium, Business, and Enterprise plans.

Choose a room

Append :enriched to any room to add token (name, symbol, image, decimals), price.usd, value.usd and marketCap.usd to every transfer and balance change, and identity to each transfer’s from and to and each balance change: the wallet’s KOL profile, bot, platform, developer, pool or SNS labels, as in the trade rooms, or null for a wallet with none. SOL’s marketCap.usd is its price times the circulating supply; USDC, USDT and USD1 have none. The enriched message can arrive up to 250 ms after the plain one; if a lookup took longer, it has enrichmentStatus: "partial" and null for what is missing.

Subscribe with the SDK

The SDK handles heartbeats and reconnects. transfers.wallet, transfers.token and transfers.tokenWallet join the three rooms; set { enriched: true } for the :enriched room. transfers.token throws for SOL: use transfers.wallet, or transfers.tokenWallet with the wrapped SOL mint.

Read a message

Each message is one transaction:
  • transfers are the room’s transfers in instruction order. id is signature:instruction:inner and unique per transfer. direction is set in wallet rooms. Token-2022 transfers with a transfer fee carry fee, and amount is before the fee.
  • balances are the room’s balance changes in that transaction: the wallet’s, the token’s, or the wallet’s for that token. cause is transfer, swap (the trader’s traded tokens), or other. The fee payer’s SOL entry has fee, which is included in change.
  • Swaps stay in the trade rooms. A transfer that is a leg of a swap already streamed is not sent again. What remains of a swap, such as platform fees, tips or payouts to other wallets, arrives with swapTx: true.
  • Not transfers: wraps, unwraps and moves between a wallet’s own accounts. Failed transactions are not streamed.
In an :enriched room the same message also carries token, price, value, marketCap and identity. In this one, a KOL sold a token for SOL; the SOL fee paid to another wallet is what remains of the swap, so it arrives with swapTx: true.
Live transfers are sent at processed commitment. A transaction can be dropped on a fork, and there is no rollback message, so reconcile with the REST endpoint. Joining overlapping rooms delivers the same transfer once per room.

Next

Account transfers reference

Every parameter and response field.

Datastream protocol

Connect, join rooms, and handle heartbeats.