# Liquidity pools by LP activity

`GET https://api.getchord.xyz/v1/chains/solana/lp/pools`

Source: https://getchord.xyz/docs/api-reference/operations/sollppools/

Every pool where liquidity moved in the window, ranked: `fees` (claimed fees, default), `deposits`, `withdrawals`, `net` (net inflow), `lps` (distinct LPs), `tvl` or `fee_tvl` (fees claimed in the window per dollar of liquidity now). Each row has the pool's TVL estimate and swap volume from the swap tape (TVL is null until the pool has had a verified swap), deposits, withdrawals, claimed fees, counts and open positions. Cached 60 seconds.

`feeTvlPct` is fees **claimed**, not fees accrued: the tape cannot see fees that sit unclaimed in a position, so it is not an APR. `sort=fee_tvl` starts from a $10,000 TVL floor (one claim on a thin pool would top the list); pass `minTvl=0` for no floor. `q` takes a ticker (any case, part of it is enough) or one pool or mint address (exact, case-sensitive).

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.

## Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
| `sort` | query | no | `fees` · `deposits` · `withdrawals` · `net` · `lps` · `tvl` · `fee_tvl` (default `fees`) |  |
| `limit` | query | no | integer (default `50`) |  |
| `hours` | query | no | integer (default `24`) | Window in hours, never before `since`. |
| `minTvl` | query | no | integer | Leave out pools under this TVL in US dollars, and pools whose TVL is unknown. Default 0, or 10000 with `sort=fee_tvl`. |
| `q` | query | no | string | A ticker, or one pool or mint address. |
| `dex` | query | no | `meteora_dlmm` · `meteora_damm_v2` · `raydium_clmm` · `pumpswap` | One venue. |

## Response 200

Example (captured from the live API):

```json
{
  "chain": "solana",
  "sort": "fees",
  "windowHours": 24,
  "since": 1791301995,
  "pools": 862,
  "rows": [
    {
      "pool": "7fDzFPYhdtNm5NbqvZYRcjB879DxH4dRjmMhbHSYqM5J",
      "dex": "meteora_damm_v2",
      "mintA": "TfLEzpE2rvwng5WPDP7XqsMoNLfgk2mKXNxJUvQs8c1",
      "symbolA": "LOCAL",
      "mintB": "So11111111111111111111111111111111111111112",
      "symbolB": "SOL",
      "tvlUsd": 27625.24059411423,
      "priceUsd": 0.00007144600292746474,
      "token": "TfLEzpE2rvwng5WPDP7XqsMoNLfgk2mKXNxJUvQs8c1",
      "swapVolumeUsd": 4454.320941113588,
      "depositsUsd": 0,
      "withdrawalsUsd": 0,
      "netFlowUsd": 0,
      "feesClaimedUsd": 4161.145469719044,
      "adds": 0,
      "removes": 0,
      "claims": 2,
      "opens": 0,
      "closes": 0,
      "lps": 1,
      "openPositions": 1
    },
    {
      "pool": "HbjYfcWZBjCBYTJpZkLGxqArVmZVu3mQcRudb6Wg1sVh",
      "dex": "meteora_dlmm",
      "mintA": "pumpCmXqMfrsAkQ5r49WcJnRayYRqmXz6ae8H7H9Dfn",
      "symbolA": "PUMP",
      "mintB": "So11111111111111111111111111111111111111112",
      "symbolB": "SOL",
      "tvlUsd": null,
      "priceUsd": 0.006306820783643733,
      "token": "pumpCmXqMfrsAkQ5r49WcJnRayYRqmXz6ae8H7H9Dfn",
      "swapVolumeUsd": 19055.704227499944,
      "depositsUsd": 7769.8327865424735,
      "withdrawalsUsd": 41.92886719122702,
      "netFlowUsd": 7727.903919351246,
      "feesClaimedUsd": 3075.699010802388,
      "adds": 11,
      "removes": 1,
      "claims": 10,
      "opens": 0,
      "closes": 0,
      "lps": 7,
      "openPositions": 7
    }
  ],
  "updatedAt": 1791303661
}
```

- **400**: `BAD_LIMIT` / `BAD_HOURS` / `BAD_SORT` / `BAD_MIN_TVL` / `BAD_QUERY` / `BAD_DEX`, or `UNSUPPORTED_CHAIN` (Solana is not public on this deployment and the request has no `X-API-Key`).
- **429**: Over the per-minute limit (`RATE_LIMIT_EXCEEDED`). Read `X-RateLimit-Reset` and back off.
- **503**: `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.
