---
title: "Get user portfolio with all pools containing open positions"
method: GET
path: "/portfolio/open"
tags: ["Portfolio"]
---

# Get user portfolio with all pools containing open positions

`GET /portfolio/open`

Returns a paginated list of pools where the user has open (active) positions.
The response includes:
- Pool metadata (address, bin step, base fee, token symbols, icons)
- Current balances and unclaimed fees in USD and SOL
- Pool metrics (TVL, 24h volume, fee/TVL ratio)
- List of open position addresses for each pool
- Aggregated total metrics across all pools (balances, unclaimed fees, PnL) in USD and SOL
- SOL price used for conversion (omitted if unavailable)

Results can be sorted by various metrics and support pagination.

# Arguments

* `user` - The wallet address of the user
* `page` - Page number for pagination (default: 1, minimum: 1)
* `page_size` - Number of pools per page (default: 20, maximum: 50)
* `sort_by` - Field to sort by: `current_balances`, `unclaimed_fee`, `pool_tvl`,
  `pool_volume_24h`, or `fee_per_tvl_24h` (default: `current_balances`)
* `sort_direction` - Sort direction: `asc` or `desc` (default: `desc`)

# Returns

* `200` - The user's open portfolio with pool metadata, balances, and total metrics
* `400` - Invalid user address or query parameters

## Query parameters

- `user` string, required
- `page` integer
- `page_size` integer
- `sort_direction` 'asc' | 'desc'
- `sort_by` 'current_balances' | 'unclaimed_fee' | 'fee_per_tvl24h'

## Response `200`

Successfully retrieved open portfolio

- GetOpenPortfolioResponse
  - `hasNext` boolean, required
  - `page` integer, required
  - `pageSize` integer, required
  - `pools` PoolOpenPortfolioItem[], required
    - `balances` string, required — Current balance in USD
    - `balancesSol` unknown
    - `baseFee` number, double, required
    - `binStep` integer, required
    - `collectFeeMode` integer, required
    - `feePerTvl24h` string, required — User's fee per tvl in rolling 24h
    - `listPositions` string[], required — List of position addresses in pool
    - `openPositionCount` integer, required — Number of open positions
    - `outOfRange` unknown
    - `pnl` string, required — Live PnL
    - `pnlPctChange` string, required — Live PnL percentage change
    - `pnlSol` unknown
    - `pnlSolPctChange` unknown
    - `poolAddress` string, required
    - `poolPrice` unknown
    - `poolStateUpdatedAtBlockTime` unknown
    - `poolStateUpdatedAtSlot` unknown
    - `positionsOutOfRange` string[], required — List of position addresses that are out of range
    - `rewardX` string, required
    - `rewardY` string, required
    - `tokenX` string, required
    - `tokenXIcon` string, required
    - `tokenXMint` string, required
    - `tokenY` string, required
    - `tokenYIcon` string, required
    - `tokenYMint` string, required
    - `totalDeposit` string, required — Total deposit in USD
    - `totalDepositSol` unknown
    - `unclaimedFees` string, required — Current unclaimed fee in USD
    - `unclaimedFeesSol` unknown
  - `solPrice` unknown
  - `total` TotalMetrics — Total metrics related to user portfolio
    - `balances` string, required — Current balance in USD
    - `balancesSol` unknown
    - `pnl` string, required — Current pnl in USD
    - `pnlPctChange` string, required — PnL percent change (USD)
    - `pnlSol` unknown
    - `pnlSolPctChange` unknown
    - `totalPositions` integer, required — Total number of open positions across all pools
    - `unclaimedFees` string, required — Current unclaimed fees in USD
    - `unclaimedFeesSol` unknown
  - `totalCount` integer, required
  - `totalPositions` integer, required — Total number of open positions across all pools

## Other responses

- `400` — Invalid user address or query parameters

---

[API](https://skmtc.net/meteora/apis/dynamic-amm-keeper.md) · [All operations](https://skmtc.net/meteora/apis/dynamic-amm-keeper/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/meteora/dynamic-amm-keeper/versions/453231c15a14/schema)
