Launch Tape

On the record Solana · pump.fun · every trade, every day

Solana launches. Recorded.

Find a winning strategy before you start.

Test your bot's rules on every real pump.fun trade, before you risk a cent.

Usual backtest+2.3%a tradeOct 10 2026, 14:00-16:00 UTC, 67 coins
Same rules on the tape-0.9%a tradeOct 10 2026, 14:00-16:00 UTC, 67 coins

A full day, Oct 12 2026, 775 coins: tape -3.9% a trade, usual backtest -0.9%.

The example rules from our test page: buy 15 s after graduation, sell at 3 min or -20%, 0.1 SOL a trade. The tape fills you a block late, charges fees, and lets your size move the pool.

30 minutes after graduation7,771 pump.fun graduates, Oct 3-14 2026, against the price 10 s after graduating
Up at all24.7%
Doubled or more9.0%
Down 90% or more57.6%

About 1 in 4 is still up after 30 minutes. Most are not. Finding which ones, before you buy, is the whole game, and the only honest way to look is on every trade that actually happened.

Get the latest full day, $10 Test my rules, free Free 2-hour sample

every trade · opens in ChatGPT · money back if a file doesn't open

Just looking? See what it looks like, free (fits in ChatGPT/Claude, even on a phone): 2 hours of graduates, one row each (19 KB CSV) or one coin, 30 minutes, every trade (0.4 MB CSV). Then test on a full day: $10. What to do with the sample

Try this

Drop graduates-2026-10-10-1400-1600utc.csv into ChatGPT or Claude and ask: Which coins touched 2x in their first 10 minutes, and what did they have in common? Which ones fell 80% and when did the first big sell come?

A full day is the same sheet, about 200 KB, still fits in the app: $10.

  1. Downloadthe free sample, or a day you buy
  2. Drop it into your AIChatGPT, Claude, or your own code
  3. Ask what actually happenedto these coins, and to your bot's rules (the prompt)

Recording since October 3 2026 and growing by a day every day. Coverage gaps are marked in the files, never filled in.

Why this exists

We built a pump.fun bot with AI. On paper it looked great. Then we put real money on the exact same rules.

Four wallets, 139 real trades on fresh graduates: net −US$17.45. A second bot providing liquidity on new pools: 65 real positions, net −US$134.70. Small money on purpose, and still the lesson cost about US$150.

Real fills landed a block after the signal, every round trip paid about 2% in fees and slippage, and before Sept 23 our own price tape mixed two sources about 6% apart, so some of the swings the paper bot “caught” were never there.

The data was the problem, not the AI. So we started recording every launch from the chain, with the fills and the fees, and sell it by the day.

Better rules than ours might exist. Nobody knows yet. The tape is how you find out.

01

What we record

In plain words · the dataset name on the right

All of it read straight from the chain, 24/7, with gaps marked instead of hidden. One file per dataset per day.

What we don't record: no wallet labels, no opinions on who's a rugger, no social media.

02

Datasets

7 datasets · the two a bot builder needs first, then five more
gradtrades since 2026-10-03

Every graduate's first 30 minutes, trade by trade

Every buy and sell on PumpSwap in the first 30 minutes after each graduation: wallet, tokens, SOL, effective price, pool reserves after the trade, the trader's balance before it, and all three fees.

Rows / day
~5,034,000 (Oct 10 2026)
Row types
trade 417,347 · grad 105 · end 88 · down 2 · up 2

Day files: gradtrades-YYYY-MM-DD.jsonl.gz and .parquet, plus graduates-YYYY-MM-DD.csv, the day on one sheet (the columns). Coins followed: cap 300–600 SOL at graduation, at most 30 coins at a time. Failed transactions are not included.

The day on one sheet: graduates-YYYY-MM-DD.csv

One row per pump.fun graduate of the UTC day, about 200 KB a day, built from that day's gradtrades (and pregrad for who was behind each coin). It opens in Google Sheets or Numbers on a phone, or drop it into the ChatGPT or Claude app and ask what happened. Every number comes from the files you get; a column whose source is missing stays empty, nothing is guessed. Free sample: graduates-2026-10-10-1400-1600utc.csv (105 coins, 19 KB). Percentages are plain numbers (−80 = minus 80%); times are UTC.

