Create Token
POST https://api.shrine.trade/bnb/api/create-token
Builds the Flap launch transaction for you: metadata pinned through Flap's IPFS gateway, the vanity address Flap requires, the tax setup if you want one, and - if you want one - a dev buy in the same transaction. You sign and send it; the token and its bonding curve exist as soon as it confirms.
shrine.trade takes no fee on creation, and neither does Flap: the only cost is gas. The transaction value is your dev buy, if any.
Every launch goes on the Flap bonding curve and graduates to PancakeSwap on its own once 800M tokens are sold. Two kinds of token:
- Standard - no tax. Graduates to a PancakeSwap Infinity pool whose LP fees are paid to holders as a dividend.
- Tax token - you set a tax on buys and sells, charged on every trade. Flap's tax system decides where it goes: to you, burned, paid to holders as dividends, added to liquidity, or any mix. Graduates to PancakeSwap v2. This is what most Flap launches are.
The key never leaves your machine. It signs locally; only the signed transaction is handed to /api/send to broadcast. The key itself is never sent to shrine.trade.
Pinning happens first: Build waits for the image and metadata to finish pinning to IPFS, so the token shows up on flap.sh with its image the moment it launches.
Example
- JavaScript
- Python
const { readFileSync } = require("node:fs");
const { Wallet } = require("ethers");
// ─── your token ───────────────────────────────────────
const PRIVATE_KEY = "0xYOUR_PRIVATE_KEY";
const NAME = "Grene";
const SYMBOL = "GRENE";
const IMAGE = "./logo.png"; // image file, next to this script
const DESCRIPTION = "the greenest coin on BNB Chain";
// ─── links — all optional, "" to leave one out ────────
const TWITTER = "https://x.com/grene";
const TELEGRAM = "";
const WEBSITE = "https://grene.example";
// ─── economics ────────────────────────────────────────
const PAIR_TOKEN = "BNB"; // what the curve holds: BNB, USD1, a stock ticker like NVDAB or TSLAB, or an address
const DEV_BUY = ""; // your own opening buy, in PAIR_TOKEN. "" = none
const BUY_TAX = 0; // % of every buy. 0 on both = standard token
const SELL_TAX = 0; // % of every sell
const BENEFICIARY = ""; // where your share of the tax goes. "" = the launching wallet
// how the tax splits, % of the tax, must add up to 100:
const TO_YOU = 100; // to BENEFICIARY, in the quote asset
const BURNED = 0;
const TO_HOLDERS = 0; // as dividends, in DIVIDEND_TOKEN
const TO_LIQUIDITY = 0;
const DIVIDEND_TOKEN = "quote"; // "quote", "self", or an ERC-20 address
// ──────────────────────────────────────────────────────
async function main() {
const wallet = new Wallet(PRIVATE_KEY); // signs only; no node needed
// 1. Pin the image + metadata through Flap's IPFS gateway.
const form = new FormData();
form.append("file", new Blob([readFileSync(IMAGE)], { type: "image/png" }), "logo.png");
form.append("description", DESCRIPTION);
form.append("twitter", TWITTER);
form.append("telegram", TELEGRAM);
form.append("website", WEBSITE);
const up = await fetch("https://api.shrine.trade/bnb/api/upload-image", {
method: "POST",
body: form,
});
const uploaded = await up.json();
if (uploaded.error) throw new Error(`${uploaded.error}: ${uploaded.message}`);
console.log("metadata pinned:", uploaded.meta);
// 2. Ask shrine.trade to build the launch transaction.
const res = await fetch("https://api.shrine.trade/bnb/api/create-token", {
method: "POST",
headers: { "content-type": "application/json" },
body: JSON.stringify({
name: NAME,
symbol: SYMBOL,
meta: uploaded.meta,
pairToken: PAIR_TOKEN,
buyTaxBps: BUY_TAX * 100,
sellTaxBps: SELL_TAX * 100,
// Left out entirely when empty - the API picks sane defaults.
...(DEV_BUY ? { initialBuy: DEV_BUY } : {}),
...(BENEFICIARY ? { beneficiary: BENEFICIARY } : {}),
...(BUY_TAX || SELL_TAX ? {
marketingBps: TO_YOU * 100, deflationBps: BURNED * 100,
dividendBps: TO_HOLDERS * 100, lpBps: TO_LIQUIDITY * 100,
dividendToken: DIVIDEND_TOKEN,
} : {}),
from: wallet.address,
}),
});
const body = await res.json();
if (body.error) throw new Error(`${body.error}: ${body.message}`);
console.log("token will be", body.token, "-", body.tokenType);
// 3. Sign locally - your private key never leaves this script.
// 4. Hand each signed transaction to the API to broadcast, in order (a dev
// buy in USD1 needs an approval first). No RPC of your own needed.
let explorer;
for (const tx of body.txs) {
const signed = await wallet.signTransaction({
to: tx.to, data: tx.data, value: BigInt(tx.value), gasLimit: BigInt(tx.gas),
maxFeePerGas: BigInt(tx.maxFeePerGas), maxPriorityFeePerGas: BigInt(tx.maxPriorityFeePerGas),
nonce: tx.nonce, chainId: tx.chainId, type: 2,
});
const sent = await (await fetch("https://api.shrine.trade/bnb/api/send", {
method: "POST", headers: { "content-type": "application/json" },
body: JSON.stringify({ signedTx: signed }),
})).json();
if (sent.error) throw new Error(`${sent.error}: ${sent.message}`);
if (sent.status !== "landed") throw new Error(`${tx.description} ${sent.status}: ${sent.explorer}`);
explorer = sent.explorer;
}
// 5. The address was known before sending: Flap deploys with CREATE2.
console.log("token launched:", body.token);
console.log("tx:", explorer);
console.log("page:", "https://flap.sh/token/" + body.token);
}
main();
Save it as launch.js, put your image next to it as logo.png, then:
npm install ethers
node launch.js
import requests
from eth_account import Account
# ─── your token ───────────────────────────────────────
PRIVATE_KEY = "0xYOUR_PRIVATE_KEY"
NAME = "Grene"
SYMBOL = "GRENE"
IMAGE = "./logo.png" # image file, next to this script
DESCRIPTION = "the greenest coin on BNB Chain"
# ─── links - all optional, "" to leave one out ────────
TWITTER = "https://x.com/grene"
TELEGRAM = ""
WEBSITE = "https://grene.example"
# ─── economics ────────────────────────────────────────
PAIR_TOKEN = "BNB" # what the curve holds: BNB, USD1, a stock ticker like NVDAB or TSLAB, or an address
DEV_BUY = "" # your own opening buy, in PAIR_TOKEN. "" = none
BUY_TAX = 0 # % of every buy. 0 on both = standard token
SELL_TAX = 0 # % of every sell
BENEFICIARY = "" # where your share of the tax goes. "" = the launching wallet
# how the tax splits, % of the tax, must add up to 100:
TO_YOU = 100 # to BENEFICIARY, in the quote asset
BURNED = 0
TO_HOLDERS = 0 # as dividends, in DIVIDEND_TOKEN
TO_LIQUIDITY = 0
DIVIDEND_TOKEN = "quote" # "quote", "self", or an ERC-20 address
# ──────────────────────────────────────────────────────
account = Account.from_key(PRIVATE_KEY) # signs only; no node needed
# 1. Pin the image + metadata through Flap's IPFS gateway.
with open(IMAGE, "rb") as f:
up = requests.post(
"https://api.shrine.trade/bnb/api/upload-image",
files={"file": ("logo.png", f, "image/png")},
data={"description": DESCRIPTION, "twitter": TWITTER, "telegram": TELEGRAM, "website": WEBSITE},
).json()
if "error" in up:
raise SystemExit(f"{up['error']}: {up['message']}")
print("metadata pinned:", up["meta"])
# 2. Build the launch transaction.
payload = {
"name": NAME, "symbol": SYMBOL, "meta": up["meta"],
"pairToken": PAIR_TOKEN, "buyTaxBps": BUY_TAX * 100, "sellTaxBps": SELL_TAX * 100,
"from": account.address,
}
if DEV_BUY:
payload["initialBuy"] = DEV_BUY
if BENEFICIARY:
payload["beneficiary"] = BENEFICIARY
if BUY_TAX or SELL_TAX:
payload.update({"marketingBps": TO_YOU * 100, "deflationBps": BURNED * 100,
"dividendBps": TO_HOLDERS * 100, "lpBps": TO_LIQUIDITY * 100,
"dividendToken": DIVIDEND_TOKEN})
body = requests.post("https://api.shrine.trade/bnb/api/create-token", json=payload).json()
if "error" in body:
raise SystemExit(f"{body['error']}: {body['message']}")
print("token will be", body["token"], "-", body["tokenType"])
# 3. Sign locally and hand each signed transaction to the API to broadcast.
for tx in body["txs"]:
signed = Account.sign_transaction(
{
"to": tx["to"], "data": tx["data"], "value": int(tx["value"]), "gas": tx["gas"],
"maxFeePerGas": int(tx["maxFeePerGas"]), "maxPriorityFeePerGas": int(tx["maxPriorityFeePerGas"]),
"nonce": tx["nonce"], "chainId": tx["chainId"],
},
account.key,
)
sent = requests.post("https://api.shrine.trade/bnb/api/send", json={"signedTx": "0x" + signed.raw_transaction.hex().removeprefix("0x")}).json()
if "error" in sent:
raise SystemExit(f"{sent['error']}: {sent['message']}")
if sent["status"] != "landed":
raise SystemExit(f"{tx['description']} {sent['status']}: {sent['explorer']}")
print(tx["description"] + ":", sent["explorer"])
print("token launched:", body["token"])
print("page:", "https://flap.sh/token/" + body["token"])
Save it as launch.py, put your image next to it as logo.png, then:
pip install eth-account requests
python launch.py
Supported quote assets
A Flap token can be priced in BNB, in a stablecoin or major, or in one of Binance's tokenised stocks and ETFs on BNB Chain - a meme that trades directly against NVIDIA, Tesla, SpaceX, the S&P 500 or gold. Flap also accepts other Flap tokens as quotes ("child" launches). Pass "BNB", a ticker from the tables (any case), or an address as pairToken; an asset Flap hasn't enabled returns pair_token_not_approved.
Whatever you pick is fixed at launch and is what the curve holds. Buyers still pay in plain BNB: for every asset below, Flap swaps BNB into the quote inside the buy, and sells come back as BNB by default. A tax on a stock-priced token is collected in that stock, so marketingBps pays you in NVDAB, and dividendBps pays holders in it (the default dividendToken is the quote).
Crypto
| Ticker | Asset | Decimals | Address |
|---|---|---|---|
BNB | BNB | 18 | native BNB - no address |
USDT | Tether USD | 18 | 0x55d398326f99059fF775485246999027B3197955 |
USD1 | USD1 | 18 | 0x8d0D000Ee44948FC98c9B98A4FA4921476f08B0d |
U | United Stables | 18 | 0xcE24439F2D9C6a2289F741120FE202248B666666 |
lisUSD | Lista USD | 18 | 0x0782b6d8c4551B9760e74c0545a9bCD90bdc41E5 |
BTCB | Bitcoin (BTCB) | 18 | 0x7130d2A12B9BCbFAe4f2634d864A1Ee1Ce3Ead9c |
ETH | Ethereum | 18 | 0x2170Ed0880ac9A755fd29B2688956BD959F933F8 |
SOL | Solana | 18 | 0x570A5D26f7765Ecb712C0924E4De545B89fD43dF |
Stocks, ETFs and gold
Binance-issued tokenised equities. Each tracks one share of the underlying; one NVDAB is one NVIDIA share, so a 0.01 dev buy in a NVDAB launch is a hundredth of a share.
| Ticker | Asset | Decimals | Address |
|---|---|---|---|
XAUT | Tether Gold | 6 | 0x21cAef8A43163Eea865baeE23b9C2E327696A3bf |
SPYB | SPY (S&P 500 ETF) | 18 | 0x7138b48df7D98D7e3cc221BfE7192D0a178182D8 |
QQQB | Invesco QQQ Trust | 18 | 0x205812CdBed920aFf76C6580abD681a46D11efc7 |
NVDAB | NVIDIA | 18 | 0x02Fca66C1D1aFB4E2A7884261eB00F63598a7436 |
AAPLB | Apple | 18 | 0x431a3BEE82E2ca41e49895CbECE5bB0F76A89b7A |
TSLAB | Tesla | 18 | 0x5b1910eAaD6450E50f816082Aa078C41F10C292f |
MSFTB | Microsoft | 18 | 0x80106cb3EAD06659A5ad19DF39D9b4733863B9b0 |
GOOGLB | Alphabet | 18 | 0x3F53De71c126BdaBAe20f9cD64848d317f6C3238 |
SPCXB | SpaceX | 18 | 0xbe9D156892E55e7154BcD3cB0FEA677F9D3103E1 |
SKHYB | SK Hynix | 18 | 0xCA750eF65f295BBECd685Abf54e82CAf297BDB61 |
HOODB | Robinhood | 18 | 0xA394dCEa3fd3847fD793afBFd163E2e3858B7c65 |
BABAB | Alibaba | 18 | 0x4eF9d3062c7F6ebA4AAE4990c5036598C6eff4ec |
GMEB | GameStop | 18 | 0x46cEeFDa28Dd7207059ed19B0acdc026955bb15C |
NFLXB | Netflix | 18 | 0xD6829Ea836b6FA224d099D40E54B31262f874631 |
MSTRB | Strategy (MicroStrategy) | 18 | 0xE87afb3076AeB0f9B14E368DE8145ae6a2826A14 |
DJTB | Trump Media & Technology Group | 18 | 0xF2ec508422174Ee564de98187db9359D318AFB6b |
MRNAB | Moderna | 18 | 0x5fd86da9B05abE396fe9d02a4A213A7c00556503 |
FLNCB | Fluence Energy | 18 | 0x4af1D41cd9dD950dcA43984b43aaA2A8702714Ac |
SOXLB | Direxion Semiconductor Bull 3X ETF | 18 | 0xd97d097a89113fa59b76c572E5b2Eb647E8eefaf |
SOXSB | Direxion Semiconductor Bear 3X ETF | 18 | 0xE28Cd11C99AF2df76bb8aDA4Cd0ef3904378280F |
This is the list as of September 2026. When Binance issues a new stock and Flap enables it, its address works as pairToken straight away; the ticker follows in the next release.
Every curve graduates at the same point - 800M of the 1B supply sold - whatever it is priced in. That is the only graduation point Flap's Portal accepts on BNB Chain.
The tax system
A tax token's tax is split four ways, in basis points that sum to 10000:
| Share | Goes to |
|---|---|
marketingBps | beneficiary, in the quote asset, automatically. This is the creator's revenue. |
deflationBps | Burned. |
dividendBps | Holders of at least minimumShareBalance tokens, in dividendToken: the quote asset, the token itself, or another ERC-20. They claim it through Creator Revenue. |
lpBps | Added to the token's PancakeSwap liquidity. |
The default is all to the beneficiary. A buy tax and a sell tax can differ (buyTaxBps: 300, sellTaxBps: 1000 is a common shape); the tax runs for taxDays after graduation and, for antiFarmerHours after graduation, on every pool rather than just the main one. On the curve the tax is charged as an extra fee on every trade and goes the same way.
Before it reaches any of those, Flap keeps up to 0.3% of taxed volume. shrine.trade takes nothing from it. Everything here is fixed at launch.
Request
| Field | Type | Description |
|---|---|---|
name | string | Token name. Not unique - always identify tokens by address. |
symbol | string | Ticker. |
logo | string | Image URL, or a base64 data: URL. The API fetches it and pins image + metadata through Flap's gateway. Either this or meta. |
meta | string | A metadata CID you already pinned with POST /api/upload-image (what the scripts above do). Skips the pinning step; description and socials are then ignored. |
description | string, optional | Project description, pinned with the image. |
socials | object, optional | { twitter, telegram, website } - any may be "". |
pairToken | string, optional | What the curve is priced in. "BNB" (default), a ticker from Supported quote assets such as "USD1" or "NVDAB", or the address of any quote asset Flap has enabled. |
initialBuy | decimal string, optional | Your own opening buy, in the same transaction, in the quote asset (BNB for a BNB launch). Runs inside the transaction that creates the curve, so nobody can trade ahead of it. A USD1 dev buy puts an approve_quote transaction in front. |
buyTaxBps / sellTaxBps | number, optional | Tax on every buy / sell, in basis points (100 = 1%). Either above 0 makes this a tax token; they can differ. Immutable after launch. Default 0. |
taxDays | number, optional | Tax tokens: how long the tax runs after graduation, in days. Default 365. |
antiFarmerHours | number, optional | Tax tokens: for this many hours after graduation the tax also applies to every other pool, so LP farmers can't route around it. At most 8760. Default 0. |
beneficiary | address, optional | Tax tokens: where the marketing share of the tax goes. Defaults to from. |
marketingBps / deflationBps / dividendBps / lpBps | number, optional | Tax tokens: how the tax splits, in bps of the tax - to the beneficiary, burned, paid to holders as a dividend, added to the token's liquidity. Must sum to 10000; anything not named is 0. Default: all to the beneficiary. |
dividendToken | string, optional | With dividendBps: what holders are paid in. "quote" (default) for the quote asset (the stock itself on a stock-priced launch), "self" for the token itself, or an ERC-20 address Flap can swap into. |
minimumShareBalance | decimal string, optional | With dividends (tax tokens with dividendBps, and every standard token): the token balance a holder needs to receive them. Flap's floor is 10000, which is the default. |
slippage | number, optional | Percent, for the dev buy. Default 5. |
from | address | Your wallet (creator). |
What a launch costs
Flap charges no creation fee, so a launch costs gas and nothing else - about 0.0004 BNB for a tax token and less for a standard one at BNB Chain's usual 0.05 gwei, plus your dev buy. Because a node reserves gasLimit x maxFeePerGas before running the transaction, and both figures are padded (20% on the limit, a 1.25x ceiling on the price), the wallet must hold a little more than is actually spent; the difference comes back in the same block. Budget 0.001 BNB for a plain launch and you will never be short.
Flap does apply a rate limit per creator wallet - one launch every so often - and returns launch_rate_limited when you are inside it.
Response
A real one, for a 3%/3% tax token with a 0.001 BNB dev buy:
{
"txs": [
{
"to": "0xe2cE6ab80874Fa9Fa2aAE65D277Dd6B8e65C9De0",
"data": "0x…",
"value": "1000000000000000",
"gas": 7230661,
"maxFeePerGas": "62500000",
"maxPriorityFeePerGas": "50000000",
"nonce": 12,
"chainId": 56,
"type": 2,
"description": "create"
}
],
"token": "0x32e00b9c8eb2ff2462b61b692475d7670ea07777",
"salt": "0xe37d685461db060f32606abcd0af9c18d4bc275244d46edbf0123869d1367347",
"tokenType": "tax_v3",
"launchFee": "0",
"launchFeeFormatted": "0",
"pairToken": "BNB",
"pairTokenSymbol": "BNB",
"pairTokenDecimals": 18,
"graduationSupply": "800000000000000000000000000",
"graduationSupplyFormatted": "800000000",
"meta": "bafkreieraixgnucog5qpve3qqqapghudod7ogi5ztlorgavbjszahk3lga",
"metaUri": "https://ipfs.io/ipfs/bafkreieraixgnucog5qpve3qqqapghudod7ogi5ztlorgavbjszahk3lga",
"beneficiary": "0x8894E0a0c962CB723c1976a4421c95949bE2D4E3",
"buyTaxBps": 300,
"sellTaxBps": 300,
"tax": {
"taxDays": 365,
"antiFarmerHours": 0,
"marketingBps": 10000,
"deflationBps": 0,
"dividendBps": 0,
"lpBps": 0,
"dividendToken": "quote",
"minimumShareBalance": "0"
},
"initialBuy": "1000000000000000",
"initialBuyFormatted": "0.001",
"expectedTokensOut": "173060121205804955576978",
"expectedTokensOutFormatted": "173060.121205804955576978",
"expectedEconomics": "Flap tax token: 3.00% tax on buys and 3.00% on sells for 365 days after graduation …"
}
txs- sign and send in order. Usually one,create. A dev buy in an ERC-20 quote putsapprove_quotein front.token- the token's address, known before you send: Flap deploys with CREATE2 and thesaltwe searched for. Tax tokens end in7777, standard ones in8888- Flap requires it.tokenType-standard_v3ortax_v3.launchFee- always0: Flap charges nothing to create. The transaction'svalueis the dev buy.meta/metaUri- the pinned metadata, as a CID and through a gateway.beneficiary,buyTaxBps,sellTaxBps,tax- echo what the launch will use: the tax duration and anti-farmer window, the split, the dividend token and holder floor.lpFeesToon a standard token is alwaysholders.initialBuy,expectedTokensOut- the dev buy in the quote asset's base units and what it returns, simulated against the real launch. Only with aninitialBuy.expectedEconomics- a plain-English summary of the token's terms.