Skip to content

One pool's liquidity

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

Deposits, withdrawals, net flow and claimed fees over the window, and by hour; open positions and their owners; the pair with decimals, TVL estimate and swap volume. Cached 20 seconds.

Liquidity on Solana from Chord’s own tape: adds, removes, fee claims, position opens and closes, decoded from the same blocks as the swaps. No key needed.

  • Venues. Meteora DLMM, Meteora DAMM v2, Raydium CLMM and PumpSwap. Orca Whirlpools, Raydium CPMM / v4 and Meteora dynamic pools are not read yet.
  • Since. since is when LP decoding started (2026-10-06 15:53 UTC); windows never start before it. A position opened earlier is partial: true and carries no PnL.
  • Fees are claimed fees. An LP’s fees appear when it claims them, so a window’s fees understate what the pool earned, and one claim can hold days of fees.
  • Positions. One row per position account (DLMM / DAMM v2 position, Raydium CLMM position NFT, PumpSwap LP token account), rebuilt from all its events. lower / upper are DLMM bin ids or Raydium CLMM ticks; null = full range. Realized PnL = withdrawn + fees claimed − deposited, only for a position seen from its open to its close with every amount priced. An open position’s current value is not in the events: none is given.
  • Amounts are whole tokens in the pool’s own order (mintA / mintB); USD is valued when the event happened. Each add / remove / claim is checked against the pool vaults’ balance changes in the same transaction (verified).
  • Addresses are base58 and case-sensitive, as on the other Solana routes.
address
required

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

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

Pool address, base58.

hours
integer
default: 24 >= 1 <= 168

Window in hours, never before since.

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

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

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

meteora_dlmm · meteora_damm_v2 · raydium_clmm · pumpswap.

string
windowHours
integer
since

Unix time, seconds, UTC.

integer
mintA

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

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

Creator-chosen.

string | null
mintB

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

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

Creator-chosen.

string | null
decimalsA
integer
decimalsB
integer
tvlUsd
number | null
priceUsd
number | null
token

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

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

Unix time, seconds, UTC.

integer
swapVolumeUsd
number | null
depositsUsd
number
withdrawalsUsd
number
netFlowUsd
number
feesClaimedUsd
number
openPositions
integer
openOwners
integer
hourly
Array<object>
object
hour

Unix time, seconds, UTC.

integer
depositsUsd
number
withdrawalsUsd
number
feesClaimedUsd
number
adds
integer
removes
integer
claims
integer
opens
integer
closes
integer
lps
integer
updatedAt

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

integer
Example
{
"chain": "solana",
"pool": "HTvjzsfX3yU6BUodCjZ5vZkUrAxMDTrBs3CJaq43ashR",
"dex": "meteora_dlmm",
"windowHours": 24,
"since": 1791301995,
"mintA": "So11111111111111111111111111111111111111112",
"symbolA": "SOL",
"decimalsA": 9,
"mintB": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
"symbolB": "USDC",
"decimalsB": 6,
"tvlUsd": null,
"priceUsd": 120.90833585378545,
"token": "So11111111111111111111111111111111111111112",
"firstLpEvent": 1791302002,
"swapVolumeUsd": 657350.330032,
"depositsUsd": 46262.672679370095,
"withdrawalsUsd": 12314.010901404514,
"netFlowUsd": 33948.66177796558,
"feesClaimedUsd": 25.931564176688006,
"openPositions": 22,
"openOwners": 17,
"hourly": [
{
"hour": 1791298800,
"depositsUsd": 30397.05064594894,
"withdrawalsUsd": 7196.542626796252,
"feesClaimedUsd": 0.370617802409548,
"adds": 52,
"removes": 28,
"claims": 30,
"opens": 24,
"closes": 0,
"lps": 10
},
{
"hour": 1791302400,
"depositsUsd": 15865.622033421156,
"withdrawalsUsd": 5117.468274608262,
"feesClaimedUsd": 25.56094637427846,
"adds": 56,
"removes": 35,
"claims": 36,
"opens": 27,
"closes": 0,
"lps": 15
}
],
"updatedAt": 1791303661
}

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

POOL_NOT_FOUND: no liquidity event in this pool since LP decoding started, or its venue is not read.

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