Lunar Shadow Labs

New tokens on Raydium LaunchLab, streamed

Raydium LaunchLab is the bonding-curve program that launchpads such as bonk.fun and StonkFun run on. Our feed decodes every LaunchLab launch, trade and migration, whichever launchpad it came through, and tells you which platform configuration it used.

Market data only. New tokens are high risk; this data says what happened on chain, not what to buy.

Subscribe

import asyncio, json, os, websockets   # pip install websockets

URL = "wss://feed.lunarshadowlabs.com/ws?venues=launchlab&kinds=launch,migration"
HEADERS = {"Authorization": f"Bearer {os.environ['LSL_KEY']}"}

async def main():
    async with websockets.connect(URL, additional_headers=HEADERS, max_size=None) as ws:
        async for raw in ws:
            m = json.loads(raw)
            if m["kind"] == "launch":
                x = m["x"]
                print("launch", m["symbol"], m["mint"], "platform", x["platform"] or x["platform_config"])
            elif m["kind"] == "migration":
                print("migrated", m["mint"], "->", m["to_venue"], m["to_pool"])

asyncio.run(main())

Add swap to kinds for every trade on the curves. For production use, add the resume and reconnect loop from the docs.

A launch

{
  "v": 1,
  "seq": 3022,
  "kind": "launch",
  "venue": "launchlab",
  "keys": [
    "Hqk8M9Bgg8sLYxkEagXpmUE76sSRU2uUAWTD5tLCTzuh",
    "So11111111111111111111111111111111111111112",
    "9xhQXEe6td4XXNhu7NnzG8mJU6zCHch9kFjM2tHZhvYV",
    "8wssXh42VWSfULRHmxB3Z7aEbsHvDmMYLSAsBjyFmb38"
  ],
  "stage": "executed",
  "source": "replay",
  "commitment": "processed",
  "slot": 453819945,
  "sig": "mzoZD2s9jzYFdq2n96Gh9wa7CKVk3jZkaRBH16jg6uYQZFsV4rRY1Lr32KeTfvYtDAcodfPDa879wTbTwERME9W",
  "ix": 2,
  "inner": 7,
  "t_ingest_us": 1791394380730128,
  "t_emit_us": 1791394380730150,
  "via": null,
  "mint": "Hqk8M9Bgg8sLYxkEagXpmUE76sSRU2uUAWTD5tLCTzuh",
  "curve": "9xhQXEe6td4XXNhu7NnzG8mJU6zCHch9kFjM2tHZhvYV",
  "creator": "8wssXh42VWSfULRHmxB3Z7aEbsHvDmMYLSAsBjyFmb38",
  "user": "8wssXh42VWSfULRHmxB3Z7aEbsHvDmMYLSAsBjyFmb38",
  "name": "Higgspad",
  "symbol": "HIGGS",
  "uri": "https://files.catbox.moe/nzjeta.json",
  "quote_mint": "So11111111111111111111111111111111111111112",
  "token_program": null,
  "base_flags": null,
  "quote_flags": null,
  "x": {
    "decimals": "6",
    "platform_config": "CF4FZ21wdRZ1tnK2Tef3ddq65CEm6ehUWAamzdtTVuUP",
    "platform": "higgspad"
  }
}

Decoded by our feed from a recorded mainnet transaction (replayed, so source reads replay; live events say geyser).

A trade on the curve

{
  "v": 1,
  "seq": 13647,
  "kind": "swap",
  "venue": "launchlab",
  "keys": [
    "AZNW9Lgv9xAgYoRJVYiFXJAAsj3Gk8gJEnW4P1siWiwW",
    "6GmAFSYs4gk3FDao5FzzySQpPZaWsa4rUJHacpMpUNgx",
    "3zQoY91mfz9cDKUEWN876Rndedh5GGfgggt2vSSFqCJD",
    "5jmdAzA9kGrkVjppTh1ye2goFGUtF9Gpi2CbfrdkB5pY"
  ],
  "stage": "executed",
  "source": "geyser",
  "commitment": "processed",
  "slot": 454291681,
  "sig": "4pXstqFZ8S6Z5hC2u5PEMmfxgfy6WZzjrWa3VrK9STFz15NQneM5Fx9RV6pfZPhfGa9GY5nY1kFPyodx4WzJ4PcZ",
  "ix": 1,
  "inner": 1,
  "t_ingest_us": 1791394580295474,
  "t_emit_us": 1791394580295506,
  "via": "FLASHX8DrLbgeR8FcfNV1F5krxYcYMUdBkrP1EPBtxB9",
  "pool": "3zQoY91mfz9cDKUEWN876Rndedh5GGfgggt2vSSFqCJD",
  "user": "5jmdAzA9kGrkVjppTh1ye2goFGUtF9Gpi2CbfrdkB5pY",
  "base_mint": "AZNW9Lgv9xAgYoRJVYiFXJAAsj3Gk8gJEnW4P1siWiwW",
  "quote_mint": "6GmAFSYs4gk3FDao5FzzySQpPZaWsa4rUJHacpMpUNgx",
  "is_buy": false,
  "base_amount": "4076863737044",
  "quote_amount": "140776131430",
  "base_decimals": 6,
  "quote_decimals": 9,
  "price": 3.453049709531674e-05,
  "fees": {
    "protocol": "356395270",
    "platform": "1425581078",
    "creator": "0",
    "share": "0"
  },
  "partial": false,
  "derived": false,
  "base_flags": {
    "program": "token2022",
    "decimals": 6,
    "supply": "1000000000000000",
    "mint_authority": null,
    "freeze_authority": null,
    "transfer_fee": {
      "older": {
        "bps": 100,
        "max": "1000000000000000",
        "epoch": 1051
      },
      "newer": {
        "bps": 100,
        "max": "1000000000000000",
        "epoch": 1051
      },
      "authority": "WLHv2UAZm6z4KyaaELi5pjdbJh6RESMva1Rnn8pJVVh"
    },
    "metadata_pointer": "AZNW9Lgv9xAgYoRJVYiFXJAAsj3Gk8gJEnW4P1siWiwW",
    "extensions": [
      18,
      1,
      19
    ]
  },
  "quote_flags": null,
  "x": {
    "pool_status": "fund",
    "exact_in": true,
    "virtual_base": "1073025605595363",
    "virtual_quote": "20467833611843",
    "real_base_after": "278468406615805",
    "real_quote_after": "7173360231466",
    "platform_config": "6BwHHDg3u1854jC8PDLXvR4spTcLNaoBxLJNGC4nTESt",
    "platform": "stonkfun"
  }
}

Captured from our live feed on 2026-10-07.

Graduation

When a LaunchLab curve fills, the token migrates to raydium_cpmm or raydium_v4, and you receive a migration message with the new pool. See migration events for its fields.

Try the feed

One WebSocket, 12 Solana venues, one flat price.

Start free trial Read the docs

3-day free trial, then $49/month per license plus applicable tax, charged automatically every month until you cancel. Cancel online any time before the trial ends and you pay nothing. Starting a trial means you agree to the Terms. Market data only, no signals or advice.

← All guides