How to detect fake volume and wash trading on pump.fun
Fake volume on pump.fun is everywhere: how wash trading bots inflate the tape and how to measure it — wash_pct, round-trippers and the trust score, via API.
Fake volume on pump.fun is everywhere: how wash trading bots inflate the tape and how to measure it — wash_pct, round-trippers and the trust score, via API.
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.
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.
/tokens/{mint}/wash-tradersThe 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 |
wash_pct honestlyRound-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:
41 buys / 39 sells is cycling,
not trading a view. Perfectly matched buy/sell counts across several wallets is the
classic wash signature.vol_sol is a large slice of
total_vol_sol means the "market" is mostly one machine talking to
itself.wash_pct in 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.
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.
/tokens/{mint}/swapsNumbers 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.
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.
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.
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.
wash_pct — the share of 24h
volume from wallets with ≥5 buys and ≥5 sells. Share, not existence: some
round-tripping is organic.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.
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.
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.
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.
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.
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).
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.
Build on the same data
Free API key with 200,000 trial credits: full REST and WebSocket access to the same firehose that powers the Terminal. Connect a Solana wallet; no email, no card.