MadeOnSolMade on Sol
RobinhoodBlogAdvertise
Sign in
MadeOnSolMade on Sol

Solana and Robinhood Chain intelligence — KOL wallet tracking, deployer intelligence, all-DEX trade streams, and a developer API. Discover, compare, and build.

Discover

  • All Tools
  • Stacks
  • KOL Tracker
  • Deployer Hunter
  • KOL Scout Leaderboard
  • Robinhood Chain
  • Robinhood Wallet Scanner
  • Robinhood API
  • Solana API
  • Token Surge Alerts
  • WebSocket Streaming
  • Sniper Deploy Alerts
  • MCP Servers & SDKs
  • Datasets
  • API Pricing
  • Enterprise API
  • x402 for AI agents
  • Robinhood Chain x402
  • Yields
  • Blog
  • Blog Archive
  • Solana Glossary

Best Of

  • Best Trading Bots
  • Best DEXs
  • Best Wallets
  • Best Analytics
  • Best DeFi
  • Best Snipers

Compare

  • Wallets
  • DEXs
  • Snipers
  • TG Bots
  • Terminals
  • Analytics
  • Portfolio
  • Copy Trading
  • Security
  • Liquid Staking
  • RPC Providers
  • Bridges
  • Launchpads
  • NFT Marketplaces
  • Lending
  • Bot Calculator
  • Perps
  • Scanners
  • Data APIs

Resources

  • Submit a Tool
  • API Docs
  • Get an API Key
  • For Businesses
  • Affiliate Program
  • Changelog
  • API Status
  • Tool Uptime
  • Signal Scorecard
  • Compare KOLs
  • Leaderboard
  • Community
  • Site Stats
  • Advertise

Legal

  • About
  • Contact
  • Terms
  • Privacy
  • Security
  • DPA
  • Disclaimer

© 2026 MadeOnSol

MadeOnSol — eenmanszaak, Hulshout, Belgium · KBO/BTW BE 1039.535.538 (art. 56bis, no VAT charged)

Follow us on XPowered by:constant·k — Private Solana RPC Services
Solana APIToken surge & revival alerts

Definitions verified 2026-08-28 · live figures as of 2026-08-28 12:28:54 UTC (refreshed hourly)

Solana API · token momentum alerts

Token surge & revival alerts
with the honest half attached.

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 access (PRO, €43/mo) REST · WebSocket · webhooks · SDKs

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.

154
Fires

150 surges · 4 revivals

81
With +1h outcome

fires ≥ 65 min old

80.0%
Breakout up after 1h

n = 5

1.39×
Breakout median peak

within the hour

Hit-rates

What the tiers actually did, last 7 days.

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 · tierFiresWith outcomeUp after 1hMedian peakDoubled within 1h
revival430.0%0.93×0.0%
surge · breakout10580.0%1.39×0.0%
surge · early1065416.7%1.45×24.1%
surge · strong341926.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

The ten newest fires.

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)SymbolKind · tierVenueAgeMC at fire× launch / prevRisk flags+1h MC+1h peak
08-28 12:27YESsurge · strongpumpfun5 min$32.6k9.56×bundled_launchcold_deployersniper_heavyearly_buyers_exitingpendingpending
08-28 12:27Lestersurge · earlypumpfun4 min$12.4k3.76×bundled_launchcold_deployersniper_heavyearly_buyers_exitingpendingpending
08-28 12:26—surge · breakoutpumpfun21 s$51.9k17.64×few_buyerswash_patternsell_pressurependingpending
08-28 12:26—surge · earlypumpfun21 s$51.9k17.64×few_buyerswash_patternsell_pressurependingpending
08-28 12:26—surge · strongpumpfun21 s$51.9k17.64×few_buyerswash_patternsell_pressurependingpending
08-28 12:25Xsurge · breakoutpumpfun23 s$471.4k41.22×few_buyerssell_pressurependingpending
08-28 12:25Xsurge · earlypumpfun23 s$471.4k41.22×few_buyerssell_pressurependingpending
08-28 12:25Xsurge · strongpumpfun23 s$471.4k41.22×few_buyerssell_pressurependingpending
08-28 12:24YESsurge · earlypumpfun103 s$13.0k3.81×bundled_launchcold_deployersniper_heavyearly_buyers_exitingpendingpending
08-28 12:23MANKsurge · strongpumpfun2 min$44.1k13.26×bundled_launchsniper_heavyearly_buyers_exitingsell_pressurependingpending

