---
title: "Get your portfolio"
method: GET
path: "/portfolio"
tags: ["Portfolio"]
---

# Get your portfolio

`GET /portfolio`

## Request

- Base URL: `https://arena-predictions.com/api/v1`
- URL: `https://arena-predictions.com/api/v1/portfolio`
- Auth: HTTP bearer

The key owner's own paper portfolio in one call: the account, open positions (at most 500) and resting orders (at most 200), each naming the Arena instrument its market lists and the side held. Private picks included. With no X-Arena-Org header this is the key's own main account. With the header it is that organization's paper sandbox: its cash, positions and resting orders, and organization.slug. An unknown or forbidden organization is refused rather than answered from the personal account. No ticker, title or price while the venue-data switch is off. Not cached.

## Headers

- `X-Arena-Org` string

## Response `200`

Your portfolio.

- Portfolio
  - `account` Account, required
    - `balanceDollars` number, required: Spendable paper dollars.
    - `netWorthDollars` number, required: Balance plus open positions at cost plus money held by resting buys.
    - `openStakeDollars` number, required
    - `heldDollars` number, required: Held by resting buy orders.
    - `openPositions` integer, required: How many. Positions themselves are not in this response.
    - `restingOrders` integer, required
    - `run` integer, required: 0 until the first reset.
    - `runStartedAt` string, date-time, nullable, required
    - `startBalanceDollars` number, required: What the run started with: 100,000.
    - `adjustmentsInRunDollars` number, required: Operator corrections in this run. Not profit.
    - `pnlSinceResetDollars` number, required: Net worth less the run's start and adjustments.
    - `selfResetEnabled` boolean, required: Whether the owner turned resets on in Settings on the web.
    - `resetBlockedBy` 'reset_not_enabled' | 'cooldown' | 'open_positions' | 'nothing_to_reset' | 'null', nullable, required: What would refuse a reset right now, or null.
    - `nextResetAt` string, date-time, nullable, required: Set while the 30-day cooldown runs.
    - `lifetimePnlDollars` number: Profit since 2026-09-01 across every run. Left out with run=current.
    - `resets` integer: Left out with run=current.
    - `busts` integer: Left out with run=current.
    - `lastResetAt` string, date-time, nullable: Left out with run=current.
  - `positions` Position[], required
    - `tradeId` string, uuid, required
    - `instrumentId` string, nullable, required: The Arena instrument the market lists; null when not mapped.
    - `instrumentLabel` string, nullable, required: The instrument's YES side in words.
    - `instrumentSide` 'yes' | 'no' | 'null', nullable, required: The side of the instrument held.
    - `boughtSide` 'yes' | 'no' | 'null', nullable, required: The side of the market bought.
    - `contracts` integer, required
    - `costDollars` number, required: Paper dollars paid.
    - `statedProbPct` integer, nullable, required: The probability you stated when placing, if any.
    - `placedVia` string, nullable, required
    - `placedPrivate` boolean, required
    - `parlayId` string, uuid, nullable, required
    - `fillVenue` string, required
    - `openedAt` string, date-time, nullable, required
    - `marketTicker` string, nullable: Only while the venue-data switch is on.
    - `entryCents` number, nullable: Only while the venue-data switch is on.
  - `positionsCount` integer, required
  - `positionsTruncated` boolean, required
  - `orders` Order[], required
    - `orderId` string, uuid, required
    - `action` 'buy' | 'sell' | 'null', nullable, required
    - `instrumentId` string, nullable, required
    - `instrumentLabel` string, nullable, required
    - `instrumentSide` 'yes' | 'no' | 'null', nullable, required
    - `orderSide` 'yes' | 'no' | 'null', nullable, required
    - `contracts` integer, required
    - `filledContracts` integer, required
    - `remainingContracts` integer, required
    - `limitCents` integer, nullable, required: Your own limit.
    - `holdDollars` number, required
    - `timeInForce` string, nullable, required
    - `expiresAt` string, date-time, nullable, required
    - `status` string, nullable, required
    - `statedProbPct` integer, nullable
    - `placedVia` string, nullable
    - `placedPrivate` boolean
    - `createdAt` string, date-time, nullable, required
    - `marketTicker` string, nullable: Only while the venue-data switch is on.
  - `ordersCount` integer, required
  - `ordersTruncated` boolean, required
  - `asOf` string, date-time, required
  - `venueData` boolean, required
  - `mode` 'paper', required
  - `organization` object: Present when X-Arena-Org selected an organization sandbox. Absent on the personal account.
    - `id` string, uuid, required
    - `slug` string, nullable: The organization's slug. Null when the sandbox did not name one.

## Other responses

- `400`: invalid_request: GET /portfolio takes no query parameters, or X-Arena-Org is not an organization id.
- `401`: Missing, malformed, unknown, revoked or expired key. Carries a WWW-Authenticate: Bearer challenge.
- `403`: insufficient_scope: the key does not carry portfolio:read. organization_forbidden: X-Arena-Org names an organization this key cannot use. The personal account is not read.
- `404`: organization_not_found: no organization matches X-Arena-Org. The personal account is not read.
- `429`: rate_limited (over the plan's minute limit) or quota_exceeded (over the month). Only while the limits are enforced; until then requests are counted and the headers set, and nothing is refused. error.retryAfterSeconds equals Retry-After.
- `503`: The key could not be verified, or the data could not be read, right now. Retry after the Retry-After seconds.

---

[API](https://skmtc.dev/arena-predictions/apis/arena-api.md) · [All operations](https://skmtc.dev/arena-predictions/apis/arena-api/llms.txt) · [OpenAPI document](https://skmtc.dev/arena-predictions/apis/arena-api/revisions/9d89d166dae6?raw)
