CRIUS Docs
API status Get API key
Holders & wallets

Find a token's top traders and their PnL

Rank the traders of any Robinhood Chain token by PnL, volume, buys or ROI, with wallet tags, gas and hold time. A real example with the PnL math explained.

Updated 3 min read
Short answer

Call GET /v1/robinhood/token/{address}/traders?sort=pnl&window=all (Free plan, 5 credits). Each trader has pnl_usd, realized_pnl_usd, unrealized_pnl_usd, roi_pct, buys, sells, bought_usd, sold_usd, gas_spent_usd, holding_time_s and tags (dev, sniper, whale, smart_account, fomo…). PnL uses average cost with USD at trade time.

A token’s top traders are the wallets that made the most from trading it. Crius adds up every buy and sell each wallet made in the token, attributed to the real trader behind routers, bots and smart accounts, and ranks them by profit, volume, number of buys or return. Each trader comes with its realized and unrealized PnL, what it paid and received in USD and ETH, gas spent, how long it held, and tags that say whether it was the dev, a sniper or a whale.

Get the leaderboard in one call

CHARGE's top three traders: $1,302.88, $994.45 and $838

Who made the most trading Charge AI (0x7b8892cea949bc60d494681d1bc3ea96071ab0b8), and how?

GET/v1/robinhood/token/0x7b8892cea949bc60d494681d1bc3ea96071ab0b8/traders?limit=3
curl "https://api.crius.sh/v1/robinhood/token/0x7b8892cea949bc60d494681d1bc3ea96071ab0b8/traders?limit=3" \
-H "x-api-key: $CRIUS_API_KEY"
Real response 200 Captured Oct 28, 2026 · 91 lines (arrays trimmed)
{
"data": [
{
"address": "0x9e38fedc40987c19396cc20ea59eb2b1b7928881",
"avg_buy_usd": 0.00000842823,
"avg_sell_usd": 0.0000532304,
"balance": 0,
"bought": 29080767.335830362668108408,
"bought_eth": 0.099,
"bought_usd": 245.099,
"buys": 1,
"cost_basis": "complete",
"first_trade_ts": 1791983208000,
"gas_spent_usd": 0.0875722,
"holding_time_s": 118676,
"last_trade_ts": 1792101884000,
"pnl_usd": 1302.88,
"rank": 1,
"realized_pnl_usd": 1302.88,
"roi_pct": 531.573,
"sells": 7,
"sold": 29080767.335830362668108408,
"sold_eth": 0.635695,
"sold_usd": 1547.98,
"tags": [],
"unrealized_pnl_usd": 0
},
{
"address": "0x7c79ad74d36dea424d08a5d326271bf03da81f6a",
"avg_buy_usd": 0.00000790248,
"avg_sell_usd": 0.0000343631,
"balance": 0,
"bought": 46475393.982901663958413733,
"bought_eth": 0.1485,
"bought_usd": 367.271,
"buys": 2,
"cost_basis": "complete",
"first_trade_ts": 1791983183000,
"gas_spent_usd": 0.0712204,
"holding_time_s": 125872,
"last_trade_ts": 1792109055000,
"pnl_usd": 994.45,
"rank": 2,
"realized_pnl_usd": 994.45,
"roi_pct": 270.767,
"sells": 4,
"sold": 37582304.39247174197236032,
"sold_eth": 0.528147,
"sold_usd": 1291.44,
"tags": [],
"unrealized_pnl_usd": 0
},
{
"address": "0x83055f3e7be4e289733bbc8c7bd42a6443177f07",
"avg_buy_usd": 0.000023621,
"avg_sell_usd": 0.0000471805,
"balance": 0,
"bought": 35569497.20243776424709037,
"bought_eth": 0.3465,
"bought_usd": 840.189,
"buys": 3,
"cost_basis": "complete",
"first_trade_ts": 1791988168000,
"gas_spent_usd": 0.0631376,
"holding_time_s": 4039,
"last_trade_ts": 1791992207000,
"pnl_usd": 838,
"rank": 3,
"realized_pnl_usd": 838,
"roi_pct": 99.7395,
"sells": 3,
"sold": 35569497.20243776424709037,
"sold_eth": 0.691944,
"sold_usd": 1678.19,
"tags": [],
"unrealized_pnl_usd": 0
}
],
"meta": {
"block": 100406823,
"block_age_ms": 829,
"block_ts": 1793225080000,
"chain": "robinhood",
"finalized_block": 100397649,
"lag_ms": 64,
"next_cursor": "3",
"pnl_method": "average cost; USD at trade time; unrealized at current price",
"safe_block": 100401329,
"window": "all"
}
}

What this tells you

  • meta.window: "all" and meta.pnl_method: "average cost; USD at trade time; unrealized at current price": the defaults rank by total PnL over the token’s whole history.
  • Rank 1, 0x9e38fedc40987c19396cc20ea59eb2b1b7928881: one buy of 0.099 ETH (bought_usd: 245.099), seven sells for sold_usd: 1547.98, pnl_usd: 1302.88, roi_pct: 531.573. balance: 0, so it’s all realized. It held for holding_time_s: 118676 (about 33 hours, first to last trade) and paid gas_spent_usd: 0.0875722.
  • Rank 3, 0x83055f3e7be4e289733bbc8c7bd42a6443177f07, doubled its money (roi_pct: 99.7395) in holding_time_s: 4039, about 67 minutes. Three buys, three sells, $840.189 in and $1,678.19 out.
  • Rank 2, 0x7c79ad74d36dea424d08a5d326271bf03da81f6a, bought 46,475,393 tokens and sold only 37,582,304, yet balance is 0: the rest left the wallet by transfer. Those tokens count neither as a sale nor as a loss, so its PnL is the realized profit on what it sold, 994.45.
  • All three have tags: [] (no dev, sniper or whale tag) and cost_basis: "complete". Ranks 1 and 2 first traded about six minutes after CHARGE was created on Pons (2026-10-14 13:00 UTC): early, but not snipers.