"unpriced" = no candle within the hour (the token stopped being priced), which is not the same as zero.

Surge tiers

Three tiers, each once per mint, each sustained.

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.

TierMax ageMin market capLaunch multipleExtra condition
early≤ 10 min$12k≥ 3× launch MC—
strong≤ 30 min$30k≥ 6× launch MCand ≥ 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

Dormant ≥ 24 h, then confirmed by the tape.

  • No 1-minute trade candle for ≥ 24 h, measured on candles written for every priced mint across all 14 DEX programs — so graduated Raydium / Meteora tokens count, not just curves.
  • Confirmed only by buys: ≥ 5 buys and ≥ $500 buy volume with MC ≥ 1.5× the pre-dormancy candle close, or ≥ 20 buys / ≥ $5k regardless. Unknown pre-dormancy MC needs ≥ $2k of buy volume.
  • 15-minute confirmation window, then the candidate expires silently. One fire per dormancy episode (24 h re-fire guard). tier is null on revivals.
  • Never by the price mark alone — a single dust buy into an empty pool marks MC up 300 % and is not a revival.

Hard gates (both kinds)

Nothing fires on a price mark.

  • Liquidity ≥ $1.5k and ≥ 2 % of market cap when liquidity is known. A pump curve launches near 1.0 and graduates around 0.25; graduated memecoins sit at 5–30 %. Below 2 % the "MC" is a thin-pool artefact.
  • MC ≤ $100B sanity bound.
  • The MC gained must be paid for: buy volume on the tape ≥ 3 % × (MC − launch MC, or − pre-dormancy MC). Moving a pump curve from $5k to $70k costs ~85 SOL; a price mark costs ≈ $0, and token-side "liquidity" inflates with the mark — volume does not.
  • While no candle carries USD volume yet, only a move ≤ 20× may fire; bigger ones are re-checked every 20 s until the tape catches up.

Risk flags

Twelve flags, each with a threshold.

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.

FlagRaised 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_liquidityliquidity < $3k or < 3 % of market cap
cold_deployerdeployer 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_pressuresells > buys on the tape since birth / revival
no_tape_tradesprice moved with no parsed swap on the candle tape (curve-account ticks, routed legs without amounts) — real but unmeasured
no_prior_pricerevival with an unknown pre-dormancy market cap
mint_authority_activemint authority not revoked
transfer_feeToken-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

One row shape for REST, WebSocket and webhooks.

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).

