Trader signals API
Which tracked traders are in this token, and are they still holding?
Leaderboard-ranked trader wallets that traded one token: first buy, cost, proceeds, holdings and whether they still hold. On Solana it can read their live balances instead of the snapshot.
/api/external/signals/signals-whos-in/{chain}/{mint}What it returns
Every tracked trader — a wallet ranked on a public trader leaderboard — that bought or sold one token, one row per wallet: its first buy (time, size, price, market cap), buy and sell counts, cost and proceeds, the holdings it is known to keep, whether it is still holding, and which ranked traders the wallet belongs to. Built from each tracked wallet's full trade history in the token; coverage.complete is true when that history was read for every tracked wallet. When it is false the answer covers only the trades recorded since each board started being followed (coverage.since), so a wallet that traded the token earlier can be missing. A token no tracked trader touched answers an empty holders list. By default holdings is the recorded snapshot: the last balance measured, carried forward by the trades after it. live=true reads each wallet's on-chain balance right now instead (SOL only, the 150 most recently active wallets): those rows answer holdingsBasis "live" and holdingsAt the moment of the read, a wallet that left by transfer reads as exited, and coverage.live says how many were read, failed or skipped. A live answer takes about 2 s.
Chains
- Solana SOL
- BNB Chain BNB
- Ethereum ETH
- Base BASE
- Robinhood Chain RHC
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/signals/signals-whos-in/SOL/<mint>"
| Parameter | Description |
|---|---|
livequery · boolean · optional | true reads each wallet's on-chain balance right now (SOL only, up to 150 wallets, about 2 s). Default false: the recorded snapshot. |
chainpath · string · required | The chain the token lives on. Served on SOL, BNB, ETH, BASE, RHC; every other chain returns 400. |
mintpath · string · required | The token mint address (Solana) or contract address (EVM). |
Response fields
A JSON response. Every field is always present; null means the value could not be established, never zero.
| Field | Type | Description |
|---|---|---|
chain | string | The chain asked about. |
address | string | The token, as matched (lower-cased on EVM chains). |
generatedAt | integer | null | When this answer was built, unix seconds. |
summary | object | Wallets by status. Each count is null when not reported. |
summary.wallets | integer | null | Wallets listed. |
summary.holding | integer | null | Wallets that bought and never sold. |
summary.partial | integer | null | Wallets that sold part. |
summary.exited | integer | null | Wallets that sold everything. |
summary.unknown | integer | null | Wallets whose position cannot be told from the trades on record. |
holders | object[] | One row per wallet. |
holders[].wallet | string | The wallet. |
holders[].firstBuy | object | null | Its first buy on record. null when it only sold on record. |
holders[].firstBuy.at | integer | null | When, unix seconds. |
holders[].firstBuy.txHash | string | null | The transaction. null when not reported. |
holders[].firstBuy.usdAmount | number | null | Its size in USD. null when not reported. |
holders[].firstBuy.priceUsd | number | null | The token price in USD. null when not reported. |
holders[].firstBuy.marketCapUsd | number | null | The token's market cap in USD. null when not reported. |
holders[].lastTradeAt | integer | null | Its latest trade on record, unix seconds. |
holders[].buys | integer | null | Buys on record. |
holders[].sells | integer | null | Sells on record. |
holders[].tokensBought | number | null | Tokens bought. null when any buy lacks the figure. |
holders[].tokensSold | number | null | Tokens sold. null when any sell lacks the figure. |
holders[].costUsd | number | null | USD spent buying. null when any buy lacks the figure. |
holders[].proceedsUsd | number | null | USD taken selling. null when any sell lacks the figure. |
holders[].holdings | number | null | Tokens it is known to hold. null when no balance is known. |
holders[].holdingsAt | integer | null | When that balance was measured, unix seconds. |
holders[].holdingsBasis | string | null | Where the balance comes from: "reported" by the board, read from the "transaction" itself, computed from the full trade "history", or a "live" balance read. null when none. |
holders[].holdingsDerived | boolean | null | Whether the balance was carried forward from an older measurement by later trades. |
holders[].status | string | null | Holding, partly sold, fully exited, or unknown from the trades on record. |
holders[].sources | string[] | The boards that reported its trades. |
holders[].traders | object[] | The ranked traders this wallet belongs to. Empty when none claims it. |
holders[].traders[].id | string | The trader, "<SOURCE>:<id>" — the subject signals-trader takes. |
holders[].traders[].source | string | The board that tracks the trader. |
holders[].traders[].handle | string | null | The name the trader goes by on that board. |
holders[].traders[].xHandle | string | null | The trader's X (Twitter) username. null when not linked. |
holders[].traders[].avatarUrl | string | null | The trader's picture. null when none. |
holders[].traders[].resolution | string | null | How the wallet is tied to the trader: "native", "confirmed" or "candidate". |
holders[].traders[].placement | object | null | The trader's best standing board placement. null when no board lists them now. |
holders[].traders[].placement.board | string | The board period: 24h, 7d or 30d. |
holders[].traders[].placement.rank | integer | null | The rank on it, 1 = best. |
holders[].traders[].placement.pnlUsd | number | null | The PnL in USD the board ranks on. null when not reported. |
holders[].traders[].placement.pnlNative | number | null | The PnL in the chain's native coin. null when not reported. |
coverage | object | |
coverage.since | object | Per board, its oldest trade on record (unix seconds): how far back an incomplete answer reaches. |
coverage.complete | boolean | True when every tracked wallet's full trade history in this token was read; false when the answer covers the trades on record only. |
coverage.live | object | What the live balance read covered. requested and used are false on a default answer. |
coverage.live.requested | boolean | Whether live=true was asked. |
coverage.live.used | boolean | Whether balances were read now. false when not asked, or when the chain is not served live. |
coverage.live.checked | integer | null | Wallets whose balance was read now. |
coverage.live.failed | integer | null | Wallets whose read failed; they keep the recorded figure. |
coverage.live.skipped | integer | null | Wallets past the 150-wallet cap, least recently active first; they keep the recorded figure. |
coverage.live.reason | string | null | Why the read did not run or was partial: "not_configured", "unsupported_network" or "partial_failure". null when it ran in full or was not asked. |
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