Valhalla API
List, chart and trade every coin launched on Valhalla from your own platform. No key, no sign-up.
Base URL: https://launchvalhalla.fun/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 Token-2022 coin with 6 decimals and a fixed supply of 1,000,000,000. Mint and freeze authority are revoked.
- It trades in one Meteora DAMM v2 pool against its pair token: SANTA, GP, GLDX, or another listed coin.
- Its liquidity is burned or permanently locked. Nobody can withdraw it.
- It carries a transfer tax of 1% to 10%. The tax buys SANTA, which is burned, paid to the coin's holders, or (on SANTA pairs) used to buy the coin back and burn it.
- It launches as a curve (no seed, starts at a $5,000 market cap) or as a seeded pool.
Quick start
1. List the coins
const api = 'https://launchvalhalla.fun/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 Valhalla 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, tutorial-island, 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 Grand Exchange board: SANTA, GP, listed coins and the Grand Exchange top 10, as well as the coins launched here. |
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, launch types, tax range, liquidity options. |
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, SANTA, GP, GLDX, 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. pool means it goes straight into the coin's own pool, which is used while a coin's opening fee is still falling and until Jupiter has indexed a new pool. 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 buys SANTA, half (gpBurnBps) buys GP and burns it. A coin still on a curve pays its fee inside the curve plus the GP burn. A sell carries none. GP burned so far:GET /api/eco/gpburn. - Pool fee: 2% of every swap. A coin launched with the opening fee starts at 35% and falls to 2% over its first 8 minutes;
pool.openingFee.nowBpson the coin tells you where it is. - The coin's tax:
tax.bpsof every transfer of the coin.receive.amountis already net of it.
// GET /quote?mint=…&side=buy&amount=0.5¤cy=SOL
{
"side": "buy", "mint": "…", "symbol": "RS4",
"pay": { "symbol": "SOL", "mint": "So111…", "amount": 0.5 },
"receive": { "symbol": "RS4", "mint": "…", "amount": 2841120.5, "minimum": 2755886.9 },
"priceImpactPct": 1.9, "feeBps": 50, "slippageBps": 300,
"route": "jupiter", "via": ["Meteora DLMM", "Meteora DAMM v2"]
}
// POST /swap returns the same fields plus:
// "transaction": "<base64 unsigned versioned transaction>", "lastValidBlockHeight": 123456789
A coin, field by field
{
"mint": "…", "symbol": "RS4", "name": "Runescape 4", "description": "…",
"image": "https://launchvalhalla.fun/launch/….png", "page": "https://launchvalhalla.fun/ecosystem/rs4",
"links": { "website": "…", "twitter": null, "telegram": null },
"createdAt": 1791069094867, "liveAt": 1791069110467, "tradingOpensAt": null, "status": "live",
"board": "mainland", "kingOfTheHill": true,
"launch": { "type": "seeded", "startMarketCapUsd": null, "seed": 10000000, "santaBurnedAtLaunch": 500000 },
"token": { "decimals": 6, "supply": 1000000000, "program": "token-2022", "mintAuthority": null, "freezeAuthority": null },
"quote": { "mint": "3c7mm…", "symbol": "SANTA", "decimals": 6, "issuerNote": null },
"pool": { "address": "…", "dex": "meteora-damm-v2", "liquidity": "locked", "feesCompound": false,
"swapFeeBps": 200, "openingFee": { "startBps": 3500, "endBps": 200, "seconds": 480 }, "secondPool": null },
"tax": { "bps": 500, "mode": "buyback", "rateLocked": false, "santaBought": 130829, "santaBurned": 0,
"santaPaidToHolders": 0, "holderPayouts": 0, "coinsBoughtBackAndBurned": 2461732 },
"market": { "priceUsd": 0.0000194, "priceQuote": 0.0406, "priceSanta": 0.0406, "marketCapUsd": 19448,
"liquidityUsd": 18534, "volume24hUsd": 5917, "change24hPct": 337, "holders": 68, "trades": 159, "lastTradeAt": 1791080270 },
"dev": { "wallet": "…", "allocationPct": 6.94, "soldPct": 0, "lockedUntil": null },
"flags": { "snipedPct": 10.98, "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.openingFee | Also nowBps and secondsLeft while it is still falling. |
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.