Veilbound Launchpad API
List, chart and trade every coin launched on Veilbound Launchpad from your own platform. No key, no sign-up.
Base URL: https://launch.veilbound.gg/api/public/v1
Responses are JSON. CORS is open, so it works from a browser. An error is { "error": "…" } with a 4xx status.
Limits per address, per minute: 240 reads, 90 quotes, 30 transaction builds. Over the limit you get a 429; wait 20 seconds.
What a coin here is
- A coin with 6 decimals and a fixed supply of 1,000,000,000, made on pump.fun. Mint and freeze authority are revoked.
token.programon each coin says which token program it uses. - It starts on a pump.fun bonding curve paired with $VEIL (or SOL), at about a $5,000 market cap, with no seed. When the curve fills it moves to its PumpSwap pool on its own;
pool.curve.statussays where it is. - It has no transfer tax (
tax.bpsis 0). What it earns is pump.fun's creator fee, set and locked at launch: 5% of it goes to the $VEIL flywheel (buys back and burns the top VEIL pairs), the rest to the launcher, a game's bankroll, or the coin's holders. - Its liquidity is the curve, then a PumpSwap pool. Nobody can withdraw it.
Quick start
1. List the coins
const api = 'https://launch.veilbound.gg/api/public/v1';
const { pairs } = await (await fetch(`${api}/pairs?sort=marketCap&limit=50`)).json();
for (const p of pairs) console.log(p.symbol, p.market.priceUsd, p.market.marketCapUsd, p.quote.symbol);
2. Price a trade
// buy with 0.5 SOL
const q = await (await fetch(`${api}/quote?mint=${mint}&side=buy&amount=0.5¤cy=SOL&slippageBps=300`)).json();
console.log(q.receive.amount, q.receive.minimum, q.priceImpactPct);
3. Build, sign, send
const r = await (await fetch(`${api}/swap`, { method: 'POST', headers: { 'content-type': 'application/json' },
body: JSON.stringify({ wallet: wallet.publicKey.toBase58(), mint, side: 'buy', amount: 0.5, currency: 'SOL', slippageBps: 300 }) })).json();
const tx = VersionedTransaction.deserialize(Buffer.from(r.transaction, 'base64'));
const signed = await wallet.signTransaction(tx);
const signature = await connection.sendRawTransaction(signed.serialize());
// optional: show it on the Veilbound Launchpad tape at once
await fetch(`${api}/trades/notify`, { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ signature }) });
The transaction is unsigned and built for the wallet you name. Nothing is held for you: you sign it and send it through your own RPC. It expires with its blockhash, about a minute after it is built.
Endpoints
| Endpoint | What it returns |
|---|---|
GET /pairs | Every coin launched here, with its market. Query: quote (symbol or mint), board (mainland (Veilbound), tutorial-island (the Rift), graveyard), sort (marketCap, newest, volume, holders, liquidity, change), limit (up to 200), offset. |
GET /pairs/{mint} | One coin, plus its safety checks, the dev's position and the top holders. |
GET /pairs/{mint}/trades | Its swaps, newest first. Query: limit (up to 200), before (unix seconds; pass the previous page's next). |
GET /pairs/{mint}/candles | OHLCV in the pair token. Query: interval (1m 5m 15m 1h 4h 1d), limit (up to 1000). |
GET /board | Everything on the board: VEIL itself, the coins launched here and any other coin trading against VEIL. |
GET /quote | The price of a trade. Query: mint, side, amount, currency, slippageBps. |
POST /swap | The unsigned transaction for that trade. JSON body: wallet, mint, side, amount, currency, slippageBps. |
POST /trades/notify | JSON body: signature. Indexes a swap you just sent. |
GET /launchpad | How coins launch here: pair tokens, the pump.fun curve, creator-fee options and games. |
GET /creators/{wallet} | A launcher's record: every coin they launched and what became of it. |
Trading
| Field | Meaning |
|---|---|
side | buy or sell. |
amount | For a buy: how much of the currency to spend. For a sell: how many coins to sell. |
currency | What a buy is paid with, or what a sell pays out: SOL, VEIL, or PAIR (the coin's own pair token). Default: SOL for a buy, PAIR for a sell. |
slippageBps | 10 to 3000. Default 100 (1%). Below receive.minimum the transaction fails and nothing is spent. |
The answer names the route. jupiter means the trade goes through the Jupiter aggregator, which reaches the pump.fun curve and, after graduation, the PumpSwap pool. pool means it goes straight into the coin's own curve, which is used until Jupiter has indexed a brand-new coin. In those first minutes, pay with PAIR.
What a trade costs
- Site fee: a buy carries the fee shown as
feeBps(1%), taken from what is paid, inside the same transaction: half is platform revenue, half (gpBurnBps, kept under its historical name) buys VEIL and burns it. A coin still on a curve pays its fee inside the curve plus the VEIL burn. A sell carries none. VEIL burned so far:GET /api/eco/gpburn. - pump.fun's fees: the curve's (and later PumpSwap's) own trading fee, plus the coin's creator fee. Both are already inside
receive.amount.
// GET /quote?mint=…&side=buy&amount=0.5¤cy=SOL
{
"side": "buy", "mint": "…", "symbol": "COMBO",
"pay": { "symbol": "SOL", "mint": "So111…", "amount": 0.1 },
"receive": { "symbol": "COMBO", "mint": "…", "amount": 2138149.28, "minimum": 2116767.79 },
"priceImpactPct": 0.29, "feeBps": 100, "gpBurnBps": 50, "slippageBps": 100,
"route": "jupiter", "via": ["Pump.fun Amm", "Pump.fun"]
}
// POST /swap returns the same fields plus:
// "transaction": "<base64 unsigned versioned transaction>", "lastValidBlockHeight": 123456789
Game payouts
A coin launched with a game keeps its game's share of the pump.fun creator fee in a bankroll the site holds for that coin. Pump.fun locks that share when the coin launches. Sack payouts, drops, the hoard burn, the boss raid and the throne run on their own. With the Game server game, your own server pays the winners through this API. Every payout is listed on the coin's page with its transaction.
| Endpoint | What it does |
|---|---|
GET /api/games/{mint} | The coin's game: its rules, what the bankroll holds, the live state (sack fill, next drop, boss HP and damage board, the hour's throne leader), and the last 30 moves with their transactions. |
POST /api/games/payout | Pays a player from the bankroll. Header: x-game-key. JSON body: mint, wallet, amount (in VEIL), ref (your own id for this payout), and an optional memo. |
The launcher makes the game key on the coin's page and can replace it at any time. The site keeps only its hash. Each ref is paid only once: sending the same ref again returns the first answer. One payout can be at most the coin's maxPct of the bankroll (10% by default), a day's payouts at most dayPct (50% by default), and a coin can make 500 payouts a day. The launcher's own wallet is never paid.
// POST /api/games/payout x-game-key: vgk_…
{ "mint": "…", "wallet": "…", "amount": 2500, "ref": "match-88121" }
// → { "status": "done", "amount": 2500, "to": "…", "sig": "…", "ref": "match-88121", "at": "2026-10-31T15:02:11.000Z" }
A coin, field by field
{
"mint": "…", "symbol": "COMBO", "name": "Combo Meter", "description": "…",
"image": "https://launch.veilbound.gg/launch/….png", "page": "https://launch.veilbound.gg/ecosystem/combo",
"links": { "website": "https://veilbound.gg", "twitter": "https://x.com/veilboundgg", "telegram": null },
"createdAt": 1793474811088, "liveAt": 1793474838179, "tradingOpensAt": null, "status": "live",
"board": "tutorial-island", "kingOfTheHill": false, "venue": "pump-fun",
"launch": { "type": "pump-fun-curve", "startMarketCapUsd": 5000, "seed": null, "santaBurnedAtLaunch": 0 },
"token": { "decimals": 6, "supply": 1000000000, "program": "token-2022", "mintAuthority": null, "freezeAuthority": null },
"quote": { "mint": "GSp4q…pump", "symbol": "VEIL", "decimals": 6, "issuerNote": null },
"pool": { "address": "…", "dex": "pump-fun", "curvePool": "…", "liquidity": "bonding curve", "feesCompound": false,
"swapFeeBps": null, "openingFee": null, "secondPool": null, "curve": { "status": "trading" } },
"tax": { "bps": 0, "mode": "none", "rateLocked": true, "santaBought": 0, "santaBurned": 0,
"santaPaidToHolders": 0, "holderPayouts": 0, "coinsBoughtBackAndBurned": 0 },
"market": { "priceUsd": 0.00000417, "priceQuote": 0.00478, "priceSanta": 0.00478, "marketCapUsd": 4168,
"liquidityUsd": 1681, "volume24hUsd": 13160, "change24hPct": 46.9, "holders": 21, "trades": 321, "lastTradeAt": 1793484979000 },
"dev": { "wallet": "…", "allocationPct": 0, "soldPct": 0, "lockedUntil": null, "holdsPct": 1.76, "lockedPct": 0, "buy": null },
"flags": { "snipedPct": 57.8, "bundledPct": 0 }
}
GET /pairs/{mint} adds:
| Field | Meaning |
|---|---|
safety | Read from the chain: mintRevoked, freezeRevoked, metadataFrozen, liquidityLocked, liquidityBurned, taxRateLocked. |
dev | Also holdsPct, lockedPct and the launch buy. |
holders | count and the top ten, the pool labelled. |
pool.curve | status: trading on the pump.fun curve, sold out, moving to PumpSwap once it has filled, graduated once it trades in its PumpSwap pool (then pool.dex is pumpswap). pool.openingFee and tax stay in the payload for older coins and are empty (null / 0) on pump.fun coins. |
Times are unix: milliseconds on coins (createdAt, liveAt), seconds on trades and candles. Prices in market can be null for a coin that has not traded yet.
