TL;DR
- Find the tokens smart money is buying
- Identify the wallets driving that flow
- Score each candidate wallet across its full history
- Monitor trusted wallets for new moves
All requests share the base URL https://public-api.birdeye.so, authenticate with the X-API-KEY header, and select the network with x-chain: solana.
The signal this pipeline produces is: a wallet worth following just acted. Sizing, routing, and execution stay your own decision downstream of that signal.
The four stage pipeline
1
Find the tokens smart money is buying
Scanning every token on Solana is wasted effort when one endpoint already tells you which tokens skilled wallets are accumulating right now.Endpoint:
GET /smart-money/v1/token/list2
Identify the wallets driving the flow
A token level signal hides the wallets underneath it. This call drops from the token down to the individual traders moving it, sorted by realized profit so the wallets that actually booked gains sit at the top.Endpoint:
GET /defi/v2/tokens/top_tradersEach trader carries a
tags array of dev, bundler, sniper, and insider. Treat a tag as a caution flag that lowers a wallet’s priority, not proof of bad behavior. Aggregate volume is volumeUsd, while the buy and sell breakdowns are uppercase volumeBuyUSD and volumeSellUSD.3
Score each candidate wallet
A wallet can look brilliant on a single token and be reckless everywhere else. Before letting a wallet into the signal set, pull its whole record in one call.Endpoint:
POST /wallet/v2/pnl/detailsRead the win rate from
data.summary.counts.win_rate. It arrives as a ratio between 0 and 1, so multiply by 100 to display it. Do not recompute it from total_win and total_loss, since the denominator counts every unique token the wallet touched, not just wins plus losses. realized_profit_percent already arrives as a percentage, so do not scale it again. pricing.current_price can be null for a token with no live price, so guard for that before any math.4
Monitor trusted wallets for new moves
A trusted wallet is only useful while it is acting. This stage watches each wallet so the layer fires the moment one enters or exits a position.Endpoint:
GET /trader/txs/seek_by_timeIn the response, the trader wallet is
owner, while the item level address is the pool, so do not confuse the two. Each trade splits into a base and a quote leg, each carrying a type_swap of to or from. The tracked token on to means the wallet bought, an entry; on from means the wallet sold, an exit.Watch your credit budget
A monitoring layer that polls several wallets on a loop can consume credits faster than a one off script. Endpoint:GET /utils/v1/credits
Before you ship
- The token list is sorted by
net_flowand treated as a watchlist, not a buy list. - All required parameters are set on the top traders call so it never returns a 400 error.
- Behavior tags are applied as a soft risk filter, not a hard ban.
- Every wallet is scored with
duration=allandposition_scope=cumulative, with win rate read as a ratio. - The trades endpoint is polled with
after_time, deduped on the composite key.
FAQ
What is smart money copy trading?
What is smart money copy trading?
Mirroring the trades of wallets with a proven record of profitable activity. This pipeline handles finding those wallets, verifying them, and detecting their moves, while your own system decides how to act on the signal.
How do you avoid copying a wallet that just got lucky?
How do you avoid copying a wallet that just got lucky?
Score the wallet across its entire portfolio with the profit and loss endpoint rather than judging it on one token, using
duration=all and position_scope=cumulative so the result is not quietly scoped to a recent window. A healthy win rate and real realized profit over the full history is far more reliable than a single large gain.Can you get real time alerts instead of polling?
Can you get real time alerts instead of polling?
Yes. The wallet transactions stream delivers updates by push on higher plans, which removes polling entirely. On a Premium plan, a short polling loop on the trades endpoint achieves the same outcome over standard REST.

