A pool's positions
const url = 'https://api.getchord.xyz/v1/chains/solana/lp/pool/example/positions?status=open&limit=50';const options = {method: 'GET'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request GET \ --url 'https://api.getchord.xyz/v1/chains/solana/lp/pool/example/positions?status=open&limit=50'The pool’s positions, most recently active first. 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.
sinceis when LP decoding started (2026-10-06 15:53 UTC); windows never start before it. A position opened earlier ispartial: trueand 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/upperare 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.
Parameters
Section titled “ Parameters ”Path Parameters
Section titled “Path Parameters”Solana address, base58, case-sensitive. Never lower-case it.
Pool address, base58.
Query Parameters
Section titled “Query Parameters”Which positions.
Responses
Section titled “ Responses ”object
Solana address, base58, case-sensitive. Never lower-case it.
Unix time, seconds, UTC.
One Solana LP position.
object
Solana address, base58, case-sensitive. Never lower-case it.
meteora_dlmm · meteora_damm_v2 · raydium_clmm · pumpswap.
Solana address, base58, case-sensitive. Never lower-case it.
Solana address, base58, case-sensitive. Never lower-case it.
Solana address, base58, case-sensitive. Never lower-case it.
Creator-chosen.
Solana address, base58, case-sensitive. Never lower-case it.
Creator-chosen.
DLMM bin id or CLMM tick.
Unix time, seconds, UTC.
Unix time, seconds, UTC.
Unix time, seconds, UTC.
Unix time, seconds, UTC.
Whole tokens.
Claimed.
Claimed.
Withdrawn + fees − deposited; null unless closed, not partial and fully priced.
The tape did not see the open (opened before since); PumpSwap: more came out than the tape saw going in.
Value events without a USD price.
Unix time, SECONDS, when the Solana box built this answer. Unlike the rest of the API (milliseconds).
Example
{ "chain": "solana", "pool": "HTvjzsfX3yU6BUodCjZ5vZkUrAxMDTrBs3CJaq43ashR", "status": "open", "since": 1791301995, "positions": [ { "position": "6gDiPzm69sdQMAAMUjSwY8n1ruPXYpy6Yx5tTt3PBgPv", "dex": "meteora_dlmm", "pool": "HTvjzsfX3yU6BUodCjZ5vZkUrAxMDTrBs3CJaq43ashR", "owner": "GDzKV9YibjzWNtFCeGSAXntzv8e2tU1UcLPV1hoXxXJM", "mintA": "So11111111111111111111111111111111111111112", "symbolA": "SOL", "mintB": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", "symbolB": "USDC", "lower": -21194, "upper": -21170, "status": "open", "openedAt": 1791303634, "closedAt": null, "firstEvent": 1791303634, "lastEvent": 1791303634, "events": 2, "depositedA": 0, "depositedB": 65.188341, "withdrawnA": 0, "withdrawnB": 0, "feesA": 0, "feesB": 0, "depositedUsd": 65.188341, "withdrawnUsd": 0, "feesClaimedUsd": 0, "realizedPnlUsd": null, "partial": false, "unpricedEvents": 0 }, { "position": "G8LWKkSM58cGfty8Huw7PAsaRz86LqyaysUhMLL8HdD3", "dex": "meteora_dlmm", "pool": "HTvjzsfX3yU6BUodCjZ5vZkUrAxMDTrBs3CJaq43ashR", "owner": "zmpMLRAH2Nt5ZDaax1jXH9QdmVRzw7rHm84sKpZa6wy", "mintA": "So11111111111111111111111111111111111111112", "symbolA": "SOL", "mintB": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", "symbolB": "USDC", "lower": -21167, "upper": -21091, "status": "open", "openedAt": 1791302020, "closedAt": null, "firstEvent": 1791302020, "lastEvent": 1791303567, "events": 25, "depositedA": 22.506085353, "depositedB": 1668.168769, "withdrawnA": 16.697187434, "withdrawnB": 1367.959384, "feesA": 0.001835888, "feesB": 0.267907, "depositedUsd": 4385.0568295447565, "withdrawnUsd": 3383.4942419848394, "feesClaimedUsd": 0.48990795627555367, "realizedPnlUsd": null, "partial": false, "unpricedEvents": 0 } ], "updatedAt": 1791303662}BAD_ADDRESS / BAD_STATUS / BAD_LIMIT, or UNSUPPORTED_CHAIN (Solana is not public on this deployment and the request has no X-API-Key).
Every non-2xx body.
object
Stable machine code, e.g. INVALID_PARAMS, NOT_READY, RATE_LIMIT_EXCEEDED.
For humans.
HTTP status, when included.
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.
Every non-2xx body.
object
Stable machine code, e.g. INVALID_PARAMS, NOT_READY, RATE_LIMIT_EXCEEDED.
For humans.
HTTP status, when included.
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.
Every non-2xx body.
object
Stable machine code, e.g. INVALID_PARAMS, NOT_READY, RATE_LIMIT_EXCEEDED.
For humans.
HTTP status, when included.
Example
{ "error": "INVALID_PARAMS", "message": "amount must be an integer string in the token's smallest unit"}