---
title: "Api Portfolio Summary Alias"
method: GET
path: "/api/portfolio/summary"
---

# Api Portfolio Summary Alias

`GET /api/portfolio/summary`

## Request

- Base URL: `https://www.oxfordledge.com` (the document declares no server; this is the origin it was published from)
- URL: `https://www.oxfordledge.com/api/portfolio/summary`
- Auth: none declared

Alias: /api/portfolio/summary -> /api/portfolio-positions (internal proxy).

## Response `200`

Successful Response

- PortfolioPositionsResponse: `GET /api/portfolio-positions` response. F4 schema-tightening (2026-04-30): `positions` REQUIRED. Handler returns `{"positions": positions}` on the 200 path; 404 (not found) and 500 (load error) branches return error envelopes via JSONResponse with explicit status_code, so they bypass response_model validation. Frontend portfolio panel iterates `data.positions.forEach(...)` for every row render + P&L summary; missing field NPEs the whole panel.
  - `positions` PortfolioPosition[], required
    - `ticker` string, nullable
    - `shares` number, nullable
    - `costBasis` number, nullable
    - `currentPrice` number, nullable
    - `marketValue` number, nullable
    - `pnl` number, nullable
    - `pnlPct` number, nullable
  - `totalValue` number, nullable
  - `count` integer, nullable

---

[API](https://skmtc.dev/oxfordledge/apis/oxford-ledge-api.md) · [All operations](https://skmtc.dev/oxfordledge/apis/oxford-ledge-api/llms.txt) · [OpenAPI document](https://skmtc.dev/oxfordledge/apis/oxford-ledge-api/revisions/e832a1260f0b?raw)
