Skip to content

A bot that buys new launches

Three calls in a loop:

  1. GET /coins/new?since=<the newest createdAt you have>: the launches since your last look, newest first. Every 2 to 3 seconds is plenty.
  2. 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.
  3. POST /swap: the buy, for your wallet. Its sellBack says 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.