

Read pairs, pricing and live launches, then build the exact launch transaction this site signs — unsigned, for your keys only.
StonkSpawn reads every StonkFun market and builds launch transactions for your own keys. Read endpoints are public JSON. The launch endpoint returns an unsigned transaction — the server never creates, sees or holds a private key.
Launching something bigger? Talk to us about custom launches
Paths are relative to the site you are viewing. Every response is JSON in one envelope: { data } on success, { error: { code, message } } with a 4xx/5xx status on failure. Values that could not be read are null — never treat a missing number as zero.
const res = await fetch('https://stonkspawn.xyz/api/v1/launches?limit=10')
const body = await res.json()
if (!res.ok) throw new Error(body.error.message)
console.log(body.data.launches)GET endpoints send Access-Control-Allow-Origin: *, so they work from a browser on any domain. Nothing here needs an API key.
/api/v1/configRead this before you offer a launch button. launchEnabled is false when this site or StonkFun has launches paused, with the reason in launchDisabledReason. feeSol is the flat launch fee included in every built transaction (0 = none).
{
"data": {
"launchEnabled": true,
"launchDisabledReason": null,
"network": "mainnet-beta",
"venue": "StonkFun · Raydium LaunchLab",
"program": "LanMV9sAd7wArD4vJFi2qDdfnVhFxYSUg6eADduJ3uj",
"feeSol": 0,
"treasury": null
}
}/api/v1/pairsThe quote assets a StonkFun LaunchLab token can launch against — tokenized stocks, majors, currencies and memes. Filter with ?category=xstock (also solana, backpack, prestock, currency, custom).
{
"data": {
"count": 526,
"pairs": [{
"mint": "Xsc9qvGR1efVDFGLrVsmkzv3qi45LTBjeUKSPmx9qEh",
"symbol": "NVDAX",
"name": "NVIDIA",
"decimals": 8,
"category": "xstock",
"categoryLabel": "xStock",
"tokenProgram": "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb",
"logoUrl": "https://www.stonkfun.xyz/api/asset/quote-logo/…"
}]
}
}/api/v1/pricing?quote=<mint>What a launch on this quote must look like: the raise, start and graduation market cap in USD, the LaunchLab config, virtual reserves and the current quote price. The build endpoint reads this for you; use it to show a preview.
curl -s 'https://stonkspawn.xyz/api/v1/pricing?quote=Xsc9qvGR1efVDFGLrVsmkzv3qi45LTBjeUKSPmx9qEh'/api/v1/launches?limit=25The newest StonkFun launches (up to 100), newest first. Each row carries its pool read from the chain: progress along the bonding curve (0–1), graduated, and marketCapUsd — the launch’s opening USD market cap times the price move since, so it is an estimate in the launch’s own USD basis.
{
"data": {
"count": 1,
"launches": [{
"mint": "FqGueyKf19nC5ZW6i2kGFkoLAYUAdTb79Syu9XNH2kDo",
"pool": "ApsLnvX3qumkZKFbheDBG9S4fcP2t61HCqosBqAhsnyc",
"name": "Super Intelligence",
"symbol": "SI",
"quote": { "mint": "Xsc9qvGR1efVDFGLrVsmkzv3qi45LTBjeUKSPmx9qEh", "symbol": "NVDAX" },
"createdAt": "2026-09-22T20:00:41.000Z",
"startMarketCapUsd": 3306.38,
"marketCapUsd": 4120.51,
"priceUsd": 0.0000041,
"progress": 0.084,
"graduated": false
}]
}
}/api/v1/marketsThe StonkFun markets worth looking at, already filtered and ranked. Copy-paste spam is folded into one entry. Each market carries a proprietary heat score — higher means more is happening right now. Sort by it, filter on category, and you have our scanner in your own code.
| Field | Type | Notes |
|---|---|---|
universe | number | Total coins StonkFun lists. |
markets[].heat | number | Proprietary score. Compare within one response only; the scale can change. |
markets[].category | string | Quote category: xstock, custom, solana, leverage… |
markets[].volume24hUsd | number | null | 24 h traded volume, USD. |
markets[].progress | number | null | Bonding-curve progress, 0–1. 1 once graduated. |
/api/v1/trending?window=24StonkFun coins ranked by 24 h USD volume. top is the #1 coin launched inside the window (1–168 hours) that has an image; ranked is the full list.
/api/v1/token/<mint>The token’s LaunchLab pool, found and decoded on chain: creator, quote mint, curve progress, price in the quote and in USD, raised so far, and the raw account (account, base64) if you want to decode it yourself.
curl -s 'https://stonkspawn.xyz/api/v1/token/FqGueyKf19nC5ZW6i2kGFkoLAYUAdTb79Syu9XNH2kDo'/api/v1/token/<mint>/metaName, symbol, image and every link the creator filled in — X, Telegram, Discord, website, and more — typed by platform. Read from the mint's on-chain metadata; when the creator's host is down, StonkFun's own copy is used.
{ "data": { "mint": "…", "name": "…", "symbol": "…", "image": "https://…",
"links": [ { "kind": "x", "url": "https://x.com/…", "field": "twitter" } ], "resolved": true } }/api/v1/candles/<mint>?interval=60OHLCV in USD, built from the coin's own on-chain trades. interval is in seconds: 1, 3, 5, 15, 30, 60, 300, 900, 3600, 14400, 86400.
/api/v1/token/<mint>/holdersThe top 100 holders by balance with amount, share of supply and USD value, plus the total holder count. Pool vaults are tagged, so the curve never shows up as a whale.
/api/v1/token/<mint>/burnedHow much of a coin is gone for good, whoever burned it: the supply minted at launch (read from the create transaction) minus the supply on chain now, plus anything sent to the Solana incinerator. burnedTokens is null when the launch supply could not be read — never 0. Fresh every 60 s.
/api/v1/metadataMultipart form with file (image, under 4 MB) and name, symbol, optional description, twitter, telegram, website. Returns the IPFS metadataUri you pass to the build endpoint as uri.
curl -s -X POST 'https://stonkspawn.xyz/api/v1/metadata' \
-F file=@logo.png -F name='Nvidia Cat' -F symbol=NCAT \
-F description='The cat that pairs with NVDAX'/api/v1/launch/buildReturns the unsigned launch transaction, built by the same code this site uses: compute budget → optional launch fee → initialize_with_token_2022 → your optional dev buy in the same transaction. It is dry-run on mainnet with signature checks off, and the result comes back as simulation.
The server never generates or holds a key. You create the mint keypair yourself, send only its public key as mint, and sign the transaction with both: your mint keypair, then your wallet (creator, the fee payer).
| Field | Type | Notes |
|---|---|---|
creator | pubkey | Your wallet: pays, signs and receives the dev buy. The pool's on-chain creator is the Vault (returned as poolCreator), so StonkFun's 0.5% creator share of standard-mode volume funds the flywheel. |
mint | pubkey | Public key of a keypair you generated. Required. |
name | string | ≤ 32 characters. |
symbol | string | ≤ 10 characters, no spaces. Upper-cased. |
uri | url | The metadataUri from /api/v1/metadata. |
quoteMint | pubkey | A mint from /api/v1/pairs. |
rewardBps | number | Optional reflections. 0 = standard (creator share to the Vault), or 100 / 300 = a 1% / 3% Token-2022 transfer fee paid to holders. Any other value is rejected on chain. |
devBuyUsd | number | Optional. Paid in the quote asset — the creator must already hold it (SOL is wrapped for you). |
{
"data": {
"transaction": "AgAAAAAAAAAA…", // base64, legacy Transaction
"encoding": "base64",
"format": "legacy",
"signers": ["<mint>", "<creator>"],
"mint": "<mint>",
"pool": "<the pool this launch creates>",
"recentBlockhash": "8jwL7VL8…",
"lastValidBlockHeight": 427522090,
"devBuy": { "quoteRaw": "8460228", "quoteSymbol": "SOL", "tokens": 302507.46 },
"simulation": { "ok": true, "err": null, "unitsConsumed": 190797, "logs": ["…"] }
}
}The blockhash expires in about a minute — build right before you sign. Never send a transaction whose simulation.ok is false.
With @solana/web3.js and any wallet that can sign a transaction. Everything below runs on your side; only public keys cross the wire.
import { Connection, Keypair, Transaction } from '@solana/web3.js'
const API = 'https://stonkspawn.xyz'
const conn = new Connection('https://api.mainnet-beta.solana.com', 'confirmed')
// 0 · check availability
const { data: cfg } = await (await fetch(`${API}/api/v1/config`)).json()
if (!cfg.launchEnabled) throw new Error(cfg.launchDisabledReason)
// 1 · your mint keypair — generated here, never sent
const mint = Keypair.generate()
// 2 · metadata → IPFS
const form = new FormData()
form.append('file', imageBlob, 'logo.png')
form.append('name', 'Nvidia Cat'); form.append('symbol', 'NCAT')
const { data: meta } = await (await fetch(`${API}/api/v1/metadata`, { method: 'POST', body: form })).json()
// 3 · build the unsigned launch
const res = await fetch(`${API}/api/v1/launch/build`, {
method: 'POST', headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
creator: wallet.publicKey.toBase58(), mint: mint.publicKey.toBase58(),
name: 'Nvidia Cat', symbol: 'NCAT', uri: meta.metadataUri,
quoteMint: 'Xsc9qvGR1efVDFGLrVsmkzv3qi45LTBjeUKSPmx9qEh', devBuyUsd: 0,
}),
})
const { data, error } = await res.json()
if (error) throw new Error(error.message)
if (!data.simulation?.ok) throw new Error('the chain would reject this launch')
// 4 · sign twice: the mint keypair, then the creator wallet — and send
const tx = Transaction.from(Buffer.from(data.transaction, 'base64'))
tx.partialSign(mint)
const signed = await wallet.signTransaction(tx)
const sig = await conn.sendRawTransaction(signed.serialize())
await conn.confirmTransaction({ signature: sig, blockhash: data.recentBlockhash, lastValidBlockHeight: data.lastValidBlockHeight })
console.log('live:', data.mint)This is StonkSpawn’s own endpoint reference. For StonkFun’s upstream API see stonkfun.xyz .
| Status | code | Meaning |
|---|---|---|
| 400 | bad_request | A parameter is missing or malformed. The message names it. |
| 400 | mint_required | The build endpoint needs your own mint public key. |
| 404 | not_found | No LaunchLab pool for that mint (graduated, or not a StonkFun token). |
| 502 | upstream_unavailable | StonkFun or the pinning service did not answer. Retry with backoff. |
| 502 | rpc_unavailable | The Solana RPC did not answer. Retry with backoff. |
Responses carry Cache-Control with an s-maxage per endpoint (pairs 10 min, pricing 30 s, launches 10 s, token 4 s). Polling faster than that returns the same data — please don’t.
No key, no signup. Keep it under 60 requests per minute per IP on read endpoints and 10 per minute on /launch/build and /metadata. Responses are cached at the edge; the s-maxage on each response is the fastest the data changes.
| Endpoint | Fresh every |
|---|---|
/pairs | 10 min |
/pricing | 30 s |
/markets · /launches | 10–20 s |
/trending | 60 s |
/token · /candles | 4 s |
Need more throughput for a product of your own? Get in touch.
One address for support and business: stonkspawn@emaxhq.com.