Skip to main content
Current state of every v2 user position — size, avg_price, realized_pnl, and total_bought for every (wallet, token) pair the v2 exchange has ever touched. Joined to market metadata so every row carries question, slug, outcome, image, and condition_id. Backed by the v2.position view. A position is considered closed when size = 0; otherwise open.

Request

Authentication

Paid tier required. Pass your API key via x-api-key, Authorization: Bearer, or ?key=:
Free-tier keys receive 402 Payment Required.

Query parameters

All parameters are optional. Calling the endpoint with no filters returns the 100 largest positions globally.

Parameter validation

  • wallet: regex ^0x[a-f0-9]{40}$.
  • condition_id: regex ^0x[a-f0-9]{64}$.
  • token_id: 1-78 digits, ^[0-9]+$.
  • status: whitelist {open, closed, all}.
  • order: whitelist {asc, desc}.
Anything that fails validation returns 400 Bad Request with {"error": "..."}.

Response

Response fields

Rate-limit headers

Every response includes:

Examples

Error responses

Notes

  • A position exists as soon as a wallet has touched a token on v2, even after it’s been closed (size = 0). Closed positions still carry their realized_pnl_usdc for historical accounting.
  • total_bought_usdc is cumulative USDC spent acquiring — it does NOT decrease on partial exits. Use it for true cost basis.
  • On neg-risk markets (multi-outcome events like PGA winners), a wallet can hold positions on many outcomes under the same event_title. Each outcome is its own condition_id.
  • Positions with size = 0 and realized_pnl = 0 and total_bought = 0 exist when a wallet held a position and fully transferred it off-chain without realizing PnL.
  • Numeric fields are returned as strings — parse to Decimal/BigNumber before math.