Definitions verified 2026-08-28 · live figures as of 2026-08-28 12:28:54 UTC (refreshed hourly)
Solana API · token momentum alerts
A surge is a token under 30 minutes old whose market cap runs at least 3×, 6× or 8× its launch market cap and holds it for 10 seconds. A revivalis a token with no trade for 24 hours that real buys bring back. Every fire ships with who bought, whether they were bundled, whether they already sold, the deployer's record, twelve risk flags, and — an hour later — what actually happened.
GET /api/v1/tokens/surges · WS channel token:surges · webhook events token:surge / token:revival · PRO+ · keyed API only (not on x402)
Live · last 7 days
Read from the same table the API serves.
150 surges · 4 revivals
fires ≥ 65 min old
n = 5
within the hour
Hit-rates
The same numbers GET /api/v1/tokens/surges?stats=1&days=7 prints. up after 1h = market cap one hour after the fire ≥ market cap at the fire. Peak multiple = highest market cap within the hour ÷ market cap at fire. Only fires ≥ 65 minutes old with a computed outcome count. Out-of-sample by construction — the fire is written before the outcome exists.
| Kind · tier | Fires | With outcome | Up after 1h | Median peak | Doubled within 1h |
|---|---|---|---|---|---|
| revival | 4 | 3 | 0.0% | 0.93× | 0.0% |
| surge · breakout | 10 | 5 | 80.0% | 1.39× | 0.0% |
| surge · early | 106 | 54 | 16.7% | 1.45× | 24.1% |
| surge · strong | 34 | 19 | 26.3% | 1.41× | 10.5% |
Judge the tiers on these numbers, not on their names. A tier whose median +1h market cap sits below 1.0× is a feed you fade or size down, however it is labelled. The engine went live on 2026-08-28; the sample grows daily.
Live feed
Outcome columns fill in once a fire is 65 minutes old; until then they read pending. Flags are the honest half of each row — an empty list means no flag raised, not verified clean.
| Fired (UTC) | Symbol | Kind · tier | Venue | Age | MC at fire | × launch / prev | Risk flags | +1h MC | +1h peak |
|---|---|---|---|---|---|---|---|---|---|
| 08-28 12:27 | YES | surge · strong | pumpfun | 5 min | $32.6k | 9.56× | bundled_launchcold_deployersniper_heavyearly_buyers_exiting | pending | pending |
| 08-28 12:27 | Lester | surge · early | pumpfun | 4 min | $12.4k | 3.76× | bundled_launchcold_deployersniper_heavyearly_buyers_exiting | pending | pending |
| 08-28 12:26 | — | surge · breakout | pumpfun | 21 s | $51.9k | 17.64× | few_buyerswash_patternsell_pressure | pending | pending |
| 08-28 12:26 | — | surge · early | pumpfun | 21 s | $51.9k | 17.64× | few_buyerswash_patternsell_pressure | pending | pending |
| 08-28 12:26 | — | surge · strong | pumpfun | 21 s | $51.9k | 17.64× | few_buyerswash_patternsell_pressure | pending | pending |
| 08-28 12:25 | X | surge · breakout | pumpfun | 23 s | $471.4k | 41.22× | few_buyerssell_pressure | pending | pending |
| 08-28 12:25 | X | surge · early | pumpfun | 23 s | $471.4k | 41.22× | few_buyerssell_pressure | pending | pending |
| 08-28 12:25 | X | surge · strong | pumpfun | 23 s | $471.4k | 41.22× | few_buyerssell_pressure | pending | pending |
| 08-28 12:24 | YES | surge · early | pumpfun | 103 s | $13.0k | 3.81× | bundled_launchcold_deployersniper_heavyearly_buyers_exiting | pending | pending |
| 08-28 12:23 | MANK | surge · strong | pumpfun | 2 min | $44.1k | 13.26× | bundled_launchsniper_heavyearly_buyers_exitingsell_pressure | pending | pending |
"unpriced" = no candle within the hour (the token stopped being priced), which is not the same as zero.
Surge tiers
A surge is measured against the launch market cap, not a USD number alone: pump.fun launches at ~28 SOL of market cap by construction, so the multiple is SOL-price-independent while the USD floor keeps micro-launches out. The baseline is the first sample the engine saw within 90 s of birth (baseline_source: launch); if it first saw the token later, the multiple is not applied (baseline_source: late) and the payload says so.
| Tier | Max age | Min market cap | Launch multiple | Extra condition |
|---|---|---|---|---|
| early | ≤ 10 min | $12k | ≥ 3× launch MC | — |
| strong | ≤ 30 min | $30k | ≥ 6× launch MC | and ≥ 2× the lowest sample of the last 3 min (climbing now) |
| breakout | ≤ 2 min | $45k | ≥ 8× launch MC | — |
Sustained means the floor and multiple hold on the current tick and on a sample at least 10 s older, and nothing fires before 20 s of age. The very first live fire on 2026-08-28 was a same-slot bundle marked straight to $475k at age 1 s with zero parsed buys — it lit all three tiers at once. A one-tick mark is a spike, not a surge; that rule exists because of it.
Revival rule
tier is null on revivals.Hard gates (both kinds)
Risk flags
On pump.fun, “reached $50k in two minutes” is very often a bundled launch. A feed that only says pumped turns its readers into the exit liquidity, so every fire says who bought and how. Flags derived from the tape are computed only from a source that exists; absence of data never produces a flag.
| Flag | Raised when |
|---|---|
| bundled_launch | ≥ 3 of the first-20 early buyers bought in the same block (surge only) |
| few_buyers | < 8 unique buyers where wallet data exists, else < 10 buys on the tape |
| wash_pattern | ≥ 4 trades per wallet across < 15 wallets |
| thin_liquidity | liquidity < $3k or < 3 % of market cap |
| cold_deployer | deployer reputation tier is cold |
| sniper_heavy | ≥ 3 known sniper wallets in the early-buyer cohort |
| early_buyers_exiting | ≥ 50 % of a ≥ 5-wallet early cohort has already sold |
| sell_pressure | sells > buys on the tape since birth / revival |
| no_tape_trades | price moved with no parsed swap on the candle tape (curve-account ticks, routed legs without amounts) — real but unmeasured |
| no_prior_price | revival with an unknown pre-dormancy market cap |
| mint_authority_active | mint authority not revoked |
| transfer_fee | Token-2022 transfer fee configured |
Per-wallet facts (unique buyers, sniper wallets, the bundled cohort) come from the pump.fun-pipeline trade tape. For bonk / bags / graduated mints those blocks are empty and the row says wallet_data_available: false — never an inferred zero. The candle tape trails a hot token by up to ~60 s, so a fire under 90 s old is measured on live wallet trades and tape.source names which.
Payload
A real breakout fire from launch day, abbreviated. The WebSocket and webhook event is the same object minus outcome; every scalar can be null, and null means unknown, never zero. The full contract is in the SDK types (TokenSurgeEvent).
{
"id": 157, "kind": "surge", "tier": "breakout",
"mint": "CDyx79J8W57oSEcZ6iG5ry3MMoW9RTbgd4C4QvRmpump",
"symbol": "Rasonque", "launchpad": "pumpfun", "primary_dex": "pumpfun",
"fired_at": "2026-08-28T11:58:22.718Z", "birth_source": "sniper", "age_seconds": 92,
"market_cap_usd": 45411.93, "liquidity_usd": 20545.4, "liquidity_to_mc_ratio": 0.452,
"baseline_mc_usd": 3339.15, "baseline_source": "launch", "mc_multiple": 13.6,
"mc_change_3m_pct": 1260.12, "peak_mc_usd": 59873.93, "pct_of_peak": 75.85,
"tape": { "source": "candles", "buys": 253, "sells": 168, "buy_volume_usd": 18711.89,
"sell_volume_usd": 12170.34, "unique_buyers": 251, "trades_per_wallet": 2.88,
"wallet_data_available": true },
"kol": { "buyers": 4, "buys": 4, "sells": 9, "names": ["Clown", "Cupsey", "KOREAN"] },
"early_buyers": { "count": 20, "bundled": 6, "cohort_sol": 16.209, "sold": 20, "sniper_wallets": 20 },
"deployer": { "tier": "unranked", "runner_rate": 0.1569, "bonding_rate": 0.0185,
"total_deployed": 4330, "labeled_tokens": 51, "recent": "BDDDDDDDDD" },
"mint_authority_revoked": true, "freeze_authority_revoked": true, "is_token_2022": true,
"risk_flags": ["bundled_launch", "sniper_heavy", "early_buyers_exiting"],
"outcome": null
}Read it honestly: 13.6× launch in 92 s with 251 unique buyers and three named KOLs — and 6 of the first 20 buyers bought in the same block, all 20 are known sniper wallets, and all 20 had already sold. The deployer has launched 4,330 tokens. The flags say it before the outcome does.
How to consume
Same filters on every rail: kinds, tiers, launchpads, exclude_flags, min_mc_usd / max_mc_usd, deployer_tier. Pushed frames do not count against your daily quota — see WebSocket streaming.
curl "https://madeonsol.com/api/v1/tokens/surges?kind=surge&exclude_flags=bundled_launch,sniper_heavy&min_mc_usd=30000&limit=20&stats=1" \ -H "Authorization: Bearer msk_YOUR_KEY" # cursors: pagination.next_since / next_before (fired_at)
{ "type": "subscribe", "channels": ["token:surges"],
"filters": { "kinds": ["surge"], "tiers": ["strong", "breakout"],
"exclude_flags": ["bundled_launch"], "min_mc_usd": 30000 } }
// frames: event "token:surge" | "token:revival", with seq + id{ "url": "https://your.app/hooks/surges",
"events": ["token:surge", "token:revival"],
"filters": { "tiers": ["breakout"], "exclude_flags": ["bundled_launch"] } }
// HMAC-SHA256 header x-madeonsol-signature · 3 retries (5s / 30s / 2min)// TypeScript
const { events, stats } = await client.token.surges({ kind: "surge", tier: "strong", only_clean: true, stats: true });
const stream = await client.stream.connect();
stream.on("token:surge", (e) => console.log(e.tier, e.symbol, e.risk_flags));
# Python
rows = client.tokens_surges(kind="surge", exclude_flags="bundled_launch", stats=True)
// Rust
let res = client.token.surges(&TokenSurgesParams { only_clean: Some(true), ..Default::default() }).await?;MCP: tool madeonsol_tokens_surges in mcp-server-madeonsol. Retention 60 days. Health-checked: the feed is flagged internally if it is silent for 6 hours.
Where this sits
Most Solana data APIs (Solana Tracker, Birdeye, Codex, DexScreener) ship a trending or top-movers sort — a ranking you poll. A surge is an event with a threshold, a sustain rule, a volume-backing gate and a recorded outcome, pushed the moment it holds. The honest comparison: their trending lists cover every DEX pair from day one; our surges need a known launch on a launchpad curve, and per-wallet context is pump.fun-pipeline scoped. If you need Raydium-native launch detection today, a trending sort is the better tool.
FAQ
More for developers
WebSocket streaming
seq, replay, heartbeat, 19 channels — pushed events don't spend quota.
Pre-confirmation deploy alerts
pump.fun deploys from deshred, ~500–800 ms before confirmation.
MCP servers & SDKs
Two MCP servers, 14 packages, one free key.
Full surface: Solana API overview, Robinhood Chain API, endpoint docs and the 9-provider data API comparison.
Start building
Surges and revivals ship on PRO (€43/month) over REST, WebSocket and webhooks, with the same server-side filters on every rail.