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.
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?
curl "https://api.crius.sh/v1/robinhood/token/0x7b8892cea949bc60d494681d1bc3ea96071ab0b8/traders?limit=3" \ -H "x-api-key: $CRIUS_API_KEY"const res = await fetch("https://api.crius.sh/v1/robinhood/token/0x7b8892cea949bc60d494681d1bc3ea96071ab0b8/traders?limit=3", { headers: { "x-api-key": process.env.CRIUS_API_KEY },});const { data, meta } = await res.json();import os, requests
r = requests.get( "https://api.crius.sh/v1/robinhood/token/0x7b8892cea949bc60d494681d1bc3ea96071ab0b8/traders?limit=3", headers={"x-api-key": os.environ["CRIUS_API_KEY"]},)body = r.json()print(body["data"])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"andmeta.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 forsold_usd: 1547.98,pnl_usd: 1302.88,roi_pct: 531.573.balance: 0, so it’s all realized. It held forholding_time_s: 118676(about 33 hours, first to last trade) and paidgas_spent_usd: 0.0875722. - Rank 3,
0x83055f3e7be4e289733bbc8c7bd42a6443177f07, doubled its money (roi_pct: 99.7395) inholding_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, yetbalanceis 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) andcost_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
| Field | Meaning |
|---|---|
rank, address, tags | Position in the ranking, the trader, and its wallet tags. |
buys, sells | Number of trades on each side in the window. |
bought, sold, balance | Tokens bought, sold, and held now. |
bought_usd, sold_usd, bought_eth, sold_eth | What 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_usd | Average price per token on each side. |
realized_pnl_usd, unrealized_pnl_usd, pnl_usd | PnL on what was sold, on what's still held, and the total. |
roi_pct | pnl_usd as a percentage of bought_usd. |
cost_basis | complete, or unknown (sold tokens received by transfer) when PnL can't be computed. |
gas_spent_usd | Gas (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_s | First 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,7dorall(default). Only trades in the window count.tag: only traders with any of these tags, for exampletag=smart_accountortag=fomo.exclude: leave out tags, for exampleexclude=dev,sniper,exchangefor 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) andcursor(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
-
Get a Free key.
/tradersneeds the Free plan and costs 5 credits per call. Send it in thex-api-keyheader. -
Pick the question. “Who won?” is
sort=pnl. “Who’s winning today?” iswindow=24h. “Who’s actually trading it?” issort=volume. Copy-trading lists usually addexclude=dev,sniper. -
Show how, not just how much.
buys,sells,holding_time_sandroi_pcttell a sniper’s quick flip apart from a patient position. -
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.
Related
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