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.

Base URL /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

GET/rules

The 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

GET/coins

Coins launched on Vitro, newest first.

sortnew (default), top for the biggest market cap first, or vamps for vamps only.
limit1 to 100. The default is 50. Lists look back over the newest 500 launches.
GET/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

GET/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

GET/tributes

Every 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.

addressThe token's contract address on BNB Chain. Every Vitro coin's ends in 7777, Flap's mark for tax tokens.
name, symbol, description, imageAs launched. image is a URL.
linksx, telegram and website, each a URL or null.
roleoriginal or vamp.
familyThe original's address. For an original, its own address.
vaultThe coin's Split Vault, where its trade tax collects for its creator and the pad.
creatorThe wallet that launched it.
launchedAt, launchTxWhen it launched, and the launch transaction's hash (null if the pad picked it up without one).
marketCapUsd, marketCapBnbAs of the pad's last look, at most about five minutes old. Null for a coin the pad hasn't priced yet.
curveProgress, graduatedHow full Flap's curve is, 0 to 1, and whether the coin has moved to PancakeSwap.
lastTradeAt, deadA coin is dead after 72 hours without a trade, which frees its slot in the family.
tributeFor a vamp: bnb it paid, tokensBurned of the original, the burnTx, and the reason it counts as a vamp. Null for an original.
urlThe 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.

  1. Check it. POST /api/check with 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) or full.
  2. Build it. POST /api/build with verdict (that id), launcher and an optional firstBuyBnb. An original gets stage: "launch" and one transaction. A vamp first gets stage: "tribute": a buy of the original and a burn of what it bought.
  3. 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, and getRecipientsInfo() 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.

ReadingNo limit beyond the five-second cache. Please don't poll faster than that.
Checks20 an hour from one address.
Builds12 an hour from one address, and 5 per check.