Skip to content

Every token traded in the last 24 hours

GET
/chains/solana/tokens
curl --request GET \
--url 'https://api.getchord.xyz/v1/chains/solana/tokens?sort=volume&limit=100'

The 24-hour board. volume ranks the 600 most traded tokens and trades the 300 with the most trades; change (24-hour price change) and new (first seen in the last 24 hours, newest first) rank inside the 600 most traded tokens with at least $5,000 of volume, so a $40 pool moving 900 % is not a mover. Cached 20 seconds.

Volume-bot tapes and impostors are left out (screened counts them, all=1 keeps them in with their screen). Most of Solana’s busiest tokens are wallets trading with themselves: on 13 and 14 October, 265 and 271 of the 400 most traded tokens had under 3 % of their volume from wallets that went one way, about 70 % of the board’s volume (one of them printed $150M on $350k of liquidity, 78 wallets each buying and selling ~$1.56M). A token is left out when under 10 % of its 24-hour volume is one-way (oneWayPct) unless it is a deep market (at least $250k of SOL / stable liquidity turned over at most 10× in the window: majors whose Solana flow is arbitrage stay). Many tokens still share a symbol.

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”.
sort
string
default: volume
Allowed values: volume trades change new

Descending; new = newest first.

limit
integer
default: 100 >= 1 <= 200
Media typeapplication/json
object
sort
string
windowHours
integer
tokens
Array<object>

One Solana token with its 24-hour tape.

object
token

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

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

Creator-chosen; null until the metadata worker has read it.

string | null
name

Creator-chosen.

string | null
image

Image URL from the token’s metadata, as published by its creator.

string | null
decimals
integer | null
priceUsd

Last price on the token’s main pool (traded in the last hour first, then the deepest).

number | null
change24hPct

Price now against the main pool’s close 24 hours ago.

number | null
volume24hUsd

USD over the 24-hour window, every pool the tape reads.

number
trades24h
integer
buys24h
integer
buyVolume24hUsd
number
liquidityUsd

Main pool: twice its quote-side reserve in USD, from the last swap whose event carried the reserve. An estimate; null when unknown.

number | null
marketCapUsd

Price × supply: fully diluted.

number | null
pool

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

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

Venue id: pumpswap · pumpfun (bonding curve) · meteora_dbc · meteora_damm_v2 · meteora_dlmm · meteora_pools (dynamic AMM v1) · raydium_clmm · raydium_cpmm · raydium_v4 · raydium_launchlab · orca (Whirlpool).

string | null
firstSeen

Unix time, seconds, UTC.

integer | null
oneWayPct

Percent of the 24-hour dollar volume traded by wallets that went one way: each wallet’s smaller side (bought or sold, in USD) under half its larger side. The rest is wallets buying and selling about the same amounts back and forth: arbitrage, market making or wash trading. Null when not measured.

number | null
screen

Why the boards leave this token out, or null. volume bot: under 10 % of its 24-hour volume came from one-way wallets and it is not a deep market (at least $250k of SOL / stable liquidity turned over at most 10× in the window). impostor: the ticker of SOL, USDC or USDT, look-alike letters included, on another mint.

string | null
Allowed values: volume bot impostor
screened

What the board left out.

object
tokens

Candidates of this board left out.

integer
volumeUsd

Their 24-hour volume.

number
byReason

Count per screen value.

object
key
additional properties
any
rule

The rule, in words.

string
measured

False when the volume screen did not run for this board (the tape’s per-wallet rollup is missing or behind): rows are then unscreened for volume.

boolean
updatedAt

Unix time, SECONDS, when the Solana box built this answer. Unlike the rest of the API (milliseconds).

integer
Example
{
"sort": "trades",
"windowHours": 24,
"tokens": [
{
"token": "So11111111111111111111111111111111111111112",
"symbol": "SOL",
"name": "Solana",
"image": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/So11111111111111111111111111111111111111112/logo.png",
"decimals": 9,
"priceUsd": 120.98396092263611,
"change24hPct": 1.1310855236659645,
"volume24hUsd": 92343484.342816,
"trades24h": 668125,
"buys24h": 344626,
"buyVolume24hUsd": 47132735.284852006,
"liquidityUsd": 30496683.315842,
"marketCapUsd": null,
"pool": "58oQChx4yWmvKdwLLZzBi4ChoCc2fqCUWBkwMihLYQo2",
"dex": "raydium_v4",
"firstSeen": 1791028889
},
{
"token": "Xs3oZwbHvqis4NYcf4YKWmEia2eC84wSiVrcYcTqpH8",
"symbol": "SPCXx",
"name": "SpaceX xStock",
"image": "https://xstocks-metadata.backed.fi/logos/tokens/SPCXx.png",
"decimals": 8,
"priceUsd": 163.10022589848552,
"change24hPct": null,
"volume24hUsd": 37511133.496547684,
"trades24h": 476322,
"buys24h": 230903,
"buyVolume24hUsd": 18759541.58185133,
"liquidityUsd": 95373.03161138113,
"marketCapUsd": 91333037.55386804,
"pool": "B7nYoGHqCGoFRiPB4AoT1NqbqrFWJDfiEkD3WNXxSCnt",
"dex": "raydium_cpmm",
"firstSeen": 1791028946
}
],
"updatedAt": 1791166451
}

BAD_LIMIT / BAD_SORT, 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"
}