How to detect fake volume and wash trading on pump.fun
Volume is the most faked metric on pump.fun. Trending feeds sort by it, buyers screen by it, and a bot can manufacture it for pennies: buy, sell, repeat — the same SOL round-tripping through the same token, printing "activity" that never had a second party. This guide shows how to detect fake volume on pump.fun with data: measure wash trading, identify volume bots wallet by wallet, and check whether the first buyers of a launch are bots — using the Raiden API.
Why volume is the easiest metric to fake
Every discovery surface in the pump.fun ecosystem — trending tabs, "top movers" lists, volume screeners — ranks tokens by traded volume. That makes volume the one number an operator most wants to inflate, and it happens to be the cheapest one to inflate: unlike holders (which need funded wallets) or price (which needs net capital inflow), volume only needs the same capital to move back and forth. A wallet that buys 2 SOL and sells 2 SOL prints 4 SOL of volume and loses only the fees. Run that loop a few hundred times across a handful of wallets and a dead token looks like the hottest chart of the hour. Wash trading on Solana is especially cheap because transaction fees are fractions of a cent — the economics favor the botter.
One call: /tokens/{mint}/wash-traders
The detection endpoint scans the token's last 24 hours and flags round-trippers — wallets with at least 5 buys AND at least 5 sells in the window. A wallet that only accumulates is a buyer, not a wash trader; it is the repeated in-and-out cycling that inflates the tape:
curl -H "X-API-Key: $RAIDEN_KEY" \ "https://terminal.raiden.wtf/api/tokens/9xQm…pump/wash-traders"
{
"mint": "9xQm…pump",
"window_h": 24,
"flagged": 6,
"shown": 6,
"wash_vol_sol": 128.4,
"total_vol_sol": 472.9,
"wash_pct": 27.2,
"data": [
{ "wallet": "6hh9…Nfew", "buys": 41, "sells": 39, "vol_sol": 88.2 }
]
}| Field | Meaning |
|---|---|
flagged / shown | total round-trippers found vs the ones listed — data is capped at the 20 most active (by trade count) |
wash_vol_sol | 24h volume produced by round-trippers, in SOL |
total_vol_sol | the token's full 24h volume, in SOL |
wash_pct | the headline number: the share of volume that is artificial — computed over all flagged wallets, not just the 20 shown |
data[] | per wallet: buys, sells, vol_sol |
Reading wash_pct honestly
Round-tripping is not automatically a scam. Scalpers cycle in and out of hot tokens; some market-making-ish behavior round-trips by design. The signal is not the existence of round-trippers — it is the share of volume they account for, and how the tape is shaped:
- Balanced counts — a wallet at
41 buys / 39 sellsis cycling, not trading a view. Perfectly matched buy/sell counts across several wallets is the classic wash signature. - Concentration — one wallet whose
vol_solis a large slice oftotal_vol_solmeans the "market" is mostly one machine talking to itself. - The share — a token with
wash_pctin the single digits has a normal amount of churn. A token where a quarter of the volume is round-tripped deserves a closer look. A token where most of it is round-tripped is advertising activity that is not there.
How the trust score prices it in
GET /tokens/{mint}/trust — the live 0–100 risk score (higher = safer) —
folds wash trading in as one of its five weighted signals, alongside dev
reputation, known rug-dumpers in the token, bundled supply and dev exit. The
wash weight is 0.15, and each signal reports its raw value plus its
contribution (comp) to the final score:
{
"mint": "9xQm…pump",
"score": 45,
"verdict": "caution",
"signals": {
"dev_score": { "value": 0, "comp": 8.4, "known": true },
"bundled_pct": { "value": 52.0, "comp": 0.0, "known": true },
"wash_pct": { "value": 27.0, "comp": 4.3, "known": true }
},
"weights": { "dev": 0.35, "offenders": 0.25, "bundle": 0.15, "exit": 0.10, "wash": 0.15 }
}
The weight is only half the story. When wash_pct crosses 40%, a
hard cap kicks in: the score is capped at 45 — inside the caution band
(verdicts: clean ≥65, caution 40–64,
likely_rug <40) — no matter how good the other signals look. A token
whose tape is mostly fake can never rate as clean, even with a reputable dev and an
unbundled launch. The full scoring model, signal by signal, is covered in the
pump.fun rug check guide.
Cross-check the tape: /tokens/{mint}/swaps
Numbers should survive an eyeball test. Pull the raw tape and look for the same trader alternating sides within seconds:
curl -H "X-API-Key: $RAIDEN_KEY" \ "https://terminal.raiden.wtf/api/tokens/9xQm…pump/swaps?order=desc&limit=50"
{
"data": [
{ "time": "2026-07-23T14:02:11Z", "trader": "6hh9…Nfew", "is_buy": false,
"sol_amount": "1998887301", "slot": 352114208, "block_index": 610,
"router": "BSfD…bot", "sig": "3kPw…9dTa" },
{ "time": "2026-07-23T14:01:58Z", "trader": "6hh9…Nfew", "is_buy": true,
"sol_amount": "2000000000", "slot": 352114177, "block_index": 402,
"router": "BSfD…bot", "sig": "5mQx…hh2e" }
],
"next_cursor": "2026-07-23T14:01:58Z"
}
The same wallet buys 2.000 SOL and sells ~1.999 SOL back thirteen seconds later: the
round trip cost fees and printed ~4 SOL of "volume". Two more things to look at on the
tape: the router field — the top-level program that orchestrated the swap
(absent means a direct pump.fun / pump-amm call) — because bot volume tends to arrive through the
same router program on every fill; and failed=1, which interleaves
reverted attempts so you can see whether the "demand" ever competed for blockspace at
all.
Cross-check the crowd: volume without holders
Real volume implies real people. GET /tokens/{mint}/holder-stats is one
cheap call:
{ "holders": 61, "held": "812400000000000", "top10": "703900000000000", "top25": "798100000000000" }
Hundreds of SOL of daily volume on a token with 61 holders — where the top 10 hold
almost everything — is not a crowd, it is a cast.
GET /tokens/{mint}/activity adds the flow view: each window (5m/1h/24h)
carries not just buys and sells but distinct
buyers and sellers. Thousands of transactions from a few
dozen distinct wallets is the same story from the other side.
How to see if the first buyers are bots
Fake volume rarely starts at hour six — tokens that wash usually launch coordinated.
GET /tokens/{mint}/launch groups the token's first swaps into
bundles: runs of buys landing in the same slot at consecutive block indexes —
the bot ladder, pre-funded wallets submitted together before any human could react:
{
"mint": "9xQm…pump",
"creator": "5Q5q…Funr",
"bundled_pct_supply": 23.4,
"dev_bundle_pct_supply": 4.9,
"bundle_count": 3,
"bundles": [
{ "slot": 352114100, "start_index": 12, "size": 6, "is_bundle": true,
"has_dev": true, "wallets": ["5Q5q…Funr", "8psN…VRtf", "…"],
"sol_total": "2988888890", "pct_supply": 14.2 }
]
}
bundled_pct_supply is the share of supply grabbed by bundles at launch,
and has_dev marks the bundle the creator was in. A token born with a bot
ladder tends to keep its bots: the same wallets that sniped the creation slot are
frequent round-trippers later. The full launch forensics — how bundles are detected
and what the percentages mean — is in the
bundle checker guide.
Screen for fake volume in Python
Put it together: take a screener page, run every token through the wash detector, and drop what fails your threshold. The threshold is yours to pick — the API reports the measurement, not a verdict:
import requests BASE = "https://terminal.raiden.wtf/api" H = {"X-API-Key": "YOUR_KEY"} WASH_MAX = 25.0 # your tolerance: max % of 24h volume from round-trippers hot = requests.get(f"{BASE}/tokens/trending", params={"window": "1h", "limit": 50}, headers=H).json() for t in hot["data"]: w = requests.get(f"{BASE}/tokens/{t['mint']}/wash-traders", headers=H).json() if w["wash_pct"] >= WASH_MAX: top = w["data"][0] if w["data"] else None line = (f"{t['symbol']:<10} wash={w['wash_pct']:5.1f}% " f"{w['wash_vol_sol']:.1f}/{w['total_vol_sol']:.1f} SOL " f"({w['flagged']} round-trippers)") if top: line += f" top: {top['wallet']} {top['buys']}B/{top['sells']}S" print(line) # PUMPY wash= 61.3% 289.1/471.6 SOL (14 round-trippers) top: 6hh9…Nfew 41B/39S
For a deeper look at anything the screen flags, GET /tokens/{mint}/pack
returns the whole dossier in one call — trust, wash traders, launch, holder stats,
funding clusters and more, each key the exact response of the standalone endpoint.
The honest summary
- Volume is the most faked metric because it is the cheapest to fake and every trending feed rewards it.
- One number to check first:
wash_pct— the share of 24h volume from wallets with ≥5 buys and ≥5 sells. Share, not existence: some round-tripping is organic. - The trust score already prices it in — weight 0.15, and a hard cap at 45 once wash crosses 40% of volume.
- Cross-check with the raw tape (same trader alternating sides, same router), the crowd (holders and distinct buyers vs volume), and the launch (bot ladders in the creation slot).
Every endpoint here is documented with full response shapes in the API reference. The data is a complete record since May 1, 2026, kept on a rolling 6-month window — enough to check any token the trending tab throws at you, and the wallets behind it: when a round-tripper looks familiar, the wallet tracking guide shows how to profile it across every token it ever touched.
Frequently asked questions
What counts as a wash trader on pump.fun?
A round-tripper: a wallet with at least 5 buys AND at least 5 sells on the same token within the last 24 hours. A wallet that only accumulates is a buyer, not a wash trader — it is the repeated cycling in and out of the same token that inflates volume artificially.
What does wash_pct measure exactly?
The share of a token's 24h trading volume produced by round-tripper wallets. It is computed over every flagged wallet, not just the top 20 listed in the response — so it is a real estimate of how much of the tape is artificial, expressed as a percentage of total volume.
Is all round-tripping a scam?
No. Some in-and-out trading is organic — scalpers and market-making-style behavior round-trip too. The signal is the SHARE of volume that comes from round-trippers, not their existence. A token where a quarter of the volume is round-tripped deserves a closer look; a token where most of it is has a manufactured tape.
How does wash trading affect the Raiden Trust score?
wash_pct is one of five weighted signals in the score, with a weight of 0.15. When it crosses 40%, a hard cap kicks in: the score is capped at 45, inside the caution band, no matter how clean the other signals look — a mostly-fake tape can never rate as clean.
How can I tell if the first buyers of a token are bots?
Pull the launch analysis: the token's first swaps come back grouped into same-slot bundles. Consecutive buys in the creation slot with adjacent block indexes are a bot ladder — pre-funded wallets landing together, often with the dev's own bundle among them (has_dev).
Can pump.fun volume bots be filtered out automatically?
Yes — loop a screener page through the wash-traders endpoint and drop every token whose wash_pct exceeds your threshold. A few lines of Python turn the trending feed into a wash-adjusted one.