# runup > Launchpad on Solana where every memecoin has a basket of real tokenized stocks (xStocks such as TSLAx, NVDAx, SPYx) underneath. A fee on every trade of the coin buys more stock into its vault. Holders can burn coins at any time to receive their share of the stocks. Coins launch on Raydium LaunchLab. Base URL: https://runup.trade (mainnet). The devnet demo is https://undr-seven.vercel.app, with the same API. Public API: https://runup.trade/api/public/v1 Everything is non-custodial: the API never sees a private key. Actions return unsigned Solana transactions that you sign with your own wallet. ## Launch a coin in three calls 1. `GET /api/public/v1/presets` lists basket presets (ids like `tech`, `america`, `elon`, `mix`) and the stocks allowed in a custom basket, each with `priceUsd`, `change30d` and `change1y`, plus fee presets (`Degen` 1%, `Balanced` 2%, `Fortress` 4%). `GET /api/public/v1/stocks` is the stock list alone. 2. `POST /api/public/v1/launches/prepare` with JSON `{ "creatorWallet": "", "name": "moon cat", "symbol": "MCAT", "basketPreset": "tech", "feePreset": "Balanced", "firstBuySol": 0.05 }` or a custom basket instead of a preset: `"basket": [{ "symbol": "TSLAx", "weightBps": 6000 }, { "symbol": "SPYx", "weightBps": 4000 }]` (1 to 6 stocks, weights add to 10000). Optional token card: `"description"` (up to 500 chars), `"website"`, `"twitter"`, `"telegram"` (https links or an `@handle`), `"image"` (data URL up to 1 MB). Returns `{ launchId, mint, transactions: base64[], uri, expiresAt }`; `uri` is the metadata JSON on Arweave. 3. Sign every transaction with `creatorWallet` (they are Solana v0 or legacy transactions), then `POST /api/public/v1/launches/submit` with `{ "launchId": "...", "signedTransactions": [...] }` within about a minute. Check `GET /api/public/v1/launches/{launchId}` until `status` is `live`. Submitting the same launch twice returns 409, so retries never create a second coin. ## Read coins - `GET /api/public/v1/tokens?q=&status=curve|graduated&sort=marketCap|basket|progress&page=1&pageSize=50` - `GET /api/public/v1/tokens/{mint}`: price, market cap, the stocks under the coin and their value, fee preset, page URL. Errors look like `{ "error": { "code": "invalid_request" | "not_found" | "conflict" | "rate_limited" | "chain_error", "message": "..." } }`. Limits per IP per minute: reads 120, prepare 20, submit 20; on 429 wait for `Retry-After`. Tickers of real assets (SOL, USDC, stock symbols) are reserved. ## Trade and redeem - `GET /api/public/v1/quote?mint=&side=buy|sell&amount=`: amount in SOL for a buy, in coins for a sell; returns `amountOut`, spot and execution price, `priceImpact`, fees. - `POST /api/public/v1/trades/prepare` with `{ "wallet", "mint", "side", "amount" }` returns `{ quote, transactions, requestId?, expiresAt }`. - `POST /api/public/v1/redeems/prepare` with `{ "wallet", "mint", "amount" }` burns coins for the wallet's share of every stock in the vault; returns `{ quote, transactions, expiresAt }`. - Sign with `wallet`, then `POST /api/public/v1/transactions/submit` with `{ "signedTransactions": [...], "requestId"? }` within a minute. Send `requestId` back when prepare returned one (mainnet trades go through Jupiter). - `GET /api/public/v1/tokens/{mint}/trades?limit=50` (newest first) and `GET /api/public/v1/tokens/{mint}/candles?interval=900` (OHLC in USD). ## TypeScript Install: `npm install @runup.trade/client @solana/web3.js`. ```ts import { createRunupClient } from '@runup.trade/client' import { Keypair } from '@solana/web3.js' const runup = createRunupClient() // mainnet by default; { baseUrl: DEVNET } for the devnet demo const presets = await runup.presets() const { token } = await runup.launch(wallet /* Keypair or wallet adapter */, { name: 'moon cat', symbol: 'MCAT', basketPreset: 'tech', feePreset: 'Balanced', firstBuySol: 0.05, }) console.log(token?.url) const { signatures } = await runup.trade(wallet, token.mint, 'buy', 0.01) // buy with 0.01 SOL await runup.redeem(wallet, token.mint, 1000) // burn 1000 coins for stock ``` ## MCP server for agents Install: `npx -y @runup.trade/mcp` (needs Node 20+). `@runup.trade/mcp` gives Claude, Cursor, ChatGPT and other MCP clients nine tools: `list_coins`, `get_coin`, `list_presets`, `get_quote`, `recent_trades`, `launch_coin`, `launch_status`, `trade_coin`, `redeem_coin`. - `launch_coin` returns a draft first and only launches with `confirm: true`. - A configured `RUNUP_WALLET_KEY` signs only when `RUNUP_URL` is set as well. Without a wallet it returns a link like `https://runup.trade/launch?name=moon+cat&symbol=MCAT&basket=tech&fee=Balanced&firstBuy=0.05` for a person to confirm with their wallet. - `trade_coin` and `redeem_coin` quote first and act only with `confirm: true` and a configured wallet. - `RUNUP_MAX_FIRST_BUY_SOL` caps what the agent can spend per launch, `RUNUP_MAX_TRADE_SOL` per trade (default 0.5 each), `RUNUP_MAX_SESSION_SOL` across the whole session (default 2). Config for an MCP client: ```json { "mcpServers": { "runup": { "command": "npx", "args": ["-y", "@runup.trade/mcp"] } } } ``` ## Launch link for people Send a person to `/launch` with the fields filled in: `name`, `symbol`, `fee` (Degen, Balanced, Fortress), `firstBuy` (SOL), and `basket` as a preset id (`tech`) or stocks with percents (`TSLAx:60,SPYx:40`).