Skip to content

Smart traders

GET
/chains/solana/smart-traders
curl --request GET \
--url 'https://api.getchord.xyz/v1/chains/solana/smart-traders?days=1&sort=score&limit=50'

The wallets that made repeated, verifiable profit over the last 1, 3 or 7 UTC days (today included): bots, launch wallets and lucky one-offs removed by named rules, then ranked by a luck-corrected score. Rebuilt every 10 minutes on the Solana side (computedAt); the request never computes, so it answers in milliseconds, and 503 for a few minutes after a deploy until the first build.

How a wallet gets on the board:

  • Profit you can stand behind. Realized PnL at average cost over the whole window (a position bought on day 1 and sold on day 3 counts), from swaps in pools quoted in SOL, USDC or USDT only. A position with more than 10 % of its amount traded through pools quoted in another token is left out (unpricedTokens), and so is one returning over 1,000× its cost or selling more than the token’s deepest pool could pay (suspectTokens).
  • A person, not a machine. Removed by name (checked.flags): cadence (over 500 swaps on a day), sniper (over 150 tokens on a day), burst (8+ transactions inside a minute, in more minutes than the wallet has active days), sameslot (sells within 2 s of buying, 5+ and 5 %+ of its sells), arb (transactions that buy and sell one token), scalp (median hold under 60 s: gone before anyone could follow), launch (most closed positions first bought within 2 s of that pool’s first swap: creator and bundle wallets).
  • One operator, one row. Wallets that made their first buy of the same 3+ tokens within 2 s of each other are one operator: the best score stays and carries siblings; a follower 30 s behind is not grouped.
  • Not luck. At least 5 tokens bought and sold, 10 swaps, $2,000 of volume, $1,000 realized and a 30 % win rate.
  • Score = realized × (0.35 + 0.65 × win rate shrunk toward 50 % with 20 phantom positions) × (0.5 + 0.5 × profitable days / active days) × (0.5 when one token made over 80 % of the profit, 0.75 over 60 %) × exp(−hours since the last trade / 48). rules repeats every threshold in words.

Candidates are the top 250 wallets by realized PnL in the window, so sort=roi and sort=winrate reorder that verified set rather than search every wallet; roi only ranks wallets that put at least $1,000 to work. from is where the window really starts: never before coverageSince. Unrealized PnL (unrealizedPnlUsd, held amount marked at most at the deepest pool’s liquidity) is shown, not ranked. Past profit over a few days is not a forecast.

Chord’s own Solana tape, read-only. No key needed.

  • What it reads. The swap events of 11 venues: PumpSwap, the pump.fun bonding curve, Meteora DBC, Meteora DAMM v2, Meteora DLMM, Meteora pools (dynamic AMM v1), Raydium CLMM, Raydium CPMM, Raydium AMM v4, Raydium LaunchLab and Orca Whirlpool. Each swap is checked against the pool vaults’ balance changes in the same transaction.
  • What it does not read. Prop AMMs (SolFi, HumidiFi and the like) and order books. SOL/USDC and other major pairs therefore show far less volume than the whole market; the numbers are accurate for pump.fun, Meteora and Raydium style tokens. Transfers are not seen either: wallet PnL is average cost inside the window.
  • History. Live since 2026-10-03 12:01 UTC, plus a backfill of the days before. coverageSince on /chains/solana/overview says from when totals are complete: quote that field, not a date.
  • Addresses are base58 and case-sensitive. Never lower-case a mint or a wallet: a lower-cased mint is a different string, refused with 400 BAD_ADDRESS when it stops being base58 (an L becomes l) and answered 404 TOKEN_NOT_FOUND otherwise. Solana has no numeric chain id here: the path segment is the literal solana.
  • Units. Token amounts are whole tokens (decimals already applied), quoteAmount is whole units of the pool’s quote (SOL, USDC, USDT or the other token), prices and *Usd fields are US dollars. Timestamps, updatedAt included, are Unix seconds.
  • Names are untrusted. symbol, name and image are whatever the token’s creator wrote; many mints share a symbol and there are no wash or impostor flags. Identify a token by its mint.
  • Errors. 400 BAD_* for a bad parameter; 400 UNSUPPORTED_CHAIN if Solana is not public on the deployment and the request has no X-API-Key; 503 CHAIN_DATA_UNAVAILABLE when the Solana store cannot be read in time and 503 CHAIN_NOT_ENABLED when the lane is off: retry later, never read either as “no trades”.
days
integer
default: 7
Allowed values: 1 3 7

Window in UTC days, today included.

sort
string
default: score
Allowed values: score pnl roi winrate

Descending.

limit
integer
default: 50 >= 1 <= 100
Media typeapplication/json
object
chain
string
Allowed value: solana
windowDays

