---
title: "Api Etf Lookthrough"
method: GET
path: "/api/etf-lookthrough"
---

# Api Etf Lookthrough

`GET /api/etf-lookthrough`

## 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/etf-lookthrough`
- Auth: none declared

Security-level holdings for one ETF from the filed N-PORT store.

Public, per the tier doctrine above: this reads PG only and makes no
upstream call, so it sits with /api/etf-list rather than /api/etf-data.

Why this route exists: v230 landed `etf_nport_holdings` (284,858 rows /
147 series) plus a typed read helper, and the helper had NO callers --
the store's only production read was an EXISTS count. A dataset nobody
can query answers no question.

Honest-empty on every miss: a non-ETF ticker, an ETF with no `series_id`
in the catalog, and a series with no filed period yet all return
holdings=[] rather than an error, because none of those is a failure.

## Query parameters

- `ticker` string: ETF ticker, e.g. SPY
- `limit` integer

## Response `200`

Successful Response

- ETFLookthroughResponse: `GET /api/etf-lookthrough?ticker=…` — filed N-PORT holdings for one ETF (v230), largest first. Public per the tier doctrine in routes/routes_etf_fastapi.py. Misses are honest-empty, never errors. `pctOfNav` is PERCENT units (2.5 == 2.5%) — the key names the unit so the ambiguity `19f8cc87` closed cannot return. Reasoning: the route docstring.
  - `ticker` string, required
  - `seriesId` string, nullable
  - `asOf` string, nullable
  - `count` integer
  - `holdings` object[]
  - `error` string, nullable

## Other responses

- `422`: Validation Error

---

[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)