GET /api/v1/tokens/surges · events[0]
{
  "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

REST, WebSocket, webhooks, SDKs.

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.

REST · newest strong+breakout surges, bundled launches excluded
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)
WebSocket · wss://madeonsol.com/ws/v1/stream
{ "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
Webhook · POST /api/v1/webhooks
{ "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)
SDKs · TypeScript madeonsol 2.26 · Python madeonsol-x402 1.28 · Rust madeonsol 0.27
// 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

What a trending sort does not tell you.

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

Surge & revival questions, answered.

What is a token surge?+
A surge is a token less than 30 minutes old whose market cap runs hard against its launch market cap. Three tiers: early (≤10 min, ≥$12k, ≥3× launch), strong (≤30 min, ≥$30k, ≥6× launch and ≥2× the lowest sample of the last 3 minutes), breakout (≤2 min, ≥$45k, ≥8× launch). Each tier fires at most once per mint and the tiers are independent, so a token can go straight to breakout. A tier only fires when it is sustained — the floor and multiple must hold on the current tick and on a sample at least 10 seconds older — and nothing fires before 20 seconds of age. The launch multiple is SOL-price-independent because a pump.fun launch market cap is roughly 28 SOL by construction.
How is a revival confirmed?+
A revival is a token with no 1-minute trade candle for at least 24 hours that starts trading again. It is confirmed only by the tape, never by the price mark: at least 5 buys and $500 of buy volume with market cap at least 1.5× the last pre-dormancy candle close, or at least 20 buys / $5k of buy volume regardless. If the pre-dormancy market cap is unknown the bar is $2k of buy volume. The candidate has 15 minutes to confirm, then expires silently, and there is a 24-hour re-fire guard per mint. A single dust buy into an empty pool can mark market cap up 300% — that is a pending candidate that expires, not a fire.
Why did a token fire — or not fire — when the chart looked the same?+
Four gates sit in front of every fire and they are gates, not flags. Liquidity must be at least $1.5k and at least 2% of market cap when known (a 22-second-old token showing an $18.3M market cap on a few thousand dollars of liquidity is a thin-pool artefact). Market cap must be at most $100B. The market cap gained must be paid for: buy volume on the tape must be at least 3% of the move from launch (or pre-dormancy) market cap — a price mark in a spoofed pool moves market cap on roughly $0 of volume. And while no candle carries USD volume yet, only a move of at most 20× may fire; larger moves are re-checked every 20 seconds until the tape catches up. If the engine first saw a token late (baseline_source = late), the launch multiple is not applied and only the USD floors and velocity count. Known blind spots: a mint whose only pool holds under $500 of liquidity gets no market cap tick and is invisible; a graduated token traded only through Jupiter multi-hop with no direct-venue leg is rejected by the pricing layer.
Does it cover Raydium, Meteora and Orca, or only pump.fun?+
Surges need a known birth: a pre-confirmation deshred deploy, a confirmed on-chain create, or the first observed trade — and a first-observed trade counts as a birth only on a launchpad curve (pump.fun, LaunchLab, bags, Moonshot, Meteora DBC, boop). On PumpSwap, Raydium, Meteora or Orca a first observed trade means an existing token got a new pool, so it is deliberately not treated as a launch. Revivals are different: dormancy is measured on 1-minute candles that the pricing layer writes for every mint it prices across all 14 DEX programs, so a graduated Raydium or Meteora token that wakes up after 24 hours does fire. Per-wallet facts (unique buyers, sniper wallets, bundled cohort) come from the pump.fun-pipeline trade tape; for bonk/bags/graduated mints they are empty and the payload says wallet_data_available: false rather than pretending.
What does the hit-rate mean?+
Every fire is written before its outcome exists. Ten minutes after the hour mark a scheduled job fills in the market cap, peak and low one hour after the fire from the candle tape. up_1h_pct is the share of fires whose market cap one hour later was at least the market cap at the fire; median_peak_multiple is the median of (highest market cap within the hour ÷ market cap at fire); doubled_1h_pct is the share whose peak reached 2× the fire. Only fires at least 65 minutes old with a computed outcome count. priced_after_1h: false means the token had no candle in that hour — it stopped being priced — which is not the same as zero. The numbers are out-of-sample by construction and are the only honest way to weight the tiers; the names early/strong/breakout are labels, not promises.
What tier do I need, and is it on x402?+
PRO or above (PRO is €43/month). BASIC keys receive HTTP 403 on GET /api/v1/tokens/surges and cannot hold a stream token. The endpoint is keyed (msk_) only — it is not on the keyless x402 rail. Delivery is REST (cursor-paginated on fired_at), the WebSocket channel token:surges (events token:surge and token:revival, same object minus outcome), and the webhook registry events token:surge / token:revival with identical server-side filters.
Can I filter out bundled launches server-side?+
Yes. REST accepts exclude_flags=bundled_launch,sniper_heavy (rows carrying any listed flag are dropped; an unknown flag returns 400 with the known list) or only_clean=1 for rows with no flags at all, plus kind, tier, mint, launchpad, deployer_tier, min_mc_usd / max_mc_usd and min_buys. The WebSocket subscribe and webhook filters take kinds[], tiers[], launchpads[], exclude_flags[], min_mc_usd / max_mc_usd and deployer_tier[]. Note that an empty risk_flags array means no flag was raised, not verified clean — absence of data never produces a flag.
How long is history kept and how fresh is the feed?+
Fires are retained for 60 days. The engine listens to the pricing bus that updates every priced mint at most every 250 ms, so a surge fires within seconds of the sustained condition; the open 1-minute candle only lands at rollover, which is why a fire younger than 90 seconds is measured on live wallet trades (tape.source = wallet_trades) instead of candles. Each response echoes the live thresholds in a definitions block read straight from the rule engine, so what the docs say and what fires cannot drift.

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

Momentum with the context to fade it.

Surges and revivals ship on PRO (€43/month) over REST, WebSocket and webhooks, with the same server-side filters on every rail.

See plans & pricing Endpoint docs