Solana Wallet Transfers API
Every SOL and token transfer between wallets — decoded, USD-valued, and pushed to you as it happens. Watch a list of wallets or a set of tokens, or take the full feed: on Pro, one subscription with no filter delivers every wallet-to-wallet transfer on Solana. Flat monthly pricing, no compute units or credits.
Live transfer stream from $39/mo · Every transfer on Pro at $99/mo · Free REST transfer history
- Every transfer
- On Pro, with no filter needed
- USD value
- On every priced transfer
- 7 days
- Of history over REST
Coverage
What counts as a wallet transfer
SOL and any token, wallet to wallet. Swaps, pool moves and program deposits are left out on purpose, so the feed is funds moving between wallets and nothing else. A wallet's swaps are on the trades stream.
- A wallet sending SOL or a token to a different wallet. Moves to program accounts (deposits, payouts, a DEX's pools) are not transfers.
- Two wallets exchanging tokens with each other in one transaction is a swap, not two transfers. A watched wallet's swaps come on the trades stream with a wallets filter; they are not repeated here.
- Inside a transaction that also swaps, only a transfer moving at least half of what the sender swapped in that token counts, such as sweeping the proceeds to another wallet. App fees don't.
- Any amount above zero. volumeUsd is the USD value when the transfer was decoded, or null when the token had no price yet.
- There is no source field: almost every transfer is sent by the wallet itself, not through an app.
Looking for a wallet's swaps? They're on the trades stream
Swaps are not on this feed. To follow what a particular wallet buys and sells, subscribe to the trades stream with that address in its wallets filter — up to 100 wallets — or pull its last 7 days with GET /v1/wallets/:wallet/trades. Each swap carries both legs, the venue and a USD value.
client.stream("trades", { wallets: ["WALLET_ADDRESS"] })Run it next to a transfers subscription on the same connection and you see what a wallet trades and where the funds go afterwards, without counting anything twice. On Starter the trades stream also needs a mints filter; Pro can watch wallets on their own.
Payload
The shape of a Solana transfer
One TransferV1 object on the live stream and over REST — sender, receiver, token, amount and USD value.
{
"type": "transfer",
"wallet": "5FHwkW5742VKq9W8pN3mL7jR2sT6cX4bY1zD8gH9K2pQ",
"volumeUsd": 228.5,
"transfer": {
"from": "5FHwkW5742VKq9W8pN3mL7jR2sT6cX4bY1zD8gH9K2pQ",
"to": "3M6iBQx9d4h8FLpNq2sT7wJcY6zR1nGtK5uA3oXvE2mB",
"mint": "So11111111111111111111111111111111111111112",
"symbol": "SOL",
"amount": "2000000000",
"uiAmount": 2,
"decimals": 9
},
"signature": "6Rk3nT2xQeB8mVdR4wLc9fJhY6zS1nGtK5uA3oXvW7qE2mCpH8dRzL4nJb9FgKtR5zXvY2mNc8hQ",
"slot": 309847050,
"timestamp": 1751009300000
}wallet is the wallet the message is for. Compare it with transfer.from and transfer.to for the direction. With a wallets filter you get one message per watched side, so a transfer between two wallets you watch arrives twice — dedupe on signature plus wallet if you need it once. Without one, each transfer arrives once, with wallet set to the sender.
uiAmount is the decimal-adjusted size; raw amount and decimals are there when you need them. SOL appears as the wrapped-SOL mint with 9 decimals, so SOL and tokens share one parser. symbolis for display (null for a token we haven't resolved yet); key on mint, since anyone can give a token any symbol.
volumeUsd is the USD value when the transfer was decoded, and null when the token had no price yet. timestamp is Unix milliseconds (nullable when blockTime is unknown); use slot for ordering. There is no source field: almost every transfer is sent by the wallet itself, not through an app.
REST rows are the identical shape, so backfill and live code share one parser: wallet transfers takes the same filters as the stream.
Use cases
What people build on wallet transfers
One stream, four common jobs.
Wallet trackers and activity feeds
Show what a wallet sent and received as it happens, with the token symbol and a USD value already on the event. Backfill the last 7 days over REST when the page loads.
Whale alerts
Set minVolumeUsd and receive only the transfers above your threshold — for a set of tokens on Starter, or across every transfer on Pro.
Following a dev or insider wallet
Pair transfers with the wallets filter on the trades stream to see both halves: what a wallet buys and sells, and where the funds go next.
Deposit and payout monitoring
Watch your own addresses with direction set to in or out and react to each movement, without polling an RPC node for balance changes.
Filters
Filter Solana transfers by wallet, token, direction or size
Applied on our side, before anything is sent to you.
By wallet (wallets)
The wallets to watch: everything each one sends or receives. Up to 100 at once on Starter and 1,000 on Pro. The cap is how many you watch at the same time — re-subscribe with a new list whenever you like. Pro can also leave the filter out and receive every transfer.
By token (mints)
Only transfers of these tokens — any token, wrapped SOL included. Up to 25 at once on Starter and 100 on Pro. With wallets, you get those wallets' transfers of those tokens.
By direction (direction)
in for what the watched wallets received, out for what they sent; omit it for both. It needs wallets, because direction only means something relative to a wallet you watch.
By size (minVolumeUsd / maxVolumeUsd)
USD bounds for whale alerts and for cutting dust, on the stream and on the REST endpoint. These filters exclude transfers where volumeUsd is null.
Filters AND across fields and OR within a list. Starter must send wallets or mints; Pro may send neither and receive every transfer. Transfers have no sourcesfilter — a filter the channel doesn't take is rejected as invalid_filters, never silently ignored.
Quickstart
Stream Solana wallet transfers in Python or TypeScript
Python uses pip install anaxer; TypeScript uses @anaxer/sdk. cURL shows the free-plan REST path.
import asyncio
import anaxer
# Starter or higher for the live transfers stream
async def main():
async with anaxer.connect(api_key="YOUR_API_KEY") as client:
async with client.stream(
"transfers",
# Starter must pass wallets or mints; Pro may omit both for every transfer.
wallets=["WALLET_ADDRESS"],
direction="out",
) as sub:
async for t in sub:
print(t.wallet, "->", t.transfer.to, t.transfer.ui_amount, t.transfer.symbol, t.volume_usd)
asyncio.run(main())import { connect } from "@anaxer/sdk";
const client = connect({ apiKey: process.env.ANAXER_API_KEY! });
// Everything these wallets receive, $1,000 and up.
client
.stream("transfers", {
wallets: ["WALLET_ADDRESS", "ANOTHER_WALLET_ADDRESS"],
direction: "in",
minVolumeUsd: 1000,
})
.on("data", (t) => {
console.log(t.transfer.from, "→", t.wallet, t.transfer.uiAmount, t.transfer.symbol, t.volumeUsd);
});
// Pro: no filter at all — every wallet-to-wallet transfer on Solana.
client.stream("transfers").on("data", (t) => {
console.log(t.transfer.from, "→", t.transfer.to, t.transfer.uiAmount, t.transfer.symbol, t.volumeUsd);
});# REST transfer history works on every plan, including Free (7-day window)
curl "https://api.anaxer.com/v1/wallets/WALLET_ADDRESS/transfers?direction=out&limit=50" \
-H "Authorization: Bearer YOUR_API_KEY"
# Only one token, $500 and up
curl "https://api.anaxer.com/v1/wallets/WALLET_ADDRESS/transfers?mints=TOKEN_MINT&minVolumeUsd=500" \
-H "Authorization: Bearer YOUR_API_KEY"New to our WebSocket? The wire protocol, reconnect and backfill patterns are documented in one place.
Plans
What transfer access costs
The live stream starts at Starter. REST transfer history works on Free. Streams are never metered by volume.
Pro gets every transfer on Solana
Pro is not limited to a watchlist. Subscribe to transfers with no wallets and no mints filter and you receive every wallet-to-wallet transfer — SOL and every token — as it happens, for $99/month. Add minVolumeUsd to keep only the large ones, or pass up to 1,000 wallets and 100 tokens when you want to narrow it down.
Transfer history is 7 days on every plan, and transfers are stored from 11 November 2026, the day the stream launched. Anaxer is stream-first; REST is for backfill and recent lookups, not a multi-year archive.
Build vs buy
Tracking wallets without running an indexer
What it takes to get the same feed from a raw Solana node.
- 1
Find the transfers
A raw node gives you transactions, not transfers. You subscribe to each wallet or to everything, then decode the System Program and token-program instructions inside them.
- 2
Work out who sent what to whom
Tokens move between token accounts, not wallets, so each one has to be resolved to its owner. Then swaps, pool moves and program deposits have to be separated from real wallet-to-wallet transfers.
- 3
Price each one
A USD value needs a live price for every token at the moment of the transfer. Anaxer attaches it upstream, from the same prices that feed the trades and prices streams.
With Anaxer that is one subscribe message. If you need raw account data or programs we don't decode, a full RPC provider is still the right tool — raw firehose versus parsed streams covers how to choose.
Learn more
Wallet tracking guides and reference
Docs and guides for the transfers stream, REST backfill, and alerts.
Pricing
Simple pricing. No compute units. No credits.
Flat monthly plans you can understand in 10 seconds. The bill is the price on the box.
Streams
Token Creation
Token Graduation
Token Prices
DEX Trades
Wallet Transfers
Stream limits
Connections per stream type
REST API
Requests / mo
Rate limit
Streams
Token Creation
Token Graduation
Token Prices
DEX Trades
Track up to 25 tokens at once
Wallet Transfers
Up to 100 wallets or 25 tokens at once
Stream limits
Connections per stream type
REST API
Requests / mo
Rate limit
Streams
Token Creation
Token Graduation
Token Prices
DEX Trades
All tokens, unlimited
Wallet Transfers
All transfers, unlimited
Stream limits
Connections per stream type
REST API
Requests / mo
Rate limit
Enterprise
High volume, custom limits, dedicated support and an SLA.
FAQ