1, 3 or 7.

integer
sort
string
from

Unix time, seconds, UTC.

integer
coverageSince

Unix time, seconds, UTC.

integer | null
computedAt

Unix time, seconds, UTC.

integer
tookMs

How long the last build of this window took on the Solana side.

integer
population
object
profitable

Wallets over the floors with realized PnL in the window.

integer
cadence

Of those, removed for over 500 swaps on a day.

integer
sniper

Removed for over 150 tokens on a day.

integer
checked
object
candidates

Wallets read swap by swap.

integer
kept

On the board.

integer
flags

Candidates removed per rule: cadence, sniper, burst, sameslot, arb, scalp, launch. A wallet can carry several; launch is only looked up for wallets no other rule removed.

object
key
additional properties
integer
suspect

Removed because most of the profit came from left-out positions.

integer
ineligible

Under a floor once read exactly.

integer
readErrors

Candidates whose swaps could not be read this cycle (back next cycle).

integer
clustered

Wallets dropped as a second wallet of an operator already on the board (see siblings).

integer
rules

Every threshold, in words.

object
key
additional properties
string
traders
Array<object>
object
wallet

Solana address, base58, case-sensitive. Never lower-case it.

string
/^[1-9A-HJ-NP-Za-km-z]{32,44}$/
score

Luck-corrected, recency-weighted realized profit; the default order.

number
realizedPnlUsd
number
roi

Realized ÷ cost of the sold amount; 0.5 = +50 %.

number | null
winRate

Share of closed tokens sold above their average buy, 0–1.

number | null
winRateAdj

Win rate shrunk toward 0.5.

number
closedTokens

Tokens bought and sold in the window.

integer
winningTokens
integer
tokens
integer
trades
integer
volumeUsd
number
activeDays
integer
profitableDays

Days whose closed positions (by last sell) netted a profit.

integer
medianHoldS

Median seconds between average buy and average sell, closed tokens.

number | null
unrealizedPnlUsd

Held amount at the current price (capped at the deepest pool’s liquidity) minus its average cost. Not ranked.

number
heldValueUsd
number
costSoldUsd

Cost of the sold amount at the average buy.

number
bestToken
object
token

Solana address, base58, case-sensitive. Never lower-case it.

string
/^[1-9A-HJ-NP-Za-km-z]{32,44}$/
symbol

Creator-chosen.

string | null
name

Creator-chosen.

string | null
image
string | null
realizedPnlUsd
number
bestShare

The best token’s share of realized PnL.

number | null
unpricedTokens
integer
suspectTokens
integer
launchTokens

Closed tokens first bought within 2 s of the pool’s first swap.

integer
siblings

Other wallets of the same operator left off the board: they made their first buy of the same 3+ tokens within 2 s of this one.

integer
lastTrade

Unix time, seconds, UTC.

