TRENDDocs

Quickstart

List launches and get a quote in five minutes. No key, no account.

What is live today

TREND runs on its own dev validator. The mainnet programs are not deployed: their ids are reserved and no launch exists there. Statement as of 2026-10-10.

The API is plain HTTP and JSON. Nothing here needs a key, and nothing accepts one. You need Node 22 or curl.

1. List launches

curl -s https://api.dev.trend.fun/v1/launches/trending

The answer is { "launches": [ ... ] }. Each row carries address, primaryMint, status and the recipe in components. Take an address from it for the next step.

2. Get a quote

Amounts are decimal strings of base units, never numbers. With exactInSol the amount is lamports and it is a spending ceiling: the trade cannot cost more.

curl -s https://api.dev.trend.fun/v1/trades/quote \
  -H 'content-type: application/json' \
  -d '{"launch":"<address>","direction":"buy","amountIn":"250000000","mode":"exactInSol","preview":true}'

preview: true prices without storing anything. The answer is { "quote": { ... } }; expectedOut is what you receive and minOut is the floor the chain enforces (a pool quote, for a tradable collectible, names them estimatedAmountOut and minAmountOut). The quote has one of three shapes depending on where the launch trades. See the three quote shapes before you parse it.

3. The same two steps as a script

The snippet below is a real file, apps/docs/snippets/quickstart.mjs, and it is run against dev after every deploy of this site.

snippets/quickstart.mjs
// Quickstart: list launches, then price a buy. Node 22, no dependencies, no key.
const API = process.env.TREND_API ?? 'https://api.dev.trend.fun';

async function call(path, init) {
  const res = await fetch(API + path, init);
  const body = await res.json();
  if (!res.ok) throw new Error(`${res.status} ${body.error ?? JSON.stringify(body)}`);
  return body;
}

// 1. Launches, busiest first. Take the first Pair that is still on its curve (the list can also hold collectibles).
const { launches } = await call('/v1/launches/trending');
const launch = launches.find((l) => l.kind === 'pairs' && l.status === 'activeBonding') ?? launches[0];
console.log(launch.symbol, launch.address, launch.status);

// 2. Price 0.25 SOL of it. Amounts are decimal strings of base units: this is lamports.
const { quote } = await call('/v1/trades/quote', {
  method: 'POST',
  headers: { 'content-type': 'application/json' },
  body: JSON.stringify({
    launch: launch.address,
    direction: 'buy',
    amountIn: '250000000',
    mode: 'exactInSol',
    preview: true,
  }),
});
// A pool quote (a tradable collectible) names its output differently: read both.
console.log('you receive about', quote.expectedOut ?? quote.estimatedAmountOut, 'base units; at least', quote.minOut ?? quote.minAmountOut);

What next

On this page