Build on Vitro
Every coin, family and tribute on the pad, as JSON. There's no key to get and no sign-up. It works from a server, a script or a browser on any site.
/api/v1
const res = await fetch('/api/v1/coins?sort=top&limit=10');
const { coins } = await res.json();
for (const c of coins) console.log(c.symbol, c.role, c.marketCapUsd);
Responses are cached for five seconds at the edge, so polling faster than that returns the same answer. Times are ISO 8601 in UTC, BNB amounts are in BNB (not wei), token amounts are whole tokens, and addresses are lowercase.
Rules and addresses
/rulesThe rules the pad enforces and the addresses to check its work against: Flap's Portal and VaultPortal, the Split Vault factory every coin's tax goes through, and the pad wallet that receives Vitro's half. launchesOpen is false until launch day.
Coins
/coinsCoins launched on Vitro, newest first.
| sort | new (default), top for the biggest market cap first, or vamps for vamps only. |
|---|---|
| limit | 1 to 100. The default is 50. Lists look back over the newest 500 launches. |
/coins/{address}One coin, plus every coin in its family, biggest first. A coin that isn't on Vitro returns 404, even if it is on Flap.
Families
/families/{family}An original and its vamps, biggest first. A family's address is its original's address. live counts the coins still trading; a family holds at most maxLive.
Tributes
/tributesEvery vamp's tribute, newest first: which coin paid which, the BNB spent buying the original, how many of the original's tokens it burned, and the burn transaction. Takes limit like /coins.
The coin object
Every list returns coins in this shape. New fields may be added; the ones here won't be renamed or removed in v1.
| address | The token's contract address on BNB Chain. Every Vitro coin's ends in 7777, Flap's mark for tax tokens. |
|---|---|
| name, symbol, description, image | As launched. image is a URL. |
| links | x, telegram and website, each a URL or null. |
| role | original or vamp. |
| family | The original's address. For an original, its own address. |
| vault | The coin's Split Vault, where its trade tax collects for its creator and the pad. |
| creator | The wallet that launched it. |
| launchedAt, launchTx | When it launched, and the launch transaction's hash (null if the pad picked it up without one). |
| marketCapUsd, marketCapBnb | As of the pad's last look, at most about five minutes old. Null for a coin the pad hasn't priced yet. |
| curveProgress, graduated | How full Flap's curve is, 0 to 1, and whether the coin has moved to PancakeSwap. |
| lastTradeAt, dead | A coin is dead after 72 hours without a trade, which frees its slot in the family. |
| tribute | For a vamp: bnb it paid, tokensBurned of the original, the burnTx, and the reason it counts as a vamp. Null for an original. |
| url | The coin's page on Vitro. |
Launching from code
The pad builds transactions as { to, data, value }; your wallet sends them; you report each burn and launch by its hash and the pad checks it on-chain. Vitro never holds keys or funds. These endpoints take POST with a JSON body, and are meant for servers and scripts, not other sites' browsers.
- Check it.
POST /api/checkwith name, symbol, description, optional x, telegram and website links, image as a data URL (PNG, JPEG, WebP or GIF, under 4 MB), and your launcher address. You get back an id and a kind:original,vamp(with the original it copies) orfull. - Build it.
POST /api/buildwith verdict (that id), launcher and an optional firstBuyBnb. An original getsstage: "launch"and one transaction. A vamp first getsstage: "tribute": a buy of the original and a burn of what it bought. - Send, in order, and report. Send each transaction from the launcher's wallet and wait for it to confirm. Report a burn with
POST /api/send{ hash, kind: "burn", verdict }, then build again to get the launch. Report the launch with { hash, kind: "launch", mint } and the coin is on the pad.
// viem, with a wallet client for the launcher on BNB Smart Chain (chain id 56)
const pad = (path, body) => fetch(path, {
method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify(body),
}).then(async r => { const j = await r.json(); if (!r.ok) throw Object.assign(new Error(j.error), j); return j; });
const send = async t => {
const hash = await wallet.sendTransaction({ to: t.to, data: t.data, value: BigInt(t.value) });
await client.waitForTransactionReceipt({ hash });
return hash;
};
const launcher = wallet.account.address;
const verdict = await pad('/api/check', { name, symbol, description, image, launcher });
if (verdict.kind === 'full') throw new Error('That family is full.');
let built = await pad('/api/build', { verdict: verdict.id, launcher, firstBuyBnb: 0.05 });
if (built.stage === 'tribute') {
for (const t of built.txs) {
const hash = await send(t);
if (t.kind === 'burn') await pad('/api/send', { hash, kind: 'burn', verdict: verdict.id });
}
built = await pad('/api/build', { verdict: verdict.id, launcher, firstBuyBnb: 0.05 });
}
const hash = await send(built.txs[0]);
const { coin } = await pad('/api/send', { hash, kind: 'launch', mint: built.mint });
The check that counts happens at build. Two people can check the same idea at the same moment and both be told it's an original. Build decides one launch at a time against every coin that has landed and every launch being sent right now, and holds the winner's address for fifteen minutes. A launch that lands after that isn't added.
Launches are closed until launch day. Until launchesOpen is true, check and build return 403.
Checking it on-chain
You don't have to take the API's word for any of this.
- Every Vitro coin is a Flap tax token made through Flap's VaultPortal.
VaultPortal.tryGetVault(coin)returns its vault, made by the Split Vault factory in/rules, andgetRecipientsInfo()on that vault shows the creator and the pad wallet at 5000 basis points each. - A vamp's tribute is two transactions from the vamp's creator: a buy of the original, then a transfer of at least the bought amount to
0x000000000000000000000000000000000000dEaD. The burnTx is the second. - The pad only lists a coin whose name, ticker, metadata, tax and vault match what it built. Anyone can launch on Flap; only those coins are Vitro coins.
Errors and limits
Errors come back as { "error": "…" } with a status that says what kind: 400 for a bad request, 403 while launches are closed, 404 for something that isn't on Vitro, 409 when the pad changed under you, 429 for too many requests, and 503 when the vamp check is busy.
| Reading | No limit beyond the five-second cache. Please don't poll faster than that. |
|---|---|
| Checks | 20 an hour from one address. |
| Builds | 12 an hour from one address, and 5 per check. |