Skip to main content

launchtape

Python access to Launch Tape: daily files of Solana launch data, one file per dataset per UTC day, as gzipped JSON lines (.jsonl.gz) and as Parquet (.parquet, the same rows as typed columns).

Dataset What it is
gradtrades Every PumpSwap buy and sell in the first 30 minutes after each pump.fun graduation (wallet, amounts, price, pool reserves, fees)
pregrad Who is behind each pump.fun launch: creator and its funding, curve and graduation-slot buyers, the cap path, and a +10 min outcome
padfeed Graduations on Meteora DBC and Raydium LaunchLab: migration facts, pool balances every few seconds, top holders, US$ quote prices
meteora-pools Per-minute price, TVL, volume and exact fees for ~200 Meteora DLMM pools
curvetape Every trade on every pump.fun bonding curve from creation to graduation, plus creations, completions and migrations (from 2026-10-13)
launchmeta Every new pump.fun coin's metadata and a SHA-256 of its picture, at creation and at graduation (from 2026-10-13)
gradholders Each pump.fun graduate's 20 largest token accounts with owners and shares at +1, +10 and +60 minutes (from 2026-10-14)

Every file comes with a SHA-256; launchtape downloads a day you bought (fetch), checks it and reads it. The free files on the site (the graduates CSV and one coin's trades, launchtape.io/#sample) are plain CSV / JSON lines you can open without it; lt.sample(dataset) only works while the site lists a free sample of that dataset (none since Oct 14 2026), so a full day ($10, launchtape.io/?plan=day1#buy) is the way in.

Install

pip install launchtape              # needs only requests
pip install "launchtape[pandas]"    # adds pandas for launchtape.frame()
pip install "launchtape[parquet]"   # adds pyarrow, to read the Parquet files

Python 3.9 or newer.

Quickstart

Share of pump.fun graduates that touched -80% in their first 10 minutes, split by "instant" launches (graduated within 5 s of creation):

import launchtape as lt
import pandas as pd

g = pd.read_csv("graduates-2026-10-12.csv")                    # from your download page: one row per graduate
g = g.dropna(subset=["low_10m_pct"])                           # no pool trades = no prices
g["instant"] = g["curve_fill_sec"] < 5                         # bonding curve filled within 5 s of creation
print(g.groupby("instant")["touched_minus80_10m"].agg(["mean", "count"]))   # 1 = low_10m_pct <= -80

path = lt.fetch(link, "pregrad", "2026-10-12")                 # who was behind each coin; SHA-256 checked, cached
rec = lt.frame(path, types="record")[["mint", "sym", "instant", "ageS", "creatorPctAtGrad"]]
print(lt.schema("pregrad"))                                    # every row type and field

For drops and highs, use the graduates CSV: low_10m_pct / high_10m_pct are the lowest / highest pool price in the first 10 minutes vs the price 10 s after graduation, in % (-80 = down 80%, 100 = 2x), read in chain order from that reference trade on; touched_minus80_10m / touched_2x_10m are 1 when the low is -80 or less / the high 100 or more. Do not use pregrad's outcome minDrop for drops from 2026-10-14 03:40 UTC on: from then it also counts the graduation-slot trades priced before the big graduation buy, so coins that never fell after +10 s read -80..-90%. pregrad's crashed is a different, milder flag: a trade at 60% of the running high or lower in the first 10 minutes (a 40%+ fall from the high), not an 80% drop.

API

Call Does
lt.datasets() the datasets as (name, description) pairs
lt.schema(dataset) the schema as Markdown text (bundled, works offline)
lt.sample(dataset, format="jsonl") downloads the free sample into ~/.cache/launchtape, checks it against the site's SHA256SUMS, returns its path; a good cached copy is reused; format="parquet" for the Parquet copy
lt.load(path_or_dataset, types=None, limit=None) streams the rows as dicts (a .jsonl.gz or .parquet path); types keeps only rows whose type is one of them, limit stops after that many rows; a dataset name reads its sample
lt.frame(path_or_dataset, types=None, limit=None) the same rows as a pandas DataFrame (nested fields stay dicts/lists)
lt.fetch(link_or_token, dataset, day, dest=None, format="jsonl") downloads a paid day file from your delivery link, checks it against its .manifest.json, returns its path; format="parquet" for the Parquet copy
lt.backtest(rules=None, gradtrades=None, pregrad=None, graduates=None) replays your trading rules on every graduate in a gradtrades file with honest fills and returns the result as a dict (see Test your bot's rules)
lt.backtest_report(result) that result as the plain-text report launchtape backtest prints
for row in lt.load("gradtrades", types="grad", limit=5):      # streams, so a 5-million-row day is fine
    print(row["mint"], row["capSol"])

path = lt.fetch("https://launchtape.io/dl/<token>", "pregrad", "2026-10-11", dest="data/")
pq = lt.fetch("https://launchtape.io/dl/<token>", "gradtrades", "2026-10-11", dest="data/", format="parquet")

Parquet

Every day file and sample also comes as Parquet: the same rows, checked against the .jsonl.gz before it ships, as one table whose columns are every field of every row type (null where a row does not have the field). t stays integer milliseconds, nested objects are structs and arrays lists, padfeed's usd is a map keyed by quote mint, and pregrad's curve, src and cross (text in some row types, an object or a number in others) are text columns, an object or number as its JSON text. Read it with pandas directly, or through lt.load / lt.frame (needs pyarrow):

import pandas as pd
df = pd.read_parquet(lt.sample("pregrad", format="parquet"))   # loads in a fraction of the JSON time
cols = ["type", "bt", "mint", "side", "user", "quoteAmount"]
trades = pd.read_parquet("data/gradtrades-2026-10-11.parquet", columns=cols)   # only the columns you need

Times: t is milliseconds since 1970 UTC (pd.to_datetime(df["t"], unit="ms", utc=True)). Coverage gaps are rows in the files (down, up, resume, end), never filled in: see each schema.

A full gradtrades day is about 5 million rows; for a DataFrame, pass types= and/or limit=, or stream with load(). A download that does not match its SHA-256 raises launchtape.ChecksumError and is not kept. Environment: LAUNCHTAPE_CACHE changes the cache folder.

Command line

launchtape datasets
launchtape head data/gradtrades-2026-10-11.jsonl.gz -n 5      # first rows of a file, as JSON lines
launchtape head data/pregrad-2026-10-11.jsonl.gz -t record -n 2   # only rows of one type
launchtape sample pregrad                     # a dataset's free sample, when the site lists one (none since Oct 14 2026)
launchtape schema pregrad
launchtape fetch https://launchtape.io/dl/<token> pregrad 2026-10-11 -o data/
launchtape fetch https://launchtape.io/dl/<token> pregrad 2026-10-11 -o data/ --format parquet

python -m launchtape ... works too.

Test your bot's rules

launchtape backtest replays simple rules on every pump.fun graduate in a gradtrades file, coin by coin, and prints a report: coins traded, win rate, median and mean return a trade, total, the worst trades, how many coins never reached your entry, what the first 10 minutes did, a plain verdict, and the same rules filled the naive way for comparison. It is the same replay as the prompt on launchtape.io/test, for when your AI can't run code.

launchtape backtest --gradtrades data/gradtrades-2026-10-11.jsonl.gz   # the example rules on a day you bought
launchtape backtest --template > rules.json          # the rules as a file to edit
launchtape backtest --rules rules.json
launchtape backtest --rules rules.json --gradtrades data/gradtrades-2026-10-11.jsonl.gz   # your rules
launchtape backtest --rules rules.json --json        # every trade, as JSON

A paid day finds its pregrad file next to it (pregrad-2026-10-11.jsonl.gz or .parquet), or pass --pregrad, and its graduates CSV (graduates-2026-10-11.csv, on your download page) for the "first 10 minutes" numbers, or pass --graduates. Without the CSV those numbers come from pregrad's outcome rows and leave out graduations from 2026-10-14 03:40 UTC on, where pregrad minDrop is wrong. A full day (about 5 million rows) takes under a minute and little memory: the file is streamed once.

Rule Meaning (default)
entry_s buy this many seconds after graduation (15)
exit_s sell this many seconds after graduation; 1800 or more = hold to the end of the 30 minutes (180)
stop_pct sell when the price falls this % below your entry price; null = no stop (20)
take_profit_pct sell when the price rises this % above your entry price; null = none (null)
size_sol SOL per trade (0.1)
fee_pct / slippage_pct PumpSwap fee / priority fee + slippage, % per side (1 / 0.5)
max_fill_s / min_fill_s only coins whose bonding curve filled within / took at least this many seconds from creation (pregrad ageS; 5 = the "instant" launches)
min_dev_pct / max_dev_pct only coins whose creator held at least / at most this % of supply at graduation (pregrad creatorPctAtGrad)

How a trade is filled, so the test is never kinder than the market:

  • Prices are read at the end of each slot (the slot's last trade's priceAfter and poolBase). Several trades in one slot can be one bundle, such as a big dump and its re-buy in the same block, and nobody outside could trade between them.
  • A signal never fills at its own price: it fills at the end of the first slot after it. Stops and take-profits are checked at each slot's end and fill at the next one, so a -20% stop in a dump can fill at -80%.
  • Every buy and sell pays 1% PumpSwap fee + 0.5% priority fee and slippage (change them in the rules), and your size moves the price: a fill uses that slot's pool (constant product, with PumpSwap's virtual SOL).
  • Still holding at +30 minutes (the end of the recorded window): out at the last price. A trade still open when the file ends or the recorder stopped following the coin is left out and counted, never guessed. Feed gaps are flagged.
import launchtape as lt
res = lt.backtest({"entry_s": 15, "exit_s": 180, "stop_pct": 20, "max_fill_s": 5})
print(lt.backtest_report(res))
print(res["summary"]["medianReturnPct"], len(res["trades"]))

Full days: prices and how to buy

  • One day, $10 once: any UTC day you pick (from October 4 2026): that day's gradtrades and pregrad (and its graduates CSV), the test prompt with its file names, and what the example rules returned that day: https://launchtape.io/?plan=day1#buy.
  • Starter, $10 a month: all 7 datasets, each new day's files as the UTC day closes, plus the last 7 days on file.
  • Full history, $49 a month: everything in Starter, plus every day on file back to October 3 2026.

Buy at launchtape.io: pick one day or a plan, enter your email, press Pay (USDC or SOL on Solana; your wallet opens with everything filled in). The private download link (https://launchtape.io/dl/<token>) arrives by email, and launchtape fetch reads it.

Licences

  • This package (the code): MIT, see LICENSE.
  • The data it downloads, the free samples included, has its own licence: personal and research use inside your own team. No resale, republishing or redistribution of the files, in whole or in part. Results you derive from it (charts, papers, models, strategies) are yours. Full text: launchtape.io.

The data is market data recorded from public sources, provided as is. It is not financial advice.

Metadata

Release files for launchtape 0.1.8

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for launchtape 0.1.8
File Size Uploaded Provenance
launchtape-0.1.8.tar.gz 48.7 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for launchtape 0.1.8
File Interpreter ABI Platform
launchtape-0.1.8-py3-none-any.whl Python 3 none any Details

Total release size: 94.3 kB

Release files / launchtape-0.1.8.tar.gz

Download URL launchtape-0.1.8.tar.gz
Size 48.7 kB
Tags Source
SHA-256 checksum
How to use checksums
c5562ec45fceed1604bfe1a1ad836a5b5e832fead9d6eaf13ea718b3c3d1ab6c
BLAKE2b-256 checksum
How to use checksums
75e3b3df6bee2dabfbd050c360021552221caf2369973ca95057f1fc60227fc0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.4

Release files / launchtape-0.1.8-py3-none-any.whl

Download URL launchtape-0.1.8-py3-none-any.whl
Size 45.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
5b88a1d7987a119c1626af17d892d48dbcdd5ddb5b941fa4d270a2251f987a12
BLAKE2b-256 checksum
How to use checksums
b42c101b2083ca1ffe37e2fca38ebb49efc3f7e9af28320b64feece877c14507
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.4

Security for launchtape 0.1.8

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page