TL;DR
- Baseline volume against liquidity, trade count, and wallet count
- Trace every trade to its wallet to find concentration
- Check trade cadence down to 5 second resolution
- Spot churn in the top traders
- Cross check behavior tags on the float
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 five signals
1
Baseline volume against wallets
Genuine volume spreads across many wallets and stays in some proportion to liquidity. Fake volume does not. This is the cheapest signal, so it filters obvious cases before you spend credits on trade level analysis.Endpoint:
GET /defi/token_overview2
Trace every trade to its wallet
Ratios raise suspicion but cannot name a wallet. Group trades by owner to see how few wallets actually produce the volume.Endpoint:
GET /defi/v3/token/txs-by-volume3
Check cadence down to 5 seconds
Wash bots trade on a timer. That regularity is invisible at hourly resolution and obvious at the resolution of seconds.Endpoint:
GET /defi/v3/token/trade-data/single4
Spot churn in the top traders
A wallet that buys and sells nearly equal volume is not investing, it is churning capital to print volume.Endpoint:
GET /defi/v2/tokens/top_traders5
Cross check behavior tags on the float
Whoever runs a wash operation usually holds the token too, and those wallets tend to already carry a behavior tag from how they acquired it.Endpoint:
GET /token/v1/holder-profileRule out the innocent explanations
Before you act on a high score, rule out the legitimate patterns that trip the same signals. Skipping this is how a detector earns a reputation for crying wolf.- Market makers produce exactly the profile the churn signal looks for, since they quote both sides continuously. The tell is consistency across time rather than a burst: a market maker runs the same way all day, while a wash operation usually clusters around a listing or a marketing push.
- Arbitrage bots fire on a schedule because they poll for price gaps on a schedule. Check the
sourcefield: arbitrage spans two pools by definition, while wash trading usually cycles inside one. - Fresh tokens set off almost every signal at once, few holders, thin liquidity, a high trade to wallet ratio. Weight signals lighter inside the first day of trading, or screen new tokens under a separate rule.
- Low float distorts concentration in the same direction, since a handful of wallets naturally account for most trading when only a small share of supply circulates. Measure concentration against circulating supply where the data allows.
Turn five signals into one wash score
No signal is a verdict, so the detector’s real job is combining them. A practical starting scheme gives one point per flag: volume more than roughly 50 times liquidity, a trade count mapping to only a small fraction as many unique wallets, buy and sell volume within a few percent of each other, a single owner driving more than a fifth of traced volume after dedup, and bundler or sniper wallets holding a large share of the float.Watch your credit budget
Scoring one token spends five calls, and screening a long watchlist adds up fast. Endpoint:GET /utils/v1/credits
Before you ship
- Baseline reads
v24hUSDanduniqueWallet24has camelCase and compares volume against liquidity. - Wallet trace calls
txs-by-volumewithtoken_addressand deduplicates on the composite key. - Cadence calls
trade-data/singlewithaddress, and only trusts 5 second frames on Solana, Base, BSC, and Ethereum. - Churn reads
volumeBuyUSDagainstvolumeSellUSD, mapped apart fromvolumeUsd. - Tag overlap calls
holder-profilewithtoken_addressand weights the bundler tag lighter on tokens created before March 2026. - No single signal is treated as proof, only the stacked score.
FAQ
Can one signal confirm wash trading?
Can one signal confirm wash trading?
No. Every signal has innocent explanations on its own. The detector works by combining volume ratios, wallet concentration, cadence, churn, and tag overlap, so a token that trips several at once is the one to flag.
How do you avoid overcounting trades?
How do you avoid overcounting trades?
A single swap can appear across more than one instruction row. Deduplicate on the composite key
tx_hash plus ins_index plus inner_ins_index, unique per real trade, before counting wallets or volume.How often should you rescore a token?
How often should you rescore a token?
Wash patterns shift, so a token that scores clean today can be manipulated next week. Rescore on the cadence your credit budget allows, and always rescore right before acting on a token’s volume rather than trusting a stale result.

