Discovery and markets API
Unrealized-PnL wallet ranking, 6 chains
Wallets ranked by UNREALISED mark-to-market profit on ONE of 6 chains, highest gain first only — no losers direction. Distinct from realized-pnl-leaders: REALIZED SOL profit since 2024-09-01.
/api/external/discovery/unrealized-pnl-leaders/{chain}What it returns
Ranks wallets by total profit on ONE CHAIN over a selectable window. Chain-scoped only: there is no way to narrow this to a single token, and none is offered. ONE-DIRECTIONAL RANKING: highest unrealised gain first, always — there is no losers or reverse-sort direction, and none is offered; the source itself now rejects every value of its own reversal parameter but its own default. DISTINCT FROM realized-pnl-leaders: that endpoint ranks Solana wallets by REALIZED profit since a fixed epoch; THIS endpoint ranks wallets on six chains by a profit figure that is almost always UNREALISED. The two are not fallbacks for each other and never share a field meaning. IMPORTANT: totalPnlUsd is overwhelmingly an UNREALISED, mark-to-market figure on positions still open, not banked profit, on every chain this serves. Measured across two independent full runs of 120 ranked wallets on six chains: only ONE row ever had a majority of its profit realised, and most rows claim more profit than the USD notional the wallet has ever traded — the worst measured row claimed $18,528,065 of profit on $0.12 of volume. Always read realizedPnlUsd (profit already sold — a real 0 means nothing has been sold yet, not missing data) and volumeUsd beside totalPnlUsd before treating a row as a trading record. The cause of the gap is not established: a thin position marked to an illiquid price, and a mis-recorded cost basis, both fit the same data. Only the head of a ranking is stable between requests — the tail can reshuffle within minutes, and how far the instability reaches depends on the chain. A row identifies a wallet by address alone: no name, label or score travels with it. A cache may sit in front of this endpoint, so a ranking already a little stale is a normal answer, not a bug.
Chains
- Solana SOL
- BNB Chain BNB
- Ethereum ETH
- Base BASE
- Robinhood Chain RHC
- Arc ARC
Request
Send your key in the x-dex-data-key header. Replace each <placeholder> with a real value.
curl -H "x-dex-data-key: $DEXDATA_API_KEY" \ "https://api.dexdata.io/api/external/discovery/unrealized-pnl-leaders/SOL?window=today&limit=<limit>"
| Parameter | Description |
|---|---|
windowquery · string · required | The ranking window. today and yesterday are distinct one-day windows (verified to return different rankings), not "the last 24 hours" twice; 1W/30d/90d are longer windows the source itself defines, and their exact boundaries (calendar vs. rolling) are not independently confirmed.todayyesterday1W30d90d |
limitquery · integer · required | How many wallets to return, highest totalPnlUsd first. Capped at 100 — the wired source's own per-call ceiling (enforced after the API-key gate; see above). |
chainpath · string · required | SOL, BNB, ETH, BASE, RHC and ARC; STABLE returns 400, because the wired source has no coverage there — see isUnrealizedPnlLeadersSupported. CELO, ARB, OP and SCROLL return 400 here. |
Response fields
A JSON response. Every field is always present; null means the value could not be established, never zero.
| Field | Type | Description |
|---|---|---|
traders | object[] | Ranked highest totalPnlUsd first. Empty when the source has nothing for this chain/window/limit combination — not the same claim as nobody having traded. |
traders[].wallet | string | The wallet address. |
traders[].totalPnlUsd | number | null | realizedPnlUsd + unrealizedPnlUsd — the field this ranking is SORTED BY. Almost always dominated by unrealizedPnlUsd; see this schema's own description above before reading this as money made. null when this deployment could not establish it at all, OR when the source sent a bare profit figure without both halves of its own decomposition beside it, OR when the two halves do not sum to it within tolerance — a profit figure this endpoint cannot characterise as realised or unrealised is withheld rather than published bare. |
traders[].realizedPnlUsd | number | null | Profit already taken out — what has actually been SOLD. A real, measured 0 (46.67% of rows in one full measurement run) means "has sold nothing yet", not missing data. |
traders[].unrealizedPnlUsd | number | null | Paper gain or loss on what is still held, marked to the source's current price. |
traders[].volumeUsd | number | null | Total notional traded, buy and sell together, over the requested window. |
traders[].tradeCount | integer | null | Trade count over the requested window. |
Start building with DexData today
Sign in, create a key and make your first call in a minute. Free credits every month, and you only pay for calls that succeed.
Get a free API key