# ETF screener API

Find the US ETFs that hold a stock at a weight or more, cost at most a given expense ratio, pass a size or come from one issuer, each with its holdings date.

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

**Which ETFs hold a stock at a given weight, under a given cost?** `GET /api/v1/screen` returns the funds that pass every filter given: `issuer`, `category`, `layer`, `expense_ratio_max`, `aum_min`, and `holds` with `min_weight` for the funds that hold a stock at that weight or more. Each fund comes with its cost, size, positions and the address of its file; with `holds`, also its weight in the stock and the date of its holdings.

## Live example

The request: `GET /api/v1/screen?holds=NVDA&min_weight=10&expense_ratio_max=0.4&limit=5`, https://tickerinside.com/api/v1/screen?holds=NVDA&min_weight=10&expense_ratio_max=0.4&limit=5

On this build, 60 funds hold NVDA at 10% or more and cost 0.4% a year or less. The first five, each with the date of its holdings:

```json
{
  "filters": {
    "expense_ratio_max": 0.4,
    "holds": "NVDA",
    "min_weight": 10
  },
  "total": 60,
  "funds": [
    {
      "ticker": "GXPT",
      "weight_pct": 19.82,
      "holdings_as_of": "2026-10-12",
      "holdings_source": "issuer file",
      "expense_ratio": 0.15
    },
    {
      "ticker": "SMHX",
      "weight_pct": 18.5624,
      "holdings_as_of": "2026-06-30",
      "holdings_source": "SEC Form N-PORT",
      "expense_ratio": 0.35
    },
    {
      "ticker": "VGT",
      "weight_pct": 17.7869,
      "holdings_as_of": "2026-08-31",
      "holdings_source": "issuer file",
      "expense_ratio": 0.09
    },
    {
      "ticker": "SMH",
      "weight_pct": 17.5486,
      "holdings_as_of": "2026-06-30",
      "holdings_source": "SEC Form N-PORT",
      "expense_ratio": 0.35
    },
    {
      "ticker": "SHOC",
      "weight_pct": 17.26,
      "holdings_as_of": "2026-06-30",
      "holdings_source": "SEC Form N-PORT",
      "expense_ratio": 0.4
    }
  ]
}
```

## 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/screen?holds=NVDA&min_weight=10&expense_ratio_max=0.4&limit=5"
```

### Python (standard library)

Needs Python 3 and nothing else.

```python
import json
from urllib.request import urlopen

url = ("https://tickerinside.com/api/v1/screen"
       "?holds=NVDA&min_weight=10&expense_ratio_max=0.4&limit=5")
screen = json.load(urlopen(url))
print(screen["total"])
for f in screen["funds"]:
    print(f["ticker"], f["weight_pct"], f["holdings_as_of"], f["expense_ratio"])
```

### 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/screen"
  + "?holds=NVDA&min_weight=10&expense_ratio_max=0.4&limit=5";
const screen = await (await fetch(url)).json();
console.log(screen.total);
for (const f of screen.funds) {
  console.log(f.ticker, f.weight_pct, f.holdings_as_of, f.expense_ratio);
}
```

### 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/screen.csv?holds=NVDA&min_weight=10&expense_ratio_max=0.4")
```

## Fields to read

- `total`: How many funds pass the filters.
- `funds`: The funds of this page, each with ticker, name, issuer, expense_ratio, aum_b, positions and fund_file, the address of its file.
- `funds[].weight_pct`: With holds: the stock's weight in the fund, in percent.
- `funds[].holdings_as_of`: With holds: the date of the fund's holdings file.
- `funds[].holdings_source`: With holds: the fund's issuer file or its SEC filing.
- `next`: The address of the next page, or null on the last.

## Limits

- `limit` takes 1 to 100 funds a page, 50 by default, and `offset` up to 100,000; `next` gives the address of the following page.
- `holds` takes a security with a stock file under `/api/v1/sec/`, and `min_weight` needs `holds`.
- `sort` is weight (with holds), aum, expense_ratio, positions or ticker; a fund without the value sorted on comes last. `aum_min` is in billions of US dollars, from market data or from a filing's net assets.
- `/api/v1/screen.csv` holds up to 50 funds a page, and its last row gives the address of the next rows.

## Reference

- The endpoint's fields, errors and examples: [the API reference](https://tickerinside.com/api/#screen).
- In an assistant: the MCP server's tool `find_etfs_holding_stock` 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 holdings API](https://tickerinside.com/etf-holdings-api/), [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/).