A bot that buys new launches
Three calls in a loop:
GET /coins/new?since=<the newest createdAt you have>: the launches since your last look, newest first. Every 2 to 3 seconds is plenty.GET /coins/{address}/holders: skip a coin whose bundled wallets or snipers already hold much of it (groups.bundled.heldPct,groups.snipers.heldPct). A coin seconds old may not be counted yet (tracked: false): ask again on the next loop.POST /swap: the buy, for your wallet. ItssellBacksays what selling it straight back would return. A bot that never buys a coin whose round trip loses more than a set share never buys one that cannot be sold.
const API = 'https://uprally.co/api/v1';let since = (await (await fetch(`${API}/coins/new?limit=1`)).json()).coins[0].createdAt;
for (;;) { const { coins } = await (await fetch(`${API}/coins/new?since=${encodeURIComponent(since)}`)).json(); if (coins.length) since = coins[0].createdAt; for (const c of coins) { const h = await (await fetch(`${API}/coins/${c.address}/holders`)).json(); if (!h.tracked || h.groups.bundled.heldPct > 10 || h.groups.snipers.heldPct > 5) continue; // POST /swap { wallet, token: c.address, side: 'buy', amount: '0.001' } → sign and send built.tx } await new Promise((r) => setTimeout(r, 3000));}The whole program, with a spending cap, the round-trip check and a builder fee: A launch buyer with limits.
Coins still on their launchpad curve (Pons, Flap) trade on the curve itself; graduated ones and every other launchpad’s trade in Uniswap pools. The API picks: you send the same request either way.