# ETF holdings API

Every holding of a US ETF with its weight, the date of its file and its source, in one request with no key. Code in cURL, Python, JavaScript and Sheets.

Canonical page: https://tickerinside.com/etf-holdings-api/
Data as of 2026-10-12. Published by TickerInside, edited by VoidLab.

**What does a US ETF hold, at what weight, and from which file?** `GET /api/v1/fund/{ticker}.json` returns every position of a covered fund in `holdings`, a map from ticker to percent weight, with `holdings_as_of`, the date of the file the positions come from, and `source_layer`, which says whether that file is the issuer's own or an SEC filing. There is no key and no sign-up.

## Live example

The request: `GET /api/v1/fund/voo.json`, https://tickerinside.com/api/v1/fund/voo.json

VOO on this build: 503 positions, from its issuer's file of 2026-08-31. The five heaviest, as the answer lists them:

```json
{
  "ticker": "VOO",
  "name": "Vanguard S&P 500 ETF",
  "source_layer": "issuer",
  "holdings_as_of": "2026-08-31",
  "positions": 503,
  "holdings": {
    "NVDA": 8.0927,
    "AAPL": 7.0432,
    "MSFT": 5.7033,
    "AMZN": 3.8487,
    "GOOGL": 3.0115
  }
}
```

## Code

Each block below is a file that runs against each night's build of this site that has the files it reads, before it is published, through the same Worker that answers the API: the code shown is the code that ran. A program that calls the API on its own should name its project in its User-Agent; it is a request, not a condition.

### cURL

Prints the whole answer as JSON; add `| jq` to pick fields.

```sh
curl -s https://tickerinside.com/api/v1/fund/voo.json
```

### Python

Needs Python 3.9 or later and the tickerinside client, `pip install tickerinside`, which uses only the standard library.

```python
import tickerinside as ti

voo = ti.holdings("VOO")
print(voo.holdings_as_of, voo.source)
for row in voo.data[:5]:
    print(row["ticker"], row["weight_pct"])
```

### JavaScript

Runs as a module in Node.js 20 or later (save it as a `.mjs` file), in Deno, or in a browser page: CORS is open.

```js
const url = "https://tickerinside.com/api/v1/fund/voo.json";
const voo = await (await fetch(url)).json();
console.log(voo.holdings_as_of, voo.source_layer);
const rows = Object.entries(voo.holdings).sort((a, b) => b[1] - a[1]);
for (const [ticker, weight] of rows.slice(0, 5)) console.log(ticker, weight);
```

### Google Sheets

Paste it into a cell: Sheets fills the rows below with the CSV twin of the answer, the date on every row. Excel and Power BI read the same address with Power Query; the queries are on [ETF holdings in Excel and Google Sheets](https://tickerinside.com/spreadsheets/).

```text
=IMPORTDATA("https://tickerinside.com/api/v1/fund/voo.csv")
```

## Fields to read

- `holdings`: Every position, ticker to percent weight, heaviest first.
- `holdings_as_of`: The date of the file the positions come from. Quote it with any weight.
- `source_layer`: issuer for the issuer's own file, sec_nport for the fund's latest SEC Form N-PORT filing; the funds of the other layers name their filing or file.
- `positions`: How many lines the file lists.
- `cite_as`: A line to print under a figure: the fund, the date of its file, the link and the licence.

## Limits

- A fund read from its issuer's own file is dated to that file. A fund read from its latest SEC Form N-PORT filing is dated to the quarter end the filing describes, two to four months before it is read.
- Tickers go in the path in lower case, and a share class keeps its dot (brk.b). A fund that holds bonds, derivatives or a commodity answers in the same shape, with `holdings_kind` saying what its `holdings` map holds.
- A fund with no holdings file yet answers from its prospectus: its stated objective, and no holdings.
- `/api/v1/fund/{ticker}.csv` is the same list as CSV, heaviest first, with the date of the holdings on every row.

## Reference

- The endpoint's fields, errors and examples: [the API reference](https://tickerinside.com/api/#fund).
- In an assistant: the MCP server's tool `get_etf_holdings` answers the same question; [add the server](https://tickerinside.com/agent/) to Claude, ChatGPT, Cursor or VS Code with its address, no key.
- The other use cases: [ETF overlap API](https://tickerinside.com/etf-overlap-api/), [Which ETFs hold a stock, by API](https://tickerinside.com/which-etfs-hold-a-stock-api/), [ETF holdings history API](https://tickerinside.com/etf-holdings-history-api/), [Portfolio exposure API](https://tickerinside.com/portfolio-exposure-api/), [ETF screener API](https://tickerinside.com/etf-screener-api/).