Skip to content

One token: stats, pools and hourly tape

GET
/chains/solana/token/{address}
curl --request GET \
--url 'https://api.getchord.xyz/v1/chains/solana/token/example?hours=168'

Identity (from the token’s metadata), price on the main pool with 1-hour and 24-hour change, fully diluted market cap, liquidity summed over the pools that traded in the last 24 hours, 24-hour volume and trade counts with the venue split, up to 20 pools, and an hourly series.

Pass hours of 24 or more: the 24-hour totals are summed from the same hourly rows the series returns, so hours=2 gives the totals of two hours. In pools, volumeUsd and swaps count since the tape first saw the pool, not 24 hours. Cached 10 seconds.

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”.
address
required

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

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

Token mint, base58, exactly as it appears on-chain.

hours
integer
default: 168 >= 1 <= 720

Hourly buckets in hourly; also the span the 24-hour totals are read from (see above).

Media typeapplication/json
object
chain
string
Allowed value: solana
token

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

string
/^[1-9A-HJ-NP-Za-km-z]{32,44}$/
symbol
string | null
name
string | null
image
string | null
decimals
integer | null
supply

Whole tokens.

number | null
firstSeen

Unix time, seconds, UTC.

integer | null
priceUsd
number | null
change1hPct
number | null
change24hPct
number | null
marketCapUsd

Price × supply.

number | null
liquidityUsd

Sum over pools that traded in the last 24 hours.

number | null
volume24hUsd
number
trades24h
integer
buys24h
integer
sells24h
integer
buyVolume24hUsd
number
sellVolume24hUsd
number
venues

24-hour venue split, biggest first.

Array<object>
object
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
volumeUsd
number
trades
integer
flow24h

Who made the 24-hour volume. Null when not measured.

object
oneWayPct

As on the board row.

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
wallets

Distinct wallets in the window.

integer | null
volumeUsd

The window’s volume this was measured on.

number | null
rule
string
pools

Up to 20; traded in the last hour first, then the deepest.

Array<object>
object
pool

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

string
/^[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
quote

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

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

Since the tape first saw the pool.

number
swaps

Since the tape first saw the pool.

integer
firstSeen

Unix time, seconds, UTC.

integer | null
lastTrade

Unix time, seconds, UTC.

integer | null
hourly

Oldest first. Hours without a trade are absent.

Array<object>
object
hour

Unix time, seconds, UTC.

integer
volumeUsd
number
trades
integer
buys
integer
updatedAt

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

integer
Example
{
"chain": "solana",
"token": "7VertkgF9KLhxxJXHX6uaWuoYZTP9LdGj2bWmVXVpump",
"symbol": "Agency",
"name": "Agency",
"image": "https://ipfs.io/ipfs/bafybeicailrr3iobedoxprzs6evwq3nqxsezdhvxbhpseyhltfmufybxuq",
"decimals": 6,
"supply": 966189741.871528,
"firstSeen": 1791028889,
"priceUsd": 0.012471350009671632,
"change1hPct": 0,
"change24hPct": -33.59296229824511,
"marketCapUsd": 12049690.446634114,
"liquidityUsd": 492710.3227884476,
"volume24hUsd": 22300513.95510154,
"trades24h": 98644,
"buys24h": 50875,
"sells24h": 47769,
"buyVolume24hUsd": 10815371.994912628,
"sellVolume24hUsd": 11485141.96018891,
"venues": [
{
"dex": "pumpswap",
"volumeUsd": 12526132.33339345,
"trades": 59671
},
{
"dex": "meteora_dlmm",
"volumeUsd": 9716267.646647243,
"trades": 27864
}
],
"pools": [
{
"pool": "CyJwKnLiiY4fmiwqMCSWFSHxo7T9Ubshgs2uRAuJCrk5",
"dex": "pumpswap",
"quote": "So11111111111111111111111111111111111111112",
"priceUsd": 0.012471350009671632,
"liquidityUsd": 492426.2442871083,
"volumeUsd": 30096468.174518585,
"swaps": 152986,
"firstSeen": 1791028889,
"lastTrade": 1791151092
},
{
"pool": "4MRafCAZEk9KLLDJ7YAQSuwAFFtxz3fVLUuyDKySU8Ep",
"dex": "meteora_damm_v2",
"quote": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
"priceUsd": 0.017382927320372235,
"liquidityUsd": 277.017254,
"volumeUsd": 1947.9255100000016,
"swaps": 3651,
"firstSeen": 1791067406,
"lastTrade": 1791124069
}
],
"hourly": [
{
"hour": 1791082800,
"volumeUsd": 634272.1321694182,
"trades": 3874,
"buys": 2057
},
{
"hour": 1791086400,
"volumeUsd": 1392924.1494347786,
"trades": 7064,
"buys": 3395
}
],
"updatedAt": 1791166385
}

BAD_ADDRESS / BAD_HOURS, 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"
}

TOKEN_NOT_FOUND: this mint has not traded on a venue the tape reads since the tape started.

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"
}