Get Positions
List the user’s positions with live valuations from Redis cache.
Wallet scoping (2026-06-10): wallet_id accepts an integer wallet
id (ownership-checked, 404 otherwise), all (cross-wallet) or
api (the caller’s API wallet, legacy NULL rows included). The
default (param omitted) is the API wallet, matching /balance,
/portfolio and /equity; before 2026-06-10 the default was
all-wallets — pass wallet_id=all for the old behaviour.
Per-user 5-second cache (override via POSITIONS_CACHE_TTL_S env).
Set TTL to 0 to disable caching for debugging.
Authorizations
Issue from /v1/keys (or admin-issued for enterprise tier).
Headers
Your PolySimulator API key
Polymarket-CLOB-compat alias for X-API-Key (underscore form). SDK clients ported from Polymarket can authenticate without changing header names. X-API-Key takes precedence when both are provided.
PM-CLOB-compat dashed-form alias for X-API-Key. Same value semantics as POLY_API_KEY but with HTTP-conventional dash separators. Audit P1 (staging audit 2026-05-16 0817 PR #1296): the per-tier middleware accepts both spellings but the auth dependency originally only matched the underscore form — now both work end-to-end.
PM-CLOB-compat: Authorization: Bearer ps_live_... (or ps_test_...) is accepted as an alias for X-API-Key so py-clob-client and other ported SDKs authenticate without header name changes. Bearer JWTs are NOT accepted here — use the dashboard-auth endpoints for those.
Query Parameters
Filter by status: OPEN or CLOSED
Wallet scope: an integer wallet id you own (404 WALLET_NOT_FOUND otherwise; MAIN/API wallet ids fold in legacy rows recorded before per-wallet attribution, matching /portfolio), 'all' (every wallet you own, including UI MAIN/SANDBOX wallets), or 'api' (your API wallet — includes legacy pre-attribution rows). Keywords are case-insensitive; any other value returns 422 VALIDATION_FAILED. Default (omitted) = 'api' since 2026-06-10, matching /balance, /portfolio and /equity; before 2026-06-10 the default was all-wallets — pass wallet_id=all to keep the old behaviour.
When true, wrap the response in a PM-shape {data, next_cursor} envelope (audit P0-3 PR #1309). Default false returns the bare array for back-compat with existing polysim SDK consumers. PM-ported SDKs should set this to true. next_cursor is always an empty string here because positions are unpaginated.
Response
Successful Response
- PositionResponse · object[]
- PositionsEnvelope · object