How the PnL is computed

For each trader and token, using the USD value of every trade at the time it happened:

  • Average buy price = bought_usd ÷ tokens bought (avg_buy_usd).
  • Realized PnL = sold_usd − tokens sold × average buy price.
  • Unrealized PnL = current value of the balance − its cost at the average buy price.
  • pnl_usd = realized + unrealized. roi_pct = pnl_usd ÷ bought_usd × 100.

Check it on rank 1: 1,547.98 − 245.099 = 1,302.88, and 1,302.88 ÷ 245.099 = 531.57%. Gas isn’t subtracted from PnL; it’s in gas_spent_usd so you can net it out yourself. How PnL works covers the edge cases.

What the fields mean

FieldMeaning
rank, address, tagsPosition in the ranking, the trader, and its wallet tags.
buys, sellsNumber of trades on each side in the window.
bought, sold, balanceTokens bought, sold, and held now.
bought_usd, sold_usd, bought_eth, sold_ethWhat the buys cost and the sells returned, in USD at trade time and in ETH (ETH- and WETH-quoted trades).
avg_buy_usd, avg_sell_usdAverage price per token on each side.
realized_pnl_usd, unrealized_pnl_usd, pnl_usdPnL on what was sold, on what's still held, and the total.
roi_pctpnl_usd as a percentage of bought_usd.
cost_basiscomplete, or unknown (sold tokens received by transfer) when PnL can't be computed.
gas_spent_usdGas (L2 + L1) of the trader's trades in this token; null for tokens with more than 2M trades in the window.
first_trade_ts, last_trade_ts, holding_time_sFirst and last trade, and how long the position was open: until now if it still holds, else first to last trade.

Filter and sort

  • sort: pnl (default), realized_pnl, volume, buys, roi.
  • window: 1h, 24h, 7d or all (default). Only trades in the window count.
  • tag: only traders with any of these tags, for example tag=smart_account or tag=fomo.
  • exclude: leave out tags, for example exclude=dev,sniper,exchange for outside traders only.
  • include_contracts=true: add program contracts (bots, vaults, routers), which are left out by default. Smart accounts are wallets and always included unless excluded.
  • limit (up to 500, default 50) and cursor (meta.next_cursor) to page.

The ranking is computed over the 3,000 traders with the most volume in the window.

Use it in your app

  1. Get a Free key. /traders needs the Free plan and costs 5 credits per call. Send it in the x-api-key header.

  2. Pick the question. “Who won?” is sort=pnl. “Who’s winning today?” is window=24h. “Who’s actually trading it?” is sort=volume. Copy-trading lists usually add exclude=dev,sniper.

  3. Show how, not just how much. buys, sells, holding_time_s and roi_pct tell a sniper’s quick flip apart from a patient position.

  4. Drill into one trader. The trade tape with trader=<address> lists that wallet’s trades in the token, and the wallet profile its PnL across every token.

// Top 10 outside traders of a token by PnL over the last 7 days.
const token = "0x7b8892cea949bc60d494681d1bc3ea96071ab0b8";
const q = new URLSearchParams({ sort: "pnl", window: "7d", exclude: "dev,sniper,exchange", limit: "10" });
const res = await fetch(`https://api.crius.sh/v1/robinhood/token/${token}/traders?${q}`, {
headers: { "x-api-key": process.env.CRIUS_API_KEY },
});
const { data } = await res.json();
for (const t of data) {
const hours = (t.holding_time_s / 3600).toFixed(1);
console.log(t.rank, t.address, `PnL $${t.pnl_usd ?? "?"}`, `ROI ${t.roi_pct ?? "?"}%`, `${t.buys}/${t.sells}`, `${hours} h`, t.tags.join(","));
}

Frequently asked questions

How do I find the top traders of a Robinhood Chain token?

Call /v1/robinhood/token/{address}/traders?sort=pnl&window=all. Traders come back ranked by total PnL (realized plus unrealized). Use window=24h or 7d for recent winners and sort=volume for the biggest traders whatever their result.

How is a trader's PnL calculated?

Average cost, in USD at the time of each trade. Realized PnL is what the trader got for its sells minus what those tokens cost at its average buy price. Unrealized PnL is the current value of what it still holds minus their cost. pnl_usd is the sum. Gas isn't subtracted: it's reported separately in gas_spent_usd.

How do I see only outside traders, without the dev and snipers?

Add exclude=dev,sniper,exchange. To look at one group only, use tag, for example tag=smart_account for EIP-7702 wallets or tag=fomo for FOMO app wallets. Program contracts (bots, vaults, routers) are left out by default; include_contracts=true adds them back.

Why is a trader's PnL `null`?

It sold more tokens than it bought, so part of what it sold came from a transfer and has no known cost. cost_basis then says unknown (sold tokens received by transfer), and pnl_usd, realized_pnl_usd, unrealized_pnl_usd and roi_pct are null. They sort last when you rank by PnL or ROI.

Which plan does the top traders endpoint need?

The Free plan (a free API key), 5 credits per call. See Plans & limits.

Get your free Crius API key

Every example on this page works with a free key: higher rate limits than the anonymous plan, holders, wallets and the WebSocket stream. No card needed.

  • Robinhood Chain (4663) only, from our own archive nodes
  • REST + WebSocket
  • Pay on-chain or by card