Positions
Onchain V2 (legacy)
Positions (All)
Query every position on Polymarket. Filter by wallet, market, status, or minimum size. Full history with cursor pagination.
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.
Run against any wallet to confirm. Validated 2026-04-30 across diverse wallets at 100 % byte-perfect match on every shared open position.
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
Usestatus=open to get only positions with a non-zero size.
Who holds a market
Usemarket_slug to see all wallets with positions on a specific market.
Large positions
Usemin_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 — requestlimit=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_pnlfield 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_pnlfield shows the paper profit/loss on the remaining open shares. For resolved markets, this uses the final settlement price (0 for losers). For active markets, the current market price is used. market_statuslets clients distinguish live-tradable positions from positions on resolved markets that the wallet never redeemed. Resolved-and-never-redeemed positions still havesize > 0and will show the correct terminalunrealized_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’sdata-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)
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
Filter by wallet address
Filter by market slug
Filter by condition ID
Filter by outcome token ID
Filter by position status
Available options:
open, closed, all Minimum position size in shares
Results per page (1-500, default 100)
Required range:
1 <= x <= 500Sort direction
Available options:
desc, asc Cursor from a previous response to fetch the next page
Response
Position results with pagination

