---
title: "A wallet's liquidity events"
method: GET
path: "/chains/solana/lp/wallet/{address}/events"
tags: ["Solana data"]
---

# A wallet's liquidity events

`GET /chains/solana/lp/wallet/{address}/events`

## Request

- Base URL: `https://api.getchord.xyz/v1`
- URL: `https://api.getchord.xyz/v1/chains/solana/lp/wallet/{address}/events`
- Auth: none declared

Adds, removes, fee claims, opens and closes, newest first (the wallet as the position's owner). A close row of a DLMM `close_position2` or a Raydium CLMM position has no `pool`: the instruction does not carry it.

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.

## Path parameters

- `address` string, required: Solana address, base58, case-sensitive. Never lower-case it.

## Query parameters

- `limit` integer
- `before` integer

## Response `200`

- object
  - `chain` 'solana'
  - `owner` string: Solana address, base58, case-sensitive. Never lower-case it.
  - `events` object[]
    - `ts` integer: Unix time, seconds, UTC.
    - `slot` integer
    - `signature` string, nullable: Transaction signature, base58.
    - `dex` string: `meteora_dlmm` · `meteora_damm_v2` · `raydium_clmm` · `pumpswap`.
    - `kind` 'add' | 'remove' | 'fee' | 'open' | 'close'
    - `pool` string, nullable: Solana address, base58, case-sensitive. Never lower-case it.
    - `position` string, nullable: Solana address, base58, case-sensitive. Never lower-case it.
    - `owner` string, nullable: Solana address, base58, case-sensitive. Never lower-case it.
    - `amountA` number, nullable: Whole tokens.
    - `amountB` number, nullable
    - `usd` number, nullable
    - `lower` integer, nullable
    - `upper` integer, nullable
    - `verified` boolean, nullable: true = matches the vault balance changes; null = could not be checked (shared vault, first deposit of a new pool)
  - `nextBefore` integer, nullable: Unix time, seconds, UTC.

## Other responses

- `400`: `BAD_ADDRESS` / `BAD_LIMIT` / `BAD_CURSOR`, 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.

---

[API](https://skmtc.dev/getchord/apis/chord-api.md) · [All operations](https://skmtc.dev/getchord/apis/chord-api/llms.txt) · [OpenAPI document](https://skmtc.dev/getchord/apis/chord-api/revisions/d3bc4640fea0?raw)
