> ## Documentation Index
> Fetch the complete documentation index at: https://docs.fomoscan.sh/llms.txt
> Use this file to discover all available pages before exploring further.

# Trader leaderboard

> Rank traders by realized profit, or show pump.fun's top 100.

**For:** community sites, competitions, KOL trackers and terminal sidebars.

Two boards, two sources:

| Board | Source | Cost |
| - | - | - |
| Your own list of traders | `POST /v2/user/handles/pnl`, up to 100 handles | 30,000 CU per ready entry, 200 CU per other entry or missing handle |
| pump.fun's top 100 | `GET /v2/pump/leaderboard/traders` | 10 CU per call |

On your own list, the `24h`, `7d` and `30d` windows are realized profit across
the trader's whole wallet, every venue, Solana and EVM together. Rank on those.
The `all` window is cash flow on platform trades, not profit.

## Your own list

```js trader-board.js theme={null}
const res = await fetch("https://api.fomoscan.sh/v2/user/handles/pnl", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.FOMOSCAN_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ handles: ["tradername", "anothertrader", "thirdtrader"] }),
});
const { entries, missing } = await res.json();

const board = entries
  .filter((e) => e.status === "ready" && e.windows["7d"]?.netUsd != null)
  .sort((a, b) => b.windows["7d"].netUsd - a.windows["7d"].netUsd)
  .map((e, i) => ({
    rank: i + 1,
    trader: e.displayName ?? e.handle,
    pnl7d: Math.round(e.windows["7d"].netUsd),
    trades: e.windows["7d"].trades,
  }));

console.table(board);
if (missing.length) console.log("Not held:", missing.join(", "));
```

## pump.fun top 100

```bash theme={null}
curl -s -H "Authorization: Bearer $KEY" \
  "https://api.fomoscan.sh/v2/pump/leaderboard/traders?period=daily"
```

`period` is `daily`, `weekly` or `monthly`. Pass `at` (epoch ms or ISO) to read
the board as it stood at that time, for a weekly recap or a competition that
closes at a set hour.

## Details that matter

* **Refresh on a timer**, every 15 to 60 minutes, and serve the board from your
  own store. Visitors should not trigger API calls.
* **`pending` entries are not zero.** Show them as "updating" and ask again
  after `retryAfterSeconds`. A `ready` entry can still hold a window whose own
  `status` is `pending`, with null figures.
* **Missing handles are still charged.** Clean the list before you send it.
* **Each ready entry carries a wallet** and counts as a reveal. A free key
  reads the sample set only, so this board needs a paid plan.

> **Build it with us**
>
> We build these projects together with the teams that ship them. Tell us what
> you are building on [Telegram](https://t.me/fomoscan_support) or at
> [fomoscan-support@proton.me](mailto:fomoscan-support@proton.me) and we will
> help you scope it, size the credits and get it live.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.