integer
Example
{
"chain": "solana",
"windowDays": 7,
"from": 1790726400,
"coverageSince": 1790419777,
"computedAt": 1791304962,
"tookMs": 11141,
"population": {
"profitable": 16007,
"cadence": 3755,
"sniper": 86
},
"checked": {
"candidates": 250,
"kept": 25,
"flags": {
"cadence": 0,
"sniper": 0,
"burst": 92,
"sameslot": 125,
"arb": 8,
"scalp": 101,
"launch": 27
},
"suspect": 0,
"ineligible": 69,
"readErrors": 0,
"clustered": 0
},
"rules": {
"pricing": "PnL counts only swaps in pools quoted in SOL, USDC or USDT (direct USD); a position with more than 10 % of its amount traded through pools quoted in another token is left out (unpriced)",
"averageCost": "realized = sold amount (up to what was bought in the window) × (average sell − average buy); tokens bought before the window are not priced",
"suspect": "a position returning more than 1000× its cost, or one sell above $1,000,000 into a token whose deepest pool now holds less than 1/20 of it, is left out; a wallet whose profit came mostly from such positions is left out",
"cadence": "more than 500 swaps on any day",
"sniper": "more than 150 tokens on any day",
"burst": "8+ transactions inside one minute, in 3+ different minutes",
"sameslot": "5+ sells within 2 s of buying the same token (sandwich / bundle / launch sniper)",
"arb": "10+ transactions (and 20 %+ of all) that buy and sell the same token",
"cluster": "wallets that made their first buy of the same 3+ tokens within 2 s of each other are one operator: only the best score stays (siblings on its row, checked.clustered)",
"scalp": "median hold under 60 s over 5+ closed positions (sold before anyone could follow)",
"launch": "3+ closed positions, and at least half of them, first bought within 2 s of that pool's first swap (creator / bundle wallet)",
"eligibility": "volume ≥ $2000, ≥ 5 tokens bought and sold, ≥ 10 swaps, realized ≥ $1000, win rate ≥ 30 %",
"score": "realized × (0.35 + 0.65 × win rate shrunk toward 50 % with 20 phantom positions) × (0.5 + 0.5 × profitable days / active days) × (0.5 when one token made > 80 % of the profit, 0.75 when > 60 %) × exp(−hours since last trade / 48)"
},
"traders": [
{
"wallet": "9LXWa7V3AE15VfBupcx5gDts2ix3Y9NzbcKZKjkkq6hV",
"score": 37132.17771163606,
"realizedPnlUsd": 43978.0170266694,
"roi": 0.4170270878884252,
"winRate": 0.7761627906976745,
"winRateAdj": 0.760989010989011,
"closedTokens": 344,
"winningTokens": 267,
"tokens": 459,
"trades": 1356,
"volumeUsd": 314916.44803633285,
"activeDays": 7,
"profitableDays": 7,
"medianHoldS": 177.9890558719635,
"unrealizedPnlUsd": -61.60543642516731,
"heldValueUsd": 2038.5111692911005,
"costSoldUsd": 105456.02025361871,
"bestToken": {
"token": "Am6SB1xhuwyv6hENfR2uHj2fvKeo87KN8vVw28RcrmEa",
"symbol": "Cassie",
"name": "Cassie The Chimpanzee",
"image": "https://metadata.j7tracker.io/images/1c2700b89272443f",
"realizedPnlUsd": 7868.563813198551
},
"bestShare": 0.17892038671108912,
"unpricedTokens": 62,
"suspectTokens": 0,
"launchTokens": 20,
"siblings": 0,
"lastTrade": 1791304899
},
{
"wallet": "cATq48AALCiD2hECKZDgKHp3VoSHbXc4aDxSzgQLbc3",
"score": 32503.036821818743,
"realizedPnlUsd": 63356.15881453157,
"roi": 0.5491717745407618,
"winRate": 0.6666666666666666,
"winRateAdj": 0.5853658536585366,
"closedTokens": 21,
"winningTokens": 14,
"tokens": 25,
"trades": 100,
"volumeUsd": 308927.798739281,
"activeDays": 7,
"profitableDays": 4,
"medianHoldS": 1102.3087236881256,
"unrealizedPnlUsd": 0,
"heldValueUsd": 0,
"costSoldUsd": 115366.74270543561,
"bestToken": {
"token": "9m4Swt3D8aTzzeDEaA5xmCA8Sjd5uvWrhvMKTocjpump",
"symbol": "GTA6 Coin",
"name": "GTA6 Coin",
"image": "https://gateway.pinata.cloud/ipfs/bafkreibbdrekbfek6cbxrzi4meqbxzjnxzaycvlfnghnde3kr2rrz3vxne",
"realizedPnlUsd": 19491.505347944916
},
"bestShare": 0.3076497330749522,
"unpricedTokens": 0,
"suspectTokens": 0,
"launchTokens": 7,
"siblings": 0,
"lastTrade": 1791285568
}
],
"sort": "score"
}

BAD_DAYS / BAD_SORT / BAD_LIMIT, or UNSUPPORTED_CHAIN (Solana is not public on this deployment and the request has no X-API-Key).

Media typeapplication/json

Every non-2xx body.

object
error
required

Stable machine code, e.g. INVALID_PARAMS, NOT_READY, RATE_LIMIT_EXCEEDED.

string
message

For humans.

string
statusCode

HTTP status, when included.

integer
Example
{
"error": "INVALID_PARAMS",
"message": "amount must be an integer string in the token's smallest unit"
}

Over the per-minute limit (RATE_LIMIT_EXCEEDED). Read X-RateLimit-Reset and back off.

Media typeapplication/json

Every non-2xx body.

object
error
required

Stable machine code, e.g. INVALID_PARAMS, NOT_READY, RATE_LIMIT_EXCEEDED.

string
message

For humans.

string
statusCode

HTTP status, when included.

integer
Example
{
"error": "INVALID_PARAMS",
"message": "amount must be an integer string in the token's smallest unit"
}

CHAIN_DATA_UNAVAILABLE (the Solana store did not answer in time) or CHAIN_NOT_ENABLED (the lane is off on this deployment). Retry later; do not treat it as an empty answer.

Media typeapplication/json

Every non-2xx body.

object
error
required

Stable machine code, e.g. INVALID_PARAMS, NOT_READY, RATE_LIMIT_EXCEEDED.

string
message

For humans.

string
statusCode

HTTP status, when included.

integer
Example
{
"error": "INVALID_PARAMS",
"message": "amount must be an integer string in the token's smallest unit"
}