mintthe coin's token mint
symbol, nameticker and name (from pregrad's record of the coin; empty when there is none)
grad_time_utcgraduation time, YYYY-MM-DD HH:MM:SS
poolits PumpSwap pool
cap_sol_at_gradmarket cap in SOL at graduation (price × 1e9; about 496 for a normal graduate)
followed1 = we followed its trades (cap 300–600 SOL, seen in time); 0 = not followed, so the trade columns are empty
curve_fill_secseconds from the coin's creation to its graduation (under 5 = an instant, bundled launch)
dev_hold_pct_at_grad% of the supply the creator still held at graduation
tape_secseconds of trades this day's file holds after graduation, at most 1800; less when the coin graduated in the day's last 30 minutes or we stopped following it early. Under 600: the 10-minute columns are partial
trades_10m, buyers_10m, sellers_10mtrades, and distinct wallets that bought / sold, in the first 10 minutes
ref_cap_solthe reference price, as a market cap in SOL: the pool price after the last trade, in chain order, by graduation + 10 s (or after the first trade, when none came by then). Every % below is against it, the same reference as our posts
low_10m_pct, high_10m_pctthe lowest and highest pool price from the reference trade to 10 minutes after graduation, vs the reference, in % (−50 = half; 100 = 2x), read trade by trade in chain order
touched_minus80_10m, touched_2x_10m1 when the low is −80% or worse / the high is 2x or better
first_big_sell_sec, first_big_sell_pool_pctwhen (seconds after graduation) a single sell first took 10% or more of the pool's tokens within 10 minutes, and that sell's share of the pool; empty when none did
dump_secfrom pregrad's outcome row: when the recorder saw the first sale it flagged as a dump (by the creator, by the biggest graduation-slot buyer, or big by its size rule); the "big holder dump" of our posts. Empty when it saw none, or has no outcome row
end_10m_pct, end_30m_pctthe pool price after the last trade within 10 / 30 minutes vs the reference, in %
data_gap1 when a recorder gap touched this coin's 30 minutes (picked up late, a restart, or a feed drop). Numbers can then be missing trades; the gap is marked, never filled in

On Oct 10–12 2026 this sheet counts 2,194 followed graduates with trades: 823 (37.5%) touched −80% and 307 (14.0%) touched 2x within 10 minutes. The recorder's own outcome rows in pregrad say 835 and 330 of 2,193 (the numbers in our posts): it also counts the seconds before the +10 s reference (most of the 2x gap is a high in those first seconds), its clock sets that reference a few hundred ms earlier for some coins, and it counted a few trades the sold files leave out.

pregrad since 2026-10-04

Who's behind each launch, and how it ended

Creator and its funding, the creator's own buy, bonding-curve buyers, the buyers in the graduation slot, the curve's cap path, and the price 10 s to 10 min after graduation. Raw facts only: addresses, amounts, times. No wallet labels.

Rows / day
~194,000 (Oct 10 2026)
Row types
ctrade 9,678 · create 4,110 · curvex 285 · grad 105 · migrate 103 · record 69 · outcome 67

A coin that graduates near the end of a file gets its outcome row (+10 min) in the next file.

More datasets (5): other launchpads, Meteora pools, bonding curves, coin metadata, top holders
padfeedOther launchpads: Meteora DBC and Raydium LaunchLab graduations, pool balances, top holderssince 2026-10-03

Graduations on Meteora DBC (Bags, Jupiter Studio and others) and Raydium LaunchLab (bonk.fun): mint facts, pool balances every few seconds for 20–30 minutes, top 20 holders at +1 and +5 minutes, and US$ prices of every quote token.

Rows / day
~32,500 (Oct 10 2026)
Row types
px 3,091 · qpx 239 · holders 136 · grad 136

Price in quote units is q / b; convert to US$ with the nearest qpx row.

meteora-poolsPer-minute metrics of about 200 Meteora DLMM poolssince 2026-10-06

About 200 Meteora DLMM pools (TVL over US$50k), every minute: price, TVL, 24 h volume and fees, and the exact fees earned in that minute.

Rows / day
~287,000 (Oct 10 2026)
Row types
pool 23,794

Token mints and names are not in the row; look them up from the pool address.

curvetapeEvery bonding-curve trade, launch to graduationsince 2026-10-13

Every trade on every pump.fun bonding curve, from the coin's creation until it graduates or goes quiet: wallet, tokens, SOL without fees, both fees, the cap and curve reserves after each trade. Plus every creation (name, ticker, starting reserves), every completion and migration to PumpSwap, and the fee picture of early transactions.

Rows / day
~4,480,000 (Oct 13 2026)
Row types
trade 456,540 · end 6,358 · create 4,416 · adopt 2,978 · migrate 121 · complete 105 · gap 1

SOL amounts are without fees (a buyer paid sol + fee + cfee). Curves priced in another token carry quote, qAmt and raw reserves instead of SOL fields, never a fake 0. Feed gaps are gap rows; from 2026-10-14 they are repaired from whole blocks (src: "backfill").

launchmetaEvery new coin's metadata and picture fingerprintsince 2026-10-13

For every new pump.fun coin, at creation and again at graduation: the metadata JSON behind its link (name, ticker, description, website, whether it lists a Twitter or Telegram), and a SHA-256 of its picture's bytes, so reused pictures and copycat launches can be matched. The pictures themselves are never stored.

Rows / day
~44,300 (Oct 13 2026)
Row types
meta 4,597

No social handles: the Twitter / Telegram links are reduced to hasTwitter / hasTelegram. A failed fetch is a row with err, never guessed.

gradholdersGraduates' top 20 holders at +1, +10 and +60 minsince 2026-10-14

One, ten and sixty minutes after each pump.fun graduation: the 20 largest token accounts with their owners, amounts and shares, which one is the PumpSwap pool or the old curve, whether an owner is a program address, and the top-10 / top-20 share with the pool and curve left out.

Rows / day
~3,700 (one per graduate and mark)
Row types
holders 251

No holder count (it needs a full scan of every token account). A snapshot that could not be read is a row with err and no holders, never guessed. On sale from 2026-10-14: on 2026-10-13 the public RPC refused every holder read.

See what it looks like, free

Start here fits in ChatGPT/Claude

Try this

Drop graduates-2026-10-10-1400-1600utc.csv into ChatGPT or Claude and ask: Which coins touched 2x in their first 10 minutes, and what did they have in common? Which ones fell 80% and when did the first big sell come?

A full day is the same sheet, about 200 KB, still fits in the app: $10.

Test on a full day: $10 one UTC day, gradtrades + pregrad, JSON lines and Parquet, once, no subscription What to do with the sample

Field-by-field schemas for all seven datasets are under For developers: full schemas below and in the README. The two free files are cut from the October 10 gradtrades day file (14:00–16:00 UTC) by the same export as the files for sale.

For developers: full schemas

gradtrades

Example rows (from the sample)
grad
{"type":"grad","t":1791640841373,"bt":1791640840,"slot":455281028,"sig":"45ZhqvZwD3SC18TUZ8wQjR1uWHQn91cqTJyiftnyFnJkeoyqoiRXopZTxhHo1TpopAi6HFSwEzsSEUMPcpTfuJWQ","mint":"9pAbYE6q9t5F8tDdrJWrVyMKEYhZnPLwB6hNEHPSnkkt","pool":"2uNzE8XXwRksCymmGtyPfg7oYBYn5E2Kg1hrgP3GteK4","coinCreator":"CfZELPLk52fdxb5DTwfEnZqepPv8vjWsfJZMnGRXLgJP","poolBase":198060505.73945,"poolQuote":88.783503748,"virtualQuote":17.584505653,"price":5.37048e-7,"capSol":537.05,"curveSol":88.783503748}
trade
{"type":"trade","t":1791640800002,"bt":1791640787,"slot":455280784,"sig":"5QxGRXZWhMUGwHbYMf4rzZYBRKZ3735w5QhfYVX56kTzJPTsXGeGuwYQqLveKdzMmnQZjuUWbQNd9Xy7gLtW4tGG","i":0,"mint":"95ccfn4UAUu3mQSvi7NJSJkHEnoLdW58qcRwwzmepump","side":"buy","user":"Doofp8oxQrc3BL5xCtiSADYM5BdTvgRqRTPX9EunRAPE","baseAmount":3475.693603,"quoteAmount":0.000977776,"price":2.81318e-7,"poolBase":250399895,"poolQuote":53.41453236,"priceAfter":2.81322e-7,"userTokensBefore":1480831.488923,"lpFee":1.96e-7,"protocolFee":0.000009094,"creatorFee":0.000002934,"ix":"buy_exact_quote_in_v2"}
end
{"type":"end","t":1791640817904,"mint":"R22RNSXj4ambV2wNFJJkLEuvUa54CPTCbqkwkBZpump","why":"window","buys":2799,"sells":3186}
down / up
{"type":"down","t":1791640822088}
{"type":"up","t":1791640823203}

The down / up pair is real: at 14:00:22.088 UTC the feed connection dropped and it was back 1.1 s later. Trades in that second may be missing. The gap is written as rows, never filled in.

Schema

Every row has type and t (ms since 1970 UTC, when our recorder received it). SOL amounts in SOL, token amounts in whole tokens (6 decimals). Source: Solana public RPC (PumpSwap program logs).

gradtnumbergraduation time (ms; chain block time for late pick-ups)
gradbtnumberblock time (s)
gradslot, signumber, stringslot and signature of the graduation (migration) transaction
gradmintstringthe coin's token mint
gradpoolstringits PumpSwap pool
gradcoinCreatorstringwallet that receives the coin's creator fees
gradpoolBase, poolQuotenumberstarting tokens / SOL in the pool
gradvirtualQuotenumberPumpSwap's extra virtual SOL in the price math (~17.6 SOL, Oct 2026)
gradpricenumberSOL per token at graduation
gradcapSolnumberprice × 1e9 (market cap in SOL, ~496 for a normal graduate)
gradcurveSolnumberSOL raised by the bonding curve
gradlateboolpicked up late; trades before followFrom are missing
gradfollowFromnumberms; trades are complete from here on
gradfollowboolfalse = coin not followed (cap outside 300–600 SOL, or found too late)
tradebt, slot, sig, inumber, number, string, numberblock time (s), slot, signature, index of the PumpSwap trade inside the transaction. A sig of 64 1s means the RPC did not report the signature (rare: a few rows per million)
trademintstringcoin
tradeside"buy" / "sell"direction
tradeuserstringwallet that traded
tradebaseAmountnumbertokens bought or sold
tradequoteAmountnumberSOL paid (buy, fees included) or received (sell, after fees)
tradepricenumberquoteAmount / baseAmount (effective price, fees included)
tradepoolBase, poolQuotenumberpool tokens / real SOL after the trade
tradepriceAfternumberpool price after the trade: (poolQuote + virtualQuote) / poolBase
tradevirtualQuotenumberonly when the pool's virtual SOL changes (rare)
tradeuserTokensBeforenumberthe wallet's balance of this coin just before the trade
tradelpFee, protocolFee, creatorFeenumberfees in SOL
tradecreatorbooltrue when the trader is the coin's creator
tradeixstringinstruction variant, e.g. buy_exact_quote_in; absent for a normal buy
traderecoveredboolthe log was truncated; trade read from the full transaction
endmint, why, buys, sellsstring, string, number, numbercoin no longer followed: window (30 min done), evicted (cap of 30 coins), budget (data budget); counts recorded
down, uptnumbera feed connection dropped / came back: trades in between may be missing
resumemintstringcoin picked up again after a restart; the gap before t is missing

pregrad

Example rows (from the sample)
create
{"type":"create","t":1791640827094,"mint":"EYrWRPj4umi4AyUgiG2S6YjKhpu3oz6hc4wFNKPypump","creator":"7mHmNh6BFNWpFp5qh2VXRNzsK63zZ5ZQGQY77khANBQW","sig":"f6etp6K3nBnA6P5fhrupy8CZafaMQ9NQ7UQN1ZZbUwEvwEdi2uMndc3d1aYTz3mBYC5hqXTqg8KFJqynwqEgTx5","name":"beer","sym":"beer","devTokens":2442400.964047,"devSol":0.068442865,"capSol":28.087,"curve":"BwWK17cbHxwWBKZkUYvzxLcNQ1YVyaFezduWbtm2de6s","mayhem":true}
curvex
{"type":"curvex","t":1791640818055,"slot":455280896,"curve":"9UfpfsVkwAi9ynZHq6Wi7WjZEzL2Kp8jEbDdfWfjs5gV","mint":"9pAbYE6q9t5F8tDdrJWrVyMKEYhZnPLwB6hNEHPSnkkt","cap":304.08,"cross":300,"sol":68.935,"sinceFirstS":196.7}
ctrade
{"type":"ctrade","t":1791640836449,"bt":1791640836,"slot":455281007,"sig":"eMR2wKhSwrcTvpdLLxRkTpAJ91PYf8EHNvhJJGVuBQaJtVSqeQQsad4QWQxNHp6VQurGi4KRUToU6tzV7F7FcQJ","i":0,"mint":"9LcWKxyvcWTbzwumh7cHaUakgy4eKW4B7pWo4ZLcVM64","side":"buy","user":"E2ridaSSvdWMDJ2YfiH1X6TYSurf2gTZpDFLJ9qMmQLk","sol":0.048888888,"tokens":244185.00765,"capAfter":200.334,"curveSol":50.304208}
migrate
{"type":"migrate","t":1791640841042,"mint":"9pAbYE6q9t5F8tDdrJWrVyMKEYhZnPLwB6hNEHPSnkkt","sig":"45ZhqvZwD3SC18TUZ8wQjR1uWHQn91cqTJyiftnyFnJkeoyqoiRXopZTxhHo1TpopAi6HFSwEzsSEUMPcpTfuJWQ","pool":"pump-amm"}
grad
{"type":"grad","t":1791640841373,"mint":"9pAbYE6q9t5F8tDdrJWrVyMKEYhZnPLwB6hNEHPSnkkt","slot":455281028,"capSol":537.05,"creator":"CfZELPLk52fdxb5DTwfEnZqepPv8vjWsfJZMnGRXLgJP"}
record
{"type":"record","t":1791640859732,"mint":"4DpjsfKA8uSzscqWsyZqqZJ83wvopfBmmmAsqJpnH7Kd","sym":"Ed","name":"Ed","pool":"22FiEsj8GfHYp7vDC88gFy833mXzqDpKuvPZ574hgLv4","slot0":455281034,"sig0":"3HikNGkRwodBdHgDgsvpcGnTpJqYBTVqNKRpRry3dsxQFk86Mt5EMscKCsT2goZLQFqX48R9nu3B8NACCeqqiJiy","t0":1791640842431,"bt0":1791640842000,"src":{"first":"pumpportal","gradRow":true,"migrate":1791640842431,"curveCompleteS":0.68},"creator":"DPZpMGnuq44KE77yCjS1oq6UdqhNNSAURcB1AzQeQQTf","create":{"t":1791640165488,"sig":"3b4RzKnmb1MsYXJB1AAeFQevWMcioQMm5DSCy15kznu47kD8735q9fVT2vLvoyAuKeHdtKc93E5vhpQ7deTY3EeE","src":"pumpportal","mayhem":false,"capSol":33.957},"ageS":676.9,"instant":false,"cap0":511.65,"curveSol":86.467621472,"devBuyTokens":99366691.529599,"devBuyPct":9.937,"devBuySol":3.061728394,"creatorPctAtGrad":9.937,"creatorInfo":{"txs50":14,"capped":false,"oldestS":331,"nBefore10m":0,"funder":null,"fundSol":0,"fundedBeforeS":331,"fundMemo":false,"priorCoins24h":0,"priorCoins72h":0},"gradSlot":{"pct":0,"sol":0.002,"nWallets":1,"nTx":1,"buys":[{"w":"27HFmP7ccLadGswvQfvea4o3juLw75cPF4V6jWpHM3MX","tokens":46.135,"pct":0,"sol":0.0015,"sig":"tzo2Mdn6uvEN6MMf2pk9bfEFNEnwLMzVBdSKFbxXmXqqfLuZ2DnsJVVb6pUisqDhoUfPdT7JXMWL3CepUkQ8Fo4","bundleSize":1,"payer":"27HFmP7ccLadGswvQfvea4o3juLw75cPF4V6jWpHM3MX","signers":1,"slotOffset":1}],"whale":{"w":"27HFmP7ccLadGswvQfvea4o3juLw75cPF4V6jWpHM3MX","pct":0,"sol":0.0015,"bundleSize":1,"creatorInTx":false,"gainers":[],"txs25":25,"oldestS":399,"lastTxKind":"pamm","funder":null,"fundSol":null,"fundedBeforeS":null,"fundSig":null,"fundMemo":null}},"curve":{"coverage":"partial","holders":[{"w":"9AkbDBmPKNt8SvZRMF7wYDz33WYMnRFfsBnVE18naFpD","pct":0.045,"sol":0.0978,"creator":false},{"w":"Ej6eGdvP1VYJg45FyxpjtXLag1AEG4r2JLNxaq8F3ws7","pct":0.004,"sol":0.0094,"creator":false}],"creationSlot":null,"bundleEst":null,"estimated":false,"top1NcPct":0.045,"top5NcPct":0.049,"nOver3Pct":0,"bundleWallets":0,"bundlePct":0,"creatorPct":9.937,"path":{"firstCap":57.8,"firstS":674.2,"maxCap":410.9,"updates":948,"completeS":0.68,"t100S":668.7,"t200S":316.2,"t300S":65.7,"t400S":3.7},"trades":{"fromCap":216.2,"fromT":1791640569831,"n":5,"buys":2,"sells":3,"wallets":5,"maxCap":216.7,"lastCap":215.9,"completeT":1791640842431,"topBuyers":[{"w":"9AkbDBmPKNt8SvZRMF7wYDz33WYMnRFfsBnVE18naFpD","tokens":451685.64,"pct":0.045,"sol":0.0978},{"w":"Ej6eGdvP1VYJg45FyxpjtXLag1AEG4r2JLNxaq8F3ws7","tokens":43399.248,"pct":0.004,"sol":0.0094}]}}}
outcome
{"type":"outcome","t":1791641308603,"mint":"HXFYuYYfJ7TKMLp8KZ2vcw5jq6DaxWL8Tq7QdhDqCXbX","sym":"Aramco","t0":1791640703550,"recT":1791640712803,"capAt":{"10":3177.45,"45":3218.37,"60":3249.5,"120":3341.85,"180":3442.58,"300":3771.26,"600":5507.02},"maxGain":74,"minDrop":-78.3,"crashed":true,"trades":8684,"dump":{"tS":601.9,"w":"5NpcZzQoiARZjuPPZGRo33YwyWzhAq7R8vx1jXsKbTzo","frac":1.833138,"rule":"big-sell","sol":199.72990449,"capAfter":689.757,"tokensFrom":{"kind":"transfer","tokens":66050028.897,"pct":6.605,"from":"4imgFChpdw6YyjPw6cRxrtJpBHZS8LNrQZgbyVTfirP4","for":"5NpcZzQoiARZjuPPZGRo33YwyWzhAq7R8vx1jXsKbTzo","sig":"Atfch84VwkJckSuXqjRqBqDKuHoibeWzEMPn7nAJKkRZ7ehmM534Byp5hriqaV13JERN9M2S1mphnp87GcvdjCC","bt":1791640717,"account":"Hnzdxe8VcjXvoBmoEPRWf6EMpqsa29RVMivt3g75RpBx","accountTxs":11,"beforeDumpS":588,"afterGradS":13}},"firstBigSell":{"tS":601.9,"w":"5NpcZzQoiARZjuPPZGRo33YwyWzhAq7R8vx1jXsKbTzo","frac":0.3928,"sol":199.72990449,"capAfter":689.757,"tokensFrom":{"kind":"transfer","tokens":66050028.897,"pct":6.605,"from":"4imgFChpdw6YyjPw6cRxrtJpBHZS8LNrQZgbyVTfirP4","for":"5NpcZzQoiARZjuPPZGRo33YwyWzhAq7R8vx1jXsKbTzo","sig":"Atfch84VwkJckSuXqjRqBqDKuHoibeWzEMPn7nAJKkRZ7ehmM534Byp5hriqaV13JERN9M2S1mphnp87GcvdjCC","bt":1791640717,"account":"Hnzdxe8VcjXvoBmoEPRWf6EMpqsa29RVMivt3g75RpBx","accountTxs":11,"beforeDumpS":588,"afterGradS":13}},"bigSells":[{"tS":601.9,"w":"5NpcZzQoiARZjuPPZGRo33YwyWzhAq7R8vx1jXsKbTzo","frac":0.3928,"sol":199.72990449}],"src":"gradtrades"}

The record row is one per graduate, written 10–40 s after graduation. The outcome row follows 10 minutes later; this one shows a coin whose cap went from 3,177 SOL at +10 s to 5,507 SOL at +10 min, then one 200 SOL sell (tokens received by transfer 13 s after graduation) took it to 690 SOL.

Schema

Sources: Solana chain logs via public RPC (creations, migrations; since Oct 14 2026, before that the PumpPortal free websocket), Solana public RPC (bonding curves, transactions). Amounts in SOL; pct = % of the 1,000,000,000 supply; times in ms unless the name ends in S (seconds).

createt, mint, signumber, string, stringcoin creation
createcreatorstringcreator wallet
createname, symstringcoin name / ticker
createdevTokens, devSolnumbercreator's own buy at creation
createcapSolnumbercurve market cap right after creation
createcurvestringbonding-curve account
createmayhemboolpump.fun "mayhem mode" launch
curvexslot, curve, mintnumber, string, string/nullbonding-curve cap crossing (mint null when not yet mapped)
curvexcap, cross, sol, sinceFirstSnumbercap now (SOL), line crossed (100/200/300/400 SOL), SOL in curve, seconds since first seen
ctradebt, slot, sig, i, mint, side, useras in gradtradesbonding-curve trade on a coin near graduation (read from cap 200 SOL up); i counts this coin's trades inside the transaction, so (sig, mint, i) is the unique key
ctradesol, tokens, capAfter, curveSolnumberSOL and tokens of the trade, cap and curve SOL after it
migratemint, sig, poolstringmigration seen by PumpPortal (pool = destination AMM)
gradmint, slot, capSol, creatorstring, number, number, stringgraduation as seen on chain
recordmint, sym, name, pool, slot0, sig0, t0, bt0mixedone per graduate, written 10–40 s after graduation (t0 = graduation)
recordsrcobjectwhich feed saw it first; curveCompleteS = curve completed how long before t0
recordcreator, createstring, objectcreator wallet; creation tx (t, sig, mayhem, capSol)
recordageSnumbercreation to graduation, seconds
recordinstantboolgraduated within 5 s of creation
recordcap0, curveSolnumberPumpSwap cap at graduation; SOL raised
recorddevBuyTokens, devBuyPct, devBuySolnumbercreator's buy at creation
recordcreatorPctAtGradnumber/nullcreator's holding at graduation
recordcreatorInfoobjecttxs50 (tx count, capped 50), capped, oldestS, nBefore10m, funder, fundSol, fundedBeforeS, fundMemo, priorCoins24h, priorCoins72h
recordgradSlotobject/nullPumpSwap buys in the graduation slot: pct, sol, nWallets, nTx, buys[] (w, tokens, pct, sol, sig, bundleSize, payer, signers, slotOffset, creatorInTx), whale = the largest of those buys with its wallet facts (txs25, oldestS, lastTxKind, funder, fundSol, fundedBeforeS, fundSig, fundMemo, gainers[])
recordcurveobjectcoverage (full/partial/none), holders[] (top 10: w, pct, sol, creator), creationSlot, bundleEst, estimated, top1NcPct, top5NcPct, nOver3Pct, bundleWallets, bundlePct, creatorPct, path (t100S..t400S, maxCap, updates, completeS), trades
outcomemint, sym, t0, recTmixed+10 min after graduation
outcomecapAtobjectPumpSwap cap (SOL) at +10/45/60/120/180/300/600 s
outcomemaxGain, minDropnumber/nullbest / worst move in %, first 10 min, vs the price 10 s after graduation; touched -80% = minDrop <= -80, touched 2x = maxGain >= 100; null when no trades were seen. From 2026-10-14 03:40 UTC, graduation-slot trades repaired from blocks (priced before the big graduation buy) can make minDrop far too low on some coins (Oct 14: 349 of 569 read as touched -80%, 195 really did); use the graduates CSV's low_10m_pct / high_10m_pct, computed in chain order
outcomecrashedboola trade at 60% of the running high or lower within the first 10 min, i.e. a 40%+ fall from the high (not an 80% drop: for that use minDrop <= -80)
outcometradesnumberPumpSwap trades counted
outcomedump, firstBigSell, bigSells[]objectthe first sale breaking a fixed size rule and the large sales: tS, w, frac (share of pool sold), sol, capAfter, rule, tokensFrom
outcomesrcstringwhere trades were read from

padfeed

Example rows (from the sample)
grad
{"type":"grad","t":1791642704526,"pad":"ray","platform":"Fo1dp1JYQQWgYgAdiZWfmJpA7KRreCdCEyEEVcE1Q2TN","mint":"BwVPtfz4g8TcmmuVyQWnQEx8X3Zhr3W24McKEvztfEe1","quote":"So11111111111111111111111111111111111111112","pool":"27XKWhuX5rKrJJxr5ebQc3ZKDXSCgZVMR329aGZDXrC9","curveAuth":"6s1xP3hpbAfFoNtUNF8mfHsjr2Bd97JxFJRWLbL6aHuX","baseVault":"B7xSvh15d1aXre2bFKcRpqRG9zdbEECFR6981tiRyn5w","quoteVault":"38VBuRZUGNTGkH8WxkmnsLH7YBiC2n5FseTmBuGZq5Us","b":206900000,"q":85.000000062,"px":4.108264865248912e-7,"supply":1000000000,"decimals":6,"tokenProgram":"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb","feeBps":null,"freeze":null,"mintAuth":null,"sig":"2QN2S5rGhVv8sAZcYXT7MGVDvzAEvUYZrewBYSypMcDfksxTS2u413czrYXPiXoYwJEtRjsgoamt32kELbuVNm6p","blockTime":1791642704000,"lagMs":526}
px
{"type":"px","t":1791640800132,"mint":"7E9FWUo2mJK1LT53LPceXK8VHrDM4WhMFpBZYtyHaSC1","b":13932037.454196,"q":17.430408874,"pad":"dbc"}
holders  (top20 cut to 2 entries here; the file has all 20)
{"type":"holders","t":1791640987253,"mint":"FJH9L1G1ezgVKymcKnVUARN9YH6oPFAJ19qTQ6mL7EXd","top10":0.7,"top20":[{"acct":"GCegNfWBkzpERkQVwZkBSJBdXxqMFMMdoLuvKgNr7PEF","owner":"FhVo3mqL8PW5pH5U2CN4XE33DokiyZnUwuGpH2hmHLuM","amt":950264550.634002},{"acct":"FukAMJAHBU1rvWSYAB4MTiHzR2QnUwNNZGxm3ZxKyQc3","owner":"HLnpSz9h2S4hiLQ43rnSD9XkcUThA7B8hQMKmDaiTLcC","amt":18537186.696369}],"pad":"dbc"}
qpx
{"type":"qpx","t":1791640829727,"usd":{"98sMhvDwXj1RQi5c5Mndm3vPe9cBqPrbLaufMXFNMh5g":84.3142186577373,"So11111111111111111111111111111111111111112":109.78435044998537}}

The px row above: price = q / b = 17.43 / 13,932,037 = 1.25e-6 SOL per token; at the SOL price in the nearest qpx row (US$109.78) that is US$0.000137.

Schema

dbc = Meteora Dynamic Bonding Curve (Bags, Jupiter Studio, ...) to a DAMM v2 pool; ray = Raydium LaunchLab (bonk.fun etc.) to a Raydium CPMM pool. Each coin followed 20 min (dbc) / 30 min (ray). Source: Solana RPC; US$ quote prices from Jupiter's free price API.

alltnumberms when recorded
gradpad"dbc" / "ray"launchpad
gradplatformstringplatform config / name
gradmint, quotestringcoin mint; quote mint (SOL, or a token such as USD1 / a tokenized stock)
gradpool, curveAuth, baseVault, quoteVaultstring/nullpool and vault accounts; pool is null on every dbc row (the DAMM v2 pool is not known when the migration is heard; the vaults identify it) and set on ray rows
gradb, qnumbervault balances (tokens, quote units) at migration
gradpxnumberprice in quote = q / b
gradsupply, decimals, tokenProgramnumber, number, stringmint facts (Token or Token-2022)
gradfeeBps, freeze, mintAuthmixedToken-2022 transfer fee, freeze / mint authorities (null = none)
gradsig, blockTime, lagMsstring, number, numbermigration signature, its block time (ms, not seconds like bt elsewhere) and how long after the block we heard of it (ms)
pxpad, mint, b, qstring, string, number, numbervault balances when they changed (every ~6 s, ~2 s for fast-moving coins); price = q / b
holderspad, mint, top10, top20[]string, string, number, array+60 s and +5 min: 20 largest token accounts (acct, owner, amt); top10 = share held by top 10 excluding pool vaults and curve
qpxusdobjectevery 30 s: US$ price of SOL and of every non-SOL quote mint seen in the last 2 h, keyed by mint

meteora-pools

Example rows (from the sample)
pool
{"type":"pool","t":1791640862793,"pool":"3BCeknAQpHELGfKhUb9mnKuLC3Eg3qjJrZ5B7fqC1xSW","price":0.000006613131,"tvlUsd":59712.37,"vol24hUsd":621060.47,"fees24hUsd":17376.4,"vol24hDeltaUsd":94.68,"feesMinUsd":65.4599}
{"type":"pool","t":1791640862793,"pool":"5EStPSuAZB4TqBSWLpbGwiKFEuspdYjcc3EoRMgeMHGh","price":0.000026998604,"tvlUsd":54300.74,"vol24hUsd":268438.69,"fees24hUsd":14080.84,"vol24hDeltaUsd":-1688.1,"feesMinUsd":0}

Same minute, two pools: the first earned US$65.46 in fees in that minute on US$59.7k of TVL; the second earned nothing, and its rolling 24 h volume fell by US$1,688 (more dropped out of the 24 h window than came in).

Schema

One row per pool per minute, Meteora DLMM pools with TVL of US$50k or more, top 200 by 24 h fee/TVL. Source: Meteora's public DLMM API. No RPC, no wallets.

type"pool"row type
tnumberms when fetched
poolstringDLMM pool address
pricenumberpool's current price (quote per base token, as Meteora reports it)
tvlUsdnumbertotal value locked, US$
vol24hUsdnumberrolling 24 h volume, US$
fees24hUsdnumberrolling 24 h fees, US$
vol24hDeltaUsdnumber/nullchange in the rolling 24 h volume since the pool's previous row
feesMinUsdnumber/nullexact fees earned since the previous row (diff of Meteora's all-time cumulative fees); null on a pool's first row or a reset

curvetape

Example rows (from the sample)
create
{"type":"create","t":1791900004668,"slot":456467223,"sig":"2f23Xpkm97zfNW33TkLj8JPbD6xPapa4UApK59Up5Bou17HJZQWWiuSzNDveStHJNJ7KM77Vj6x2aQyQdDjFRYbT","bt":1791900004,"mint":"6HFExtnceGjHTkURczNMrBXvW9mW9R8H3tTjPUdQRyjY","curve":"BzYvZ5e3PZLeRi1a6Qios3Vx2JG2fUWZsszMuFKRbe5T","user":"bwamJzztZsepfkteWRChggmXuiiCQvpLqPietdNfSXa","creator":"bwamJzztZsepfkteWRChggmXuiiCQvpLqPietdNfSXa","name":"Save The Orangutans","sym":"ORANGUTANS","uri":"https://md.sdfgsdfsdf.uk/metadata/yQ1HKDod","tokenProgram":"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb","mayhem":false,"quote":null,"vt":1073000000000000,"vs":30000000000,"rt":793100000000000,"supply":1000000000000000,"vq":30000000000}
trade
{"type":"trade","t":1791900000073,"slot":456467204,"off":5277,"bt":1791899999,"sig":"3oHhesiuEZy6AEGibP29sLPwz4EE4jqb7ucAETkz4DijVrwyT9TdHdJF6rwcDYEjHUJZz4Lbpa8FLxQY2jYrAiLT","i":0,"mint":"13C3X9CJQd98H6nic3mTGE5a5wvKRQec4VaceMy9pump","side":"buy","wallet":"D4orPtC6p1VveJuVJXZCqDFDvLX5689bg3sPyT6L9L3U","tokens":2328278.127981,"sol":0.272278445,"capAfter":117.4642,"curveSol":31.491252689,"fee":0.002586646,"cfee":0.000816836,"vs":61491252689,"vt":523489102303982,"ix":"buy"}
migrate
{"type":"migrate","t":1791900007570,"slot":456467236,"sig":"2eA524jow1WmjWZtZL9oajTtsab7sLPMAiQh49A3N6jjNKjwbVkdK1oQkx5dbgMdd5vENVgdvBKu8pyvXL1ESrRu","bt":1791900007,"mint":"7HB5bziuo7maGzy24SS2KmEUnHfFkcgQPT8zt9NZpump","pool":"2HVdHvhk78x8yuhFiiLhy5MdH6dZ6wet3C32Euzyzu2N","quote":null,"solAmount":84.990359428,"mintAmount":206900000,"poolMigrationFee":0.015000001,"user":"7LCvF6K1Sp88qt9HJ6FRw4DJfXahJ72gZqqM3X9tDycU"}
end
{"type":"end","t":1791900007568,"mint":"7HB5bziuo7maGzy24SS2KmEUnHfFkcgQPT8zt9NZpump","why":"graduated","src":"create","trades":1074,"buys":903,"sells":171,"vol":172.633076653,"volQ":null,"lastCap":410.8802,"maxCap":410.8802,"firstT":1791899520492,"lastTradeT":1791900007568}
gap
{"type":"gap","t":1791902270272,"from":1791902148965,"to":1791902270272,"why":"boxcap","ms":121307}

The trade above: the buyer put 0.272278 SOL into the curve and paid 0.002587 + 0.000817 SOL in fees, 0.275682 SOL in all; the cap after it was 117.46 SOL. The gap is real: from 14:35:48 to 14:37:50 UTC the live feed was off (121 s, backed off to stay inside the shared public-RPC allowance), so trades in that window are not in this file.

Schema

One JSON object per line, rows in t order. SOL amounts in SOL, token amounts in whole tokens; vs, vt, rt, vq, supply and the Q fields are raw integers. Source: Solana chain (pump.fun program logs).

createslot, sig, btnumber, string, numberthe creation transaction
createmint, curvestringthe coin and its bonding-curve account
createuser, creatorstringwallet that sent the creation / the coin's creator (receives creator fees)
createname, sym, uristringname, ticker, metadata link, as written on chain
createtokenProgramstringToken-2022 or classic token program
createmayhemboolpump.fun "mayhem mode" coin
createquotestring/nullnull = priced in SOL; else the mint the curve is priced in
createvt, vs, rt, supply, vqnumberstarting virtual tokens, virtual SOL, real tokens, supply, virtual quote reserves (raw)
tradeslot, sig, i, btnumber, string, number, numberthe transaction; i = index of this trade among pump.fun trades in it, so (sig, i) is unique
tradeoffnumber/nullslots since the coin's creation slot (null when the creation was not seen)
trademint, side, wallet, tokensstring, "buy"/"sell", string, numberwho traded how many tokens
tradesolnumberSOL curves: SOL into (buy) / out of (sell) the curve, WITHOUT fees (a buyer paid sol + fee + cfee, a seller got sol - fee - cfee)
tradefee, cfeenumberSOL curves: pump.fun protocol fee / creator fee, SOL (0.95 % / 0.30 % in Oct 2026; mayhem coins differ)
tradecapAfter, curveSolnumberSOL curves: market cap in SOL after the trade (price x 1e9 supply); real SOL in the curve after it
tradevs, vtnumbervirtual SOL (SOL curves only) / virtual token reserves after the trade (raw)
tradequote, qAmt, vq, rq, feeQ, cfeeQstring, numbercurves priced in another token: its mint; the amount, virtual / real quote reserves and the two fees in its raw units. These rows have NO sol / capAfter / curveSol / fee (never a fake 0). quote "?" = amounts unreadable
tradeixstringinstruction: buy, sell, buy_exact_sol_in, buy_exact_quote_in, multi_hop_swap (a swap routed through the curve's quote token in one instruction; almost all on curves priced in another token)
tradebyCreatorboolpresent (true) when the trader is the coin's creator
trademayhemboolpresent (true) on mayhem-mode coins
tradetrunc, recboolthe transaction's logs were cut off (later trades in it come as rec rows read from the full transaction, or are missing)
migratesolAmount, quoteAmount, mintAmount, poolMigrationFee, usernumber, stringSOL (or raw quote) and tokens moved into the pool, migration fee (SOL), sender
endmint, why, srcstringcoin no longer followed: graduated, idle (60 min without a trade), evicted (over 20,000 followed); src create / adopt
endtrades, buys, sells, vol, volQ, lastCap, maxCap, firstT, lastTradeTnumbertotals seen while followed (vol in SOL for SOL curves, volQ raw otherwise; caps in SOL)
txtxFee, prioFee, jitoTipnumbernetwork fee paid, priority part of it (fee minus 5,000 lamports a signature), SOL sent to Jito tip accounts; SOL
txcuPrice, cuLimit, cuUsed, prioCfgnumbercompute-unit price (micro-lamports, v0 transactions), limit, used; prioCfg = a v1 transaction's own priorityFee setting
txfailedboolthe transaction failed
gapfrom, to, why, msnumber, number, string, numberthe live feed was off between from and to. why: socket, yield413 / boxcap / selfcap (backed off to stay inside the shared public-RPC allowance), refused, start, stop. Since 2026-10-14 a backfill row follows: when it says complete: true nothing in the window is missing
create, trade, complete, migratesrc"backfill"since 2026-10-14: present only on rows repaired after a gap, read from whole blocks; the same fields and values as live rows. Live rows have no src
backfillfrom, to, whynumber, number, stringsince 2026-10-14: one gap repaired from the chain (whole blocks via a paid RPC): its window (ms) and reason (restart = the recorder restarted)
backfillslotFrom, slotTo, blocks, skipped, failed, txs, rowsnumber, objectslots read, blocks read, slots with no block, slots that could not be read, transactions with pump.fun events, rows written by type
backfillcomplete, stopbool, stringcomplete: true = every slot of the window was read; false: stop says why (nocredit, maxblocks, noslot, nohelius) and slots after slotTo stay missing

launchmeta

Example rows (from the sample)
meta (phase create)
{"type":"meta","t":1791900032794,"phase":"create","src":"chain","mint":"3SrkocGC2RJRznw2HEyJBrRzoMcRDoJs5L52EWAfpump","tCreate":1791900032355,"createSig":"2vx9i7n4EpodmVcEgvX1VReULVPX3gXuKeZxzJPqr8RsHDexEqnrPz8cx6yrPSjASVskuQFV84XxmBD9NjJ2XUgA","creator":"7FVfSdnR9VPGjMtmBP1Hz9C2DFTpoNX8gVVRmnimnGt9","name":"up","sym":"up","uri":"https://ipfs.io/ipfs/QmZMeuCM42FErtBCZQd57DLcs1mpRNQLSqMVL21MRzQ8VE","uriKind":"ipfs","json":{"name":"up","symbol":"up","description":"grow up","image":"https://ipfs.io/ipfs/bafkreihb7ybjzblgsfzqzc4lv5v5kii5letvrah5xozqwziuqxnnsayl7q","showName":true,"createdOn":"https://pump.fun"},"metaSha":"8ab84aca67c8bbf27fe573ecbec4f0e94a2ec9b8f60ccf47d3493588b372aaa2","metaBytes":189,"imgUrl":"https://ipfs.io/ipfs/bafkreihb7ybjzblgsfzqzc4lv5v5kii5letvrah5xozqwziuqxnnsayl7q","imgSha":"e1fe029c856691730c8b8baf6bd5211d59275880fdbbb30b651485dad9030bfc","imgBytes":13381,"imgType":"image/gif","gwMeta":"ipfs.filebase.io","ms":165,"cachedImg":true}
meta (a failed fetch)
{"type":"meta","t":1791900007185,"phase":"create","src":"chain","mint":"6aFPW6pS1AtxgKWc4yMf6ozePzrSdBBGHmUqEdPUtz5R","tCreate":1791899997001,"createSig":"5tCy8ZwcbzsWWPaEgtMcBpUDmNoBS23A1iiCyyrg5fNwTas2gwVZSSqDWuvhrYegowF132sqgBnxAmwteDdbQciU","creator":"5vurJzLBn6dryVxztHTc5TiRo7idbRQUznCp6S4qPQFL","name":"Pocket Node","sym":"PNOD","uri":"https://paste.rs/0Wpec?meta=json","uriKind":"http","ms":10088,"err":"meta: paste.rs URLError: <urlopen error timed out>"}

The same picture always gives the same imgSha, whatever link it sits behind; cachedImg: true means that picture link was fingerprinted before. The second row is a metadata host that did not answer in time: the reason is in err, and the fields it would have filled are simply absent.

Schema

One JSON object per line, rows in t order. Sources: the creation / migration seen on chain (our curvetape feed) or by our pregrad recorder, whichever came first; the metadata and picture through public IPFS gateways.

metaphase"create" / "grad"fetched at creation, or at graduation
metasrc"chain" / "pumpportal" / "chainlogs"the feed that reported the creation / graduation first: chain = our curvetape recorder (the chain's create / migrate events); pumpportal = PumpPortal's free feed (through our pregrad recorder); chainlogs = pregrad's own detection from the chain's logs, which replaces PumpPortal there from 2026-10-14. A few rows from 2026-10-14 on (about 1 in 400) have no src: the feed was not recorded
metamint, createSig, creator, name, symstringthe coin, its creation transaction, creator wallet, on-chain name and ticker
metatCreate, tGradnumberwhen the creation / graduation was seen (ms)
metauri, uriKind, uriFromstringthe metadata link; ipfs / http / data / none / other (another scheme); grad rows: where the link came from (create, chain = read from the mint, none)
metajsonobjectthe metadata JSON's fields, each only when present: name, symbol, description (cut at 2,000 characters), image, website, showName, createdOn, and hasTwitter / hasTelegram (true when the JSON has such a link; the links themselves are left out: no social handles)
metajsonKeysarraythe JSON's other top-level keys (up to 20)
metametaSha, metaBytesstring, numbersha256 and size of the metadata JSON bytes
metaimgUrlstringthe picture link from the JSON
metaimgSha, imgBytes, imgTypestring, number, stringsha256 of the picture's bytes, its size and Content-Type (the same picture = the same imgSha)
metagwMeta, gwImgstringthe host that answered
metamsnumbertime spent fetching
metacachedImgboolthe same picture link was fingerprinted earlier (same imgSha)
metacached, changedboolgrad rows: the creation's result reused (IPFS content cannot change) / the JSON differs from the creation's (http links)
metaerrstringwhy a fetch failed (meta: <host> <reason>, image: <reason>, noUri); absent when all went well
skipmint, phase, whystringnot fetched: backlog (queue full on a very busy hour)

gradholders

Example rows (from the sample)
holders (top cut to 3 entries here; the file has up to 20)
{"type":"holders","t":1791950508411,"mint":"GUFGC9E1mtY5PB4qrr5GeyCcBJGBzMqs9bQvNon1pump","mark":10,"src":"chain","tGrad":1791949905766,"lagS":2.6,"slot":456698335,"supply":995031028.780416,"decimals":6,"pool":"AEM5qEJSYyEvqWnaajgxey5yBPXfLj5L1mLnu5Vsn2C9","n":20,"top":[{"acct":"HUVzPYCqGDz7qe46bKa6P5fuEahRaeFhTtEZGPipm6Ve","owner":"9qZvANPkPE6NHoj5W5BzJ4gb4byaVqvg1V4JCJBfiK2m","amt":129437610.107396,"pct":13.0084},{"acct":"49CVwy8EkACVqT9ASKwebaCykK4cLmzYZPbNgENPuZmu","owner":"AEM5qEJSYyEvqWnaajgxey5yBPXfLj5L1mLnu5Vsn2C9","amt":63052232.378713,"pct":6.3367,"role":"pool","pda":true},{"acct":"E3gjGe8o8mhj3hr6UScErijYrnvKS1ijwWcD5c9u41RY","owner":"BTmCme13XXrD3VLxXFChL9VnmicJ5PjkVUpAsjrooEYh","amt":2373829.971933,"pct":0.2386}],"top10Pct":13.6241,"top10PctAll":19.9136,"top20Pct":14.0483,"poolPct":6.3367,"curvePct":0,"tries":1}

Ten minutes after graduation the largest holder had 13.0% of the supply and the pool 6.3%; top10Pct (13.6) leaves the pool and curve out, top10PctAll (19.9) keeps them in.

Schema

One JSON object per line, rows in t order. Token amounts in whole tokens; pct = % of supply. Source: Solana RPC (getTokenLargestAccounts + getMultipleAccounts).

holdersmint, markstring, numberthe coin; minutes after graduation (1, 10, 60)
holderssrc, tGradstring, numberthe feed that reported the graduation first: chain (our curvetape recorder), pumpportal (PumpPortal's free feed through pregrad) or, from 2026-10-14, chainlogs (pregrad's own detection from the chain's logs); when it was seen (ms)
holderslagSnumberseconds after tGrad + mark the snapshot was actually read
holdersslotnumberchain slot of the read
holderssupply, decimalsnumbertoken supply (whole tokens) and decimals, read from the mint
holderspoolstringthe coin's canonical PumpSwap pool (SOL-quoted graduates)
holdersnnumberaccounts returned (up to 20)
holderstoparraybiggest first: acct (token account), owner (the holder), amt, pct, role (present only on pool = the coin's PumpSwap pool, or curve = its old bonding curve), pda (present only when true: the owner is a program address, not a plain wallet)
holderstop10Pct, top20Pctnumber% of supply in the 10 / 20 largest accounts, pool and curve left out
holderstop10PctAllnumber% in the 10 largest, all included
holderspoolPct, curvePctnumber% in the pool / the curve
holderstriesnumberread attempts (0 = given up before a first try)
holderserrstringthe snapshot failed (429 = the public RPC refused the read, late = no answer close enough to its mark); then no holder fields
Verify a download

SHA-256 of each free file:

180badc1ad3c6ec08ea2269ec4ad5a4c34119556184918bd67e65ec676551e30  graduates-2026-10-10-1400-1600utc.csv
4fc56af0221a66f1e91b304743172eeda3d0551975337f1942edd45d01871268  one-coin-odyssey-2026-10-10-1442-1512utc.csv
9513e2258b8f9b4f8891fbe6f02612ad9cec9a406e9e4268bf240d1d7feeec77  one-coin-odyssey-2026-10-10-1442-1512utc.jsonl

Save these lines as SHA256SUMS next to the downloads and run sha256sum -c SHA256SUMS, or download SHA256SUMS and MANIFEST.json (bytes, checksum and rows of each free file). Every day file ships with the same sidecar, <name>.manifest.json.

03

Reading the files

JSON lines (gzip) · also as Parquet · one CSV a day

Two clocks. Every row has t: milliseconds since 1970 UTC, when our recorder received the event. Rows read from the chain (trade, grad, ctrade) also carry bt, the block time in seconds, and slot. Order trades by slot then i (the trade's index inside its transaction) to get chain order; use t to know when a live bot could have known. In the sample, t runs about 0.7 s behind bt (median), 1.4 s at the 99th percentile. Files are cut on t, so a trade with a block time just before midnight UTC can sit at the top of the next day's file.

One file holds several row types with different fields, so tell your tool to look at every row, not just the first few.

Also as Parquet: reading the Parquet copies

Parquet. Every day file also comes as .parquet: the same rows in the same order, one typed column per field, ZSTD-compressed, and checked against the .jsonl.gz (same row count, rows equal) before it ships. Each file is one table whose columns are every field of every row type; a field a row does not have is null, so filter on type first. t stays integer milliseconds. Nested objects are structs (dicts in pandas) and arrays are lists. padfeed's usd is a map keyed by quote mint. A field that is text in one row type and an object or a number in another (pregrad's curve, src and cross) is a text column: the text as it is, or the object's JSON text. Every day of a dataset has the same columns, so a folder of days reads as one table.

Parquet: pandas

import pandas as pd

# a pregrad day loads in under a second (about 6 s from JSON lines)
df = pd.read_parquet("pregrad-2026-10-12.parquet")
rec = df[df["type"] == "record"]
funders = rec["creatorInfo"].str["funder"]    # nested fields are dicts

# gradtrades: read only the columns you need
cols = ["type", "bt", "slot", "i", "mint", "side", "user", "quoteAmount"]
trades = pd.read_parquet("gradtrades-2026-10-12.parquet", columns=cols)
trades = trades[trades["type"] == "trade"]

Parquet: DuckDB

-- every day you have, as one table
SELECT mint, count(*) AS trades, sum(quoteAmount) AS sol
FROM read_parquet('gradtrades-*.parquet')
WHERE type = 'trade'
GROUP BY mint ORDER BY sol DESC LIMIT 20;

-- padfeed's US$ prices: a map keyed by quote mint
SELECT t, usd['So11111111111111111111111111111111111111112'] AS sol_usd
FROM read_parquet('padfeed-2026-10-12.parquet')
WHERE type = 'qpx';
04

How it is collected

Public data only: the Solana chain (read through the public RPC, and a paid RPC for gap repair and holder snapshots), PumpPortal's free feed, public IPFS gateways for coin metadata, Meteora's public API and Jupiter's free price API. No private data, no logins, no social profiles.

Facts, not opinions. We sell what happened on chain (addresses, amounts, times), not our opinions about wallets: no "insider" or "rugger" labels. Our own trading wallets are removed from every file.

Checked before it ships. Every line is parsed and checked; malformed rows are dropped. Coverage gaps (a dropped connection, a coin skipped under our data budget) are written into the files as rows (down, up, resume, end with a why), never filled in or guessed.

05

Coverage and limits

read this before you rely on a window

Gaps are rows, not guesses

  • A dropped feed connection is written as a down row and an up row with their times; trades in between may be missing.
  • A coin picked up again after a restart gets a resume row; the gap before it is missing, not reconstructed.
  • Every followed coin ends with an end row and a why: window (30 minutes done), evicted (the 30-coin cap), budget (data budget).
  • curvetape writes a gap row for every stretch its live feed was off; launchmeta and gradholders write a row with err for every fetch or holder snapshot that failed.
  • pregrad: its feed of new coins and migrations was off 2026-10-14 09:31–13:01 UTC and 2026-10-14 15:16 to 2026-10-15 20:24 UTC (a fault, now fixed). The graduation records in those windows are there, but most lack ageS, many lack sym/name and creatorPctAtGrad, priorCoins24h/priorCoins72h read 0, and the create, migrate, curvex and ctrade rows are missing.
  • Nothing is interpolated or guessed. If a file has a hole, the hole is in the file; where a hole was later repaired from whole blocks, the repaired rows say so (src: "backfill").

What is not in gradtrades

  • Only coins whose cap at graduation is between 300 and 600 SOL are followed; the others get a grad row with follow: false and no trades.
  • At most 30 coins are followed at a time; when a 31st graduates, the oldest is evicted.
  • Each coin is followed for 30 minutes after graduation, nothing after that window.
  • Failed transactions are not included.
  • A coin picked up late has late: true and followFrom; trades before that time are missing.

What was removed before sale

  • Our own trading wallets, from every dataset.
  • Our internal "rogue" wallet list and every field derived from it: flags, priorRugged, the dumper role.
  • From pregrad: picture fingerprints and metadata URIs (they have their own dataset, launchmeta, which keeps no social links).
  • Heartbeat and stats rows.
  • No wallet labels of any kind are added. What is left is what happened on chain: addresses, amounts, times.

Checks before shipping

  • Every line is parsed as JSON and checked for type and t; malformed rows are dropped.
  • Files are cut at the UTC day boundary and published after the day closes.
  • The free files are cut from the same day files by the same export; their SHA-256 checksums are listed above, so you can check a download.
  • Known limits are written here and in the README, not hidden in a footnote.
06

Buy

One day or a plan · USDC or SOL on Solana · download links by email within minutes

Choose

One day

$10 once

Pay in USDC or SOL

  • Any UTC day you pick, the whole day on one sheet (graduates CSV): opens on your phone, drops straight into ChatGPT or Claude
  • Also included: every graduate's first 30 minutes (gradtrades) and who was behind each launch (pregrad), JSON lines and Parquet
  • The test prompt with that day's files filled in, and what the example rules returned that day
  • No subscription

One week

$20 once

Pay in USDC or SOL

  • The last 7 days, every dataset
  • Each day on one sheet (graduates CSV), plus all 7 in one file for ChatGPT
  • Once, no subscription

Full history

$49 / month

Pay in USDC or SOL

  • Every day since Oct 3 2026, a new one each morning

Live alerts · $10 / month

Pay in USDC or SOL

Every pump.fun graduation in a private Telegram channel within seconds: dev %, curve speed, graduation block, creator history, then how its first 10 minutes went. Facts only, not advice.

Free preview, 10 minutes late: t.me/launchtape

30 days, one Telegram account; your invite comes by email. Nothing renews by itself.

SOL price powered by Jupiter

One day and One week are single payments. Full history covers 31 days; nothing renews by itself. A few days before the end we email you a link to renew. Each day is one file per dataset, so a big history downloads file by file (gradtrades is about 0.8 GB a day). Solana network only; other chains on request.

If a file doesn't open or isn't as described, you get your money back.

For Python: reading the files

Python: pandas

import pandas as pd

# gradtrades is ~5M rows a day: read in chunks, keep what you need
chunks = pd.read_json("gradtrades-2026-10-10.jsonl.gz", lines=True, chunksize=500_000)
trades = pd.concat(c[c["type"] == "trade"] for c in chunks)
trades["ts"] = pd.to_datetime(trades["bt"], unit="s", utc=True)

DuckDB

-- sample_size=-1: scan every row, so every row type's fields are in the schema
SELECT type, count(*) AS n
FROM read_json_auto('gradtrades-2026-10-10.jsonl.gz', sample_size=-1)
GROUP BY type ORDER BY n DESC;

Shell: zcat + jq

# rows per type
zcat gradtrades-2026-10-10.jsonl.gz | jq -r .type | sort | uniq -c

# trades to CSV (pick your columns)
zcat gradtrades-2026-10-10.jsonl.gz \
  | jq -r 'select(.type=="trade") | [.bt,.slot,.i,.mint,.side,.user,.baseAmount,.quoteAmount,.price] | @csv' \
  > trades-2026-10-10.csv

Pay

Pay manually

For a wallet that cannot use the Pay button or scan the code: press Pay above to get an order code and the exact amount, then send that amount from any Solana wallet to this address, with the order code (like LT-7KQ2M9) as the memo.

5vf1PzK8LrF9D5bemYJYPsFYp4nHULSTA1biBampgU58
QR code of the pay address only

This QR code holds the address only: enter the amount and the memo yourself.

Your wallet has no memo field? Send the payment anyway and give us the transaction signature and your order code through the contact form: we match it by hand, within a day.

07

FAQ

Where do I start?

See what it looks like, free: the graduates CSV (105 coins, 2 hours, 19 KB) and one coin's every trade (30 minutes, 0.4 MB). Both fit in ChatGPT or Claude. Then test on a full day for $10: every graduate of one UTC day, trade by trade, with who was behind each launch.

How do I get the files after paying?

Choose what you want, give your email, press Pay. A browser wallet (Phantom, Solflare, Backpack) opens with everything filled in; on a phone, Open in wallet app does the same; on a computer without a wallet, scan the QR code with your phone. We see the payment on the Solana network within a minute or two and email you a private download link. Not in your inbox? Check your Spam (and Promotions) folder: new senders often land there; mark it Not spam and the next ones arrive normally. No account, no login. The link works for 7 days (14 for Full history); each day on it comes as .jsonl.gz and .parquet, with its manifest beside them (row counts, SHA-256). Paid some other way and nothing arrived? Send us the transaction signature through the contact form and we match it by hand.

What exactly is a file?

One dataset, one UTC day, gzipped JSON lines: gradtrades-2026-10-10.jsonl.gz holds every gradtrades row from 00:00:00 to 23:59:59 UTC on October 10, one JSON object per line. Typical gzipped sizes (Oct 10–13 2026): gradtrades about 0.8 GB, curvetape about 0.75 GB, pregrad 22–70 MB, meteora-pools 19 MB, launchmeta 14 MB, padfeed 3–4 MB, gradholders about 1 MB. Each day also comes as Parquet, gradtrades-2026-10-10.parquet: the same rows as typed columns for pandas, DuckDB, Polars or Spark, checked against the JSON lines before it ships (same days: gradtrades about 0.6 GB, pregrad 19–22 MB, meteora-pools about 3 MB, padfeed 2–3 MB). The daily feed is the same files, one set per day, sent after each UTC day closes.

Refunds?

If a file doesn't open or isn't as described, you get your money back.

08

Licence

Allowed

  • Personal and research use.
  • Use inside your own team.
  • What you build from it (charts, papers, models, strategies) is yours.

Not allowed

  • Resale of the files.
  • Republishing the files or large extracts of them.
  • Sharing outside your own team.

Warranty

Not financial advice. Files are provided as described; see the guarantee under Pay. Coverage gaps are marked, not filled; read the limits above before relying on a window.

09

Contact

Questions, missing payments, custom requests · answer within a day

What helps

  • A payment question: the transaction signature, so we find your transfer.
  • A custom request (other days, other chains, a field you need): what you want and what for.
  • We answer at the email address or handle you give, usually within a day. Your message is used only to answer you.