Skip to main content
GET
Positions
Search and filter all Polymarket positions across every wallet. Each position is enriched with market metadata and includes realized P&L, average entry price, and current size. Sourced directly from onchain settlement data.

Request

Query parameters

Identifying markets

  • market_slug — human-readable URL slug from Polymarket. Returns positions for all outcomes.
  • condition_id — unique condition identifier. Returns positions for all outcomes.
  • token_id — specific outcome token. Returns positions for only that outcome.

Response

Position fields

Pagination fields

Examples

All positions for a wallet

Open positions only

Use status=open to get only positions with a non-zero size.

Who holds a market

Use market_slug to see all wallets with positions on a specific market.

Large positions

Use min_size to find positions above a threshold.

Combined filters

Filter by wallet, market, and status at once.

Pagination

Wallet queries return every position for the wallet in a single response (up to 500), sorted by most recent on-chain activity. No pagination needed — request limit=500 and read all results. has_more is always false and no cursor is returned. Wallets with more than 500 lifetime positions are capped at 500. Non-wallet queries (filtering by market_slug, condition_id, token_id, or min_size alone) use cursor-based pagination for iterating through large result sets.

Error responses

Notes

  • Position data is sourced from onchain settlement records. Every position that was ever opened on Polymarket is included.
  • The realized_pnl field reflects actual profit/loss from closed portions of the position, including onchain redemptions of resolved markets. For open positions, it reflects any partial closes.
  • The unrealized_pnl field shows the paper profit/loss on the remaining open shares. For resolved markets, this uses the final settlement price (1forwinners,1 for winners, 0 for losers). For active markets, the current market price is used.
  • market_status lets clients distinguish live-tradable positions from positions on resolved markets that the wallet never redeemed. Resolved-and-never-redeemed positions still have size > 0 and will show the correct terminal unrealized_pnl.
  • Market metadata (market, market_slug, outcome, condition_id, image) is enriched from our index. Very old or delisted markets may not have metadata.
  • When querying by wallet, the sort key is the timestamp of the most recent fill for each position, not the position’s close date. A position bought months ago and held to resolution (closed only via redemption) will sort by its original buy date.

Verifying parity with Polymarket

Per-position fields on this endpoint match Polymarket’s data-api.polymarket.com/positions byte-for-byte. Anyone can verify directly with the standalone Node script below — no internal access required.

Field map

Self-test script (Node 18+, no dependencies)

Run against any wallet to confirm. Validated 2026-04-30 across diverse wallets at 100 % byte-perfect match on every shared open position.

What this proves

If you trust Polymarket’s positions page, you can trust ours — they’re computing the same thing from the same on-chain events. Use this script as ongoing regression coverage in your own integration if PnL accuracy is critical to your product.

Query Parameters

wallet
string

Filter by wallet address

market_slug
string

Filter by market slug

condition_id
string

Filter by condition ID

token_id
string

Filter by outcome token ID

status
enum<string>
default:all

Filter by position status

Available options:
open,
closed,
all
min_size
number

Minimum position size in shares

limit
integer
default:100

Results per page (1-500, default 100)

Required range: 1 <= x <= 500
order
enum<string>
default:desc

Sort direction

Available options:
desc,
asc
pagination_key
string

Cursor from a previous response to fetch the next page

Response

Position results with pagination