ETF screener API
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
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:
{
"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.
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.
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.
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.
=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
limittakes 1 to 100 funds a page, 50 by default, andoffsetup to 100,000;nextgives the address of the following page.holdstakes a security with a stock file under/api/v1/sec/, andmin_weightneedsholds.sortis weight (with holds), aum, expense_ratio, positions or ticker; a fund without the value sorted on comes last.aum_minis in billions of US dollars, from market data or from a filing's net assets./api/v1/screen.csvholds 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.
- In an assistant: the MCP server's tool
find_etfs_holding_stockanswers the same question; add the server to Claude, ChatGPT, Cursor or VS Code with its address, no key. - The other use cases: ETF holdings API, ETF overlap API, Which ETFs hold a stock, by API, ETF holdings history API, Portfolio exposure API.