API · v1.3.0
Launch on Mob, from code
New to launching? Start with the guide. · No keys · non-custodial · openapi.json (OpenAPI 3.1) · base https://mob.markets/api/v1
You sign everything. Every write endpoint builds a transaction and hands it back. You sign it with your own keys and send it, through POST /api/v1/send or any RPC. Mob never sees a private key.
Mob films Solana launches and runs creator-fee books for coins launched through it. Coins can launch on pump.fun, on Raydium LaunchLab through Mob's platform, or on Meteora through Mob's config. This API does the same launch flow as a program would: it builds transactions and hands them back; you sign them with your own keys and send them (through POST /api/v1/send, or any RPC). Mob never sees a private key.
For pump.fun the flow is six calls; on Raydium and Meteora it ends after step 2 (the books are pump.fun only for now). Fees on every launchpad: https://mob.markets/fees.
The flow is six calls:
POST /api/v1/launchesbuilds the create transaction on the launchpad you pick (launchpad:pump, the default,raydiumormeteora). Sign it with the creator and a fresh mint keypair.POST /api/v1/sendsends it.POST /api/v1/launches/{mint}/treasurybuilds the Family treasury, a Squads multisig.POST /api/v1/launches/{mint}/burn-wallet(optional) makes the buy-and-burn wallet.POST /api/v1/launches/{mint}/splitbuilds the fee split. pump.fun allows it once.POST /api/v1/launches/{mint}/registerhands the coin to the 12-hour crank and lists it under "Made here" on the Count.
GET /api/v1/launches/{mint} tells you where a launch stands and what comes next, read from the chain.
Limits
No API key. Builders: 30 calls a minute per caller; sends: 10. A built transaction carries a recent blockhash, so sign and send it within about a minute. Names and tickers pass the Count's blocklist. Errors are always { "ok": false, "error": "…" } with a plain-language message. CORS is open, so this works from a browser too.
A complete launch, in Node
// npm i @solana/web3.js@1 bs58
import { Keypair, Transaction, VersionedTransaction } from "@solana/web3.js";
import bs58 from "bs58";
const API = "https://mob.markets/api/v1";
const creator = Keypair.fromSecretKey(bs58.decode(process.env.CREATOR_SECRET)); // stays on your machine
const mint = Keypair.generate(); // the coin's address
const call = async (path, body) => {
const r = await fetch(API + path, body ? { method: "POST", headers: { "content-type": "application/json" }, body: JSON.stringify(body) } : {});
const d = await r.json();
if (!d.ok) throw new Error(`${path}: ${d.error}`);
return d;
};
// Sign a transaction Mob built (legacy or v0) with your own keys, and send it.
const signAndSend = async (b64, version, ...keys) => {
const bytes = Buffer.from(b64, "base64");
let signed;
if (version === "v0") { const tx = VersionedTransaction.deserialize(bytes); tx.sign(keys); signed = tx.serialize(); }
else { const tx = Transaction.from(bytes); tx.partialSign(...keys); signed = tx.serialize(); }
return (await call("/send", { transaction: Buffer.from(signed).toString("base64") })).signature;
};
// 1–2. the coin
const launch = await call("/launches", {
name: "Operation", symbol: "OP", uri: "ipfs://…/metadata.json",
creator: creator.publicKey.toBase58(), mint: mint.publicKey.toBase58(),
});
if (!launch.preflight.ok) throw new Error(`won't land: ${launch.preflight.error}`);
await signAndSend(launch.transaction, launch.version, creator, mint);
const m = launch.mint;
// 3. the Family treasury
const t = await call(`/launches/${m}/treasury`, {});
const treasurySignature = await signAndSend(t.transaction, t.version, creator);
// 4. a buy-and-burn wallet (optional)
await call(`/launches/${m}/burn-wallet`, {});
// 5. the split: ONCE, forever. 24% burn, 5% film fund, 1% Mob, the treasury gets the other 70%.
const s = await call(`/launches/${m}/split`, { burnBps: 2400, filmBps: 500, mob: true });
await signAndSend(s.transactions[0], s.version, creator);
const splitSignature = await signAndSend(s.transactions[1], s.version, creator);
// 6. hand it to the crank
const done = await call(`/launches/${m}/register`, { splitSignature, treasurySignature });
console.log("live:", done.page);
What it costs
Network fees and rent, paid by the creator: about 0.02 SOL to create the coin, under 0.01 SOL for the treasury, a few thousandths for the split and its recipients' accounts. Mob charges nothing to launch. In the split, Mob's 1% and the film fund are optional (see fees).
Endpoints
GET /api/v1
What this API is and the launch flow
Errors: 429, each { "ok": false, "error": "…" }.
POST /api/v1/launches
Build a coin's create transaction on pump.fun, Raydium LaunchLab or Meteora
Generate a fresh keypair for the mint yourself; pass only its public key. The returned transaction needs two signatures: the creator's and the mint keypair's. The creator pays the network fees and account rent and becomes the coin's creator. The name, ticker and metadata link are permanent once it lands. preflight is a simulation without signatures, so a funding problem shows before you sign.
pump (default): a pump.fun coin. Traders pay pump.fun's fees; Mob's 1% comes from the creator fees, through the split, and the creator can drop it.
raydium: a Raydium LaunchLab coin on Mob's platform (1QG13utW4S4eaEFsBGebCbx2PFV2WhZzW2vr9VjKSgs), SOL pair, Raydium's default curve, graduates to a CPMM pool. 1.55% a trade on the curve: 0.25% Raydium, 1% Mob, 0.3% the creator. Returns a v0 transaction.
meteora: a Meteora Dynamic Bonding Curve coin (Token-2022) on Mob's config (EAEXfTYiTtU3dugkdNw4fq3wXPfgKiU57NXpWC7CH1eR), graduating at about 86 SOL into a DAMM v2 pool. 1.25% a trade on the curve: 0.25% Meteora, 1% Mob. The graduated pool's liquidity is locked for good, half the creator's.
Mob's 1% on Raydium and Meteora is set on chain by the launchpad and can't be removed per coin.
Request
| Field | Type | What |
|---|---|---|
launchpad | string | pump = pump.fun · raydium = Raydium LaunchLab (Mob's platform) · meteora = Meteora Dynamic Bonding Curve (Mob's config) |
name required | string | |
symbol required | string | Without the $ |
uri required | string | https://, ipfs:// or ar:// link to the metadata JSON (name, symbol, description, image, links), hosted by you |
creator required | string | A Solana address (base58) |
mint required | string | Public key of a fresh keypair you generated |
Response
| Field | Type | What |
|---|---|---|
ok | const true | |
mint | string | A Solana address (base58) |
transaction | string | base64; legacy for pump and meteora, v0 for raydium |
encoding | const "base64" | |
version | legacy | v0 | |
signers | array | Who must sign: the creator and the mint |
lastValidBlockHeight | integer | |
preflight | object | A simulation without signatures |
next | string | |
launchpad | string | pump = pump.fun · raydium = Raydium LaunchLab (Mob's platform) · meteora = Meteora Dynamic Bonding Curve (Mob's config) |
pool | string | Raydium and Meteora: the coin's bonding-curve pool |
fees | string | Raydium and Meteora: what a trade on the curve costs and who gets it |
Errors: 400, 409, 422, 429, each { "ok": false, "error": "…" }.
GET /api/v1/launches/{mint}
Where a launch stands, and the next step
Read from the chain each time: whether the coin exists, the treasury, the burn wallet, the split, and whether the crank runs it.
Response
| Field | Type | What |
|---|---|---|
ok | const true | |
mint | string | A Solana address (base58) |
name | string | |
symbol | string | |
creator | string | A Solana address (base58) |
steps | object | |
next | string | |
treasury | object | null | |
sharingConfig | string | null | |
split | array | null | |
page | string | |
launchpad | string | pump = pump.fun · raydium = Raydium LaunchLab (Mob's platform) · meteora = Meteora Dynamic Bonding Curve (Mob's config) |
pool | string | A Solana address (base58) |
books | string | Raydium and Meteora: how fees reach the creator there |
creatorFees | object | null | LaunchLab: what the creator can claim now |
Errors: 404, each { "ok": false, "error": "…" }.
POST /api/v1/launches/{mint}/treasury
Build the Family treasury (a Squads multisig)
The coin must be on chain. Members default to the creator alone with a threshold of 1. The transaction is already signed by the one-time key that seeds the multisig's address; add the creator's signature. Calling again after it exists returns the same treasury.
Works for coins on every launchpad. On LaunchLab it's where /claim sends the creator's fees.
Request
| Field | Type | What |
|---|---|---|
members | array | Default: the creator alone |
threshold | integer | Approvals needed to move money. Default 1 |
Response
| Field | Type | What |
|---|---|---|
ok | const true | |
multisig | string | A Solana address (base58) |
vault | string | The treasury address that receives fees |
transaction | string | |
encoding | const "base64" | |
version | const "legacy" | |
signers | array | |
alreadyExists | boolean | |
preflight | object | A simulation without signatures |
Errors: 400, 404, 409, 429, each { "ok": false, "error": "…" }.
POST /api/v1/launches/{mint}/burn-wallet
Get the coin's buy-and-burn wallet
Mob makes a wallet for this coin and holds its key. Its only use: once it holds 0.03 SOL, Mob's keeper buys this coin with it and burns what it buys, each step a public transaction. Give it a share in the split (burnBps) or don't call this at all. Also returns Mob's revenue and film-fund vaults.
pump.fun coins only; a Raydium or Meteora launch gets 409.
Response
| Field | Type | What |
|---|---|---|
ok | const true | |
wallet | string | A Solana address (base58) |
mob | string | A Solana address (base58) |
film | string | A Solana address (base58) |
Errors: 404, 409, each { "ok": false, "error": "…" }.
POST /api/v1/launches/{mint}/split
Build the fee split (pump.fun allows it ONCE)
Sets where the coin's creator fees go, forever. The Family treasury gets whatever the other shares leave. Mob's 1% is in by default; pass "mob": false to leave it out. Two transactions, because all of it together is over Solana's size limit: send the first (sweep, collect, fund recipients' rent), then the second (create and set the split). Both are signed by the creator.
pump.fun coins only; a Raydium or Meteora launch gets 409.
Request
| Field | Type | What |
|---|---|---|
burnBps | integer | Share to the buy-and-burn wallet (call burn-wallet first) |
filmBps | integer | Share to Mob's film fund |
mob | boolean | Mob's 1% |
recipients | array |
{
"burnBps": 2400,
"filmBps": 500,
"mob": true,
"recipients": [
{
"wallet": "Partner111111111111111111111111111111111111",
"bps": 1000
}
]
}
Response
| Field | Type | What |
|---|---|---|
ok | const true | |
sharingConfig | string | A Solana address (base58) |
shares | array | |
transactions | array | base64 v0 transactions: send the first, then the second |
encoding | const "base64" | |
version | const "v0" | |
warning | string | |
preflight | object | A simulation without signatures |
Errors: 400, 404, 409, 429, each { "ok": false, "error": "…" }.
POST /api/v1/launches/{mint}/register
Hand the coin to the crank and list it as made on Mob
Reads the split from the chain (nothing you send is trusted for it), records the books, and from then on Mob's crank pays the fees out every 12 hours. Pass the split and treasury signatures to have them written to the coin's public ledger.
Request
| Field | Type | What |
|---|---|---|
splitSignature | string | |
treasurySignature | string |
Response
| Field | Type | What |
|---|---|---|
ok | const true | |
coin | object | |
page | string |
Errors: 400, 404, 409, each { "ok": false, "error": "…" }.
POST /api/v1/send
Send a signed transaction and wait for it
Submits through Mob's RPC with preflight on, then waits up to 45 seconds for confirmation. Optional: you can send through any RPC instead.
Request
| Field | Type | What |
|---|---|---|
transaction required | string | The fully signed transaction, base64 |
Response
| Field | Type | What |
|---|---|---|
ok | const true | |
signature | string | |
status | confirmed | finalized | sent |
Errors: 400, 422, 429, each { "ok": false, "error": "…" }.
GET /api/v1/count
The Count: every coin moving right now
Busiest by dollars traded in the last five minutes, across pump.fun, LaunchLab and the launchpads Jupiter tags. Copycats are rolled into themes. Recounted every five seconds.
Errors: 429, each { "ok": false, "error": "…" }.
GET /api/v1/coins/{mint}
One coin
A filmed coin returns its trades since launch (film is absent or true). Any other coin returns film: false, the reason, and its numbers.
Errors: 404, each { "ok": false, "error": "…" }.
GET /api/v1/coins/{mint}/books
A coin's books: balances, split and ledger
Errors: 404, each { "ok": false, "error": "…" }.
POST /api/v1/launches/{mint}/claim
Build the creator's fee claim (LaunchLab, or Meteora after graduation)
Raydium LaunchLab and Meteora coins. The creator signs; Mob never holds the fees. Fees are sent to the Family treasury (to: treasury, the default once a treasury exists) or to the creator (to: creator).
LaunchLab: LaunchLab pays the creator's 0.3% into one vault per creator, across all of their LaunchLab coins, and this claims all of it, unwrapped to SOL. After graduation, the pool's 0.97% creator fee needs no claim: Mob's daily claimer sends it to the creator's wallet as wrapped SOL, and Mob pays the network fee.
Meteora: on Mob's config the creator earns from the graduated pool's locked liquidity, not from trades on the curve. Before graduation this returns 409. After it, this claims the creator's locked position's share of the pool's fees, in SOL.
Request
| Field | Type | What |
|---|---|---|
to | string |
{
"to": "treasury"
}
Response
| Field | Type | What |
|---|---|---|
ok | const true | |
claimSol | number | |
to | string | A Solana address (base58) |
transaction | string | |
encoding | const "base64" | |
version | const "legacy" | |
signers | array | |
lastValidBlockHeight | integer | |
preflight | object | A simulation without signatures |
note | string |
Errors: 400, 404, 409, 429, each { "ok": false, "error": "…" }.
Discovery
The spec is at /openapi.json, linked from every API response (Link: rel="service-desc"), from /.well-known/api-catalog and from /llms.txt. By using the API you agree to the terms.