This is the v1 reference. v1 stops answering on November 1, 2026. Build on v2: see where this route went.
Rank traders
MCP tool: list_traders
Start here when the question is who to copy. copyScore and copyGrade are our own quality measure and are a better default than raw profit, which usually puts one lucky whale on top.
observedNetPnlUsd is what we watched the trader make across the trades we recorded. officialPnlUsd is what the venue reports about them. They answer different questions and can disagree.
Each call counts toward your key's 10 trader listings a day. Listing traders never uses up the 100 traders a day you can open.
Query parameters
platformstringOne of "polymarket", "kalshi", "hyperliquid". Omit for every venue.
sortstringdefault: profit"profit", "copy_score", "observed_net_pnl", "official_pnl" or "official_volume". Prefer copy_score when looking for someone to actually follow.
limitnumberdefault: 501 to 100.
offsetnumberdefault: 0For paging. The API lists the top 100 traders, so offset must be under 100.
Response
copyGrade is A to D. A trader with few observedTrades can still carry a high officialPnlUsd, so read the counts before the money.
curl "https://api.rivo.markets/v1/traders?sort=copy_score&limit=25" \
-H "Authorization: Bearer rivo_live_..."import requests
r = requests.get(
"https://api.rivo.markets/v1/traders",
headers={"Authorization": "Bearer rivo_live_..."},
params={
"sort": "copy_score",
"limit": 25,
},
)
print(r.json()["data"])const res = await fetch("https://api.rivo.markets/v1/traders?sort=copy_score&limit=25", {
headers: { Authorization: "Bearer rivo_live_..." },
});
const { data } = await res.json();{
"success": true,
"data": [
{
"platform": "polymarket",
"traderId": "0x9f2c...b7a4",
"displayName": "coldbrew",
"copyScore": 78,
"copyGrade": "A",
"observedTrades": 214,
"observedWins": 131,
"observedLosses": 71,
"observedNetPnlUsd": 48210.55,
"officialPnlUsd": 51992.1,
"followerCount": 37,
"isFollowed": false
}
]
}