mobMARKETS

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:

  1. POST /api/v1/launches builds the create transaction on the launchpad you pick (launchpad: pump, the default, raydium or meteora). Sign it with the creator and a fresh mint keypair.
  2. POST /api/v1/send sends it.
  3. POST /api/v1/launches/{mint}/treasury builds the Family treasury, a Squads multisig.
  4. POST /api/v1/launches/{mint}/burn-wallet (optional) makes the buy-and-burn wallet.
  5. POST /api/v1/launches/{mint}/split builds the fee split. pump.fun allows it once.
  6. POST /api/v1/launches/{mint}/register hands 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

    FieldTypeWhat
    launchpadstringpump = pump.fun · raydium = Raydium LaunchLab (Mob's platform) · meteora = Meteora Dynamic Bonding Curve (Mob's config)
    name requiredstring
    symbol requiredstringWithout the $
    uri requiredstringhttps://, ipfs:// or ar:// link to the metadata JSON (name, symbol, description, image, links), hosted by you
    creator requiredstringA Solana address (base58)
    mint requiredstringPublic key of a fresh keypair you generated

    Response

    FieldTypeWhat
    okconst true
    mintstringA Solana address (base58)
    transactionstringbase64; legacy for pump and meteora, v0 for raydium
    encodingconst "base64"
    versionlegacy | v0
    signersarrayWho must sign: the creator and the mint
    lastValidBlockHeightinteger
    preflightobjectA simulation without signatures
    nextstring
    launchpadstringpump = pump.fun · raydium = Raydium LaunchLab (Mob's platform) · meteora = Meteora Dynamic Bonding Curve (Mob's config)
    poolstringRaydium and Meteora: the coin's bonding-curve pool
    feesstringRaydium 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

    FieldTypeWhat
    okconst true
    mintstringA Solana address (base58)
    namestring
    symbolstring
    creatorstringA Solana address (base58)
    stepsobject
    nextstring
    treasuryobject | null
    sharingConfigstring | null
    splitarray | null
    pagestring
    launchpadstringpump = pump.fun · raydium = Raydium LaunchLab (Mob's platform) · meteora = Meteora Dynamic Bonding Curve (Mob's config)
    poolstringA Solana address (base58)
    booksstringRaydium and Meteora: how fees reach the creator there
    creatorFeesobject | nullLaunchLab: 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

    FieldTypeWhat
    membersarrayDefault: the creator alone
    thresholdintegerApprovals needed to move money. Default 1

    Response

    FieldTypeWhat
    okconst true
    multisigstringA Solana address (base58)
    vaultstringThe treasury address that receives fees
    transactionstring
    encodingconst "base64"
    versionconst "legacy"
    signersarray
    alreadyExistsboolean
    preflightobjectA 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

    FieldTypeWhat
    okconst true
    walletstringA Solana address (base58)
    mobstringA Solana address (base58)
    filmstringA 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

    FieldTypeWhat
    burnBpsintegerShare to the buy-and-burn wallet (call burn-wallet first)
    filmBpsintegerShare to Mob's film fund
    mobbooleanMob's 1%
    recipientsarray
    {
      "burnBps": 2400,
      "filmBps": 500,
      "mob": true,
      "recipients": [
        {
          "wallet": "Partner111111111111111111111111111111111111",
          "bps": 1000
        }
      ]
    }

    Response

    FieldTypeWhat
    okconst true
    sharingConfigstringA Solana address (base58)
    sharesarray
    transactionsarraybase64 v0 transactions: send the first, then the second
    encodingconst "base64"
    versionconst "v0"
    warningstring
    preflightobjectA 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

    FieldTypeWhat
    splitSignaturestring
    treasurySignaturestring

    Response

    FieldTypeWhat
    okconst true
    coinobject
    pagestring

    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

    FieldTypeWhat
    transaction requiredstringThe fully signed transaction, base64

    Response

    FieldTypeWhat
    okconst true
    signaturestring
    statusconfirmed | 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

    FieldTypeWhat
    tostring
    {
      "to": "treasury"
    }

    Response

    FieldTypeWhat
    okconst true
    claimSolnumber
    tostringA Solana address (base58)
    transactionstring
    encodingconst "base64"
    versionconst "legacy"
    signersarray
    lastValidBlockHeightinteger
    preflightobjectA simulation without signatures
    notestring

    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.