# Discover tokens

> A markets board, a trending strip, a new-launches feed, search, and the attention signal — every discovery surface on Arc from four endpoints.

Source: https://getchord.xyz/docs/recipes/discover-tokens/

**Goal**: the discovery layer of a trading app — what is traded, what is moving, what just launched, and search — on Arc.

## Markets board

`GET /arc/tokens` returns every token that traded in the last 24 hours (about 1,500 on a normal day), with price, change, buy/sell volume, trades, traders, market cap, pool counts per venue and honesty flags. Sort server-side; page with `offset`.

```ts
const { tokens, total } = await fetch(`${A}/arc/tokens?sort=volume&limit=100&offset=0`).then((r) => r.json());
```

- Columns Chord shows: token (logo, symbol, `listed` check), price, 24h change, volume, buys / sells, traders, market cap (labelled FDV), pools.
- `flags` present → grey the row and badge it. They already sort below clean rows.
- `routable` → whether to draw a Buy button.
- `includeUnlisted=1` adds tokens with no curated metadata or logo (most launches). Chord shows them, with the on-chain symbol.

Keep the board moving between polls with the WebSocket `prices` channel — one subscription covers the whole board, prices and 24h counters alike, plus tokens trading for the first time:

```ts
ws.send(JSON.stringify({ op: "sub", channel: "prices", chain: 5042 }));
// { op: "prices", at, items: [{ address, priceUsd, ts, side, usd, volume24h, trades24h, buys24h, sells24h, … }] }
//   apply by address; use the counters when `at` is later than the REST page's `updatedAt`
// { op: "new", items: [{ address, symbol, name, totalSupply, firstTs, priceUsd }] } — prepend to a "New" list
```

## Trending

`GET /arc/trending?limit=20` — movers of the last two hours, scored from the hourly rollup. Each row is a full token row plus `score`, `volNow`, `tradesNow`, `change1hPct` and `momentum`. Poll every 30 s.

## New launches

`GET /arc/graduated?hours=48&limit=100` — tokens whose first pool on Arc was created in the window, routable today and screened (impostor symbols, launch farms, no-sell tokens, too few traders removed). Newest first; `launchedAt`, `launcher`, `launcherName` and `creator` on each row; `screened` counts what each filter removed, which is worth showing ("1,615 launch-farm tokens hidden"). Poll every 60 s.

Pair it with `GET /arc/launchers?hours=24` for the launchpad strip: which launchers are active, pools per hour, and 24-hour volume over the pools each one created.

## Search

`GET /arc/tokens/search?q=argus&limit=10` — symbol, name or address over every token traded in the last 24 hours. Exact symbol first, then prefix, name, substring; listed tokens and volume break ties so the real ARGUS outranks a copy. A pasted address always returns that token. Debounce at 200 ms; `coverage` says how many tokens have a resolved name yet.

## Attention

`GET /arc/attention?days=1&limit=20` — what people on Chord are looking at (searches, views, questions to the analyst, watchlist adds). A demand signal, independent of price; use it for a "people are watching" rail.

## Putting it together

Chord's markets page polls `/arc/tokens` every 20 s, `/arc/trending` every 30 s, `/arc/graduated` every 60 s, keeps prices live over the WebSocket, and runs search on demand. That is well inside the anonymous limit; a key is only needed when you serve many users from one server.
