---
title: "Get wallet open positions"
method: GET
path: "/v4/data/prediction/wallets/{address}/positions"
tags: ["Prediction API"]
---

# Get wallet open positions

`GET /v4/data/prediction/wallets/{address}/positions`

/v4/data/prediction/wallets/{address}/positions

**100 credits per API call**

Current open positions held by a wallet — one row per outcome token, with unrealised PnL, current value, lifetime cost basis, and the parent market's question, slug and outcome metadata. Useful for "what's in my portfolio right now" views and per-market drill-downs.

**Platform support**

*   Polymarket only. Kalshi wallets return `400`.

**Filtering, sorting and pagination**

*   `market` scopes the response to a comma-separated list of condition ids (`0x` + 64 hex), up to 50 entries.
*   `eventId` scopes the response to a comma-separated list of Polymarket numeric event ids, up to 50 entries. Mutually exclusive with `market` — passing both returns `400`.
*   `sizeThreshold` filters out positions smaller than the given size. Defaults to `1`; pass `0` to include dust.
*   `redeemable=true` returns positions on resolved markets that the wallet has won but has not yet redeemed. `mergeable=true` returns positions eligible for merging back to USDC. Both default to `false`.
*   `sortBy` accepts `CURRENT`, `INITIAL`, `TOKENS`, `CASHPNL`, `PERCENTPNL`, `TITLE`, `RESOLVING`, `PRICE`, `AVGPRICE`. Defaults to `TOKENS`. Combine with `sortDirection` (`ASC` / `DESC`, defaults to `DESC`).
*   `title` filters by a substring of the market question.
*   Pagination is offset-based — `limit` (1..500, default 100) and `offset` (0..10000, default 0).

**Other notes**

*   `address` is normalised to lowercase before being echoed in the response (every row's `proxyWallet`).
*   `negativeRisk` indicates whether the parent market is part of Polymarket's negative-risk grouping (e.g. multi-candidate winner-take-all markets).

## Path parameters

- `address` string, required — EVM wallet address — `0x`-prefixed, 40 hex characters. Returned lowercased in response payloads. Non-EVM inputs (e.g. Kalshi user identifiers) return `400` from every wallets endpoint.

## Query parameters

- `market` string
- `eventId` string
- `sizeThreshold` number
- `redeemable` boolean
- `mergeable` boolean
- `sortBy` 'CURRENT' | 'INITIAL' | 'TOKENS' | 'CASHPNL' | 'PERCENTPNL' | 'TITLE' | 'RESOLVING' | 'PRICE' | 'AVGPRICE' — Sort key for `/wallets/{address}/positions`.
- `sortDirection` 'ASC' | 'DESC' — Sort direction.
- `title` string
- `limit` integer
- `offset` integer

## Response `200`

OK

- PredictionWalletPositionsResponse — Paginated wallet open-positions response.
  - `data` PredictionWalletPosition[], required
    - `proxyWallet` string, required — Holder wallet (0x + 40 hex, lowercased).
    - `asset` string, required — Polymarket outcome-token asset id.
    - `conditionId` string, required — Market condition id (0x + 64 hex).
    - `size` number, required — Current position size (outcome tokens).
    - `avgPrice` number, required — Volume-weighted average entry price.
    - `initialValue` number, required — USD value at entry.
    - `currentValue` number, required — Current USD mark-to-market value of the position.
    - `cashPnl` number, required — Unrealised PnL in USD.
    - `percentPnl` number, required — Unrealised PnL as a ratio (e.g. 0.1053 = 10.53%).
    - `totalBought` number, required — Lifetime USD spent acquiring this position.
    - `realizedPnl` number, required — Realised PnL in USD.
    - `percentRealizedPnl` number, required — Realised PnL as a ratio.
    - `curPrice` number, required — Current market price of the outcome.
    - `redeemable` boolean, required — `true` when the position is on a resolved market and the wallet has won but has not yet redeemed.
    - `mergeable` boolean, required — `true` when the position can be merged back to USDC with the opposite outcome.
    - `title` string, nullable, required — Parent market question.
    - `slug` string, nullable, required — Parent market slug on Polymarket.
    - `icon` string, nullable, required — Parent market icon URL.
    - `eventSlug` string, nullable, required — Parent event slug on Polymarket.
    - `outcome` string, nullable, required — Outcome label (e.g. `YES` / `NO`).
    - `outcomeIndex` integer, required — Outcome index (0 / 1 on binary markets).
    - `oppositeOutcome` string, nullable, required — Label of the opposite outcome.
    - `oppositeAsset` string, required — Polymarket asset id of the opposite outcome.
    - `endDate` string, nullable, required — ISO-8601 close timestamp of the parent market.
    - `negativeRisk` boolean, required — Whether the parent market is part of Polymarket's negative-risk grouping (e.g. multi-candidate winner-take-all markets).
  - `pagination` PredictionOffsetPagination, required — Offset-based pagination metadata, returned by every wallet endpoint and by `/markets/{id}/positions`. `pageNumber` is the zero-indexed page derived from `offset / limit` on the request.
    - `pageSize` integer, required — Page size of the call that produced this response.
    - `pageNumber` integer, required — Zero-indexed page number (`offset / limit`).

## Other responses

- `400` — Bad Request
- `401` — Unauthorized. Not valid or inactive subscription key present in the HTTP Header.
- `403` — Forbidden. The request is authenticated, but it is not possible to perform the operation due to logical error or invalid permissions.
- `500` — Internal server error. There was an error on the server during the processing of the request.

---

[API](https://skmtc.net/tatum/apis/blockchain-data.md) · [All operations](https://skmtc.net/tatum/apis/blockchain-data/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/tatum/blockchain-data/versions/8622ee4b8fae/schema)
