List Positions
Positions aggregated by predexon_id across routed venues
Overview
Return the account’s open positions grouped by outcome. The router fans out position reads to every routed venue in parallel, then groups per-venue holdings under a singlepredexon_id.
One position per outcome surfaces even when the partner holds it across multiple venues. Per-venue breakdowns are available on positions[].venues[].
Top-level fields use the same names as their per-venue counterparts (size, averagePrice, currentPrice, currentValue, pnl, status, result) — the enclosing scope disambiguates. Each position carries:
- Cost basis (
averagePrice) sourced directly from each venue’s execution plane, which already tracks weighted-average cost across every source of fills — the router does not recompute attribution. - Live pricing (
currentPrice,currentValue,pnl) computed by the router from the streaming order-book feed using each venue’s current top bid. Plane-reported values for these are intentionally not forwarded — they’re periodic REST snapshots and would mislead partners on time-sensitive decisions. - Lifecycle state (
status,result) passed through from the plane.
predexon_id groups equivalent outcomes across venues.
Path Parameters
Response Fields
Top level
Position entry
Fields are aggregated across every venue that holds the position. Per-venue values are preserved invenues[].
Per-venue entry
Every field on the position entry exists at the per-venue level with the per-venue value.Unmapped position entry
unmapped[] carries positions the router cannot aggregate or live-price. Two cases produce these:
- Sports markets that have resolved. Once the game finishes, the market drops off the router’s live trading surface, but the partner still holds the redeemable token until claimed.
- Non-sports markets (politics, news, crypto-binary, etc.). The router only routes sports markets, so positions on other markets always surface here — even while the market is fully active on its native venue.
currentPrice, currentValue, and pnl are omitted — they require a live order book that isn’t available for these markets. Use the per-venue read at GET /api/accounts/{accountId}/positions?venue={venue} if you need live pricing on an unmapped position.
_meta.venues[]
Per-venue read status. When a venue returned error, its positions are not reflected in the aggregated response — the other venues still return normally.
Lifecycle
status
result
Aggregation across venues
When a position exists on multiple venues, the top-level fields are derived from each venue as follows:Example
GET /api/accounts/acc_8f2e/router/positions
currentPrice, currentValue, and pnl are computed by the router using the live top-of-book bid for each venue — they are not passed through from plane-reported values, which can be stale. averagePrice is always plane-sourced and reflects every fill that contributed to the position, including fills from sources outside the router._meta.venues[].status is error for any venue, the aggregated positions[] reflects only the healthy venues. Re-call the endpoint after a short delay to pick up the missing venue once reads recover — a brief transient on one venue does not roll back the response.unmapped[] is not a degraded mode — it’s the design for any position outside the router’s live trading surface. Resolved sports positions (waiting to be redeemed) and non-sports positions (politics, news, etc.) belong here permanently. Reconcile against predexonId like you would for positions[]. The shape is intentionally flatter (no venues[] aggregation, no live pricing) — partners that need a live price for these positions should call GET /api/accounts/{accountId}/positions?venue={venue}.Authorizations
Trading key provided by Predexon. The data key used by the Sports Discovery API on api.predexon.com is a separate credential.
Path Parameters
Account ID. Must belong to the calling API key.
Response
Positions aggregated across routed venues.
Positions aggregated by predexonId. One entry per outcome, regardless of how many venues the partner holds it on.
Positions the router doesn't carry on its live trading surface. Two cases: (1) sports markets that have resolved (status: resolved or redeemable); (2) non-sports markets (politics, news, crypto-binary), which always surface here. No aggregation, no live pricing.
