---
title: "Get the authenticated user's current live position exposure"
method: GET
path: "/positions/exposure"
tags: ["Orders"]
---

# Get the authenticated user's current live position exposure

`GET /positions/exposure`

## Request

- Base URL: `https://execution.kairos.trade`
- URL: `https://execution.kairos.trade/positions/exposure`
- Auth: API key in header `X-Client-Id` and API key in header `X-Api-Key` and API key in header `X-Api-Secret`

Returns the caller's current positions from the lowest-latency source available, which is always at least as fresh as the synchronous fill path. This is the RECOMMENDED source of truth for "what do I currently hold" while actively trading — prefer it over any aggregate that may lag behind live fills.
Three buckets, each token appears in at most one:
  - `positions` — open positions (`net_size != 0`), with `available_to_sell`
    (net size minus outstanding sell reservations) and `reserved`.
  - `closed_token_ids` — tokens the store just folded flat (within a
    10-minute window); callers may use presence here to zero any
    stale cached position for that token.
  - `resolved` — held tokens whose MARKET HAS RESOLVED, split out so a
    resolved loser is never confused with an open position; `redeemable`
    is `true` for a won (claimable) outcome, `false` for a loss.

Absence from every bucket means the store has no current opinion on that token (neither "open" nor "just closed") — leave any previously-cached value as-is.
**Central fallback.** On a deployment without a cell-local position store the response is built from central Postgres instead. In that mode `available_to_sell` always equals `net_size`, `reserved` is always `0`, and `closed_token_ids` is always empty — the reservation view is a regional-node feature.
**Auth & scope.** Requires `position:read`. Takes no query, path or body parameters.

## Response `200`

Current position exposure.

- OrderPositionsExposureResponse: Response for `GET /positions/exposure`.
  - `positions` OrderPositionExposure[], required
    - `token_id` string, required
    - `market_id` string, required
    - `outcome` string, nullable
    - `holding_wallet` string, required
    - `net_size` string, required: Current signed size (decimal string), positive = long.
    - `available_to_sell` string, required: `net_size` minus outstanding sell reservations — what a new SELL can reserve right now.
    - `reserved` string, required: Size committed to in-flight sells: `net_size - available_to_sell`.
    - `avg_entry_price_bps` integer, required: Average entry price in basis points (price × 10000).
    - `realized_pnl` string, required: Realized PnL to date, decimal string.
    - `last_trade_at` string, date-time, required
  - `closed_token_ids` string[], required: Token ids the store positively holds at `net_size == 0` (folded flat, e.g. a just-settled sell). Absence from both this list and `positions`/`resolved` means "no current opinion." Carries no venue, so on a cell serving several it cannot say which venue's position to retire — read `closed` instead.
  - `closed` OrderClosedPositionExposure[], required: The same retirements as `closed_token_ids`, each scoped to the venue that owns it.
    - `exchange_id` string, required: Canonical execution venue id. Token and market ids are unique only within a venue.
    - `token_id` string, required: Outcome-token id the venue holds at `net_size == 0`.
  - `resolved` OrderResolvedPositionExposure[], required
    - `token_id` string, required
    - `market_id` string, required
    - `outcome` string, nullable
    - `holding_wallet` string, required
    - `net_size` string, required: Size still on the books for this resolved token. Informational only — may lag zero for a settled loser.
    - `redeemable` boolean, required: `true` = won (claimable via redeem); `false` = lost.

## Other responses

- `401`: No valid credential presented — missing/invalid API-key headers or an invalid/expired session token.
- `403`: Missing `position:read` scope, or API-key access to one of the returned providers is disabled. Empty body (status code only).
- `500`: Backing store read failed. Empty body (status code only).
- `503`: API-key access to one of the returned providers could not be checked (fails closed). Empty body (status code only).

---

[API](https://skmtc.dev/kairos/apis/kairos-order-execution-api.md) - [All operations](https://skmtc.dev/kairos/apis/kairos-order-execution-api/llms.txt) - [OpenAPI document](https://skmtc.dev/kairos/apis/kairos-order-execution-api/revisions/9ba7d463d505?raw)
