Free ETF holdings API
All US ETFs as JSON, 5,730 of the 5,733 listed funds: the holdings of 5,423 US ETFs with their weights, which ETFs hold a stock, and the overlap between any two stock ETFs, with no key or sign-up, under CC BY 4.0.
$ curl https://tickerinside.com/api/v1/fund/voo.json
{
"ticker": "VOO",
"holdings_as_of": "2026-06-30",
"holdings": {
"NVDA": 7.5142,
"AAPL": 6.59,
"…": "502 more"
},
"weekly": [-0.025, 0.0586, "… 154 more"],
"…": "45 more fields"
}
What the API covers
TickerInside is an open, machine-readable database of US ETF holdings, with the source and date of each holding. The holdings are read from the issuers' own files and from SEC filings, linked to the stocks inside each fund, and served with no key.
- US ETFs covered
- 5,423
- 624 from four issuers' own files, 2,009 from SEC filings, and 921 fixed income funds, 237 multi-asset funds, 1,368 derivative-based funds, 130 trusts and pools and 134 funds from their sponsors' files
- Holdings rows
- 667,124
- Positions served, each with its weight and date
- Securities held
- 16,724
- In the 626 issuer files, each with its holders
- Fund pairs
- 3,465,028
- Overlap from any two stock ETF files, and 15 written comparisons
- Stocks with a file
- 5,043
- 4,673 of them with at least 110 of the 156 weekly returns, for correlation and risk
- Data files
- 8,400
- JSON, one GET each, every one dated
Counted from the files of : index.json, funds.json, holders.json and the fund and stock files. The files of the funds without a page are linked from one page, the largest of known size first. A pair is measured by the reader from its two fund files; one with a fund from SEC filings compares portfolios dated months apart.
Quickstart
One HTTPS request, with no key and no account. Every fund, stock and comparison file carries its dates and a citation line.
- Base URL
https://tickerinside.com/api/v1- Authentication
- None
- No key, no account, no per-user quota
- Format
- JSON over HTTPS
- UTF-8, CORS open to any origin
- Updates
- Weekday nights
- Built from 22:00 UTC, due by 02:00 UTC; cached five minutes,
304toIf-None-Match
-
Request a file
Ask which ETFs hold Nvidia. Tickers go in the path in lower case.
curl https://tickerinside.com/api/ v1/ sec/ nvda.json -
Read the answer
holderslists the funds read from their issuers' own files, heaviest first, each as fund, weight in percent and the date of that fund's file.holders_sec_nportadds the funds known from SEC filings, dated to the quarter end each filing describes.A security listed outside the US has a key of its own with its market (
7203.JPis Toyota in Tokyo) and no stock file:/api/v1/sec/7203.jp.jsonanswers withcoverageholders_only, from the shard of its first character. How keys are written is under How holdings are keyed.{ "ticker": "NVDA", "name": "Nvidia", "…": "24 more fields", "held_by": 160, "heaviest": ["GXPT", 19.88], "held_by_sec_nport": 587, "holders": [ ["GXPT", 19.88, "2026-10-16"], ["IYW", 16.5999, "2026-10-15"], ["TOPT", 15.6462, "2026-10-15"], "… 157 more" ], "holders_sec_nport": [ ["SMHX", 18.5624, "2026-06-30"], ["SMH", 17.5486, "2026-06-30"], "… 585 more" ], "…": "1 more field", "left_out": [], "…": "19 more fields" } -
Show the date and the source
Print
cite_asunder any figure you show: the dates in it are what let a reader check the figure. Credit TickerInside with a link to the page the figure comes from (cite_asgives it) wherever the medium allows a link, and by name where it does not. How you mark the link is up to you;cite_htmlis that link, ready to paste.TickerInside, Nvidia (NVDA), holders from each covered fund's own file and from SEC Form N-PORT filings, each dated, prices through 2026-10-16, https://tickerinside.com/stock/ nvda/ , CC BY 4.0
Use it from a coding agent
One line each, for Claude Code, Codex, Cursor, Copilot, Gemini CLI and any agent that runs a command or speaks MCP. None needs a key.
| What | One line |
|---|---|
| Remote MCP server, any MCP client | https://tickerinside.com/mcp |
| Local MCP server, Node 20 or later | npx -y tickerinside-mcp@latest |
| Agent skill | npx skills add https://tickerinside.com |
| Claude Code plugin, inside a session (Claude Code 2.1.275 or later) | /plugin install tickerinside --marketplace https://tickerinside.com/.claude-plugin/marketplace.json |
| Python client | pip install tickerinside |
| AGENTS.md block to paste into a project | https://tickerinside.com/AGENTS.md |
The whole reference as one text file is /llms-full.txt, and /llms.txt maps the site. This page as Markdown is /api/index.md, and each of its sections and endpoints is a file of its own, listed in /api/sections/index.md. Fetch the JSON with curl or fetch and parse it; a browsing tool that summarizes pages drops fields and dates.
Endpoints
Static JSON files under https://tickerinside.com/api/v1, and five answers computed from them when asked, read with GET. Each path leads to its fields in the field reference at the end of this page.
Every endpoint is a GET, with no key to send. The files take nothing in, and the five computed answers take theirs in the query string, so there is no POST, PUT or DELETE. A path also works without .json: /api/v1/fund/voo answers with a 301 to /api/v1/fund/voo.json. Try it sends the request from this page to the live API and shows the start of the answer.
-
GET
/index.jsonWhat exists: every covered ticker, the coverage counts and the date of the data. Start here.
index.json46.8 KBMarkdown
-
GET
/funds.jsonEvery fund, one line each: name, issuer, category, size, cost, position count and the address of its file.
funds.json1.6 MBMarkdown
-
GET
/universe.jsonThe US-listed ETFs in Nasdaq Trader's symbol directory, how each is covered or why not yet, and the coverage measured against that list.
universe.json453 KBMarkdown
-
GET
/fund/{ticker}.jsonOne fund: its holdings with their weights and the date of their source, an issuer file or an SEC filing, then cost, returns, risk and weekly returns over 156 weeks where the data has them. A figure the data lacks is null, and so is a week without a return; with fewer than 110 weekly returns,
weeklyis an empty list, or null for a fund from SEC filings. It also answers a US mutual fund share class: FXAIX or AGTHX with its fund's holdings from its latest SEC Form N-PORT (kindmutual_fund), a bond fund such as PTTRX by issuer with its fixed income statistics, as a bond ETF's file gives them, a target-date fund such as VFIFX looked through to the stocks one dollar of it holds (look_through, and every one of them side by side on the target-date funds page), and VFIAX with the holdings of VOO, the ETF class of the same fund (share_class_of), never with the ETF's cost or price./api/v1/mutual-funds.jsonlists them. -
GET
/sec/{ticker}.jsonOne stock (sec for security, not the SEC): which ETFs hold it and at what weight, from issuer files and from SEC filings, with returns, risk and its weekly returns over the same 156 weeks. Every stock in the price data with at least 110 weekly returns in those weeks has one. A stock with fewer has one when a fund read from an issuer file or a stock ETF from SEC filings holds it in a file dated since it listed, the price data has its closes since its listing, or a year of them, the last at most five sessions old, and Nasdaq Trader's directory lists it under its name:
weeklyis then an empty list and the figures over three and five years are null. Any other security a covered fund holds, a line listed abroad included, answers withcoverageholders_only: its holders, each dated, and no prices. -
GET
/holders.jsonThe reverse index of the 626 issuer files: every security their funds hold, and which of them hold it, in one file.
holders.json3.9 MBMarkdown
-
GET
/holders/{c}.jsonholders.jsoncut by the first character of the key, a to z, or 0 for any other character (7203.JPis in0.json,AZN.GBina.json). It is the source of the holders-only answers under/sec/, for a security with no stock file, such as a line listed abroad. Any other address under/holders/answers404, reasonnot_a_shard. -
GET
/securities.jsonEvery security the funds of those issuer files hold, with how many of them hold it and its largest weight.
securities.json792 KBMarkdown
-
GET
/identifiers.jsonEvery fund and stock with a file: its FIGIs, its SEC CIK and, for a fund, its SEC series and class ids, which never change while a ticker may, with its exchange and asset type.
/api/v1/identifiers.csvgives the same rows.identifiers.json1.3 MBMarkdown
-
GET
/ownership.jsonThe ETF ownership ledger: how much of each stock the covered US ETFs hold, at least, and from how many funds, with the share of their money in the ten largest US companies.
ownership.json93.5 KBMarkdown
-
GET
/methods.jsonThe methods of the ETF ownership figure,
ti-ownership/1, of the ETF Ownership Index,ti-ownership-index/1, and of the overlap of two funds that the written comparisons give,ti-overlap/1, with their formulas, rules and test vectors.methods.json34.7 KBMarkdown
-
GET
/ownership-index.jsonThe ETF Ownership Index: each stock's share held by the covered US ETFs, at least, the funds counted and the share the three largest of them hold, then the market and sector lines weighted by market cap. Its CSV twin is
/api/v1/ownership-index.csv, and the methodology has a worked example. -
GET
/ownership-index/history.jsonThe index by market close, and each stock's change of ETF ownership over 5 and 20 market days, from the flows of the funds read daily. Its CSV twin is
/api/v1/ownership-index/history.csv. Under the history terms. -
GET
/compare/{a}-vs-{b}.jsonA written comparison: ETF overlap measured three ways, and correlation over one, three and five years. Only the 15 pairs in
index.jsonwritten_comparisonshave one, in the order listed there (voo-vs-vtiexists;vti-vs-vooanswers301to it). Any other pair answers404, reasonno_written_comparison, and is measured from its two fund files. The pairs: VOO vs VTI, QQQ vs VGT, SCHD vs SCHG, VOO vs QQQ, QQQ vs QQQM, DGRO vs SCHD, QQQ vs SPY, VIG vs VYM, VOO vs VUG, VT vs VTI, QQQM vs SCHG, RSP vs SPY, SCHD vs VYM, SCHG vs VUG, VGT vs XLK.voo-vs-vti.json5.3 KBMarkdown
-
GET
/overlap?funds={funds}The overlap of 2 to 10 funds, computed when asked with the code of the MCP tools, so the figures are theirs: two funds give the overlap by weight, each fund's share in common, the largest shared holdings and the correlation of weekly returns; three or more give every pair ranked. Two bond funds overlap by issuer, a fund that holds no shares is set aside with the reason.
/api/v1/overlap.csvgives one row per pair. -
GET
/lookthrough?portfolio={portfolio}The companies under a portfolio of funds, each fund with its weight or amount after a colon, or none for equal weights: each company's weight, its value and the funds it comes through, as the MCP tool
get_etf_portfolio_lookthroughgives them./api/v1/lookthrough.csvgives one row per company. -
GET
/batch?funds={funds}Up to 10 fund files in one answer, keyed by ticker, each exactly what
/fund/answers, with the tickers not covered and why. -
GET
/screen?holds={holds}The funds that pass a few filters:
issuer,category,layer,expense_ratio_max,aum_min, andholdsa stock withmin_weight, sorted and paged withsort,limitandoffset./api/v1/screen.csvgives the page as rows. -
GET
/diversify?have={have}&try={try}For each fund of
try, against the funds ofhaveat their weights: its overlap by weight, the correlation of weekly returns on all weeks and on the weeks the funds held fell, its part in mega-cap tech, its sectors and countries as its fund file's breakdown gives them, and one sentence to quote, ranked by overlap, then correlation. A trust, a derivative-based or a bond fund counts in the correlation from its own weekly prices. /diversify/ with the same query renders the answer as a page. -
GET
/history.jsonEvery fund with a holdings history, from its issuer's own files: the dates of its oldest and newest files, how many, and the address of its history. Under the history terms.
history.json120 KBMarkdown
-
GET
/history/{ticker}.jsonOne fund's holdings history: each file date, and what entered, exited and moved from one file to the next, weights only.
-
GET
/flows.jsonWhat the ETFs read daily from their issuers' files bought and sold on the latest complete market close, from their share counts: the largest net additions and reductions, the index entries and exits, and the last 20 closes. Every security moved is in
/api/v1/flows.csv, and the summary is a feed, /feeds/flows.xml. Under the history terms.flows.json49.5 KBMarkdown
-
GET
/flows/{ticker}.jsonOne security's flows: the funds adding and trimming it, the net change in shares and dollars, the funds with the largest changes and a series over the last 20 file days. As feeds:
/feeds/stock/{ticker}.xml, and/feeds/fund/{ticker}.xmlfor one fund's changes. -
GET
/status.jsonThe nightly report: when the build ran and the date of each layer of the data.
-
GET
/uptime.jsonLive checks of the pages, the API and the MCP server, every five minutes.
Holders from SEC filings are in each stock file, under holders_sec_nport, and for a security with no stock file in its holders shard; they are not in holders.json or securities.json. Each stock file carries its line of the ownership ledger under etf_ownership. Any pair without a written comparison is measured from its two fund files, as the overlap example does.
Errors and redirects
The HTTP status is the answer, and every answer under /api/ is open to any origin. A 404 carries a short JSON body whose reason and follow-up address say what to request next, and a 400 of a computed answer one whose reason and parameter say what to fix.
| Status | Reason | Meaning | Next request |
|---|---|---|---|
200 | The file. | Read it. Every file carries its dates. | |
204 | A browser's CORS preflight, an OPTIONS request, answered before any redirect: GET and HEAD from any origin, with the headers asked for, kept up to a day. | Nothing to do. | |
301 | An upper case ticker, a share class written BRK-B or BRK/B (the file is brk.b.json), an address without .json, /api/v1 alone, or punctuation copied from a sentence at its end. A key listed abroad with a hyphen, such as SQM-B, keeps it. A written comparison asked for in the other order leads to its file: vym-vs-vig to vig-vs-vym.json. A fund with no file under /etf/ leads to its file under /fund/: etf/voo.json to fund/voo.json. /stock/, the name of the pages, leads to the stock files under /sec/: stock/nvda.json to sec/nvda.json. | Follow it (curl -L). Location gives the address. | |
304 | Your If-None-Match matches the file's ETag. | Keep your copy. | |
400 | A computed answer refused its query: reason (missing_parameter, unknown_parameter, repeated_parameter, invalid_value, too_few_funds, too_many_funds) and parameter say why. | Fix it as message says. | |
400 | too_large | Past the limits of one call (fund files read, holdings compared or looked through): limit and asked give both figures. | Follow the address or tool message names first (answered_by gives them as fields), or ask for fewer funds per call. |
404 | in_another_layer | Under /fund/, only to the TickerInside clients released before it answered for every fund: the fund's file is under /etf/. | etf: that file. |
404 | has_security_file | The ticker asked for as a fund, under /fund/ or /etf/, is not a covered fund, but it has a stock file or a holders-only answer. | security: that address. |
404 | is_a_fund | The ticker asked for as a stock is a covered fund. | fund: its holdings. holders: the shard that lists the funds holding it. |
404 | not_held | Under /sec/: no covered fund holds this key. A security they hold with no stock file answers 200 with coverage holders_only. An old key (7203) answers earlier_key, with reads_as from the aliases of its shard. | holders: the shard of its first character. covered: securities.json. |
404 | not_in_directory | Under /fund/: not covered, nor in the directory of US-listed funds; a listed one gets its universe.json code. | covered: index.json, which lists every covered fund. |
404 | earlier_key | Under /sec/: a key written before lines abroad carried their market. | reads_as: the keys it reads as now. |
404 | no_such_endpoint | No endpoint at this address. | covered: index.json. |
404 | no_written_comparison | Under /compare/: no comparison file for this pair, in either order. pair gives the two tickers asked for, and written_comparisons the pairs that have one, as index.json lists them. | fund_files: the fund files of the two, if covered. The overlap by weight is the sum, over the tickers both hold, of the smaller of the two weights. |
404 | not_a_shard | Under /holders/: not a shard. The shards are a.json to z.json, and 0.json for a key that starts with any other character; 0.json is also split by the key's first digit into 0/0.json to 0/9.json. | holders: the shard of the key's first character. |
404 | not_in_archive | The fund has no holdings history: only the funds read from issuer files have one. | history: history.json, which lists them. |
404 | holdings_at_date_not_enabled | Holdings at a date, /history/{ticker}/{date}.json, come from the fund's quarterly SEC reports, and this fund has none here (GLD; SPY and DIA, whose N-PORT carries no series): every valid date answers this. | changes: the fund's history file. |
404 | before_first_report | The date is before the fund's first quarterly SEC report here. | first_report: the date of that report. |
404 | not_in_sec_history | /quarterly/{ticker}.json: the fund has no quarterly SEC report here: a commodity trust files none, a unit investment trust's carries no series, and a fund that is not a stock fund is not kept. | index: quarterly.json, which lists the funds kept. |
404 | invalid_date | The date is not a calendar date written YYYY-MM-DD, or it is after today in UTC. | Ask again with a valid date. |
404 | Under /overlap, /lookthrough and /diversify: a fund the answer needs is not covered; not_covered lists the tickers and reasons their codes. | covered: index.json. | |
405 | A computed answer asked with another method than GET or HEAD (method_not_allowed). | Use GET. | |
404 | not_held_by_daily_funds | Under /flows/: no fund read daily from its issuer's files held the key or moved it in the window the flows cover. | summary: flows.json, the day's largest moves. |
503 | The file could not be served just then. The body's error is unavailable, with Retry-After: 60. | Retry after a minute. uptime: uptime.json says whether the site fails its own checks. |
Every 404 body is JSON. It holds error, always not_covered; reason, a code /contract/ lists; ticker, as asked for, or null when the address names no ticker; message; docs; and the follow-up address named above. Under /history/, it also holds date when a date was asked for. before_history, for a date before a fund's first file, is answered only once holdings at a date are served. A 400 body holds error (bad_request), reason, message, docs, and parameter, or limit and asked.
Every static file is served with an ETag and Cache-Control: public, max-age=300, must-revalidate, so a client or a proxy may keep it for five minutes and then check it with the ETag. uptime.json is computed when asked and kept for one minute. The five computed answers carry the same Cache-Control and an ETag of the query and the deploy, and the edge cache keeps each for up to a day, so the same query asked again is not computed again. Every answer also carries a Link header naming the OpenAPI description, this page and the status file.
CSV for spreadsheets
The fund files under /api/v1/fund/ and the stock files each have a CSV twin, written from the same JSON, with the date of the holdings on every row: /api/v1/fund/{ticker}.csv lists an ETF's holdings, heaviest first, with holdings_kind and listed_pct for a fund of the other layers, and /api/v1/sec/{ticker}.csv the covered funds that hold a stock. /api/v1/funds.csv lists every fund, one row each, with the address of its file, and /api/v1/securities.csv every security of securities.json. Three computed answers have one too, with the path in .csv or format=csv: /api/v1/overlap.csv?funds=VOO,QQQ,SCHD, one row per pair with both holdings dates; /api/v1/lookthrough.csv?portfolio=VOO:60,QQQ:40, one row per company with the funds it comes through and their dates; and /api/v1/screen.csv, one row per fund. Google Sheets reads them with IMPORTDATA, Excel and Power BI from the web: ETF holdings in Excel and Google Sheets has the formulas, the columns, six TI_ functions for Google Sheets in one Apps Script file, and four Power Query queries.
Build with it
Five examples, each in eleven languages, then three recipes for other jobs. In cURL, Python, Python (tickerinside), JavaScript, R, Java, C#, C++ and Go, each example shows what it printed against the live API on the day it was recorded. The tab of any other language says how it was checked, or that it has not run yet.
Six use cases, each a page with a live example and code that runs against each night's build before it is published: ETF holdings API, ETF overlap API, Which ETFs hold a stock, by API, ETF holdings history API, Portfolio exposure API and ETF screener API. All of them in one file for agents: /api/sections/use-cases.md.
- A fund's holdings
- Which ETFs hold a stock
- ETF overlap
- ETF ownership
- Every fund
- Holdings as CSV
- Correlation
- Files with curl
Pick a language in one example and every example on the page shows it. cURL, Python and JavaScript are printed here; the other languages load when their tab is picked, and every example is also a plain file under /api/examples/, which its tab links. Each names your project in its User-Agent, which we ask of any program that calls the API on its own; it is a request, not a condition. CORS is open, so the JavaScript examples also run from a web page. The Python (tickerinside) tab uses the client on PyPI, tickerinside, version 0.5.0 of : pip install tickerinside. It needs only the standard library; with pandas installed, every result also has a .df DataFrame.
One fund's holdings, largest first
It prints the date of the issuer's file, its holdings as ticker and weight in percent, largest first, and the cite_as line.
It reads holdings, holdings_as_of and cite_as.
curl -fsS -A "MyProject/1.0 (+https://example.com)" \
https://tickerinside.com/api/v1/fund/voo.json |
jq -r '
# The date of the issuer file the weights come from
"VOO holdings_as_of \(.holdings_as_of)",
# holdings maps each ticker to its weight in percent: largest first
"\(.holdings | length) holdings, largest first",
(.holdings | to_entries | sort_by(-.value)[] | "\(.key) \(.value)"),
# The line to print under any figure you quote
.cite_as'
Needs curl, and jq 1.6 or later for the JSON. Install: jq: brew install jq, or apt install jq. Run: bash holdings.sh, or paste into a terminal.
VOO holdings_as_of 2026-08-31
503 holdings, largest first
NVDA 8.0927
AAPL 7.0432
MSFT 5.7033
AMZN 3.8487
GOOGL 3.0115
[trimmed: 498 more lines]
TickerInside, Vanguard S&P 500 ETF (VOO), holdings from the issuer's file of 2026-08-31, https://tickerinside.com/etf/voo/, CC BY 4.0
import requests
# Name your own project in the User-Agent
HEADERS = {"User-Agent": "MyProject/1.0 (+https://example.com)"}
# Read VOO's file: one GET, no key
r = requests.get("https://tickerinside.com/api/v1/fund/voo.json",
headers=HEADERS, timeout=30)
r.raise_for_status()
fund = r.json()
# The date of the issuer's file the weights come from
print("VOO holdings_as_of", fund["holdings_as_of"])
# holdings maps each ticker to its weight in percent: sort it, largest first
rows = sorted(fund["holdings"].items(), key=lambda kv: kv[1], reverse=True)
print(len(rows), "holdings, largest first")
for ticker, weight in rows:
print(ticker, weight)
# The line to print under any figure you quote
print(fund["cite_as"])
Needs Python 3.9 or later and requests. Install: pip install requests. Run: python holdings.py.
VOO holdings_as_of 2026-08-31
503 holdings, largest first
NVDA 8.0927
AAPL 7.0432
MSFT 5.7033
AMZN 3.8487
GOOGL 3.0115
[trimmed: 498 more lines]
TickerInside, Vanguard S&P 500 ETF (VOO), holdings from the issuer's file of 2026-08-31, https://tickerinside.com/etf/voo/, CC BY 4.0
// Name your own project (a browser may send its own User-Agent instead)
const headers = { "User-Agent": "MyProject/1.0 (+https://example.com)" };
// Read VOO's file: one GET, no key
const res = await fetch("https://tickerinside.com/api/v1/fund/voo.json",
{ headers });
if (!res.ok) throw new Error(`HTTP ${res.status}`);
const fund = await res.json();
// The date of the issuer's file the weights come from
console.log(`VOO holdings_as_of ${fund.holdings_as_of}`);
// holdings maps each ticker to its weight in percent: sort it, largest first
const rows = Object.entries(fund.holdings).sort((a, b) => b[1] - a[1]);
console.log(`${rows.length} holdings, largest first`);
for (const [ticker, weight] of rows) console.log(`${ticker} ${weight}`);
// The line to print under any figure you quote
console.log(fund.cite_as);
Needs Node.js 20 or later, or a browser inside <script type="module">. A browser may send its own User-Agent instead of the one set here. Run: node holdings.mjs.
VOO holdings_as_of 2026-08-31
503 holdings, largest first
NVDA 8.0927
AAPL 7.0432
MSFT 5.7033
AMZN 3.8487
GOOGL 3.0115
[trimmed: 498 more lines]
TickerInside, Vanguard S&P 500 ETF (VOO), holdings from the issuer's file of 2026-08-31, https://tickerinside.com/etf/voo/, CC BY 4.0
Which ETFs hold a stock, and at what weight
It prints how many funds hold it, then every fund from the issuers' files as fund, weight in percent and the date of that fund's file, in the file's order (largest weight first), and the cite_as line.
It reads held_by, held_by_sec_nport, holders and cite_as.
For every security at once, load holders.json (3.9 MB) once and keep it; it covers the 626 issuer files.
curl -fsS -A "MyProject/1.0 (+https://example.com)" \
https://tickerinside.com/api/v1/sec/nvda.json |
jq -r '
# How many funds hold it: from issuer files, and from SEC filings
"NVDA held_by \(.held_by) (issuer files), "
+ "held_by_sec_nport \(.held_by_sec_nport) (SEC filings)",
# holders is sorted, largest weight first: [fund, weight %, file date]
(.holders[] | "\(.[0]) \(.[1]) \(.[2])"),
# The line to print under any figure you quote
.cite_as'
Needs curl, and jq 1.6 or later for the JSON. Install: jq: brew install jq, or apt install jq. Run: bash holders.sh, or paste into a terminal.
NVDA held_by 178 (issuer files), held_by_sec_nport 506 (SEC filings)
GXPT 19.77 2026-09-25
VGT 17.7869 2026-08-31
VUSG 16.9756 2026-09-28
IYW 16.69 2026-09-25
TOPT 16.09 2026-09-25
[trimmed: 173 more lines]
TickerInside, Nvidia (NVDA), holders from each covered fund's own file and from SEC Form N-PORT filings, each dated, prices through 2026-09-28, https://tickerinside.com/stock/nvda/, CC BY 4.0
import requests
# Name your own project in the User-Agent
HEADERS = {"User-Agent": "MyProject/1.0 (+https://example.com)"}
# Read NVDA's file: one GET, no key
r = requests.get("https://tickerinside.com/api/v1/sec/nvda.json",
headers=HEADERS, timeout=30)
r.raise_for_status()
stock = r.json()
# How many funds hold it: in their issuers' own files, and in SEC filings
print("NVDA held_by", stock["held_by"], "(issuer files), held_by_sec_nport",
stock["held_by_sec_nport"], "(SEC filings)")
# holders is sorted, largest weight first: [fund, weight %, file date]
for fund, weight, file_date in stock["holders"]:
print(fund, weight, file_date)
# The line to print under any figure you quote
print(stock["cite_as"])
Needs Python 3.9 or later and requests. Install: pip install requests. Run: python holders.py.
NVDA held_by 178 (issuer files), held_by_sec_nport 506 (SEC filings)
GXPT 19.77 2026-09-25
VGT 17.7869 2026-08-31
VUSG 16.9756 2026-09-28
IYW 16.69 2026-09-25
TOPT 16.09 2026-09-25
[trimmed: 173 more lines]
TickerInside, Nvidia (NVDA), holders from each covered fund's own file and from SEC Form N-PORT filings, each dated, prices through 2026-09-25, https://tickerinside.com/stock/nvda/, CC BY 4.0
// Name your own project (a browser may send its own User-Agent instead)
const headers = { "User-Agent": "MyProject/1.0 (+https://example.com)" };
// Read NVDA's file: one GET, no key
const res = await fetch("https://tickerinside.com/api/v1/sec/nvda.json",
{ headers });
if (!res.ok) throw new Error(`HTTP ${res.status}`);
const stock = await res.json();
// How many funds hold it: in their issuers' own files, and in SEC filings
console.log(`NVDA held_by ${stock.held_by} (issuer files), ` +
`held_by_sec_nport ${stock.held_by_sec_nport} (SEC filings)`);
// holders is sorted, largest weight first: [fund, weight %, file date]
for (const [fund, weight, date] of stock.holders) {
console.log(`${fund} ${weight} ${date}`);
}
// The line to print under any figure you quote
console.log(stock.cite_as);
Needs Node.js 20 or later, or a browser inside <script type="module">. A browser may send its own User-Agent instead of the one set here. Run: node holders.mjs.
NVDA held_by 178 (issuer files), held_by_sec_nport 506 (SEC filings)
GXPT 19.77 2026-09-25
VGT 17.7869 2026-08-31
VUSG 16.9756 2026-09-28
IYW 16.69 2026-09-25
TOPT 16.09 2026-09-25
[trimmed: 173 more lines]
TickerInside, Nvidia (NVDA), holders from each covered fund's own file and from SEC Form N-PORT filings, each dated, prices through 2026-09-25, https://tickerinside.com/stock/nvda/, CC BY 4.0
The overlap of two funds, by weight
GET /api/v1/fund/voo.jsonGET /api/v1/fund/qqq.json
It prints the date of each fund's file, the overlap by weight with the count of companies in both, and each file's cite_as line. The overlap by weight is the site's definition: the sum, over the companies both hold, of the smaller of the two weights, the figure of /api/v1/compare/voo-vs-qqq.json.
It reads holdings, holdings_as_of and cite_as. Both funds come from issuer files. With a fund from SEC filings, the site also sets apart the tickers its abroad list names when the other fund holds the US company of that ticker; the Python client's compare() applies that rule.
Any pair, whatever its size, from the two fund files, which is what makes 3,465,028 pairs available; /overlap computes the same on the server. This is the by_weight figure of the comparison files: the smaller of the two weights of every ticker both funds hold, summed. Quote both file dates with it.
UA="MyProject/1.0 (+https://example.com)"
{ curl -fsS -A "$UA" https://tickerinside.com/api/v1/fund/voo.json
curl -fsS -A "$UA" https://tickerinside.com/api/v1/fund/qqq.json; } |
jq -rs '
# -s reads the two answers as one list, so no file is written
.[0] as $voo | .[1] as $qqq
# For every ticker both funds hold, the smaller of its two weights
| [$voo.holdings | to_entries[] | select($qqq.holdings[.key] != null)
| [.value, $qqq.holdings[.key]] | min] as $m
# Overlap by weight, as the site computes it: those weights, added up,
# in tenths of a percent, printed with one decimal (54.0, not 54)
| ($m | add * 10 | round) as $tenths
# Each fund has the date of its own issuer file
| "VOO holdings_as_of \($voo.holdings_as_of)",
"QQQ holdings_as_of \($qqq.holdings_as_of)",
"overlap by weight \($tenths / 10 | floor).\($tenths % 10)%, "
+ "\($m | length) companies in both",
# The lines to print under the figure, one per fund file
$voo.cite_as, $qqq.cite_as'
Needs curl, and jq 1.6 or later for the JSON. Install: jq: brew install jq, or apt install jq. Run: bash overlap.sh, or paste into a terminal.
VOO holdings_as_of 2026-08-31
QQQ holdings_as_of 2026-09-26
overlap by weight 54.0%, 86 companies in both
TickerInside, Vanguard S&P 500 ETF (VOO), holdings from the issuer's file of 2026-08-31, https://tickerinside.com/etf/voo/, CC BY 4.0
TickerInside, Invesco QQQ Trust (QQQ), holdings from the issuer's file of 2026-09-26, https://tickerinside.com/etf/qqq/, CC BY 4.0
import requests
# Name your own project in the User-Agent
HEADERS = {"User-Agent": "MyProject/1.0 (+https://example.com)"}
# Read both funds' files; each has the date of its own issuer's file
funds = {}
for ticker in ("VOO", "QQQ"):
url = f"https://tickerinside.com/api/v1/fund/{ticker.lower()}.json"
r = requests.get(url, headers=HEADERS, timeout=30)
r.raise_for_status()
funds[ticker] = r.json()
print(ticker, "holdings_as_of", funds[ticker]["holdings_as_of"])
# Overlap by weight, as the site computes it: for every ticker both funds
# hold, add the smaller of its two weights
a, b = funds["VOO"]["holdings"], funds["QQQ"]["holdings"]
shared = [t for t in a if t in b]
overlap = sum(min(a[t], b[t]) for t in shared)
print(f"overlap by weight {overlap:.1f}%, {len(shared)} companies in both")
# The lines to print under the figure, one per fund file
for fund in funds.values():
print(fund["cite_as"])
Needs Python 3.9 or later and requests. Install: pip install requests. Run: python overlap.py.
VOO holdings_as_of 2026-08-31
QQQ holdings_as_of 2026-09-26
overlap by weight 54.0%, 86 companies in both
TickerInside, Vanguard S&P 500 ETF (VOO), holdings from the issuer's file of 2026-08-31, https://tickerinside.com/etf/voo/, CC BY 4.0
TickerInside, Invesco QQQ Trust (QQQ), holdings from the issuer's file of 2026-09-26, https://tickerinside.com/etf/qqq/, CC BY 4.0
// Name your own project (a browser may send its own User-Agent instead)
const headers = { "User-Agent": "MyProject/1.0 (+https://example.com)" };
const API = "https://tickerinside.com/api/v1";
// Read both funds' files; each has the date of its own issuer's file
const funds = {};
for (const ticker of ["VOO", "QQQ"]) {
const url = `${API}/fund/${ticker.toLowerCase()}.json`;
const res = await fetch(url, { headers });
if (!res.ok) throw new Error(`HTTP ${res.status} for ${url}`);
funds[ticker] = await res.json();
console.log(`${ticker} holdings_as_of ${funds[ticker].holdings_as_of}`);
}
// Overlap by weight, as the site computes it: for every ticker both funds
// hold, add the smaller of its two weights
const a = funds.VOO.holdings, b = funds.QQQ.holdings;
const shared = Object.keys(a).filter((t) => Object.hasOwn(b, t));
const overlap = shared.reduce((sum, t) => sum + Math.min(a[t], b[t]), 0);
console.log(`overlap by weight ${overlap.toFixed(1)}%, ` +
`${shared.length} companies in both`);
// The lines to print under the figure, one per fund file
for (const fund of Object.values(funds)) console.log(fund.cite_as);
Needs Node.js 20 or later, or a browser inside <script type="module">. A browser may send its own User-Agent instead of the one set here. Run: node overlap.mjs.
VOO holdings_as_of 2026-08-31
QQQ holdings_as_of 2026-09-26
overlap by weight 54.0%, 86 companies in both
TickerInside, Vanguard S&P 500 ETF (VOO), holdings from the issuer's file of 2026-08-31, https://tickerinside.com/etf/voo/, CC BY 4.0
TickerInside, Invesco QQQ Trust (QQQ), holdings from the issuer's file of 2026-09-26, https://tickerinside.com/etf/qqq/, CC BY 4.0
How much of a company US ETFs hold
It prints the lower bound in percent and its basis, the shares counted against the shares outstanding and the date of that count, the oldest and newest holdings file behind it, and the cite_as line. When no figure is published, it prints the refused code.
It reads etf_ownership.pct_lower_bound, etf_ownership.basis, etf_ownership.refused, etf_ownership.shares_held, etf_ownership.shares_outstanding, etf_ownership.shares_outstanding_as_of, etf_ownership.holdings_dates and etf_ownership.cite_as.
curl -fsS -A "MyProject/1.0 (+https://example.com)" \
https://tickerinside.com/api/v1/sec/nvda.json |
jq -r '
# A whole number with a comma every three digits
def commas: tostring
| if length > 3 then (.[:-3] | commas) + "," + .[-3:] else . end;
# The etf_ownership block holds the figure
.etf_ownership
# pct_lower_bound is null when no figure is published; refused says why
| if .pct_lower_bound == null then
"NVDA etf_ownership: no figure published, refused \(.refused)"
else
"NVDA etf_ownership: at least \(.pct_lower_bound)% of its shares"
+ " held by covered US ETFs, basis \(.basis)",
# The shares counted, and the date of the count of shares outstanding
"shares_held \(.shares_held | commas) shares_outstanding"
+ " \(.shares_outstanding | commas)"
+ " as of \(.shares_outstanding_as_of)",
# The oldest and the newest holdings file behind the figure
"holdings dated \(.holdings_dates.oldest) to \(.holdings_dates.newest)",
# The line to print under the figure
.cite_as
end'
Needs curl, and jq 1.6 or later for the JSON. Install: jq: brew install jq, or apt install jq. Run: bash ownership.sh, or paste into a terminal.
NVDA etf_ownership: at least 11.2% of its shares held by covered US ETFs, basis company
shares_held 2,701,201,789 shares_outstanding 24,100,000,000 as of 2026-08-21
holdings dated 2026-01-31 to 2026-09-28
TickerInside, Nvidia (NVDA), at least 11.2% of its shares outstanding held by 679 covered US ETFs (ti-ownership/1), holdings dated 2026-01-31 to 2026-09-28, shares outstanding as of 2026-08-21 from SEC filings, https://tickerinside.com/api/v1/sec/nvda.json, CC BY 4.0
import requests
# Name your own project in the User-Agent
HEADERS = {"User-Agent": "MyProject/1.0 (+https://example.com)"}
# Read NVDA's file: one GET, no key. The etf_ownership block holds the figure
r = requests.get("https://tickerinside.com/api/v1/sec/nvda.json",
headers=HEADERS, timeout=30)
r.raise_for_status()
own = r.json()["etf_ownership"]
# pct_lower_bound is null when no figure is published, and refused says why
if own["pct_lower_bound"] is None:
print("NVDA etf_ownership: no figure published, refused", own["refused"])
else:
print(f"NVDA etf_ownership: at least {own['pct_lower_bound']}% of its "
f"shares held by covered US ETFs, basis {own['basis']}")
# The shares counted, and the date of the count of shares outstanding
print(f"shares_held {own['shares_held']:,} "
f"shares_outstanding {own['shares_outstanding']:,} "
f"as of {own['shares_outstanding_as_of']}")
# The oldest and the newest holdings file behind the figure
dates = own["holdings_dates"]
print("holdings dated", dates["oldest"], "to", dates["newest"])
# The line to print under the figure
print(own["cite_as"])
Needs Python 3.9 or later and requests. Install: pip install requests. Run: python ownership.py.
NVDA etf_ownership: at least 11.2% of its shares held by covered US ETFs, basis company
shares_held 2,701,201,789 shares_outstanding 24,100,000,000 as of 2026-08-21
holdings dated 2026-01-31 to 2026-09-28
TickerInside, Nvidia (NVDA), at least 11.2% of its shares outstanding held by 679 covered US ETFs (ti-ownership/1), holdings dated 2026-01-31 to 2026-09-28, shares outstanding as of 2026-08-21 from SEC filings, https://tickerinside.com/api/v1/sec/nvda.json, CC BY 4.0
// Name your own project (a browser may send its own User-Agent instead)
const headers = { "User-Agent": "MyProject/1.0 (+https://example.com)" };
// Read NVDA's file: one GET, no key. The etf_ownership block holds the figure
const res = await fetch("https://tickerinside.com/api/v1/sec/nvda.json",
{ headers });
if (!res.ok) throw new Error(`HTTP ${res.status}`);
const own = (await res.json()).etf_ownership;
// pct_lower_bound is null when no figure is published, and refused says why
if (own.pct_lower_bound === null) {
console.log("NVDA etf_ownership: no figure published, refused",
own.refused);
} else {
console.log(`NVDA etf_ownership: at least ${own.pct_lower_bound}% of its ` +
`shares held by covered US ETFs, basis ${own.basis}`);
// The shares counted, and the date of the count of shares outstanding
// toLocaleString("en-US") puts a comma every three digits
console.log(`shares_held ${own.shares_held.toLocaleString("en-US")} ` +
`shares_outstanding ${own.shares_outstanding.toLocaleString("en-US")} ` +
`as of ${own.shares_outstanding_as_of}`);
// The oldest and the newest holdings file behind the figure
const dates = own.holdings_dates;
console.log(`holdings dated ${dates.oldest} to ${dates.newest}`);
// The line to print under the figure
console.log(own.cite_as);
}
Needs Node.js 20 or later, or a browser inside <script type="module">. A browser may send its own User-Agent instead of the one set here. Run: node ownership.mjs.
NVDA etf_ownership: at least 11.2% of its shares held by covered US ETFs, basis company
shares_held 2,701,201,789 shares_outstanding 24,100,000,000 as of 2026-08-21
holdings dated 2026-01-31 to 2026-09-28
TickerInside, Nvidia (NVDA), at least 11.2% of its shares outstanding held by 679 covered US ETFs (ti-ownership/1), holdings dated 2026-01-31 to 2026-09-28, shares outstanding as of 2026-08-21 from SEC filings, https://tickerinside.com/api/v1/sec/nvda.json, CC BY 4.0
Every covered fund, with its name
It prints how many funds are read from issuer files and the date of the data, how many more come from SEC filings (listed in sec_funds), then every issuer fund as ticker and name.
It reads count, as_of, sec_count, funds[].t and funds[].n.
curl -fsS -A "MyProject/1.0 (+https://example.com)" \
https://tickerinside.com/api/v1/funds.json |
jq -r '
# funds: read from issuer files, with the date of the data
"\(.count) funds from issuer files, as_of \(.as_of)",
# sec_funds: more US stock ETFs, from SEC filings, t and n as in funds
"\(.sec_count) more from SEC filings, listed in sec_funds",
# One entry per fund: t is the ticker, n the name
(.funds[] | "\(.t) \(.n)")'
Needs curl, and jq 1.6 or later for the JSON. Install: jq: brew install jq, or apt install jq. Run: bash funds.sh, or paste into a terminal.
693 funds from issuer files, as_of 2026-09-28
1756 more from SEC filings, listed in sec_funds
AAXJ iShares MSCI All Country Asia ex Japan ETF
ACWI iShares MSCI ACWI ETF
ACWV iShares MSCI Global Min Vol Factor ETF
ACWX iShares MSCI ACWI ex U.S. ETF
AGNG Global X Aging Population ETF
[trimmed: 687 more lines]
ZAP Global X U.S. Electrification ETF
import requests
# Name your own project in the User-Agent
HEADERS = {"User-Agent": "MyProject/1.0 (+https://example.com)"}
# Read the list of covered funds: one GET, no key, one file for all of them
r = requests.get("https://tickerinside.com/api/v1/funds.json",
headers=HEADERS, timeout=30)
r.raise_for_status()
doc = r.json()
# funds: read from their issuers' own files, with the date of the data
print(doc["count"], "funds from issuer files, as_of", doc["as_of"])
# sec_funds: more US stock ETFs, from SEC filings, t and n as in funds
print(doc["sec_count"], "more from SEC filings, listed in sec_funds")
# One entry per fund: t is the ticker, n the name
for f in doc["funds"]:
print(f["t"], f["n"])
Needs Python 3.9 or later and requests. Install: pip install requests. Run: python funds.py.
685 funds from issuer files, as_of 2026-09-25
1764 more from SEC filings, listed in sec_funds
AAXJ iShares MSCI All Country Asia ex Japan ETF
ACWI iShares MSCI ACWI ETF
ACWV iShares MSCI Global Min Vol Factor ETF
ACWX iShares MSCI ACWI ex U.S. ETF
AGNG Global X Aging Population ETF
[trimmed: 679 more lines]
ZAP Global X U.S. Electrification ETF
// Name your own project (a browser may send its own User-Agent instead)
const headers = { "User-Agent": "MyProject/1.0 (+https://example.com)" };
// Read the list of covered funds: one GET, no key, one file for all of them
const res = await fetch("https://tickerinside.com/api/v1/funds.json",
{ headers });
if (!res.ok) throw new Error(`HTTP ${res.status}`);
const doc = await res.json();
// funds: read from their issuers' own files, with the date of the data
console.log(`${doc.count} funds from issuer files, as_of ${doc.as_of}`);
// sec_funds: more US stock ETFs, from SEC filings, t and n as in funds
console.log(`${doc.sec_count} more from SEC filings, listed in sec_funds`);
// One entry per fund: t is the ticker, n the name
for (const f of doc.funds) console.log(`${f.t} ${f.n}`);
Needs Node.js 20 or later, or a browser inside <script type="module">. A browser may send its own User-Agent instead of the one set here. Run: node funds.mjs.
685 funds from issuer files, as_of 2026-09-25
1764 more from SEC filings, listed in sec_funds
AAXJ iShares MSCI All Country Asia ex Japan ETF
ACWI iShares MSCI ACWI ETF
ACWV iShares MSCI Global Min Vol Factor ETF
ACWX iShares MSCI ACWI ex U.S. ETF
AGNG Global X Aging Population ETF
[trimmed: 679 more lines]
ZAP Global X U.S. Electrification ETF
Recipes for other jobs
Each output shown under a recipe is what it prints on the files of . The Python recipes share one helper. Paste it once, then any recipe below it. It sends a User-Agent that names your project, which we ask of any program that calls the API on its own; it is a request, not a condition.
import json
import urllib.request
API = "https://tickerinside.com/api/v1/"
UA = {"User-Agent": "MyProject/1.0 (+https://example.com)"}
def get(path):
"""One file of the TickerInside API, as Python objects."""
req = urllib.request.Request(API + path, headers=UA)
with urllib.request.urlopen(req) as r:
return json.load(r)
An ETF's full holdings as CSV pandas
One row per holding, heaviest first, written to a file you can open in any spreadsheet.
import pandas as pd
f = get("fund/schd.json")
df = (pd.Series(f["holdings"], name="weight_pct")
.rename_axis("ticker").reset_index()
.sort_values("weight_pct", ascending=False))
df.to_csv("schd_holdings.csv", index=False)
print(len(df), "rows, holdings as of", f["holdings_as_of"])
print(df.head(3).to_string(index=False))
99 rows, holdings as of 2026-05-31
ticker weight_pct
QCOM 6.7377
TXN 5.9047
UNH 5.0926
Correlation between funds numpy
Every fund and stock file with a weekly series carries the same 156 weeks, ending at the same date, weeks_end, so the series line up without any date matching.
The rows and columns are VOO, QQQ, SCHD and VGT. A week without a return is null, which dtype=float turns into nan, and np.corrcoef then gives nan for that fund: keep the weeks every fund has, or use pandas, whose corr skips them pair by pair. With fewer than 110 weekly returns, weekly is an empty list, or null in a file from SEC filings: leave that fund out.
import numpy as np
tickers = ["voo", "qqq", "schd", "vgt"]
rows = [get(f"fund/{t}.json")["weekly"] for t in tickers]
R = np.array(rows, dtype=float) # a null week becomes nan
print(np.corrcoef(R).round(2))
[[1. 0.95 0.57 0.92]
[0.95 1. 0.36 0.97]
[0.57 0.36 1. 0.33]
[0.92 0.97 0.33 1. ]]
Files to disk from a shell curl
Any file can be saved as it is. The -L follows the 301 that an upper case ticker gets, which matters when a path is built from user input.
# One fund: its holdings with their weights, and the date of its file
curl -sL https://tickerinside.com/api/v1/fund/voo.json -o voo.json
# One stock: which ETFs hold it, heaviest first
curl -sL https://tickerinside.com/api/v1/sec/nvda.json -o nvda.json
# What exists, and the date of the data
curl -sL https://tickerinside.com/api/v1/index.json -o index.json
Connect an assistant over MCP
The same data as twelve read-only tools, served by a remote MCP server with nothing to install and no key.
- Server URL
https://tickerinside.com/mcp- Transport and access
- Streamable HTTP, no authentication
- Read-only tools over the same files as this API
Add it to your client
- Claude
- TickerInside is in Claude's connector directory: open it and click Connect. As a custom connector: in Customize, Connectors, click + Add, then Add custom connector, paste the server URL and choose No sign in. On Team and Enterprise an Owner adds it in Organization settings, Connectors. The assistant page has a link that fills it in.
- Claude Code
- Run the command below in a terminal.
- Cursor, VS Code and others
- Add the server URL as a remote MCP server; clients that speak streamable HTTP need nothing else.
- Local servers only
- Run the npm package instead:
npx -y tickerinside-mcp@latest.
claude mcp add --transport http tickerinside https://tickerinside.com/mcp
The twelve tools
| Tool | What it answers |
|---|---|
list_etfs | Coverage and ETF search |
get_etf_holdings | ETF holdings and profile |
compare_etfs | Overlap and risk of two ETFs |
get_etf_overlap_matrix | Overlap across many ETFs |
get_etf_portfolio_lookthrough | Companies inside a portfolio |
get_etf_portfolio_risk | Portfolio risk breakdown |
find_etfs_holding_stock | ETFs that hold a stock |
compare_stocks | Stock comparison and weight in an ETF |
get_etf_ownership | ETF ownership of a stock |
get_etf_holdings_history | ETF holdings history |
get_etf_holdings_changes | ETF holdings changes |
get_etf_flows | ETF buying and selling |
The setup for any assistant, with a prompt to paste, is on the assistant page.
Where the data comes from
Two layers of holdings, kept apart and dated in every file, and end of day prices for the returns.
Issuers' own holdings files
624 funds
Read every weekday night from four issuers. In these files source_layer is issuer and holdings_as_of is the date of the file.
| Issuer | Funds | Newest file |
|---|---|---|
| iShares | 289 | |
| Invesco | 153 | |
| State Street SPDR | 93 | |
| Global X | 91 |
Some funds of these issuers are served from their SEC filings instead, under sec_funds in funds.json: 20 State Street SPDR (GNR, RWR), 13 iShares (IVVM, MAXJ), 9 Global X (PFFD, RYLD), 6 Invesco (PCEF, PBP).
622 of these files are dated or . The other 4, all Global X and iShares, are dated from to .
SEC Form N-PORT filings
2,009 funds
Other US stock ETFs, from the latest public filing each one makes with the SEC. In these files source_layer is sec_nport and report_date is the quarter end the filing describes.
- Quarter ends
- to
- Newest two
- 613 funds describe or
- Age when read
- Usually three to five months
- Refreshed
- Nightly, as each fund's newer filing appears on EDGAR
Prices and weekly returns
End of day prices through give weekly total returns over the same 156 weeks, the series behind every return, risk and correlation figure. A fund or stock with fewer than 110 of them has no series and no figure over three or five years, and a week without a return is null. Prices refresh after the US close on trading days.
Identifiers, under identifiers in each fund and stock file and in /api/v1/identifiers.json: FIGIs from OpenFIGI, asked by ticker, in the public domain under its terms; the CIK and a fund's series and class ids from the SEC's ticker files; the listing exchange from Nasdaq Trader's symbol directory.
Two dates in every fund file
Holdings refresh when the issuer publishes a new file, daily for some funds and monthly for others, so a fund file carries two dates. as_of is the price date, behind every return and risk figure. holdings_as_of is the date of the holdings file: often weeks older than as_of, and sometimes later, since some issuers date a file with the next business day. In a comparison and in holders.json, holdings_as_of is a map keyed by fund; in a stock file, each holder row carries its fund's file date. In ownership.json, as_of is the newest holdings date counted, and in history.json the newest archived file date. Quote both dates: an overlap figure without its holdings date cannot be checked.
How fresh the holdings are, by source
Measured on the fund files of this build: how many funds each source covers, the median age of their holdings, and the share dated within 7 and within 35 days.
| Source | Funds | Median age, days | Within 7 days | Within 35 days |
|---|---|---|---|---|
| Issuers' own files, read every weekday night | 626 | 2 | 99.4% | 100.0% |
| iShares | 289 | 2 | 99.3% | 100.0% |
| Invesco | 153 | 2 | 100.0% | 100.0% |
| State Street SPDR | 93 | 2 | 100.0% | 100.0% |
| Global X | 91 | 1 | 97.8% | 100.0% |
| Sponsors' websites, read every weekday night | 134 | 2 | 91.0% | 100.0% |
| SEC filings (Form N-PORT), stock ETFs | 2,049 | 109 | 0.0% | 0.0% |
| SEC filings (Form N-PORT), fixed income ETFs | 924 | 109 | 0.0% | 0.0% |
| SEC filings (Form N-PORT), multi-asset ETFs | 252 | 109 | 0.0% | 0.0% |
| SEC filings (Form N-PORT), derivative-based ETFs | 1,403 | 78 | 0.0% | 0.0% |
| Trusts' own reports (10-Q, 10-K and the like) | 130 | 109 | 0.0% | 0.8% |
| Prospectus only, until the first holdings filing | 307 | no holdings yet |
How holdings are keyed
- A fund or a stock is keyed by its ticker, upper case in the files and lower case in the path (
/api/v1/fund/voo.json). A share class keeps its dot:BRK.B, at/api/v1/sec/brk.b.json. - A line listed outside the US is keyed by its local code and its market, a two letter country code after a dot:
7203.JPis Toyota in Tokyo,SAN.FRSanofi in Paris. It has no stock file:/api/v1/sec/7203.jp.jsonanswers withcoverageholders_only, from the shard of its first character,/api/v1/holders/0.json, whosealiasesgive the keys written before, without a market (7203 reads as 7203.JP and 7203.SA). A key written with Yahoo's suffix for the exchange,005930.KSor0700.HK, is redirected to the key here,005930.KRor700.HK, and the MCP tools read it the same way; a suffix that is also a country code here (.SA, .CO, .BR) keeps its meaning here. - A row stays under a US ticker when its issuer's file places it in New York, by its exchange, its currency or its identifiers. For a line nothing else places, the US list of tickers decides. The Toronto line of the same shares (
RY) also stays under the US ticker. So a stock file'sleft_outis empty. A row in dollars that nothing places abroad counts as a US line, as a few depositary receipts traded in London do (SBID, the GDR of State Bank of India). - Preferred shares that a file writes under their issuer's common ticker are keyed as that ticker and
.PFD(JPM.PFD), apart from the common stock. - A few keys are not tickers but codes of digits and a letter, which an issuer's file gives in place of a ticker, usually for a line whose ticker changed or was delisted. When such a code enters a fund at about the weight of a ticker that exits, and the reverse follows a file later, it is the same security keyed two ways, not a trade.
How SEC filings are keyed
Filings identify most stocks by ISIN rather than by ticker, and neither ISINs nor CUSIPs are published here. A position is keyed by the ticker the filing gives it, or by the ticker the same security carries in the issuer files and in other funds' filings, or failing both by OpenFIGI's open mapping. What cannot be keyed is left out and counted in unmapped_pct. A row's company is read first from the issuer's Legal Entity Identifier where the filing gives one, so Merck KGaA is never taken for Merck & Co. LEIs are not published either.
Only funds with at least half of their assets in stock are in this layer, because their holdings are stocks that a ticker keys. Fixed income funds have files of their own, and so do the funds that mix asset classes. Leveraged and inverse funds are served apart, as derivative-based funds, since their stock rows alone would understate what they carry in swaps and futures. Funds holding more stock than their net assets are served with the funds that mix asset classes. A ticker listed under abroad in a fund file is a foreign company's local code that the US list gives to another company, and that fund is not counted among the US company's holders. Where an issuer file exists for a fund it is always the one served, because it is newer.
Fixed income funds
The layers below have files of their own under /api/v1/etf/{ticker}.json, with no holdings and no positions. /api/v1/fund/{ticker}.json answers for each of their funds too, in the shape of the stock layers' files, built from that file: holdings maps the stocks and funds it holds outright by ticker, and its other lines under a key in lower case, a bond line as its issuer, coupon and maturity. holdings_kind says what the map holds and listed_pct how much of net assets it shows. A map is empty, with listed_pct 0, when the file lists no holding line by line: a derivative-based fund that holds no stock outright, whose Treasury bills, money market funds and repurchase agreements are in its composition by kind, a pool of futures, or a fund known from its prospectus only. positions counts the keys of the map, and filing_lines or file_lines the lines of the filing or the file. Every field of the /etf/ file follows. index.json says where each ticker is: tickers and tickers_sec are the stock layers, tickers_derivative, tickers_trust, tickers_bond, tickers_multi_asset, tickers_sponsor and tickers_prospectus the others.
Bond, credit, mortgage, Treasury and municipal ETFs are read from the same filings. A bond has no ticker and no CUSIP or ISIN is published, so a fixed income fund's file (source_layer sec_nport_bonds) lists lines by issuer name, kind, coupon and maturity, with the weight of each, and fixed_income gives the average coupon and maturity, the duration, the weight by maturity and by country, and the issuers. The largest funds have over ten thousand lines: the file lists the largest 200 and counts every line in its totals. Mortgage pools are summed by issuer, coupon and year of maturity. Average maturity counts a pool at its final maturity, and duration is the fund's own interest rate risk figure, which filers compute in their own way.
Two fixed income funds overlap by issuer: the smaller weight of each issuer both hold, summed. It is issuer overlap, never mixed with overlap by shares, and the MCP tool compare_etfs gives it. Their answers under /fund/ also overlap line by line, since the same bond filed under the same issuer name has the same key in both.
Multi-asset funds
A fund of funds, or an allocation, target date, buffer or income fund, has a file (source_layer sec_nport_multi_asset) with held_outright by ticker, composition and lines by name. It is in no holder list and no overlap.
Derivative-based funds
Leveraged, inverse, option income and buffer ETFs are bets on a market made through swaps, futures and options, so their stock rows alone say little. They are read from the same SEC filings, and their fund files (source_layer sec_nport_derivatives) keep the two apart. held_outright is what the fund holds outright, in percent of net assets, and composition adds its Treasury bills, money market funds and repurchase agreements. Its swaps, futures and options are in derivatives and underlyings, as notional exposure in percent of net assets, long or short, with the instrument: TQQQ reads about 227% in swaps and 16% in futures on the Nasdaq-100 Index, all long, beside the 58% it holds in stocks.
Notional exposure is not shares held. It is never in a holder count, in holders_all or in the ownership ledger. A stock's file lists the funds that reference it under synthetic_exposure, apart from its holders, so a question about which ETFs give exposure to NVDA can include NVDX and NVDY without counting them as holders. The size is the contract size the filing states. Where a filing gives none in dollars (T-Rex's NVDX writes its contract counts where the dollars belong), the leg has no notional_pct and the file says so. An option's notional is its strike times the shares it covers, and a written option is a short position in the option, not in the stock. None of these funds has a page.
Trusts and commodity pools
A physical gold trust, a bitcoin trust, a currency trust and a commodity pool are ETFs by any reader's count, and none files Form N-PORT. Their fund files (source_layer trust_filings) say what the fund holds, from the fund's own SEC filing, which the file names with its form and dates: a trust whose only investment is one asset lists it at 100, a trust of several assets lists them without a split, and a pool lists the futures it invests in as futures exposure, with no notional because its filings give no single one. There is no held_outright, since no share of any company is held through them. Each entry was checked against the filing before it was written, and a fund whose filing does not say what it holds is not served.
Sponsor files
A fund too new for a Form N-PORT is served from the holdings its sponsor publishes (sponsor_files), by ticker with identifiers dropped, from sponsors whose terms allow it. file_date and source_url say which file. No overlap; its Form N-PORT replaces it.
Prospectus files
A fund with no holdings file has its prospectus's objective, quoted, in a file (prospectus). No holdings; its first holdings filing replaces it.
The universe and its coverage
The universe is the list of US-listed ETFs in Nasdaq Trader's symbol directory, refreshed every weekday night and kept as it was when the download fails. US ETFs in numbers prints its counts with the kinds, categories and costs of the listed ETFs. /api/v1/universe.json lists each one with its name, the layer of fund files that covers it or the reason it does not yet, and the coverage is measured there over the funds only: an exchange-traded note is a debt of the bank that issues it, holds nothing, and is listed as a note, told from a fund by its name (ETN, ETRACS, iPath, X-Links, unless the name also says ETF). 5,423 of the 5,733 US-listed ETFs in Nasdaq Trader's symbol directory of 2026-10-16 have holdings here (94.6%), and 307 more have a file from their prospectus, with the objective it states and no holdings. The same block is in index.json and status.json. Only holdings files count as coverage; a prospectus file counts as a file. That each ETF of the directory has a file is said only when none lacks one, with how many have holdings and the stated objective. The share of assets is measured from holdings files alone.
The ETF ownership ledger
For each stock with a file, etf_ownership gives the share of the company's shares outstanding that the covered US ETFs hold, as a lower bound: at least this percent, from this many funds. The shares held are the share counts of the issuer files, and for the other funds the share balances of their latest SEC filings. A Vanguard ETF's shares are counted for its ETF share class alone. A fund is counted once, and a fund's shares of another covered fund are counted in that fund. The shares outstanding are the most recent count on the cover of a periodic report the company filed with the SEC: a 10-K, 10-Q, 20-F or 40-F, amendments included. They come from the SEC's XBRL data and are published with their date and filing. The count is every class rolled up to the company; or, when the filing itself is read, the one count its cover gives; or the class's own count when only the class checks out.
A figure is published only when all three of these hold:
- The SEC's count is at most 2% below an independent current count of the same shares, since a lower count would put the percent too high. It is at most 25% above it for a company with one class, or 5% above it when several classes are rolled up.
- No split falls between the holdings dates and the date of the count.
- The figure comes to at most 100%.
So a figure can be too high by about 2% of itself, at most. A row that is another security under the stock's ticker is not counted: a preferred share, a foreign company's local code, or a value per share far from the stock's close on the row's date. A file that gives no market values is checked the same way, from its weights and the fund's stated net assets. A single issuer file's count is never published alone. Funds outside the coverage, and covered funds whose count could not be used, are not in it. The method, with its formula and test vectors, is /api/v1/methods.json, and every figure names it: ti-ownership/1. The highest figures are listed on the ETF ownership page, with their shares held, shares outstanding and dates.
Holdings history
What changed in each fund from one issuer file to the next, one fund per request, weights only.
The archive began on and keeps one snapshot per fund and file date: 17,555 so far. For the others, the first file is dated between and for 511 funds (SPY: ) and on or later for 122. /api/v1/history.json gives each fund's first file date. In status.json, data.archive.since is the day the archive began; in history.json, since is the oldest file date.
/api/v1/history.json lists the funds. /api/v1/history/{ticker}.json gives one fund's file dates and each step from a file to the next, with the lines that entered, exited and moved by 0.05 points or more. It also gives how the fund's overlap with its ten closest funds moved. Each step names the file it is compared with, so a gap in the archive or a monthly file shows. SPY's file of added BE, ILMN and P and dropped TAP, BLDR and TTD; XSMO's of , against its file of 2026-09-19, added 66 names and dropped 59, 49.3 points of names turnover.
names_turnover_pp- Half the weight that entered plus the weight that exited, in percentage points: what the change of names carried.
weights_moved_pp- Half the sum of the absolute changes of weight over every line. It includes price drift, which moves every weight a little each day, so it is not turnover.
traded_pp- What the share counts say was traded, in percentage points of assets: each line's weight times the change of its quantity beyond the fund's own growth, a split left out, plus the lines that entered and exited, halved. Null until a fund has 20 steps whose two files carry share counts.
restated- A step across a change of the keys or of the reading of the files, such as the move to keys with a market (7203.JP): it lists the old keys and the weight the new reading adds or takes away, and no trades. It has no
entered,exitedormoved, so read them with a default, such asstep.get("entered", []); the snapshots give only the count of positions that day. reverted- The entered lines the fund held two files earlier, most often a line the issuer's file left out for a day. That exit and this entry are a glitch in the file, not trades.
Quarterly holdings since 2019, /api/v1/quarterly/{ticker}.json, list every report a US ETF listed today has filed with the SEC on Form N-PORT since the end of 2019, one for the last month of each of its fiscal quarters: its date, its filing on EDGAR, its position count, its top 10 weight and its ten largest positions, each company keyed by its ticker today (Facebook's rows of 2019 read META). /api/v1/quarterly.json lists the funds, each with its first and last report. They come from the SEC's public data sets and are under CC BY 4.0 like the rest of the API. A commodity trust (GLD) files no Form N-PORT and a unit investment trust (SPY, DIA) files it without a series, which this history does not read yet: both answer 404 with reason not_in_sec_history.
Holdings at a date, /api/v1/history/{ticker}/{date}.json, give every position of the fund's latest quarterly report on or before the date: holdings_as_of is the report's date and requested_date the date asked for. A date before the first report answers 404 with reason before_first_report and first_report, a fund that files no report holdings_at_date_not_enabled with the address of its file by file history, and a malformed date invalid_date.
Private companies held by US funds, on the private companies page and in /api/v1/private-companies.json with its CSV twin /api/v1/private-companies.csv: each company that is not listed and that two US mutual funds, ETFs or closed-end funds or more hold, from their latest SEC Form N-PORT, with the number of funds and the value they put on it. /api/v1/private-companies/{slug}.json lists each fund holding one, its stake, its shares, the value per share it reports and its filing, and the company's history by quarter since 2019. Under CC BY 4.0.
Daily ETF flows, on the ETF flows page and in /api/v1/etf-flows.json with its CSV twin /api/v1/etf-flows.csv: how much money went into and out of each ETF read daily on the latest complete market close, its net creations and redemptions in dollars, measured from its holdings (the value of what it bought less what it sold, and its own growth on its net assets, published when the two agree within 10%), with the largest inflows and outflows, the last five closes, the sums by issuer and by category, what the same ETFs bought and sold, and each close's totals. /api/v1/etf-flows/series.json gives every ETF's flow on each of the last 20 closes, and /feeds/etf-flows.xml is one item per close. Under the history terms.
The file by file history above is not under CC BY 4.0. The history terms let anyone use it per request, commercial use included, credited with a link to the file wherever the medium allows one and by name where it does not, the link marked as you choose. They do not cover republishing the archive as a whole, or fetching many funds' history on a schedule to store it.
Cite this data
Every fund, stock and comparison file carries cite_as, a citation line built the same way in each.
The line names TickerInside, the fund or stock with its ticker, the source file and its date, the page where the figure can be checked, and the licence. For VOO, in the files of :
TickerInside, Vanguard S&P 500 ETF (VOO), holdings from SEC Form N-PORT for the period ended 2026-06-30, filed 2026-08-28, https://tickerinside.com/etf/voo/, CC BY 4.0
Print it under any figure you quote. Credit TickerInside with a link to the page the figure comes from (cite_as gives it) wherever the medium allows a link, and by name where it does not. How you mark the link is up to you. cite_html is the same link, ready to paste into a page: TickerInside as its text, the page as its address, or the file when there is no page, and the address again after it.
<a href="https://tickerinside.com/etf/voo/">TickerInside</a> (https://tickerinside.com/etf/voo/)
On a site or in an app, one line in the footer can credit the data. How you mark the link is up to you.
Data: <a href="https://tickerinside.com">TickerInside</a> (CC BY 4.0)
The index and list files have no cite_as; they carry license and attribution, and a figure taken from them is cited with the dataset reference below.
Citing the dataset
In a paper or a report, cite the dataset with the date of the data you used.
TickerInside (2026). US ETF holdings, data through 2026-10-16. https://tickerinside.com/. CC BY 4.0.
@misc{tickerinside_etf_holdings_20261016,
author = {{TickerInside}},
title = {{US ETF holdings, data through 2026-10-16}},
year = {2026},
howpublished = {\url{https://tickerinside.com/}},
note = {Licence: CC BY 4.0}
}
The attribution kit gives each of these lines as text, Markdown, HTML, a Jupyter notebook cell, BibTeX, CSL-JSON and one sentence for an AI answer, for the data as a whole, a fund, a stock and a computed answer.
Licence and fair use
CC BY 4.0 for the current data, with no key and no per-user quota.
- Licence
- CC BY 4.0, with attribution to TickerInside: a link to the page the figure comes from wherever the medium allows a link, and the name where it does not, the link marked as you choose. The holdings history and the ETF flows computed from it are the exception, with terms of their own.
- Current snapshots and computed figures
- CC BY 4.0, permanently for everything already published. It covers TickerInside's contribution to the holdings served today, the reverse index and every figure computed from them; credit TickerInside with a link to the page the figure comes from wherever the medium allows a link, and by name where it does not; how you mark the link is up to you. The positions are facts as each issuer publishes them, so check the issuer's terms before bulk commercial reuse.
- SEC filings
- The SEC's Form N-PORT data sets are US government works in the public domain. The fund files TickerInside derives from them are served under CC BY 4.0 like everything else, and each cites its filing. The counts of shares outstanding in the ownership ledger are facts the companies state on the covers of their SEC filings, read from the SEC's XBRL data, and each figure links its filing.
- Holdings history
- Built from the issuer files kept since 2026-09-03 and served one fund per request, weights only, under the history terms of the legal notice (/legal/#history), not under CC BY 4.0: free per request, commercial use included, credited to TickerInside with a link to the file wherever the medium allows one, and by name where it does not, the link marked as you choose; republishing the archive as a whole and extracting it systematically are not allowed.
- ETF flows
- Computed from the same archive, as sums over funds and never one fund's share counts: the summary (/api/v1/flows.json), its CSV twin (/api/v1/flows.csv), each security's answer (/api/v1/flows/) and the feeds (/feeds/flows.xml, and one per fund and per stock under /feeds/), under the history terms of the legal notice (/legal/#history), not under CC BY 4.0: free per request, commercial use included, credited to TickerInside with a link to the file wherever the medium allows one, and by name where it does not, the link marked as you choose; a feed reader may poll the feeds, while fetching the answers of many securities on a schedule to keep them is not allowed.
- Sources
- Issuers' public holdings files, the SEC's public Form N-PORT data sets, the fee tables funds file with the SEC, the shares outstanding companies report to the SEC in XBRL, and end of day prices. Provided as is, with no warranty of accuracy. It is a measurement, not investment advice.
- Fair use
- There is no key, no account and no per-user quota. The terms of service apply to the API and the MCP server as to the site.
- The whole set
- Read
/api/v1/index.jsononce, then the fund files, at most once per nightly build rather than polling: the files change once a night. Keeping each night's copy, including to build your own series, is allowed under CC BY 4.0. The history and flows files are not part of the whole set; they have terms of their own: fetch them per fund or security when asked, and poll the feeds with a feed reader. - User-Agent
- Please send one that names your program and gives a link or an address, for example
MyApp/1.0 (+https://myapp.example). It shows which files people depend on and whom to tell before anything changes. - A missing field
- Write to contact@tickerinside.com. What to include and how long an answer takes are on the support page.
What TickerInside does not serve
- Price history and quotes: a file gives its last close and weekly returns, not a price series, and no bid, ask or volume; TickerInside is not licensed to redistribute a price feed.
- Intraday data: everything is built once a night, after the US close.
- Options: no source that allows republishing them.
- Analyst estimates: no source that allows republishing them.
- ISIN, CUSIP and SEDOL: licensed codes, not served. Funds and stocks are keyed by ticker; a key of digits and a letter is an issuer file's code in place of a ticker.
Status
Written by every nightly build, and checked every five minutes.
- Data through
- Prices and the newest issuer files
- Last build
- Next build due
- By 02:00 UTC
- Issuer files
- 626 of 626
- Under 35 days old
Every build writes /api/v1/status.json: when it ran, the date of each layer of the data, the funds still served from an older file and why, the pages it dated as modified, and the versions of the API and the MCP server. A build runs every weekday night after 22:00 UTC and is due by 02:00 UTC the next morning.
Every five minutes the Worker that serves the site requests a fund page, the API index and an MCP handshake through the public address, and reads that report. What it saw is at /api/v1/uptime.json: each check's state, its share of passed checks over 24 hours, 7, 30 and 90 days, and the incidents, which open after two failed checks in a row. The checks run on Cloudflare like the site, so an outage of Cloudflare itself shows as checks missing, never counted as up.
Measured from outside every five minutes, 100% of the checks of the API passed, and 100% of the MCP server's, with a median answer of 68 ms on the last full day.
The status page draws both files: a bar of 90 days for each check, the incidents day by day and what the latest build did, with an Atom feed of the incidents.
Privacy
What the API, the MCP server, the files for agents and the pages record, and what they never record.
Each request under /api/, this page and /api/files/ included, to /mcp, to the A2A agent at /a2a, to a feed under /feeds/ or to a file for agents (/llms.txt, /llms-full.txt, /AGENTS.md, /skills/, /.claude-plugin/, /.well-known/ and /context7.json) writes one record of thirteen fields to Cloudflare Workers Analytics Engine, which also stores the time of the record. The home page, the fund pages under /etf/, the stock pages under /stock/, the assistant page under /agent/, the ETF ownership page at /etf-ownership/, the ETF flows page at /etf-flows/, the pages under /private-companies/, /diversify/ and /xray/, by their path and never their query, write the same record in three cases only: an assistant fetching one of them for a person who asked it something (ChatGPT-User, Claude-User, Perplexity-User, MistralAI-User and DuckAssistBot); a visitor arriving on one of them from an answer engine, by a link marked utm_source=chatgpt.com or with a Referer from chatgpt.com, copilot.microsoft.com, bing.com, perplexity.ai, claude.ai, gemini.google.com, search.brave.com, duckduckgo.com or chat.mistral.ai; and any program asking for one of them as Markdown, with an Accept header that ranks text/markdown above text/html, as Claude Code and OpenCode send, which gets the page's Markdown version. Any other visit to a page writes nothing here. A request redirected with a 301, such as one with an upper case ticker, writes none: only the request it leads to is recorded.
| Field | What it holds |
|---|---|
| Endpoint | The family of the file asked for (fund, sec, holders and the others), mcp, feed for a feed, doc for a file for agents or a page asked for as Markdown, page for a page an assistant fetched, or arrival for a visit from an answer engine. |
| Subject | The ticker or file asked for, or the path of a feed, of a file for agents or of a page; for /mcp, the method called, for a tool call the tool's name and up to eight values of its ticker arguments shaped like a ticker, with the older name the call used when it used one; for a computed answer (overlap, lookthrough, batch, screen, diversify), up to eight of the tickers its query names, never a weight, an amount or another value, for a handshake the name and version the client software gives, and after them the protocol revision a request names when the server does not know it, cut to 32 letters, digits, dots, dashes and underscores. |
| Kind of client | Read from the User-Agent: browser, command line or HTTP library, a TickerInside client (the npm and PyPI packages), a coding agent such as Claude Code, Codex, Cursor, Copilot or Gemini CLI, an AI assistant or its crawler, each by name, another crawler, or other; unknown when a request sends none. |
| Country | The country Cloudflare assigns to the request. |
| User-Agent | Its first 120 characters. |
| Caller code | The first 16 hexadecimal characters of a SHA-256 hash of the IP address and the User-Agent, salted with a string that includes the day's date. |
| Status | The HTTP status, or for a tool call whether it answered, found the ticker not covered, refused the input or failed. |
| Origin host | The host, never the path, of the Origin header a browser sends when a page on another site calls the API. |
| Referer host | The host, never the path, of the Referer header. |
| Sec-Fetch-Site | Whether a browser call comes from this site or another one. |
| CF-Worker | The Cloudflare Worker a call comes from, when there is one. |
| Network | The name of the network the request comes from, such as a hosting company or an internet provider. |
| Client or source | For /mcp, the name and version the client software gives in any request; for a visit from an answer engine, that engine's domain alone, never the rest of the address it came from; for a computed answer, csv when it was asked as CSV and hit when the edge cache had it. |
The caller code changes every day, so it counts distinct callers within a day and cannot follow anyone from one day to the next. No IP address is stored and no cookie is set. An MCP tool call records the tool's name and, from the arguments that name a fund or a stock, up to eight values shaped like a ticker: one to twelve letters, digits and dots with at least one letter, a dash between two parts read as a dot. Nothing else of its arguments is recorded: a portfolio given to get_etf_portfolio_lookthrough or to /api/v1/lookthrough gives its tickers, never its weights or amounts, and a search query, digits alone or a value with a space is never kept. The answer of /api/v1/lookthrough, which repeats the weights, is kept in Cloudflare's edge cache for up to a day under its query, and served only to the same query. A word passed where a ticker goes, such as apple, is kept as APPLE, since nothing checks it against the list of tickers. The Worker's own status checks are not recorded, and its Workers request logs are turned off, so no log of each request's headers is kept beside these records.
Analytics Engine keeps these records for three months, and they are not sold or shared. Pages also count visits with Simple Analytics, which sets no cookie. The privacy policy says the same for every part of the service, with who processes the records and how to ask for yours. Questions: contact@tickerinside.com.
Versioning and machine-readable files
The version is in the path, and inside v1 fields are added, never removed or retyped.
Fields are added as people ask for them. Every change to the site and its data is dated on the What changed page, and the nightly report gives the versions in use. The data contract says what v1 promises and how a program checks it: every build writes a manifest with the sha256 of every file under /api/v1/, the changes and deprecations are files a program reads, corrections are recorded in a registry with what the files said before and say since, and every 404 gives a reason code. The state of the service is on the status page.
| What | Where | Format |
|---|---|---|
| OpenAPI description | /api/openapi.json | OpenAPI 3.1, JSON |
| This page as Markdown | /api/index.md | Markdown |
| Endpoint map | /api/v1/index.json | JSON, under endpoints |
| Nightly report | /api/v1/status.json | JSON |
| Manifest of every file | /api/v1/manifest.json | JSON, and the sha256 of each file in sha256sums.txt.gz |
| Changelog | /api/v1/changelog.json | JSON |
| Deprecations | /api/v1/deprecations.json | JSON |
| Corrections | /api/v1/corrections.json | JSON |
| Methods | /api/v1/methods.json | JSON, with test vectors |
| Python client | tickerinside on PyPI | Version 0.5.0 |
| MCP server | https://tickerinside.com/mcp, and tickerinside-mcp on npm | Version 1.14.0 |
Field reference
Every field of the files listed above, typed, with examples from the files of and, for uptime.json, from simulated checks. A type that says or null marks a field that can be null, which means missing, never zero.
Words used here
- Issuer layer
- The funds read each weekday night from their issuers' own files;
source_layerissuer. - SEC layer
- The funds read from their latest SEC Form N-PORT filing, months older;
source_layersec_nport. - Line listed abroad
- A holding traded outside the US, keyed with its market (7203.JP is Toyota in Tokyo).
- Other layers
- Fixed income, multi-asset, derivative-based, trust, sponsor-file and prospectus funds: under /fund/ with
holdings_kind, in full under /etf/ (index.jsontickers_bond, etc.). - Key scheme
- How keys are written; scheme 2 adds the market to lines listed abroad (
aliasesmaps old keys).
What exists
/api/v1/index.json Every ticker covered, the coverage counts and the date of the data
What exists, and the date of the data. Start here if you are pulling the whole set.
{
"as_of": "2026-10-16",
"coverage": {"funds": 626, "securities_held": 16724, "…": "1 more field", "sec_nport": 2049, "sec_nport_periods": {"oldest": "2026-01-31", "newest": "2026-08-31"}, "…": "13 more fields"},
"…": "1 more field",
"tickers": ["AAXJ", "ACHP", "ACWI", "… 623 more"],
"tickers_sec": ["AAAA", "AADR", "AAEQ", "… 2,046 more"],
"…": "6 more fields",
"written_comparisons": [{"pair": ["VOO", "VTI"], "url": "https://tickerinside.com/api/v1/compare/voo-vs-vti.json" }, "… 14 more"],
"…": "5 more fields"
}
| Field | Type | Example | What it is |
|---|---|---|---|
as_ |
string | "2026-10-16" |
The price date across the whole site. |
coverage |
object | {"funds":626, |
The coverage counts. funds: the issuer-layer funds. securities_held: the distinct securities they hold. what: the universe in words. sec_nport: the SEC-layer funds, with the oldest and newest quarter end their filings describe in sec_nport_periods, and how old their holdings are on the day of the build in sec_nport_age (the 10th to the 90th percentile in whole months, low_months to high_months, and in words, text); sec_nport_bonds, sec_nport_multi_asset, sec_nport_derivatives, trust_filings, sponsor_files and prospectus, the other layers. Then the figures every page prints: funds_total, every layer, the US ETFs covered; universe, the coverage measured against the US-listed ETFs (see universe.json); stocks_with_file, the stocks with a file under /sec/, and stocks_with_weekly_series, those whose file carries the weekly series, at least 110 of the 156 weekly returns; pages, the funds and stocks with a page; issuers, the issuers whose files are read, largest first. |
endpoints |
object | {"funds":"https:/ |
The endpoints as URL templates, so a client can find them without reading the reference. fund answers for every fund; etf is the file of a fund listed under tickers_derivative, tickers_trust, tickers_bond, tickers_multi_asset, tickers_sponsor or tickers_prospectus. holders_shard is the template of the holders shards, {c} being the key's first character in lower case, a to z, or 0 for any other. It also gives the OpenAPI description (openapi), the reference in Markdown (docs_markdown), the nightly report (status) and the live checks (uptime). |
tickers |
array of string | ["AAXJ", |
Every issuer-layer fund, as a sorted list: the funds read from their issuers' own files. This is the universe the census of pairs and the file ages count over; a stock page counts these funds and the funds of tickers_sec. |
tickers_ |
array of string | ["AAAA", |
Every SEC-layer fund, as a sorted list: the other US stock ETFs, served from their latest SEC Form N-PORT filing. Each has a fund file like the funds above, dated to the quarter end its filing describes, and a page only in a published cohort. |
tickers_ |
array of string | ["AALG", |
Every derivative-based fund, sorted. Its file is under /etf/. |
tickers_ |
array of string | ["AAAU", |
Every trust and commodity pool that files no Form N-PORT, sorted. Its file is under /etf/. |
tickers_ |
array of string | ["AAA", |
Every fixed income fund, sorted. Its file is under /etf/. |
tickers_ |
array of string | ["AAPR", |
Every multi-asset fund, sorted. Its file is under /etf/. |
tickers_ |
array of string | ["AAUB", |
Every sponsor-file fund, sorted. |
tickers_ |
array of string | ["AAAB", |
Every prospectus-file fund, sorted. |
written_ |
array of object | [{"pair":["VOO", |
The written comparisons: the pairs with a page written by hand, each with the URL of its JSON. A pair's file exists only in the order listed here. Any two tickers above can still be compared from their two fund files. |
without_ |
object | {"etn":["AIQD", |
The directory's tickers with no file, by the reason a fund address's 404 gives. |
docs |
string | "https:/ |
The reference for these endpoints. |
license |
string | "CC BY 4.0" |
The licence the data is published under. |
attribution |
string | "Credit TickerInside with a link to this … |
How to credit the data: a link to this file where the medium allows one, the name where it does not. |
terms |
string | "https:/ |
The legal notice: who publishes, the licence of the current snapshots served here, and the separate terms of the historical archive. |
One fund
/api/v1/fund/{ticker}.json One fund's holdings and their date, with its cost, returns and risk where known
The holdings with their weights and the date of their source, then cost, returns, risk and weekly returns over 156 weeks where the data has them. A figure the data lacks is null, and so is a week without a return; with fewer than 110 weekly returns, weekly is an empty list, or null for a fund from SEC filings. This is the endpoint most things are built from. The funds no issuer file covers are served in the same shape from their latest SEC filing, with eight more fields: report_date, filed, filing_url, net_assets, multi_class, stock_pct, unmapped_pct and abroad. A fund of the other layers answers too, from its /etf/ file.
{
"ticker": "VOO",
"…": "5 more fields",
"source_layer": "sec_nport",
"…": "1 more field",
"as_of": "2026-10-16",
"holdings_as_of": "2026-06-30",
"…": "33 more fields",
"holdings": {"NVDA": 7.5142, "AAPL": 6.59, "MSFT": 4.2966, "…": "501 more"},
"weekly": [-0.025, 0.0586, 0.0136, "… 153 more"],
"weeks_end": "2026-10-16",
"…": "3 more fields"
}
| Field | Type | Example | What it is |
|---|---|---|---|
ticker |
string | "IVV" |
The fund's ticker, upper case. |
name |
string | "iShares Core S&P 500 ETF" |
The fund's name. |
page_ |
string or null | "https:/ |
The fund's page on the site, or null when it has none yet. Link it when you quote a figure. |
cite_ |
string | "TickerInside, |
A citation line for a quoted figure: the fund, its source file and that file's date, a URL to check it, and the licence. |
cite_ |
string | "<a href=\"https:/ |
The credit as HTML: a link to the page cite_as names, then its address. |
identifiers |
object | {"asset_ |
FIGI and SEC ids: /api/v1/identifiers.json. |
source_ |
string | "issuer" |
Where the holdings come from. issuer: the issuer's own file (the issuer layer). sec_nport: the fund's latest public SEC Form N-PORT filing (the SEC layer), whose holdings are the portfolio at the quarter end it describes (report_date), not on the day you read them; index.json coverage.sec_nport_age says how old the layer's holdings are on the day of the build. sec_nport_derivatives: a derivative-based fund, with its contracts apart from its holdings. sec_nport_bonds: a fixed income fund. sec_nport_multi_asset: a fund of funds or of several asset classes. trust_filings: a trust or commodity pool that files no Form N-PORT, from its own SEC filing. sponsor_files, prospectus: see /api/#sponsor-files. |
category |
object | {"id":"us-large-blend", |
TickerInside's category (id, label, group, rule, measures): https://tickerinside.com/etf/category/ |
as_ |
string or null | "2026-10-16" |
The price date: the date of the price data behind every return and risk figure here. Null for an SEC-layer fund whose weekly is null. |
holdings_ |
string or null | "2026-10-15" |
The date of the holdings: the date of the issuer's file, or for an SEC-layer fund the quarter end its filing describes. It is often weeks older than as_of, and often differs from the other fund's in a comparison, so quote it with any holdings figure. It can also be later than as_of, since some issuers date their file with the next business day. |
expense_ |
number or null | 0.03 |
Annual cost as a percentage of assets: 0.03 means three basis points, or $3 a year on $10,000. From the fund's newest SEC filing that states it, after any fee waiver when the filing gives both figures, else from the market data. Null when neither gives one. Never read a null as zero. |
expense_ |
number or null | 0.03 |
The total of the filing's fee table before any waiver, in percent, which counts the fees of the funds it holds; expense_ratio when there is no waiver. Null unless expense_ratio is from a filing. |
expense_ |
string or null | "sec_ |
Where expense_ratio comes from. sec_filing: the fee table the filing tags by share class, from the SEC's risk/return data sets or the filing itself. sec_filing_text: the fee table's text, read in a newer prospectus, where no other figure exists or one agrees with it. market_data: undated, also where the filing read is over a year old and differs, or is not matched to the fund. Null when expense_ratio is null. |
expense_ |
string or null | "2026-07-27" |
The day that filing reached the SEC, or null. |
expense_ |
string or null | "https:/ |
That filing on EDGAR, or null. |
yield |
number or null | 1.1 |
Trailing twelve month distribution yield, as a percentage. |
aum_ |
number or null | 881.3 |
Assets under management, in billions of US dollars, rounded to 0.1, from the market data, read on aum_date. For a Vanguard fund it is the whole fund, every share class together; etf_class_net_assets_b is the ETF's own class. Null when the market data gives no size, the usual case for an SEC-layer fund, whose size is then net_assets on report_date. |
aum_ |
string or null | "market_ |
Where aum_b comes from. market_data: read on aum_date. market_data_kept: the latest read gave no size, so the last size known is kept, with the day it was read, for 30 days at most. Null when aum_b is null. |
aum_ |
string or null | "2026-10-17" |
The day aum_b was read from the market data. Null when aum_b is null, or for a size read before the day was recorded. |
etf_ |
null | null |
For a Vanguard fund, the net assets of its ETF share class alone, in billions of US dollars, as Vanguard states them. Such a fund's ETF is one class of a fund that also has mutual fund classes. Every value held in /api/v1/sec/{ticker}.json is computed from it for such a fund. Null for any other fund. |
etf_ |
null | null |
The date Vanguard gives for etf_class_net_assets_b. Null when it is. |
positions |
integer | 505 |
How many positions the holdings map lists; filing_lines or file_lines count every line of a fund of another layer. |
breakdown |
object or null | {"sectors_ |
In percent of the fund, to four decimals: sectors_pct, no_sector_pct, sector_coverage_pct, sectors_stated (true from 50%), other_funds_pct, mega_cap_tech_pct (Apple, Microsoft, Nvidia, Alphabet, Amazon, Meta Platforms, Broadcom and Tesla), top10_us_companies_pct, countries_pct, no_country_pct (lines of no known country), answer, method. Null for another layer. |
vol |
number or null | 14.3 |
Annualised standard deviation of weekly total returns over three years, as a percentage. |
beta |
number or null | 1.0 |
Sensitivity to the S&P 500, from three years of weekly returns. 1.00 means it has moved with the index. |
mdd3 |
number or null | -16.9 |
Largest peak to trough decline over three years, measured on weekly closes. Negative. |
r1 |
number or null | 17.5 |
Cumulative total return over one year, as a percentage. Not annualised. |
r3 |
number or null | 90.4 |
Cumulative total return over three years, as a percentage. Not annualised. |
r5 |
number or null | 82.7 |
Cumulative total return over five years, as a percentage. Not annualised. |
last_ |
number or null | 775.16 |
The last closing price, raw, in the fund's trading currency. Returns use dividend-adjusted closes; this figure is the market close as traded. |
last_ |
string or null | "2026-10-15" |
The date of that close. |
day_ |
number or null | 0.27 |
The move from the previous close to the last, as a percentage. |
high_ |
number or null | 782.54 |
The highest raw close over the last 252 trading days. |
low_ |
number or null | 634.93 |
The lowest raw close over the last 252 trading days. |
currency |
string or null | "USD" |
The trading currency of the price fields. |
holdings |
object | {"NVDA":7.8627, |
The positions, as a map of key to percentage weight. For the issuer layer, the positions as the issuer publishes them. For an SEC-layer fund, every position the filing lets us key to a ticker; the rest is counted in unmapped_pct. A key is the ticker of a US line (a share class keeps its dot, BRK.B), or a local code and its market for a line listed abroad (7203.JP). Preferred shares filed under their issuer's common ticker are keyed as that ticker and .PFD (JPM.PFD), apart from the common stock. A key of digits and a letter is a code the issuer's file gives in place of a ticker, usually for a line whose ticker changed or was delisted. The overlap between two stock funds is computed from this field. For a fund of another layer, tickers, then other lines in lower case: a bond as issuer, coupon and maturity, else its name; never an identifier or a contract. |
weekly |
array of number or null | [-0.025, |
156 weekly total returns as decimals, oldest first, ending at as_of. The weeks are the same in every fund and stock file, so any basket of them can be correlated without matching dates. A week is null when its return cannot be computed, because the fund's prices begin later or a weekly close is missing. An empty list for an issuer-layer fund with fewer than 110 weekly returns in those weeks, and null for a fund of another layer with fewer. |
weeks_ |
string or null | "2026-10-16" |
The date the weekly series ends, always as_of. It is set even when weekly is an empty list, and null, like as_of, when weekly is null. |
flows |
object | {"date":"2026-10-12", |
For a fund read daily from its issuer's files, its net creations and redemptions in dollars, measured from its own holdings files (/etf-flows/): the close (date), flow_usd and flow_pct_of_assets, null with status not_measured when the two measures of it disagree, the close compared with (previous_close), the last closes' net (last_closes), each recent close's flow (series, [close, dollars or null]) and a sentence (text), with the page, the method and the terms. Absent for any other fund. |
license |
string | "CC BY 4.0" |
The licence the data is published under. |
attribution |
string | "Credit TickerInside with a link to the p… |
How to credit the data: a link to the page cite_as names where the medium allows one, the name where it does not. |
source |
string | "https:/ |
Where the method behind these figures is written down. |
What a fund from SEC filings adds, from /api/v1/fund/smh.json
| Field | Type | Example | What it is |
|---|---|---|---|
report_ |
string or null | "2026-06-30" |
The quarter end the filing describes, the end of one of the fund's fiscal quarters. The holdings are the portfolio on that day, not on the day you read them; index.json coverage.sec_nport_age says how old the layer's holdings are on the day of the build. Quote this date with any figure from these holdings. |
filed |
string or null | "2026-08-26" |
The day the filing reached the SEC, usually about 60 days after report_date. |
filing_ |
string or null | "https:/ |
The filing itself on SEC EDGAR, to check any figure against the source. |
net_ |
integer or null | 77198271229 |
The fund's net assets on report_date, in US dollars, as filed. For an ETF that is one share class of a larger fund, it covers every class. |
multi_ |
boolean | false |
True when the ETF is one share class of a fund that also has mutual fund classes. The holdings and weights are then the whole fund's, which is the same portfolio, and so is net_assets. |
stock_ |
number | 99.95 |
How much of net assets the filing lists as common or preferred stock, long positions only. Cash, bonds, derivatives and collateral make up the rest and are not in holdings. |
unmapped_ |
number | 0.0 |
The part of stock_pct that could not be tied to a ticker and is left out of holdings, usually private companies, warrants and thinly traded foreign lines. The holdings add up to stock_pct minus this. |
abroad |
array of string | [] |
Tickers in holdings that are a foreign company's local code, where the US list gives the same ticker to another company. Such a position is the foreign company, so the fund is not listed among the US company's holders in /api/v1/sec/. Lines listed abroad now carry their market (ALV.DE is Allianz, ALV is Autoliv), so this list is normally empty. |
What a fund of another layer adds, from /api/v1/fund/bnd.json
| Field | Type | Example | What it is |
|---|---|---|---|
holdings_ |
string | "bond" |
What the map of a fund of another layer holds: bond, multi-asset, stock, derivative (stocks held outright, never contracts), commodity (a trust's asset) or prospectus (none yet). |
listed_ |
number | 45.51 |
The share of net assets the map shows, in percent. Not listed is not the same as not held. |
etf_ |
string | "https:/ |
The /etf/ file this answer is built from, whose fields follow. |
What the four other layers add, in /api/v1/etf/{ticker}.json
| Field | Type | Example | What it is |
|---|---|---|---|
derivative_ |
integer | 11 |
The derivative positions the filing lists, before the legs roll them up. |
held_ |
object | {"NVDA":2.4785, |
What the fund holds outright: a map of ticker to percent of net assets, never its contracts (see derivatives). |
summary |
string | "On 2026-05-31, |
One sentence to quote: what the fund held, and for a trust the filing that says so. |
composition |
array of object | [{"kind":"stocks", |
What the fund holds, as [{kind, label, pct}] in percent of net assets, largest first. kind is what the filing classes each line as: stocks, treasury_bills, treasury_notes_and_bonds, agency_debt, agency_mortgage_pools, corporate_bonds, municipal_bonds, money_market_funds, repurchase_agreements and the like. A trust lists its asset, pct 100.0 when it is the only investment and null where the filing gives no split. |
derivatives |
array of object | [{"instrument":"swap", |
Swaps, futures and options, one leg per instrument, underlying and direction: instrument, description, underlying or underlying_ticker, underlying_kind, direction (the fund's side; a written option is short), notional_pct (the size the filing states, in percent of net assets; null when it gives none in dollars, always for a pool; an option's is strike times shares), value_pct, positions, option_type, option_side, expires_first, expires_last. |
underlyings |
array of object | [{"underlying":"Nasdaq-100 Index", |
The legs rolled up by underlying: long_pct and short_pct of swaps and futures, options by kind and side, instruments, net_pct, complete. |
exposure |
object | {"stocks_ |
stocks_pct; swaps_futures_long_pct and swaps_futures_short_pct; options_notional_pct; complete; long_exposure_pct, stocks plus long swaps and futures when the fund has no short leg or option and every size is stated (TQQQ: about 300), else null. |
exposure_ |
array | [] |
Caveats about the sizes, in words. |
structure |
string | "Physical metal trust" |
The kind of trust or pool. |
source_ |
string | "10-Q" |
The SEC form the description was checked against. |
target |
null | null |
The daily multiple a geared pool seeks (2x, -2x); null otherwise. |
filing_ |
integer | 17409 |
The lines the filing has, for a fixed income or multi-asset fund: a count, not holdings. |
fixed_ |
object | {"average_ |
A fixed income fund's figures, over every line of its filing: average_coupon_pct, average_maturity_years (a mortgage pool counts at its final maturity), duration_years (from the fund's own interest rate risk figures, null when it gives none), debt_pct, by_maturity, by_country and issuers [{issuer, key, pct, lines}], largest first, with issuers_total and issuers_shown_pct. Issuer overlap: the sum over shared key of the smaller pct. |
lines |
array of object | [{"issuer":"Vanguard Cmt Funds-Vanguard M… |
The largest lines of the filing by name, with no identifier: issuer, kind, coupon_pct, maturity (a date, or the year of a group of mortgage pools), pct, count of filing lines it stands for and, for an ETF this API covers, ticker. |
notes |
array of string | ["Mortgage pools are summed by issuer, |
Caveats about the lines, in words. In a sponsor file, also how its weights are read (swap and futures weights are the sponsor's own, as notional in percent of net assets). |
sponsor |
string or null | "ETF Architect sponsor site" |
The sponsor whose site was read; in a prospectus file, its adviser. |
source_ |
string | "https:/ |
The address read. |
file_ |
string | "2026-09-30" |
The date of the sponsor's file. |
date_ |
string | "file" |
file, page or read. |
read_ |
string | "2026-10-01" |
The day it was read. |
served_ |
boolean | true |
True when an earlier night's file is kept. |
file_ |
integer | 545 |
Rows in the sponsor's file. |
lines_ |
integer | 42 |
Lines not keyed and not a contract. |
form |
string | "485BPOS" |
497K, 497, 485BPOS or 485APOS. |
registrant |
string or null | "Corgi ETF Trust I" |
The filing trust, or null. |
objective |
string | "The Corgi FTSE Aaa-A Intermediate Corpor… |
The objective, quoted (at most 400 characters). |
objective_ |
boolean | true |
Always true. |
objective_ |
boolean | false |
True when cut, ending in three dots. |
stated_ |
null | null |
The daily multiple and reference the prospectus states, or null. |
index |
string or null | "FTSE US Corporate Bond AAA-A Rated 3% Is… |
The index it tracks, or null. |
expense_ |
number or null | 0.05 |
Expenses in percent, after a waiver; null if not read. |
inception_ |
null | null |
The start date it states, or null. |
holdings_ |
string | "This fund has no holdings file yet. Its … |
Says its first holdings filing replaces this file. |
The holdings map and the weekly series make this file enough on its own. The overlap of any two stock ETFs is a walk over two holdings maps, and a covariance matrix for any basket is a walk over their weekly series.
One stock
/api/v1/sec/{ticker}.json Which ETFs hold one stock and at what weight, with its returns and risk (sec is for security, not the SEC)
In this path sec stands for security, not the SEC: the file is one stock and the funds that hold it, and a fund's own holdings are in /api/v1/fund/{ticker}.json. Name, sector, market cap, valuation, returns, risk, the funds that hold it from issuer files and from SEC filings, and its weekly returns over the same 156 weeks as the fund files. Every stock in the price data with at least 110 weekly returns in those weeks has a file here, whether or not any covered fund holds it. A stock with fewer has one when a fund read from an issuer file or a stock ETF from SEC filings holds it in a file dated since it listed, the price data has its closes since its listing, or a year of them, the last at most five sessions old, and Nasdaq Trader's directory lists it under its name. weekly is then an empty list, the figures over three and five years and the correlated stocks are null or empty, calendar is given once 40 of the last 52 weeks have a return, and r1 once the weekly closes cover a full year.
{
"ticker": "NVDA",
"…": "25 more fields",
"held_by": 160,
"heaviest": ["GXPT", 19.88],
"held_by_sec_nport": 587,
"holders": [["GXPT", 19.88, "2026-10-16"], ["IYW", 16.5999, "2026-10-15"], "… 158 more"],
"holders_sec_nport": [["SMHX", 18.5624, "2026-06-30"], "… 586 more"],
"…": "1 more field",
"left_out": [],
"…": "2 more fields",
"etf_ownership": {"pct_lower_bound": 7.56, "basis": "company", "company": "Nvidia", "…": "3 more fields", "shares_outstanding_as_of": "2026-08-21", "…": "6 more fields", "holdings_dates": {"oldest": "2026-05-29", "newest": "2026-10-16"}, "…": "9 more fields"},
"…": "11 more fields",
"weekly": [-0.0214, 0.1112, 0.074, "… 153 more"],
"…": "4 more fields"
}
| Field | Type | Example | What it is |
|---|---|---|---|
ticker |
string | "NVDA" |
The stock's ticker, upper case. |
name |
string | "Nvidia" |
The company's name. |
page_ |
string or null | "https:/ |
The stock's page on the site, or null when it has none. Link this when quoting the figures. |
cite_ |
string | "TickerInside, |
A citation line for a quoted figure: company, sources and date, a URL to check it, licence. |
cite_ |
string | "<a href=\"https:/ |
The credit as HTML: a link to the page cite_as names, then its address. |
sector |
string | "Information Technology" |
The company's sector where the data classifies it, or "US Listed" when it does not, which is the case for most stocks. |
industry |
string or null | "Semiconductors" |
The finest level of that classification under the sector, such as Semiconductors or Regional Banks; null when sector is "US Listed". |
identifiers |
object | {"asset_ |
FIGI and SEC ids: /api/v1/identifiers.json. |
as_ |
string | "2026-10-16" |
The price date: the date of the price data behind every figure here. |
page |
boolean | true |
True when the stock has a written page at /stock/{ticker}/. Every stock here has this file whether or not it has a page. |
cap_ |
number or null | 5170.6 |
Market capitalisation, in billions of US dollars. |
pe |
number or null | 27.1 |
Trailing price to earnings ratio. |
yield |
null | null |
Trailing twelve month dividend yield, as a percentage. |
vol |
number or null | 43.9 |
Annualised standard deviation of weekly total returns over three years, as a percentage. |
beta |
number or null | 2.16 |
Sensitivity to the S&P 500, from three years of weekly returns. |
mdd3 |
number or null | -36.1 |
Largest peak to trough decline over three years, measured on weekly closes. Negative. |
r1 |
number or null | 18.8 |
Cumulative total return over one year, as a percentage. Not annualised. |
r3 |
number or null | 426.4 |
Cumulative total return over three years, as a percentage. Not annualised. |
r5 |
number or null | 860.1 |
Cumulative total return over five years, as a percentage. Not annualised. |
last_ |
number | 217.23 |
The last closing price, raw, in the trading currency. Returns use dividend-adjusted closes; this is the close as traded. |
last_ |
string | "2026-10-15" |
The date of that close. |
day_ |
number | -1.84 |
The move from the previous close to the last, as a percentage. |
high_ |
number | 239.24 |
The highest raw close over the last 252 trading days, or since the listing for a stock listed less than a year ago. |
low_ |
number | 165.17 |
The lowest raw close over the last 252 trading days, or since the listing for a stock listed less than a year ago. |
currency |
string | "USD" |
The trading currency of the price fields. |
calendar |
object or null | {"2022":-50.3, |
Total return by calendar year, as a percentage, the current year to date. |
held_ |
integer | 160 |
How many issuer-layer funds hold it, the rows of holders. The stock's page counts these less left_out, with the SEC-layer funds of held_by_sec_nport, as holders_all lists them. |
heaviest |
[ticker, weight] or null | ["GXPT", |
The issuer-layer fund that gives it the largest weight, as [fund ticker, weight percent]. Null when none of them holds it. |
held_ |
integer | 587 |
How many SEC-layer funds hold it, the rows of holders_sec_nport. The stock's page counts them with the issuer-layer funds and lists them in a table of their own, each linked to its filing. |
holders |
array of [ticker, weight, date] | [["GXPT", |
Every issuer-layer fund that holds it, heaviest first, as [fund ticker, weight percent, date of that fund's holdings file]. The same rows as the holders index, in the stock's own file. |
holders_ |
array of [ticker, weight, date] | [["SMHX", |
The SEC-layer funds that hold it, heaviest first, as [fund ticker, weight percent, the quarter end the filing describes]. They are months older than holders, so they are kept apart. A fund whose row under this ticker is a foreign company's local code is not listed. A filing names a security by its ISIN, which does not say where the fund bought it. So shares that trade in New York and abroad on one ISIN (AstraZeneca, TotalEnergies, Ferrari) are listed here for the funds whose stocks are mostly on US ISINs, and under the line abroad (AZN.GB) for the others. A preferred share is keyed by its issuer's common ticker, as the filings key it, so a preferred stock fund can appear here. For a stock whose weekly is empty, a row can be dated before its first close in the price data. Such a row can be another security that had the ticker, or the company's shares abroad before it listed in New York, and etf_ownership does not count it (before_first_close). |
synthetic_ |
array of object | [{"fund":"DIPS", |
The derivative-based funds whose swaps, futures or options reference the stock, largest first: fund, exposure (long, short, long and short, options, not stated), long_pct, short_pct, options, instruments, complete, report_date. Notional exposure, not shares held: in no holder list, rank or etf_ownership. |
left_ |
array of string or null | [] |
An empty list for a stock with a page, and null without one; kept for compatibility. Before lines listed abroad were keyed with their market (7203.JP), it named the issuer-layer funds whose row under the ticker was most likely a company listed abroad under the same code. Today a row stays under a US ticker when its issuer's file places it in New York, by its exchange, its currency or its identifiers, with the US list for a line nothing else places. The Toronto line of the same shares as a New York line also stays under the US ticker (RY). A row in dollars that nothing places abroad counts as a US line, as a few depositary receipts traded in London do (SBID, the GDR of State Bank of India). |
same_ |
array of [key, name] | [] |
The lines listed outside the United States under the same local code, as [key, company name], most widely held first. Each is another security, and often another company: SAN.ES is Banco Santander in Madrid and SAN.FR Sanofi in Paris, beside SAN, the Santander ADR. Their issuer-layer holders are under those keys in the holders index. Their SEC-layer holders are in holders_sec_nport of the shard of their first character (/api/v1/holders/a.json for AZN.GB). An empty list when there is none. |
earlier_ |
array of string or null | null |
The keys this ticker reads as now, this ticker among them, when it was also the key of other lines before lines listed abroad were keyed with their market. CCO, Clear Channel Outdoor, was also Cameco's Toronto code, so it reads as CCO and CCJ; SAN reads as SAN, SAN.ES and SAN.FR. The same list as the aliases of the holders index. Null when the ticker was only ever this line. |
etf_ |
object | {"pct_ |
The stock's line of the ETF ownership ledger: the share of the company's shares outstanding that the covered US ETFs hold, at least, with its parts and dates, or why no figure is published. Its fields are described below; the method, with its test vectors, is /api/v1/methods.json. |
etf_ |
object or null | {"answer":"727 of today's US stock ETFs h… |
How many of today's US stock ETFs held it in their SEC reports, each quarter: answer to quote, quarters oldest first. Null when fewer than two quarters held it. |
holders_ |
array of [fund, weight, date, layer, rank, positions, value] | [["GXPT", |
Every covered fund holding the stock, both layers in one list, heaviest first, an issuer file first on a tie. Each row is [fund ticker, weight percent, date of its holdings, layer, rank of the stock in the fund, the fund's positions, value held in millions of US dollars]. The layer is issuer for an issuer's own file, or sec_nport for an SEC Form N-PORT filing, dated to the quarter end it describes. The rank is 1 plus the number of the fund's positions that weigh more. The value held is the weight times the fund's net assets as published. Those are the ETF share class's for a Vanguard fund (etf_class_net_assets_b), aum_b for another issuer-layer fund, and net_assets for an SEC-layer fund. A value keeps the significant figures of the less precise of the weight and the net assets, three at most. VOO's value is 81000 on net assets Vanguard prints as $1.0 trillion, two figures; a fund with aum_b of 41.8 gives three. The value is null when the fund has no net assets, or has them to fewer than two figures, or when its filing covers mutual fund classes too. Fewer than two figures means aum_b under 1.0, which the market data gives to $0.1 billion, so 0.1 is anything from 0.05 to 0.15. rank_summary counts these funds in funds_without_value. The rows are the funds of holders, less left_out, and of holders_sec_nport; no fund is in both layers. A short position, a negative weight in a long and short fund, is listed with its negative weight and value. It is not a holding: rank_summary counts it in short_positions, and by_issuer, top_by_value, membership and answer leave it out. |
rank_ |
object | {"funds":747, |
How many of the holders have the stock as their largest holding (top_holding_in) and among their ten largest (top10_in), of how many (funds), in all and by layer. It also counts the holders with no value held (funds_without_value) and the funds short the stock (short_positions), which are not counted as holders. |
top_ |
array of object | [{"fund":"IVV", |
The ten holders with the most dollars in the stock, most first, each with the net assets its value is computed from and their date. Only funds with a value are ranked, so a fund whose net assets are known to fewer than two figures is not. |
membership |
array of object | [{"fund":"VOO", |
Whether the stock is in VOO, SPY, IVV, QQQ, VTI and SCHD, and in the three largest sector or industry funds holding it. Each comes with its weight, the stock's rank in it, its positions and the date of its holdings. The sector funds are ranked by the net assets a value is computed from. A fund is a sector fund when its TickerInside category is in the sector group (/etf/category/), else when its name names a sector or an industry. A fund no layer covers is left out. |
by_ |
array of object | [{"issuer":"iShares", |
The six issuers whose covered funds hold the most dollars of the stock, most first. For each: how many of its funds hold it, the dollars in millions over the funds with a value, how many have none, the heaviest weight as [fund, weight percent] and the largest holding as [fund, millions of US dollars]. An issuer file names its issuer. An SEC-layer fund takes the issuer its name and the trust that filed it give, and one with none is left out. |
fee_ |
array of object | [{"fund":"BKLC", |
The five cheapest ways to hold the stock through a covered fund: what the fund's expense ratio costs a year for each $1,000 of the stock held through it. It is 1000 times the expense ratio over the weight, both in percent. Only funds whose expense ratio is in the data are listed. |
name_ |
object or null | null |
The covered funds whose name contains the company's name as whole words (JPMorgan Realty Income ETF for Realty Income), which a reader can take for the company or for its own fund. It gives the name compared, how many funds, and up to ten of them, holders first, each with whether it holds the stock. Null when there is none, or when the name is one word found in the funds of three issuers or more: a word of fund names more than a company's. |
answer |
string | "Nvidia (NVDA) is held by 747 covered US … |
One sentence to quote, built from the fields above and etf_ownership, every figure with its date. It says how many covered funds hold the stock, by layer, and how many have it as their largest holding. It says where it weighs most (under 0.01% for a weight that rounds to nothing) and where the most dollars are, with about as many figures as the value has (under $0.1 million below that). It ends with the ownership figure when there is one: every class counted when it counts several, also when no fund holds this class. It opens on the name the stock's page uses, or for a stock without a page on the company's name as etf_ownership.company gives it, with the class when the figure counts several. It calls the funds the ownership figure counts "N of them" when they are among the holders it has just counted and the figure counts one class. |
least_ |
array of [ticker, correlation, name] | [["AWK", |
The eight stocks least correlated with this one over the last 104 of the same weekly returns, as [ticker, correlation, name]. The candidates are stocks held by ten or more covered funds, so every neighbour is reachable through ETFs. A measurement of co-movement, not a recommendation. |
most_ |
array of [ticker, correlation, name] | [["VRT", |
The eight most correlated, same shape and same candidate set. |
weekly |
array of number | [-0.0214, |
156 weekly total returns as decimals, oldest first, ending at as_of: the same weeks as the fund files, so a stock and a fund correlate with the same arithmetic as two funds. A week is null when its return cannot be computed, because the stock's prices begin later or a weekly close is missing. At least 110 of the 156 are numbers. It is an empty list for a stock with fewer that has a file by the rule of this endpoint: its vol, beta, mdd3, r3 and r5 are then null and its correlated stocks empty lists. |
weeks_ |
string | "2026-10-16" |
The last date covered by the weekly series. |
license |
string | "CC BY 4.0" |
The licence the data is published under. |
attribution |
string | "Credit TickerInside with a link to the p… |
How to credit the data: a link to the page cite_as names where the medium allows one, the name where it does not. |
source |
string | "https:/ |
Where the method behind these figures is written down. |
The etf_ownership object
| Field | Type | Example | What it is |
|---|---|---|---|
pct_ |
number or null | 7.56 |
At least this percent of the shares outstanding is held by the covered US ETFs counted, rounded down to two decimals. It is of the company, every class counted, when basis is company, and of this ticker's class alone when basis is class. It is a lower bound: funds not covered, and covered funds whose count could not be used, are not in it. One exception: the count of shares outstanding is used when it is at most 2% below a current independent count, so the figure can be up to about 2% of itself too high. Null when no figure is published; refused says why. |
basis |
string or null | "company" |
What the percent is of. company: all the company's shares outstanding, every class rolled up. class: this ticker's class alone, which is not the company's figure. It is company when shares_outstanding covers every class, rolled up (Alphabet's three classes; Berkshire's class A counted as 1,500 class B shares). It is also company when that count is the one count the company's cover gives and the company has one class of stock. It is class when the roll-up over the cover's classes does not check out against an independent count while this class's count does. It is also class when the one count the SEC gives is short of an independent company count and cannot be shown to be the company's. That happens when the filing names another class of stock (Mobileye's class B, Plains GP's class B shares), or when the count is a frames row. Null when no figure is published. |
company |
string or null | "Nvidia" |
The company the figure is about, as cite_as names it. It is the stock's name without what names the listing rather than the company. That is its class (Alphabet Inc., not Alphabet Inc. (Class A)), a depositary receipt, a registry share or a closed-end fund (Ares Capital Corporation, not Ares Capital Corporation - Closed End Fund). It keeps a leading "The" when the company's name has one (The Walt Disney Company). On a company basis the figure covers every class; on a class basis cite_as names the class by its ticker (the outstanding shares of the PAGP class). Null when no figure is published. |
shares_ |
integer or null | 1823016427 |
The shares the counted funds hold, in shares of this ticker's class, of every listed class on a company basis. Issuer files enter it only as a sum over at least two of them, never a single issuer file's count. SEC filings are public one by one, so a figure can rest on a single filing. |
shares_ |
object or null | {"issuer_ |
shares_held split between the issuers' own files (issuer_files) and SEC Form N-PORT filings (sec_nport). |
shares_ |
integer or null | 24100000000 |
The company's shares outstanding, in shares of this ticker's class, as the cover of a periodic report states them in the SEC's XBRL data: a 10-K, 10-Q, 20-F or 40-F, amendments and transition reports included. It is the most recent count read; its date is shares_outstanding_as_of and its filing shares_outstanding_filing. On a class basis, it is the class's own count. |
shares_ |
string or null | "2026-08-21" |
The date the cover counts the shares on. It is not the date of the holdings, which holdings_dates gives. |
shares_ |
string or null | "https:/ |
The filing on SEC EDGAR the count comes from, to check it against the source. |
funds_ |
object or null | {"issuer_ |
How many covered funds list the stock, any listed class on a company basis, by layer: issuer_files and sec_nport. A fund holding two classes is one fund. |
funds_ |
object or null | {"issuer_ |
How many of them are counted in shares_held, by layer. The others are in not_counted. |
funds_ |
integer or null | 0 |
How many of the counted funds are Vanguard ETFs. A Vanguard file lists the whole fund, every share class together, so each is counted for its ETF class only. Its shares are multiplied by the ETF class's net assets over the whole fund's, as Vanguard prints them, each taken at the end of its rounding that keeps the figure a lower bound. |
not_ |
object or null | {"through_ |
The funds listing the stock that are not counted, by reason; each reason is explained under not_counted in /api/v1/methods.json. no_share_count: the file gives no share count. through_fund: held through another covered fund. preferred_fund: a preferred stock fund. preferred_row: a row the file names as a preferred or depositary share. price_mismatch: a value per share that is not the stock's price. value_mismatch: a file whose counts or values do not match its weights times the fund's stated net assets. no_value_check: a file without market values, and no net assets to check it against. no_class_size: a Vanguard file without its class sizes. whole_series: a filing covering mutual fund classes. before_split: a row dated before a split of the stock. before_first_close: a row dated before the stock's first close in the price data. single_issuer_file: the only issuer file counted. A fund holding two classes of the company is one fund here, and it is not listed when either of its rows is counted; rows_not_counted has the rows. |
rows_ |
object or null | {"through_ |
The rows not counted, one per fund and class, by the same reasons. It holds the row of a fund counted through another class that is itself left out, such as a preferred depositary share filed under the common's ticker. On a class basis, only this ticker's rows. |
holdings_ |
object or null | {"oldest":"2026-05-29", |
The oldest and newest holdings dates of the counted funds. A filing describes a quarter end months back, so the two are often far apart. |
holdings_ |
object or null | {"issuer_ |
The same for each layer, issuer_files and sec_nport; null for a layer with no fund counted. |
classes |
array of object or null | null |
For a company with several classes of stock, one entry per class: class, tickers (empty for an unlisted class), shares_outstanding and as_of. weight is set where one share counts for more than one share of this ticker's class. shares_held and pct_lower_bound are set where the class's own count checks out against its ticker's and the class figure is at least 0.01%, and are null otherwise. Null for a company with one class. |
refused |
string or null | null |
Why no figure is published, as a code: no_sec_count, class_unknown, count_too_old, count_date_invalid, no_independent_count, split_between_dates, count_below_independent, count_mismatch, no_fund_counted, under_0_01_pct, above_100 or held_back. Null when a figure is published. |
refused_ |
string or null | null |
The same reason in words. |
held_ |
object or null | null |
Null on a normal night. When tonight's ledger failed its checks and was held back, the same object as held_back in /api/v1/ownership.json, and the figure here, if any, is from the last ledger that passed, with its own dates. |
method |
string | "ti-ownership/ |
The method and its version, ti-ownership/1. A change to what it computes from inputs it already accepted is a new version. |
method_ |
string | "https:/ |
Where the method is written down, with its test vectors. |
cite_ |
string or null | "TickerInside, |
A citation line for the figure: company, the figure, the method, the holdings dates and the date of the count, a URL to check it, licence. Null when no figure is published. |
cite_ |
string or null | "<a href=\"https:/ |
The credit as HTML: a link to the page cite_as names, then its address. Null when no figure is published. |
The rank_summary object
| Field | Type | Example | What it is |
|---|---|---|---|
funds |
integer | 747 |
How many covered funds hold the stock: the rows of holders_all less short_positions. |
top_ |
integer | 336 |
How many of them have it as their largest holding, a tie included. |
top10_ |
integer | 582 |
How many have it among their ten largest holdings. |
funds_ |
integer | 85 |
How many of them have no value held: no net assets, net assets known to fewer than two figures, or a filing that covers mutual fund classes too. |
short_ |
integer | 0 |
How many funds hold the stock short, a negative weight in holders_all: listed there, never counted as holders. |
by_ |
object | {"issuer":{"funds":160, |
The same three counts for each layer, issuer and sec_nport. |
A line of top_by_value
| Field | Type | Example | What it is |
|---|---|---|---|
fund |
string | "IVV" |
The fund's ticker. |
value_ |
number | 69300 |
The value of the stock the fund holds, in millions of US dollars: weight times net_assets_b, to the significant figures of the less precise of the two, three at most. |
weight |
number | 7.8627 |
The stock's weight in the fund, in percent. |
holdings_ |
string | "2026-10-15" |
The date of the fund's holdings. |
layer |
string | "issuer" |
issuer or sec_nport. |
net_ |
number | 881.3 |
The net assets the value is computed from, in billions of US dollars. |
net_ |
string | "fund" |
What they are: etf_class, a Vanguard ETF share class alone; fund, aum_b from the market data; filing, the net assets the fund's SEC filing states. |
net_ |
string or null | "2026-10-17" |
Their date: the day aum_b was read, or the filing's quarter end. Null when not known. |
A line of membership
| Field | Type | Example | What it is |
|---|---|---|---|
fund |
string | "VOO" |
The fund's ticker. |
kind |
string | "broad" |
broad for VOO, SPY, IVV, QQQ, VTI and SCHD, sector for a sector or industry fund. |
category |
string | "US Large Blend" |
The fund's category label, or null. |
held |
boolean | true |
Whether the fund holds the stock. |
weight |
number or null | 7.5142 |
Its weight in percent, or null. |
rank_ |
integer or null | 1 |
Its rank in the fund, 1 for the largest holding, or null. |
positions |
integer | 504 |
How many positions the fund holds. |
holdings_ |
string | "2026-06-30" |
The date of the fund's holdings. |
layer |
string | "sec_ |
issuer or sec_nport. |
A line of by_issuer
| Field | Type | Example | What it is |
|---|---|---|---|
issuer |
string | "iShares" |
The issuer, as the issuer files name it (iShares, SPDR, Invesco, Global X) or as a fund's name or filer gives it. |
funds |
integer | 68 |
How many of its covered funds hold the stock. |
value_ |
number or null | 148000 |
The value they hold, in millions of US dollars, over the funds with a value, to the precision of the least precise of them; null when none has one. |
funds_ |
integer | 22 |
How many of them have no value, for want of published net assets known to two figures or more. |
heaviest |
[ticker, weight] | ["IYW", |
The fund that gives the stock its largest weight, as [fund, weight percent]. |
largest |
array of number or null | ["IVV", |
The fund holding the most dollars of it, as [fund, millions of US dollars], or null. |
A line of fee_per_1000
| Field | Type | Example | What it is |
|---|---|---|---|
fund |
string | "BKLC" |
The fund's ticker. |
fee_ |
number | 0.0 |
US dollars a year of the fund's expense ratio for each $1,000 of the stock held through it. |
expense_ |
number | 0.0 |
The fund's expense ratio, in percent a year. |
weight |
number | 7.2316 |
The stock's weight in the fund, in percent. |
holdings_ |
string | "2026-07-31" |
The date of the fund's holdings. |
layer |
string | "sec_ |
issuer or sec_nport. |
The name_collision object
| Field | Type | Example | What it is |
|---|---|---|---|
name |
string | |
The company's name as compared: its trade name less the words a filed name ends in (SoFi, not SoFi Technologies). |
count |
integer | |
How many covered funds' names contain it. |
funds |
array of object | |
Up to ten of them, holders first: fund, name, holds, weight (null when it does not hold the stock), holdings_as_of and layer. |
A security covered funds hold with no file of its own, a stock the price data does not list or lists too few weekly returns for, or a line listed abroad (7203.JP), answers with "coverage": "holders_only": its holders from the shard of its first character, each dated, the price and return fields null, and none of the fields built from each fund's file or the ledger, such as etf_ownership and holders_all. A 404 means no covered fund holds the key.
A written comparison
/api/v1/compare/{a}-vs-{b}.json Overlap measured three ways and correlation, for the 15 pairs listed in index.json written_comparisons, in that order only
One of the 15 written comparisons, the pairs listed in index.json written_comparisons: overlap measured three ways, correlation over one, three and five years, and a summary of each fund. The file is written in the order listed there (voo-vs-vti); the other order answers 301 to it.
{
"pair": ["VOO", "VTI"],
"…": "1 more field",
"holdings_as_of": {"VOO": "2026-06-30", "VTI": "2026-06-30"},
"overlap": {"by_weight": 88.1, "share_of_a": 99.9, "share_of_b": 88.3, "n_shared": 502, "…": "7 more fields"},
"correlation": {"c1y": 0.99, "c3y": 1.0, "c5y": 1.0, "…": "2 more fields"},
"…": "2 more fields",
"cite_as": "TickerInside, VOO vs VTI, holdings from VOO's SEC Form N-PORT for the period ended 2026-06-30, filed 2026-08-28, and VTI's SEC Form N-PORT for the period ended 2026-06-30, filed 2026-08-28, https://tickerinside.com/compare/voo-vs-vti/, CC BY 4.0" ,
"…": "4 more fields"
}
| Field | Type | Example | What it is |
|---|---|---|---|
pair |
array of string | ["VOO", |
The two tickers, in the order of the file's address and of index.json written_comparisons: this file is /compare/{a}-vs-{b}.json with a first. The other order answers 301 to this file. |
as_ |
string | "2026-10-16" |
The price date. |
holdings_ |
object | {"VOO":"2026-06-30", |
The date of each fund's holdings file, keyed by ticker. The two are often weeks apart. |
overlap |
object | {"by_ |
Holdings overlap, measured three ways; its fields are described below. |
correlation |
object | {"c1y":0.99, |
Correlation of weekly total returns, and the annualised covariance; its fields are described below. |
funds |
object | {"VOO":{"ticker":"VOO", |
A summary of each fund, keyed by ticker, as the comparison page shows it; its fields are described below. The full file of each fund, with its holdings, is /api/v1/fund/{ticker}.json. |
page_ |
string | "https:/ |
The written comparison's page, to link when you quote a figure. |
cite_ |
string | "TickerInside, |
A citation line for a quoted figure: the pair, both holdings file dates, the page, and the licence. |
cite_ |
string | "<a href=\"https:/ |
The credit as HTML: a link to the page cite_as names, then its address. |
source |
string | "https:/ |
The written comparison's page, which this data belongs to. |
license |
string | "CC BY 4.0" |
The licence the data is published under. |
attribution |
string | "Credit TickerInside with a link to the p… |
How to credit the data: a link to the page cite_as names where the medium allows one, the name where it does not. |
The overlap object
| Field | Type | Example | What it is |
|---|---|---|---|
by_ |
number | 88.1 |
The sum, over every ticker both funds hold, of the smaller of its two weights. Symmetric: the headline figure. Tickers are compared as keys, so GOOG and GOOGL count as two. |
share_ |
number | 99.9 |
The part of the first fund's weight that sits in tickers the second also holds, in percent of the first fund's listed total weight, which can differ a little from 100. Not symmetric. |
share_ |
number | 88.3 |
The same measure from the second fund's side. When share_of_a is far above share_of_b, the first fund is mostly contained in the second. |
n_ |
integer | 502 |
How many tickers appear in both funds. The Python client calls it companies_in_both. |
n_ |
integer | 504 |
How many positions the first fund holds, as positions in its fund file. |
n_ |
integer | 3483 |
How many positions the second fund holds. |
top |
array of object | [{"ticker":"NVDA", |
The largest shared positions: ticker, name, wa and wb, the weight in each fund rounded to two decimals, and min, the smaller of the two. pa and pb are the same weights scaled so that the largest in the list is 100, for drawing bars. |
only_ |
array of object | [{"ticker":"NXPI", |
The largest positions of the first fund that the second does not hold: ticker, name and w, the weight. |
only_ |
array of object | [{"ticker":"SPCX", |
The largest positions of the second fund that the first does not hold, in the same shape. |
method |
string | "ti-overlap/ |
ti-overlap/1, in methods.json. |
method_ |
string | "https:/ |
Its address. |
The correlation object
| Field | Type | Example | What it is |
|---|---|---|---|
c1y |
number | 0.99 |
Correlation of weekly total returns over one year, 52 weeks. |
c3y |
number | 1.0 |
Correlation over three years, 156 weeks: the figure the comparison pages quote. |
c5y |
number | 1.0 |
Correlation over five years, 260 weeks. |
cov |
number | 203.2 |
Annualised covariance of the weekly returns over three years, in percent squared. Divided by the two funds' vol, it gives c3y back, which is how a reader can check it. |
weeks |
array of string | ["2025-10-24", |
The 52 weekly dates of the one-year spark series in funds. They are not the weeks of c3y or c5y. |
A fund's summary, in funds
| Field | Type | Example | What it is |
|---|---|---|---|
ticker |
string | "VOO" |
The fund's ticker. |
name |
string | "Vanguard S&P 500 ETF" |
The fund's name. |
kind |
string | "etf" |
etf. |
group |
string | "US Large Cap" |
The fund's sector or category in the market data, or null. |
vol |
number | 14.2 |
Annualised standard deviation of weekly total returns over three years, as a percentage. |
beta |
number | 0.99 |
Sensitivity to the S&P 500, from three years of weekly returns. |
r1 |
number | 17.5 |
Cumulative total return over one year, as a percentage. |
r3 |
number | 90.4 |
Cumulative total return over three years, as a percentage. |
r5 |
number | 82.7 |
Cumulative total return over five years, as a percentage. |
mdd3 |
number | -16.7 |
Largest peak to trough decline over three years, on weekly closes, as a percentage. Negative. |
cal |
object | {"2022":-18.2, |
Total return by calendar year, as a percentage, keyed by year; the current year to date. |
er |
number | 0.03 |
The expense ratio, in percent of assets a year, or null. |
yield |
null | null |
Trailing twelve month distribution yield, as a percentage, or null. |
aum_ |
null | null |
Assets under management, in billions of US dollars, or null. |
family |
string | "Vanguard" |
The fund family in the market data, or null. |
cat |
string | "US Large Blend" |
The fund's category, TickerInside's own, or null. |
nh |
integer | 504 |
How many positions have a weight above zero. It can be lower than positions in the fund file and n_a or n_b, which count every line. |
spark |
array of number | [100.0, |
The last 52 weekly closes, indexed to 100 at the first: the one-year line the page draws. |
px |
object | {"last":709.43, |
The latest raw close: last, the price; date, its date; d1, the move from the previous close in percent; hi52 and lo52, the highest and lowest close over 252 trading days; ccy, the trading currency. |
Any other pair answers 404, reason no_written_comparison, with the two fund files. From them, compute the overlap by weight: the sum, over the tickers both hold, of the smaller of the two weights, as the overlap example does.
Overlap of funds, computed
/api/v1/overlap?funds={funds} The overlap of 2 to 10 funds, computed when asked, as the MCP tools give it
The overlap of the funds in funds, a list separated by commas, computed when asked with the code of the MCP tools compare_etfs and get_etf_overlap_matrix, so the figures are theirs. Two funds give the pair: the overlap by weight, each fund's share held in common, the largest shared holdings, the correlation of weekly returns and each fund's cost and risk (kind pair). Three or more give every pair ranked by overlap by weight (kind matrix). Two fixed income funds overlap by issuer; a fund that holds no shares is set aside with the reason, and a ticker not covered is skipped, or answers 404 in a pair. A fund asked for under the ticker it had before it was renamed is read under its new ticker, which renamed gives. format=csv, or /api/v1/overlap.csv, gives one row per pair. 2 to 10 funds. The files read weigh at most 64 KB for two funds and 58 KB for three or more, a file of the other layers a third of its size, and the pairs compare at most 2,600 holdings, each pair the holdings of the fund that holds fewer.
{
"kind": "pair",
"…": "2 more fields",
"pair": ["VOO", "QQQ"],
"…": "1 more field",
"holdings_as_of": {"VOO": "2026-08-31", "QQQ": "2026-10-08"},
"…": "1 more field",
"overlap": {"by_weight": 53.9, "share_of_a": 54, "share_of_b": 92.9, "companies_in_both": 85, "…": "2 more fields", "largest_shared": [{"ticker": "NVDA", "in_a": 8.09, "in_b": 8.33, "counted": 8.09}, {"ticker": "AAPL", "in_a": 7.04, "in_b": 7.45, "counted": 7.04}, "… 13 more"]},
"correlation_3y": 0.95,
"…": "1 more field",
"weeks_used": 156,
"…": "7 more fields"
}
| Field | Type | Example | What it is |
|---|---|---|---|
kind |
string | "pair" |
pair for two funds, matrix for three or more: which of the two shapes the answer has. |
page_ |
string or null | "https:/ |
The web page whose HTML, as the server sends it, prints the answer's figure, so that it reads without JavaScript: for a pair, its written comparison when there is one, else its "Does it diversify me?" answer within that answer's limits; for three funds or more, the x-ray the site wrote of the same funds; for a look-through, the x-ray the site wrote of the portfolio at the same weights (listed under pages in /og/answers.json), or for one fund, its page. Null where no page prints the figure yet: any other overlap of three funds or more or look-through of two funds or more, a pair past those limits, a pair of bond funds. |
share_ |
string | "https:/ |
The address whose HTML reproduces the whole answer on the site: for a pair, its "Does it diversify me?" answer within that answer's limits; for three funds or more and for a portfolio, the x-ray the site wrote of the same funds (listed under pages in /og/answers.json), each weight in percent to 0.01 point and never an amount, in the order of the funds the site wrote it in. Absent where no page prints the answer. |
pair |
array of string | ["VOO", |
The two funds, upper case, in the order asked. |
prices_ |
string or null | "2026-10-09" |
The price date of the figures read from weekly returns. Null when no fund has prices. |
holdings_ |
object | {"VOO":"2026-08-31", |
Each fund's holdings date, by ticker: the date of its issuer file, or the quarter end its SEC filing describes. |
holdings_ |
object | {"VOO":"issuer file", |
Each fund's source, by ticker: issuer file, SEC Form N-PORT, trust's own SEC filing, sponsor's own holdings file, or prospectus, no holdings yet. |
overlap |
object | {"by_ |
For two funds holding shares, in percent: by_weight, the sum over the companies both hold of the smaller of their two weights; share_of_a and share_of_b, the part of each fund in companies the other holds too; companies_in_both, the holdings both have, counted by ticker (GOOGL and GOOG count as two), positions_a and positions_b; and largest_shared, the 15 largest shared holdings with each weight and the smaller one counted. A ticker the two hold for two different companies is left out of every figure and listed in same_ticker_two_companies, with same_ticker_note. |
overlap_ |
string | |
issuer when the figures are an overlap by issuer, of fixed income funds. Absent otherwise. |
issuer_ |
object | |
For two fixed income funds: the overlap by issuer, the smaller weight of each issuer both hold summed (by_weight), the share of each, issuers_in_both, the issuers compared and the largest shared and unshared ones. Never mixed with the overlap by shares. |
correlation_ |
number or null | 0.95 |
The correlation of the two funds' weekly returns over up to three years, on the weeks both have. Null under 52 such weeks. |
covariance_ |
number or null | 262.3 |
The annualised covariance of the same returns, in percent squared. Null with correlation_3y. |
weeks_ |
integer or null | 156 |
How many weeks the two figures above read. Null when they are. |
funds |
object or null | {"VOO":{"name":"Vanguard S&P 500 ETF", |
Each fund by ticker: name, expense_ratio_pct, return_3y_pct, volatility_pct, worst_fall_3y_pct, beta_vs_sp500 (three years, from its file), beta_vs_sp500_1y (the last 52 weeks against SPY's) and positions; a fixed income fund's average coupon, maturity and duration. Null where the data has no figure. |
how_ |
string | "Name the overlap measure quoted and give… |
How to quote the figures: which measure, with the holdings dates. |
covered |
boolean | |
true when the funds are covered but the answer has no figures (see comparable or computed). |
comparable |
boolean | |
false when a fund of the two holds no shares that can be overlapped (see not_comparable). Absent when the figures are given. |
not_ |
array of object | |
The funds set aside, each with why and the address of its file (fund_file): a leveraged, inverse or other derivative-based fund, a trust or pool, a multi-asset, sponsor-file or prospectus-only fund, or a bond fund beside a stock fund. |
renamed |
object | |
Each ticker asked that a fund had before it was renamed, with its ticker now, under which the answer reads and names it. Absent when there is none. |
source |
object | {"provider":"TickerInside", |
The files the answer is computed from: each fund's page_url, null without a page, api_url, holdings_source and, for a fund from a filing, filing_url; benchmark_url, SPY's file, when a one-year beta is computed; license; and cite_as, the line to print under a figure. |
note |
string | "Measurement, |
Measurement, not investment advice. |
license |
string | "CC BY 4.0" |
The licence the data is published under. |
attribution |
string | "Credit TickerInside with a link to the p… |
How to credit the data: a link to the page of a fund the figure comes from, or to this address, where the medium allows one, the name where it does not. |
docs |
string | "https:/ |
The reference of this endpoint. |
What three or more funds give instead (kind matrix)
| Field | Type | Example | What it is |
|---|---|---|---|
computed |
boolean | |
false when fewer than two of the funds hold shares that can be overlapped (see reason). |
reason |
string | |
Why nothing is computed, when computed is false. |
skipped |
object | {"covered":false, |
The tickers not covered, under not_covered, with what is covered (covered_issuers, also_covered and hint). Absent when every ticker is covered. |
pairs |
array of object | [{"pair":["VOO", |
Every pair of the funds holding shares, the largest overlap by weight first: pair, by_weight, share_of_first, share_of_second and companies_in_both, as overlap gives them for two funds, and same_ticker_two_companies when a ticker stands for two companies. |
same_ |
string | |
What same_ticker_two_companies means, when a pair has it. |
issuer_ |
array of object | |
Every pair of the fixed income funds by issuer overlap, largest first: pair, by_weight, share_of_first, share_of_second, issuers_in_both. Never mixed with pairs. |
issuer_ |
string | |
How to read issuer_overlap_pairs, when there are some. |
Each answer carries the date and source of every fund's holdings, and source names the files it is computed from.
Look-through of a portfolio, computed
/api/v1/lookthrough?portfolio={portfolio} The companies under a portfolio of funds, computed when asked, as the MCP tool get_etf_portfolio_lookthrough gives them
The companies a portfolio holds underneath, from portfolio, its funds separated by commas, each with its weight or amount after a colon (VOO:60,QQQ:40 or VOO:40000,QQQ:25000), or none for equal weights. Computed with the code of the MCP tool get_etf_portfolio_lookthrough: each company's weight, its value in the unit of the amounts, and the funds it comes through. top (1 to 200, 25 by default) says how many companies; currency, three letters, is echoed and never converted. A fund renamed is read under its new ticker, which renamed gives. format=csv, or /api/v1/lookthrough.csv, gives one row per company. 1 to 6 funds, whose files weigh at most 30 KB, a file of the other layers a third of its size, and hold at most 1,100 lines between them.
{
"…": "2 more fields",
"priced": true,
"…": "3 more fields",
"funds": 2,
"distinct_companies": 518,
"top_10_weight_pct": 41.1,
"…": "1 more field",
"holdings_as_of": {"VOO": "2026-08-31", "QQQ": "2026-10-08"},
"…": "1 more field",
"companies": [{"ticker": "NVDA", "weight_pct": 8.189, "weight_pct_2dp": 8.19, "through": [{"fund": "VOO", "weight_pct": 4.8556}, {"fund": "QQQ", "weight_pct": 3.3337}], "value": 8.19}, "… 2 more"],
"…": "5 more fields"
}
| Field | Type | Example | What it is |
|---|---|---|---|
page_ |
string or null | "https:/ |
The web page whose HTML, as the server sends it, prints the answer's figure, so that it reads without JavaScript: for a pair, its written comparison when there is one, else its "Does it diversify me?" answer within that answer's limits; for three funds or more, the x-ray the site wrote of the same funds; for a look-through, the x-ray the site wrote of the portfolio at the same weights (listed under pages in /og/answers.json), or for one fund, its page. Null where no page prints the figure yet: any other overlap of three funds or more or look-through of two funds or more, a pair past those limits, a pair of bond funds. |
share_ |
string | "https:/ |
The address whose HTML reproduces the whole answer on the site: for a pair, its "Does it diversify me?" answer within that answer's limits; for three funds or more and for a portfolio, the x-ray the site wrote of the same funds (listed under pages in /og/answers.json), each weight in percent to 0.01 point and never an amount, in the order of the funds the site wrote it in. Absent where no page prints the answer. |
priced |
boolean | true |
true when the portfolio gives each fund a weight or an amount; false when every fund counts equally. |
portfolio_ |
number or null | 100 |
The sum of the weights or amounts of the funds looked through: the funds under not_looked_through and skipped are left out of it, as they are left out of the percentages. Null when none is given. |
currency |
string or null | "unstated" |
The currency given, upper case, echoed and never converted; unstated when amounts are given without one. Null when none is given. |
prices_ |
string or null | "2026-10-09" |
The price date of the figures read from weekly returns. Null when no fund has prices. |
funds |
integer | 2 |
How many funds are looked through. |
distinct_ |
integer | 518 |
How many distinct holdings they hold between them, counted by ticker: two share classes of one company (GOOGL and GOOG) count as two. |
top_ |
number | 41.1 |
The weight of the ten largest companies, in percent of what is looked through, summed unrounded and rounded once. |
looked_ |
number | 100 |
The part of the portfolio its covered funds make up that the funds looked through are, in percent, by amount or in equal parts: weight_pct and top_10_weight_pct are of that part, and not_looked_through names the rest. |
holdings_ |
object | {"VOO":"2026-08-31", |
Each fund's holdings date, by ticker: the date of its issuer file, or the quarter end its SEC filing describes. |
holdings_ |
object | {"VOO":"issuer file", |
Each fund's source, by ticker: issuer file, SEC Form N-PORT, trust's own SEC filing, sponsor's own holdings file, or prospectus, no holdings yet. |
companies |
array of object | [{"ticker":"NVDA", |
The companies underneath, largest first, top of them (25 when top is left out). |
same_ |
object | |
The tickers listed twice: once for the US company of that ticker, once, marked listed_abroad, for the foreign company whose local code it is in another fund, with a note. Absent when there is none. |
skipped |
object | |
The tickers not covered, under not_covered, with what is covered (covered_issuers, also_covered and hint). Absent when every ticker is covered. |
not_ |
array of object | |
The funds left out of the percentages and the value, each with why and fund_file. |
covered |
boolean | |
true when the funds are covered but the answer has no figures (see comparable or computed). |
computed |
boolean | |
false when none of the funds holds shares that can be looked through (see reason). |
reason |
string | |
Why nothing is computed, when computed is false. |
renamed |
object | |
Each ticker asked that a fund had before it was renamed, with its ticker now, under which the answer reads and names it. Absent when there is none. |
source |
object | {"provider":"TickerInside", |
The files the answer is computed from: each fund's page_url, null without a page, api_url, holdings_source and, for a fund from a filing, filing_url; benchmark_url, SPY's file, when a one-year beta is computed; license; and cite_as, the line to print under a figure. |
note |
string | "Measurement, |
Measurement, not investment advice. |
license |
string | "CC BY 4.0" |
The licence the data is published under. |
attribution |
string | "Credit TickerInside with a link to the p… |
How to credit the data: a link to the page of a fund the figure comes from, or to this address, where the medium allows one, the name where it does not. |
docs |
string | "https:/ |
The reference of this endpoint. |
A company, in companies
| Field | Type | Example | What it is |
|---|---|---|---|
ticker |
string | "NVDA" |
The company's key, as the funds' holdings write it. |
weight_ |
number | 8.189 |
Its weight, in percent of what is looked through. |
weight_ |
number | 8.19 |
Its weight to two decimals, rounded once from the unrounded sum, as the x-ray page prints it. |
through |
array of object | [{"fund":"VOO", |
Each fund it comes through, the largest first, with its part in percent of what is looked through. |
value |
number or null | 8.19 |
Its value, in the unit of the weights or amounts given. Null when none is given. |
listed_ |
boolean | |
true for a foreign company's line whose local code is a US ticker too. Absent otherwise. |
The analytics record its tickers, never a weight or an amount. The answer, which repeats them, is kept in the edge cache for up to a day under its query, and served only to the same query.
Several fund files, computed
/api/v1/batch?funds={funds} Up to 10 fund files in one answer, each as /fund/ serves it
The files of the funds in funds, a list separated by commas, in one answer keyed by ticker: each exactly what /api/v1/fund/{ticker}.json answers, the answer composed for a fund of another layer included, with the tickers not covered listed with the reason /fund/ gives. 1 to 10 funds. The files of the other layers composed in one call add up to at most 55 KB; the first is always composed.
{
"asked": ["VOO", "QQQ", "NVDA"],
"found": 2,
"not_covered": [{"error": "not_covered", "reason": "has_security_file", "ticker": "NVDA", "…": "1 more field", "security": "https://tickerinside.com/api/v1/sec/nvda.json" }],
"funds": {"VOO": {"ticker": "VOO", "…": "8 more fields", "holdings_as_of": "2026-08-31", "…": "25 more fields", "holdings": {"NVDA": 8.0927, "AAPL": 7.0432, "…": "1 more"}, "…": "5 more fields"}},
"…": "3 more fields"
}
| Field | Type | Example | What it is |
|---|---|---|---|
asked |
array of string | ["VOO", |
The tickers asked for, upper case, each once, in the order asked. |
found |
integer | 2 |
How many of them are in funds. |
not_ |
array of object | [{"error":"not_ |
The tickers with no fund file, each with error not_covered, ticker and message: reason has_security_file and security for one with a stock file, else reason no_file and fund, its own address, which gives the specific reason, and covered. |
not_ |
array of object | |
Funds of the other layers past what one call composes, each with ticker, fund, its own address, and reason over_budget. Absent when there is none. |
not_ |
string | |
Why not_included is there. |
renamed |
object | |
Each ticker of a fund renamed, with the ticker of the file served under it. Absent when there is none. |
funds |
object | {"VOO":{"ticker":"VOO", |
Each fund found, by ticker as asked: what /api/v1/fund/{ticker}.json answers, a fund file of the stock layers byte for byte, or the answer composed for a fund of another layer. |
license |
string | "CC BY 4.0" |
The licence the data is published under. |
attribution |
string | "Credit TickerInside with a link to the p… |
How to credit the data: a link to the page each fund file's cite_as names where the medium allows one, the name where it does not. |
docs |
string | "https:/ |
The reference of this endpoint. |
No CSV: each fund's holdings are at /api/v1/fund/{ticker}.csv.
A screen of funds, computed
/api/v1/screen?holds={holds} The funds that pass a few filters, from the list of funds and a stock's holders
The funds of funds.json that pass every filter given: issuer and category, matched whole whatever the case, a category by its id or its label; layer (issuer_files, sec_nport, sec_nport_bonds, sec_nport_multi_asset, sec_nport_derivatives, trust_filings, sponsor_files, prospectus); expense_ratio_max, in percent a year; aum_min, in billions of US dollars, read from aum_b or else the net assets of the fund's filing; holds, a security with a stock file, with min_weight in percent. sort is weight, aum, expense_ratio, positions, ticker; limit and offset page the answer. format=csv, or /api/v1/screen.csv, gives the page as rows, and a last row with the address of the next ones when there are more. limit 1 to 100, 50 by default; a CSV page holds 1 to 50, 50 by default; holds takes a security with a stock file.
{
"…": "1 more field",
"filters": {"holds": "NVDA", "min_weight": 15},
"sort": "weight",
"total": 29,
"…": "2 more fields",
"count": 3,
"funds": [{"ticker": "GXPT", "name": "Global X PureCap℠ MSCI Information Technology ETF", "layer": "issuer_files", "issuer": "Global X", "category": "Technology", "category_id": "technology", "expense_ratio": 0.15, "aum_b": 0.1, "net_assets": null, "positions": 85, "report_date": null, "weight_pct": 19.89, "holdings_as_of": "2026-10-09", "holdings_source": "issuer file", "fund_file": "https://tickerinside.com/api/v1/fund/gxpt.json" , "page_url": null}, "… 2 more"],
"next": "https://tickerinside.com/api/v1/screen?holds=NVDA&min_weight=15&sort=weight&limit=3&offset=3" ,
"…": "4 more fields"
}
| Field | Type | Example | What it is |
|---|---|---|---|
as_ |
string | "2026-10-09" |
The date of funds.json, the price date. |
filters |
object | {"holds":"NVDA", |
The filters applied, as read: issuer as the data spells it; category as the category's id, whether it was asked by id or by label, and category_asked beside it when it was asked by a category name the site printed before 9 October 2026, which the screener reads for as long as v1 is served (funds-columns.json category_aliases); and holds_reads_as when the holders are read under another key: BRK.B for BRK-B, or the key an old one reads as now. |
sort |
string | "weight" |
The order of funds: weight (with holds) or aum, largest first by default; expense_ratio and ticker smallest first; positions largest first. A fund without the figure comes last. |
total |
integer | 29 |
How many funds pass the filters. |
offset |
integer | 0 |
Where this page starts in them. |
limit |
integer | 3 |
How many funds a page holds at most. |
count |
integer | 3 |
How many funds this page holds. |
funds |
array of object | [{"ticker":"GXPT", |
The funds of this page. |
next |
string or null | "https:/ |
The address of the next page. Null on the last one. |
source |
object | {"provider":"TickerInside", |
The files read, under api_urls: funds.json and, for holds, the stock file; and cite_as. |
license |
string | "CC BY 4.0" |
The licence the data is published under. |
attribution |
string | "Credit TickerInside with a link to the p… |
How to credit the data: a link to the page of a fund the figure comes from, or to this address, where the medium allows one, the name where it does not. |
docs |
string | "https:/ |
The reference of this endpoint. |
A fund, in funds
| Field | Type | Example | What it is |
|---|---|---|---|
ticker |
string | "GXPT" |
The fund's ticker. |
name |
string | "Global X PureCap\u2120\u00a0MSCI Informa… |
Its name. |
layer |
string | "issuer_ |
Its layer: issuer_files, sec_nport, sec_nport_bonds, sec_nport_multi_asset, sec_nport_derivatives, trust_filings, sponsor_files, prospectus. |
issuer |
string or null | "Global X" |
Its issuer, as funds.json names it. Null when unknown. |
category |
string or null | "Technology" |
Its category, TickerInside's own, set every night from the fund's file (its name in funds.json c; https://tickerinside.com/etf/category/). Null for a fund the build has not classified. |
category_ |
string or null | "technology" |
The id of that category, which never changes meaning. Null with category. |
expense_ |
number or null | 0.15 |
Its expense ratio, in percent a year. Null when unknown. |
aum_ |
number or null | 0.1 |
Its assets in billions of US dollars, from market data. Null when unknown. |
net_ |
number or null | null |
Its net assets in US dollars on report_date, from its filing. Null for a fund read from its issuer's file. |
positions |
integer | 85 |
How many positions its file lists. |
report_ |
string or null | null |
The quarter end its filing describes, or the day its prospectus was filed. Null for a fund read from its issuer's file. |
weight_ |
number | 19.89 |
With holds: the security's weight in the fund, in percent. |
holdings_ |
string | "2026-10-09" |
With holds: the date of the fund's file the weight is read from. |
holdings_ |
string | "issuer file" |
With holds: issuer file or SEC Form N-PORT. |
fund_ |
string | "https:/ |
The address of its file. |
page_ |
string or null | null |
Its page. Null without one. |
holds reads the funds the stock's file lists, as the MCP tool find_etfs_holding_stock does.
Does it diversify me?, computed
/api/v1/diversify?have={have}&try={try} The large US ETFs of a published list ranked by weekly correlation with the funds held, or each fund to try's overlap, weekly correlation and mega-cap tech share against them
With have alone, Find: the large US ETFs of a fixed, published list, in six groups, ranked by the correlation of their weekly returns with the portfolio's over up to 156 weeks, compared before rounding, leaving out any ETF held; the answer opens on the ETF of lowest correlation in each of the 3 groups where it is lowest, with its correlation on the weeks the portfolio fell, its volatility, the portfolio's volatility with 10% in it, what it holds, and its overlap with the portfolio when the files fit the limits of Find; every ETF of the list follows, ranked (mode find, the fields below). A sort of measurements by a published rule. For each fund of try, a list separated by commas, against the portfolio of the funds of have, each with its weight after a colon or none for equal weights: the overlap by weight with the portfolio looked through, the correlation of weekly returns with the portfolio's over up to three years and on the weeks it fell, the part in mega-cap tech, and the sectors and countries of its lines, with one sentence to quote for each, ranked by overlap, then by correlation. A trust, a derivative-based or a bond fund has no overlap by shares and counts in the correlation from its own weekly prices. /diversify/ with the same query renders the answer as a page, which share_url gives. No CSV. 1 to 6 funds in have and 1 to 6 in try. The files read weigh at most 90 KB, a compact file for half its size and a file of the other layers for a third, and hold at most 20,000 lines between them; each fund to try is compared with each fund held in at most 16,000 comparisons of lines in all, about the lines of the shorter of each pair. With have alone, Find ranks the list for any portfolio of up to 6 funds with weekly returns; the overlap of its 3 runs when the files of both sides fit the lower limits of Find, and overlap says whether it ran.
{
"…": "2 more fields",
"question": "Does VXUS or SPMO diversify a portfolio of QQQ 60%, SMH 20% and GLD 20%?",
"…": "1 more field",
"answers": ["VXUS has an overlap of 0.6% by weight with a portfolio of QQQ 60%, SMH 20% and GLD 20%, by the issuer files of 2026-08-31 for VXUS and 2026-10-10 for QQQ, and the Form N-PORT filing of 2026-06-30 for SMH; its weekly returns had a 0.75 correlation over 156 weeks to 2026-10-09, and 0.65 over the 57 weeks the portfolio fell.", "… 1 more"],
"…": "1 more field",
"candidates": [{"ticker": "VXUS", "…": "5 more fields", "overlap": {"by_weight_pct": 0.6, "…": "1 more field", "companies_in_both": 4, "…": "1 more field"}, "correlation": {"weekly": 0.75, "weeks": 156, "from": "2023-10-20", "to": "2026-10-09", "down_weeks": 0.65, "down_weeks_count": 57, "with": ["QQQ", "SMH", "GLD"]}, "…": "2 more fields", "mega_cap_tech_pct": 0, "…": "2 more fields", "rank": 1, "…": "1 more field"}],
"…": "1 more field",
"prices_as_of": "2026-10-09",
"…": "1 more field",
"share_url": "https://tickerinside.com/diversify/?have=QQQ:60,SMH:20,GLD:20&try=VXUS,SPMO" ,
"…": "6 more fields"
}
| Field | Type | Example | What it is |
|---|---|---|---|
kind |
string | "diversify" |
Always diversify. |
mode |
string | "compare" |
compare, the check of the funds of try against the funds of have. With have alone the answer is Find, mode find, another shape (DiversifyFind). |
question |
string | "Does VXUS or SPMO diversify a portfolio … |
The question answered, in words: the funds to try and the portfolio of the funds held, with their weights. |
answer |
string | "Of VXUS and SPMO, |
The answer in one sentence, to quote as it is: of the funds to try, the one with the lowest overlap and the one with the lowest weekly correlation, with the figures and their period, or for one fund to try its two figures; the line /diversify/ prints under the question. |
answers |
array of string | ["VXUS has an overlap of 0.6% by weight w… |
One sentence per fund to try, in the order of candidates, to quote as it is: its overlap with the portfolio, the correlation of weekly returns with the portfolio's over the weeks both have and on the weeks the portfolio fell, and the holdings dates, or why a figure is not measured. |
have |
object | {"funds":[{"ticker":"QQQ", |
The portfolio of the funds held: each fund (funds) with its weight_pct, name, holdings_as_of, holdings_source, holds_shares and weekly_returns, the number of weekly returns its file has; weights, given or equal; looked_through_pct, the part of the portfolio in funds that hold shares; holds_no_shares; returns_from, the funds its weekly returns are computed from, and no_price_history; no_breakdown, the funds holding shares whose file gives no breakdown; mega_cap_tech_pct, sectors and countries as each candidate has them, its funds' at their weights, in percent of the whole portfolio; and its sentence. |
candidates |
array of object | [{"ticker":"VXUS", |
Each fund to try, ranked (see ranking). |
ranking |
string | "By overlap, |
The rule of the order of candidates, in words. |
prices_ |
string | "2026-10-09" |
The last week of the weekly returns, the date of the prices. |
definitions |
object | {"overlap":"The sum, |
How each figure is computed, in the words /diversify/ prints: overlap, share_of_candidate (the part of the candidate in companies the portfolio holds), correlation, down_weeks, sectors and countries; the companies counted as mega-cap tech (mega_cap_tech: rule and companies, each with its name and tickers), the fixed list every fund file's breakdown counts; and sectors_stated_from_pct. |
skipped |
object | |
The tickers not covered, under not_covered, left out of the answer. Absent when every ticker is covered. |
renamed |
object | |
Each ticker asked that a fund had before it was renamed, with its ticker now, under which the answer reads and names it. Absent when there is none. |
share_ |
string | "https:/ |
The page of this answer, /diversify/ with the same query, which renders it for a person or an assistant that fetches it. |
api_ |
string | "https:/ |
This answer's own address. |
source |
object | {"provider":"TickerInside", |
The files the answer is computed from: each fund's page_url, null without a page, api_url and holdings_source; reference_url, the file of mega-cap tech and the names of the sectors and countries; license; and cite_as. |
note |
string | "Measurement, |
Measurement, not investment advice. |
license |
string | "CC BY 4.0" |
The licence the data is published under. |
attribution |
string | "Credit TickerInside with a link to the p… |
How to credit the data: a link to the page of a fund the figure comes from, or to this address, where the medium allows one, the name where it does not. |
docs |
string | "https:/ |
The reference of this endpoint. |
A fund to try, in candidates
| Field | Type | Example | What it is |
|---|---|---|---|
ticker |
string | "VXUS" |
The fund to try. |
name |
string | "Vanguard Total International Stock ETF" |
Its name. |
holdings_ |
string | "2026-08-31" |
The date of its holdings: its issuer file, or the quarter end its filing describes. |
holdings_ |
string | "issuer file" |
Its source: issuer file, SEC Form N-PORT, trust's own SEC filing, sponsor's own holdings file, or prospectus, no holdings yet. |
fund_ |
string | "https:/ |
The address of its fund file. |
page_ |
string or null | "https:/ |
Its page. Null without one. |
overlap |
object or null | {"by_ |
In percent: by_weight_pct, the sum over the companies it and the portfolio both hold of the smaller of its weight and the portfolio's, the portfolio looked through its funds at their weights; share_of_candidate_pct, the part of the fund in those companies; companies_in_both, the holdings both have, counted by ticker; and largest_shared, up to five, each with in_candidate_pct, in_have_pct and counted_pct. Null for a fund that holds no shares, or when no fund held does (see not_measured). |
correlation |
object or null | {"weekly":0.75, |
Of weekly returns, the fund's against the portfolio's: weekly, over weeks weeks from from to to, each the last close of its week (weeks run Saturday to Friday: a week closes on its Friday, or on the Thursday when the exchange is shut that Friday, and the last week on the data's last close); down_weeks, the same on the down_weeks_count weeks the portfolio fell, null under 20 of them; and with, the funds held whose returns the portfolio's are computed from. Null without 52 weeks in common (see not_measured). |
volatility_ |
number | 14.5 |
Its annualised weekly volatility over the weeks of its correlation, in percent; absent when the correlation is not measured. |
with_ |
object | {"volatility_ |
The portfolio's annualised weekly volatility with 10% in this ETF and 90% in the ETFs held at their weights, rebalanced weekly (volatility_pct), against the portfolio alone (instead_of_pct), over the weeks of its correlation; absent when the correlation is not measured. |
mega_ |
number or null | 0 |
The part of the fund in the companies definitions.mega_cap_tech lists, in percent to one decimal, from its fund file's breakdown. Null for a fund that holds no shares or has no breakdown. |
sectors |
object or null | {"known_ |
From its fund file's breakdown: known_pct, the part of the fund whose sector is found; coverage_pct, that part of its stock weight; stated, whether coverage_pct reaches definitions.sectors_stated_from_pct; and weights, when stated, each sector with its id (sector), name and pct of the fund, largest first. Null as mega_cap_tech_pct is. |
countries |
object or null | {"us_ |
From its fund file's breakdown, in percent of the fund: us_pct, the United States; weights, up to six countries, largest first, each with its ISO code (country), name and pct; and other_pct, the rest. Null as mega_cap_tech_pct is. |
not_ |
object | |
Why a figure is null, by figure: overlap, correlation, down_weeks or profile. Absent when every figure is given. |
rank |
integer | 1 |
Its place in the order of ranking, from 1. |
sentence |
string | "VXUS has an overlap of 0.6% by weight wi… |
Its sentence, as answers gives it. |
What have alone gives (mode find): /api/v1/diversify?have=VOO:60,QQQ:20,VXUS:20
| Field | Type | Example | What it is |
|---|---|---|---|
kind |
string | "diversify" |
Always diversify. |
mode |
string | "find" |
Always find: have alone, no try. |
question |
string | "Which ETF in each group had the lowest w… |
The question answered, in words: which ETF in each group of the list had the lowest weekly correlation with the portfolio of the funds held, with their weights; when a fund held has no price history here, with the funds of returns_from, at their weights among them, which every figure of weekly returns names. |
answer |
string | "Over the 156 weeks to 2026-10-09, |
The answer in one sentence, to quote as it is: the ETF of lowest weekly correlation in each of the 3 groups where it is lowest, each with its group and figure, and the weeks with their last date; the line /diversify/ prints under the question. |
answers |
array of string | ["SHY had a 0.05 weekly correlation with … |
One sentence per ETF of lowest, to quote as it is: its weekly correlation with the portfolio over the weeks and on the weeks the portfolio fell, its place in its group, and its overlap by weight with the holdings dates when measured. |
have |
object | {"funds":[{"ticker":"VOO", |
The portfolio of the funds held: each fund (funds) with its weight_pct, name, weekly_returns, holdings_as_of, holdings_source, holds_shares and page_url; weights, given or equal; returns_from, the funds its weekly returns are computed from, and no_price_history; volatility_pct over its weeks, weeks and to, of the weekly returns of the funds of returns_from; looked_through_pct; and mega_cap_tech_pct, sectors and countries, its funds' breakdowns at their weights, each fund's from its own file whether it has a price history here or not, the same figures as the check of the same portfolio; null when one of its funds holding shares has none, or when a fund's file is more than the answer reads beside the ranking, which its note names. |
list |
object | {"name":"Large US ETFs across six kinds o… |
The list ranked: its name, list_date (the day it was chosen; a change of the list is a new date), about (the list in one sentence), left_out_on_purpose (what the list leaves out, in words), count, ranked (tonight, leaving out the funds held and any without weekly returns tonight), groups (id, label and tickers, in the order of the list), held_and_left_out, no_weekly_returns_tonight, and url, the list as a file. |
rule |
string | "From the ETFs of the list, |
The rule of the ranking, in words, as the page prints it. |
lowest |
array of object | [{"rank":1, |
The ETF of lowest weekly correlation in each of the 3 groups where it is lowest, lowest first: a sort of the list's measurements by its published rule. |
lowest_ |
array of object | [{"group":"bond", |
The ETF of lowest weekly correlation in every group, lowest first: group, group_label, ticker, weekly and weeks. |
ranked |
array of object | [{"rank":1, |
Every ETF of the list ranked, lowest weekly correlation first before rounding, an exact tie in the order of the list: rank, ticker, name, group, group_label, page_url, weekly, down_weeks and weeks. |
overlap |
string | "not_ |
measured when the overlap of the 3 with the portfolio ran, the files of both sides within the limits of Find; not_measured otherwise, and overlap is null in lowest. |
overlap_ |
object | {"tickers":["XLE"], |
When overlap is not_measured, the check that answers it in one call: tickers, the ETFs of lowest that hold shares; page, the check's page; and diversify, its JSON answer, each with the overlap by weight of those ETFs with the portfolio. Absent when no check of them fits the limits of one call. |
ties |
array of object | |
An ETF of lowest whose weekly correlation prints the same as others of its group: ticker, with, printed. The order is before rounding. Absent without one. |
prices_ |
string | "2026-10-09" |
The last week of the weekly returns, the date of the prices. |
definitions |
object | {"correlation":"Pearson's correlation bet… |
How each figure is computed, in the words /diversify/ prints: correlation, down_weeks, volatility, with_10_pct, overlap, mega_cap_tech, sectors and countries. |
share_ |
string | "https:/ |
The page of this answer, /diversify/?have=, which renders it for a person or an assistant that fetches it. |
api_ |
string | "https:/ |
This answer's own address. |
source |
object | {"provider":"TickerInside", |
The files the answer is computed from: each fund's page_url and api_url; list_url, the list; license; and cite_as. |
note |
string | "Measurement, |
Measurement, not investment advice. |
license |
string | "CC BY 4.0" |
CC BY 4.0. |
attribution |
string | "Credit TickerInside with a link to the p… |
How to credit the data. |
docs |
string | "https:/ |
This endpoint's reference. |
An ETF of the list, in lowest
| Field | Type | Example | What it is |
|---|---|---|---|
rank |
integer | 1 |
Its place among the 3, lowest first, from 1. |
ticker |
string | "SHY" |
The ETF of the list. |
name |
string | "iShares 1-3 Year Treasury Bond ETF" |
Its name. |
group |
string | "bond" |
Its group in the list, by id. |
group_ |
string | "Bonds" |
Its group, in words. |
page_ |
string or null | "https:/ |
Its page. Null without one. |
fund_ |
string | "https:/ |
The address of its fund file. |
holdings_ |
string | "2026-05-31" |
The date of its holdings. |
holdings_ |
string | "SEC Form N-PORT" |
Its source: issuer file, SEC Form N-PORT or trust's own SEC filing. |
correlation |
object | {"weekly":0.05, |
Of weekly returns, the ETF's against the portfolio's, as a candidate's in the check: weekly, weeks, from, to, down_weeks, down_weeks_count and with. |
volatility_ |
number | 1.6 |
Its annualised weekly volatility over the same weeks, in percent. |
with_ |
object | {"volatility_ |
The portfolio's annualised weekly volatility with 10% in this ETF and 90% in its funds at their weights, rebalanced weekly (volatility_pct), against the portfolio alone (instead_of_pct), over weeks to to. |
overlap |
object | null |
Its overlap by weight with the portfolio looked through, as a candidate's in the check, when measured; null otherwise, and for an ETF that holds no shares. |
mega_ |
number | null |
Its part in mega-cap tech, from its fund file's breakdown; null for an ETF that holds no shares. |
sectors |
object | null |
Its sectors, from its fund file's breakdown, as a candidate's in the check. |
countries |
object | null |
Its countries, from its fund file's breakdown, as a candidate's in the check. |
holds |
string | "Holds bonds" |
For an ETF that holds no shares, what it holds in two words. |
composition |
array of object | [{"label":"US Treasury notes and bonds", |
For an ETF that holds no shares, what it holds by kind, up to three, each with label and pct. |
sentence |
string | "SHY had a 0.05 weekly correlation with V… |
Its sentence, as answers gives it. |
The list, /api/v1/diversify/candidates.json
| Field | Type | Example | What it is |
|---|---|---|---|
name |
string | "Large US ETFs across six kinds of exposu… |
The list's name. |
list_ |
string | "2026-10-10" |
The day the list was chosen. A change of the list is a new date. |
about |
string | "30 large US ETFs across six kinds of exp… |
The list in one sentence. |
left_ |
array of string | ["S&P 500 ETFs weighted by company size, |
What the list leaves out on purpose, in words. |
weeks_ |
string | "2026-10-16" |
The last week of the weekly returns in w, the date of the prices. |
rule |
string | "From the ETFs of the list, |
The rule of the ranking, in words, as every answer prints it. |
top |
integer | 3 |
How many groups an answer opens on. |
min_ |
integer | 52 |
The fewest weekly returns a correlation is computed on. |
groups |
array of object | [{"id":"us-equity", |
The groups in the order of the list: id, label, one (an ETF of the group, in a sentence) and tickers. |
unit |
string | "weekly returns in whole numbers of 0.000… |
How w is written. |
left_ |
array of string | [] |
The ETFs of the list with no weekly returns in tonight's files, left out of every ranking until they have them. |
funds |
array of object | [{"t":"VTI", |
Each ETF of the list with weekly returns tonight, in the order of the list. |
license |
string | "CC BY 4.0" |
CC BY 4.0. |
reference_ |
integer | 1961 |
What /api/v1/diversify/reference.json counts for against the limits of an answer, in the units of size. |
An ETF of the list, in funds
| Field | Type | Example | What it is |
|---|---|---|---|
t |
string | "VTI" |
Its ticker. |
g |
string | "us-equity" |
Its group, by id. |
vol |
number | 14.4 |
Its annualised weekly volatility over 156 weeks, in percent, as its fund file gives it. |
n |
string | "Vanguard Total Stock Market ETF" |
Its name. |
page |
string or null | "https:/ |
Its page on the site. Null without one. |
size |
integer | 14010 |
What its file counts for against the limits of an answer: a file under /fund/ its length, its compact file under /diversify/funds/ half of that file's, a file under /etf/ a third. |
lines |
integer | 3483 |
How many holdings the overlap reads of it; 0 for an ETF that holds no shares. |
l |
string | "sec_ |
Its source layer, as source_layer in its fund file: issuer, sec_nport, sec_nport_bonds, trust_filings and the others. |
h |
string | "2026-06-30" |
The date of its holdings. |
bd |
object | {"sectors_ |
For an ETF that holds shares, its breakdown, the one its fund file gives: sectors_pct, no_sector_pct, sector_coverage_pct, sectors_stated, other_funds_pct, mega_cap_tech_pct and countries_pct. |
comp |
array of object | [{"label":"US Treasury notes and bonds", |
For an ETF that holds no shares, what it holds by kind, up to three, each with label and pct of its net assets. |
w |
array of integer | [-257, |
Its weekly returns as whole numbers of 0.0001 (divide by 10,000: 47 is 0.47%), oldest first, ending at weeks_end; null for a week without a return. |
One ETF's weekly returns, /api/v1/diversify/weekly/{ticker}.json: /api/v1/diversify/weekly/voo.json
| Field | Type | Example | What it is |
|---|---|---|---|
t |
string | "VOO" |
Its ticker. |
n |
string | "Vanguard S&P 500 ETF" |
Its name. |
page |
string or null | "https:/ |
Its page on the site. Null without one. |
size |
integer | 3147 |
What its file counts for against the limits of an answer: a file under /fund/ its length, its compact file under /diversify/funds/ half of that file's, a file under /etf/ a third. |
lines |
integer | 504 |
How many holdings the overlap reads of it; 0 for an ETF that holds no shares. |
l |
string | "sec_ |
Its source layer, as source_layer in its fund file: issuer, sec_nport, sec_nport_bonds, trust_filings and the others. |
h |
string | "2026-06-30" |
The date of its holdings. |
bd |
object | {"sectors_ |
For an ETF that holds shares, its breakdown, the one its fund file gives: sectors_pct, no_sector_pct, sector_coverage_pct, sectors_stated, other_funds_pct, mega_cap_tech_pct and countries_pct. |
comp |
array of object | |
For an ETF that holds no shares, what it holds by kind, up to three, each with label and pct of its net assets. |
w |
array of integer | [-250, |
Its weekly returns as whole numbers of 0.0001 (divide by 10,000: 47 is 0.47%), oldest first, ending at end; null for a week without a return. |
end |
string | "2026-10-16" |
The last week of w, the date of the prices. |
solo |
object | {"list_ |
Its own ranking against the list as a one-ETF portfolio, when the list ranks it: list_date, lowest (the 3 of the answer, in order) and rows, every ETF of the list not held as [ticker, weekly correlation, on down weeks, weeks, down weeks], the correlations in hundredths (divide by 100), lowest first before rounding. |
The files Find reads, public like every file under /api/v1/. candidates.json is the list: its date, its groups, its rule in words, and each ETF of it with its weekly returns, its breakdown or what it holds, and what its file counts for against the limits of an answer. /api/v1/diversify/weekly/{ticker}.json, in lower case, is one ETF's weekly returns and breakdown, for every ETF with at least 52 weekly returns whose last week is the list's, with its own ranking against the list. An answer of have alone is a sort of these measurements by the published rule, the same list for every portfolio: a ranking can be recomputed from these files alone, as Pearson's correlation of w against the portfolio's weekly returns at its weights. The analytics record its tickers, never a weight. The answer, which repeats the weights, is kept in the edge cache for up to a day under its query, and served only to the same query.
Every fund, one line each
/api/v1/funds.json Every fund, one line each, with the address of its file
Ticker, name, category, cost, position count, and whether the fund has a written page: the funds read from issuer files under funds, and those from SEC filings under sec_funds. The list to iterate before pulling fund files.
{
"as_of": "2026-10-16",
"count": 626,
"…": "2 more fields",
"funds": [{"t": "AAXJ", "n": "iShares MSCI All Country Asia ex Japan ETF", "c": "Asia Pacific ex Japan", "cat_id": "asia-pacific-ex-japan", "er": 0.72, "p": 948, "issuer": "iShares", "aum_b": 4.0, "page": true, "url": "https://tickerinside.com/etf/aaxj/" , "api": "https://tickerinside.com/api/v1/fund/aaxj.json" }, "… 625 more"],
"sec_count": 2049,
"…": "1 more field",
"sec_funds": [{"t": "AAAA", "n": "Amplius Aggressive Asset Allocation ETF", "c": "Aggressive Allocation", "cat_id": "allocation-aggressive", "er": 0.49, "p": 43, "api": "https://tickerinside.com/api/v1/fund/aaaa.json" , "report_date": "2026-07-31", "issuer": null, "aum_b": null, "net_assets": 278318309, "page": true, "url": "https://tickerinside.com/etf/aaaa/" }, "… 2,048 more"],
"…": "8 more fields"
}
| Field | Type | Example | What it is |
|---|---|---|---|
as_ |
string | "2026-10-16" |
The price date. |
count |
integer | 626 |
How many issuer-layer funds there are, the length of funds. Each has a /fund/ file. |
with_ |
integer | 664 |
How many funds have a page, in every list of this file. |
note |
string | "page is true when the fund has a written… |
How to read the entries. |
funds |
array of object | [{"t":"AAXJ", |
One entry per issuer-layer fund: t the ticker, n the name, c the category's name (Large Blend for US Large Blend, as before 9 October 2026), cat_id its id, er the expense ratio, p the number of positions. issuer is the fund's issuer, named as in index.json coverage.issuers, and aum_b its assets in billions of US dollars, as in its fund file; either can be null. page says whether it has a page, url is that page or null, and api is its file. |
sec_ |
integer | 2049 |
How many SEC-layer funds there are, the length of sec_funds. |
sec_ |
string | "sec_ |
How to read sec_funds. |
sec_ |
array of object | [{"t":"AAAA", |
One entry per SEC-layer fund: t, n, c, cat_id, er, p, issuer, aum_b and api as above, then report_date, the quarter end the filing describes, and net_assets, in US dollars on that date. er is null where the cost is not in the data, never zero, and aum_b is null unless the market data gives the fund's size; the filing's figure is net_assets. issuer is read from the fund's name and checked against the trust that filed it, or null when neither says. page and url as in funds. |
sponsor_ |
array of object | [{"t":"AAUB", |
One entry per sponsor-file fund, as sec_funds. |
prospectus_ |
array of object | [{"t":"AAAB", |
One entry per prospectus-file fund, as sec_funds, with filed and form. |
bond_ |
array of object | [{"t":"AAA", |
One entry per fixed income fund, as sec_funds; p counts its filing's lines. |
multi_ |
array of object | [{"t":"AAPR", |
One entry per multi-asset fund, as sec_funds. |
derivative_ |
array of object | [{"t":"AALG", |
One entry per derivative-based fund, as sec_funds; report_date is the quarter end its filing describes. The files of this and the next three lists are under /etf/, at each entry's api. In them, page and url are given only for a fund that has a page. |
trust_ |
array of object | [{"t":"AAAU", |
One entry per trust or commodity pool, as sec_funds; report_date is the period its filing describes, null for a fund too new to have filed a report. |
license |
string | "CC BY 4.0" |
The licence the data is published under. |
attribution |
string | "Credit TickerInside with a link to this … |
How to credit the data: a link to this file where the medium allows one, the name where it does not. |
The US-listed ETFs, and their coverage
/api/v1/universe.json The US-listed ETFs, how each is covered or why not yet, and the coverage measured
One row for each ETF in Nasdaq Trader's symbol directory: ticker, name, fund or exchange-traded note, and the layer that covers it or why it is not covered yet. The coverage is measured here over the funds only; the same block is in index.json and status.json.
| Field | Type | Example | What it is |
|---|---|---|---|
as_ |
string | "2026-10-16" |
The price date across the whole site. |
available |
boolean | true |
False, with an empty funds list, when the list of US-listed ETFs could not be read for this build. |
source |
string | "Nasdaq Trader symbol directory (nasdaqtr… |
Nasdaq Trader's symbol directory. |
file_ |
string | "2026-10-16" |
The day of the directory file. |
sentence |
string | "5, |
The measured coverage in one sentence to quote. |
coverage |
object | {"etfs":5733, |
The measure, the block of index.json coverage.universe: etfs, covered (with holdings), pct, by_layer, prospectus, with_file, with_objective, not_covered by reason, etns, other_products, outside_universe, file_date, source, sentence, all_us_etfs, headline, claim and assets. |
layers |
object | {"issuer_ |
What each layer of fund files is. |
reasons |
object | {"etn":"An exchange-traded note is a debt… |
Why a fund has no fund file, by code. |
funds |
array of array of string | [["AAA", |
One row for each US-listed ETF and each exchange-traded note the directory flags: [ticker, name, kind, layer, why]. kind: etf, etn (a debt of the issuing bank, not a fund) or other. layer: how the fund is covered, null when it is not yet, and why is then its reason. |
license |
string | "CC BY 4.0" |
The licence the data is published under. |
attribution |
string | "Credit TickerInside with a link to this … |
How to credit the data: a link to this file where the medium allows one, the name where it does not. |
A ticker of the list with no fund file answers 404 at /api/v1/fund/{ticker}.json; this file says why.
Who holds what, issuer files
/api/v1/holders.json Which issuer-layer funds hold each security, and at what weight, in one file
The reverse index of the 626 issuer files: for each of the 16,724 securities their funds hold, which of them hold it and at what weight. One file of 3.9 MB, the right shape for a client that loads it once and walks it. SEC-layer funds are not in it. A stock's SEC-layer holders are in /api/v1/sec/{ticker}.json, under holders_sec_nport, and those of a key with no stock file are in the shard of its first character, /api/v1/holders/{c}.json.
{
"as_of": "2026-10-16",
"holdings_as_of": {"CNRG": "2026-10-15", "CWI": "2026-10-15", "…": "624 more"},
"…": "1 more field",
"securities": 16724,
"…": "2 more fields",
"holders": {"NVDA": [["GXPT", 19.88], ["IYW", 16.5999], "… 158 more"], "…": "16,723 more securities"},
"…": "4 more fields"
}
| Field | Type | Example | What it is |
|---|---|---|---|
as_ |
string | "2026-10-16" |
The price date. |
holdings_ |
object | {"CNRG":"2026-10-15", |
The date of each issuer-layer fund's holdings file, keyed by ticker. |
funds |
object | {"XLC":"Communication Services Select Sec… |
Ticker to fund name for the issuer-layer funds, and for a few other funds the price data names, and for other funds the price data names. Use index.json tickers, not this map, as the list of covered funds. |
securities |
integer | 16724 |
How many distinct securities the issuer-layer funds hold between them, the length of holders. |
names |
object | {"ACA":"Arcosa, |
Ticker to company name for every security the data can name: from the price data for the stocks with a history, from the issuer files for the rest. |
note |
string | "For each security, |
How to read the holders map. |
holders |
object of arrays of [ticker, weight] | {"ACA":[["CNRG", |
The index itself: for each security, the issuer-layer funds that hold it, as [fund ticker, weight percent], heaviest first. A security is one listed line. A US line is keyed by its ticker, and a dot and one letter mark a US share class (BRK.B). Any other line is keyed by its local code and its market, a dot and a two letter country code (7203.JP, SAN.FR). The Toronto line of a Canadian company that also trades in New York is the same shares, under the US ticker (RY). Preferred shares a file writes under their issuer's common ticker are under that ticker and .PFD, three letters and never a market (JPM.PFD). That key holds every series of JPMorgan's preferred stock a fund holds, and in a preferred stock fund any other income security filed under the ticker, such as a business development company's listed notes. It is a US line of its own, so a preferred stock fund is never listed among the holders of the common stock. |
aliases |
object | {"000100":["000100.CN", |
The keys written before lines listed abroad were keyed with their market, when a local code alone was the key. Each maps to the keys it reads as now, the US line first and then the heaviest: 7203 reads as 7203.JP (Toyota) and 7203.SA (Elm), A005930 as 005930.KR. A key that became several was several companies or lines under one code. The shard of each old key's first character lists them all. This file leaves out a key that reads only as itself with its market after it (NESN as NESN.CH). |
license |
string | "CC BY 4.0" |
The licence the data is published under. |
attribution |
string | "Credit TickerInside with a link to this … |
How to credit the data: a link to this file where the medium allows one, the name where it does not. |
source |
string | "https:/ |
Where the method behind these figures is written down. |
Who holds what, one first character
/api/v1/holders/{c}.json holders.json split by the key's first character, with the SEC-layer holders of the securities that have no stock file
The reverse index split by the first character of the key: a.json to z.json, and 0.json for a key that starts with any other character (7203.JP is in 0.json, AZN.GB in a.json). Each shard holds the part of holders.json for its keys, with their names and figures under facts. It also holds what holders.json does not: the SEC-layer funds that hold a key with no stock file, such as a line listed abroad, under holders_sec_nport, and the old keys of its first character under aliases. It is the source of the holders-only answers under /sec/. 0.json is the largest shard (3.0 MB). The same content is split again by the key's first digit, in /api/v1/holders/0/0.json to /api/v1/holders/0/9.json (7203.JP is in 0/7.json), for a client that wants a smaller file.
{
"as_of": "2026-10-16",
"holdings_as_of": {"CNRG": "2026-10-15", "CWI": "2026-10-15", "…": "624 more"},
"…": "1 more field",
"facts": {"7203.JP": {"n": "Toyota Motor Corp"}},
"holders": {"7203.JP": [["EWJV", 6.8909], ["RXI", 3.6642], "… 42 more"], "…": "6,125 more keys"},
"holders_sec_nport": {"7203.JP": [["IQDG", 4.095], ["BBJP", 3.9873], "… 80 more"], "…": "7,926 more keys"},
"sec_nport_as_of": {"IQDG": "2026-06-30", "BBJP": "2026-07-31", "…": "655 more"},
"aliases": {"7203": ["7203.JP", "7203.SA"]},
"…": "2 more fields"
}
| Field | Type | Example | What it is |
|---|---|---|---|
as_ |
string | "2026-10-16" |
The price date. |
holdings_ |
object | {"CNRG":"2026-10-15", |
The date of each issuer-layer fund's holdings file, keyed by ticker, for every issuer-layer fund. |
funds |
object | {"CNRG":"State Street SPDR S&P Kensho Cle… |
Ticker to fund name for the issuer-layer funds. The names of SEC-layer funds are in /api/v1/funds.json, under sec_funds. |
facts |
object | {"A":{"n":"Agilent Technologies", |
For each key of this shard the data can describe: n, the name, and where known r1, r3, vol, mdd3, cap_b, pe and yield, in the units of a stock file. page is true when the stock has a page. |
holders |
object of arrays of [ticker, weight] | {"ACA":[["CNRG", |
The part of holders.json for the keys of this shard: each key to the issuer-layer funds that hold it, as [fund ticker, weight percent], heaviest first. Each row's date is in holdings_as_of. |
holders_ |
object of arrays of [ticker, weight] | {"ACWI":[["HF", |
Each key of this shard that has no stock file, such as a line listed abroad, to the SEC-layer funds that hold it, as [fund ticker, weight percent], heaviest first. Each row's date is in sec_nport_as_of. A key with a stock file has its SEC-layer holders in that file. |
sec_ |
object | {"AAAA":"2026-07-31", |
Each SEC-layer fund listed in holders_sec_nport, to the quarter end its filing describes. |
aliases |
object | {"A000070":["000070.KR"], |
The old keys whose first character is this shard's, each with the keys it reads as now: 7203 reads as 7203.JP and 7203.SA. Unlike holders.json, it also lists a key that reads only as itself with its market (NESN as NESN.CH). Absent from a shard with no old key. |
license |
string | "CC BY 4.0" |
The licence the data is published under. |
attribution |
string | "Credit TickerInside with a link to this … |
How to credit the data: a link to this file where the medium allows one, the name where it does not. |
Ask for the key's first character in lower case, or 0 when it is not a letter. The files are a.json to z.json, 0.json, and 0/0.json to 0/9.json; any other address under /api/v1/holders/ answers 404, reason not_a_shard.
Every security, one line each
/api/v1/securities.json Every security the issuer-layer funds hold, with how many of them hold it
Every security the funds of the 626 issuer files hold, with how many of them hold it and its largest weight, in one file of 792 KB. The list to walk before asking for stock files: its last place says whether a stock file exists.
{
"as_of": "2026-10-16",
"count": 16724,
"…": "1 more field",
"securities": [["NVDA", 160, 19.88, "Nvidia", 1, 1], ["MSFT", 158, 15.07, "Microsoft", 1, 1], "… 16,722 more"],
"…": "2 more fields"
}
| Field | Type | Example | What it is |
|---|---|---|---|
as_ |
string | "2026-10-16" |
The price date. |
count |
integer | 16724 |
How many securities are listed, the length of securities. |
note |
string | "Each entry is [ticker, |
How to read the entries. |
securities |
array of [ticker, funds, weight, name, page, file] | [["NVDA", |
One entry per security held by the issuer-layer funds, the most widely held first. Each is [ticker, how many of those funds hold it, its largest weight in any of them, company name, 1 when it has a page at /stock/{ticker}/, 1 when /api/v1/sec/{ticker}.json is a stock file, not a holders_only answer]. |
license |
string | "CC BY 4.0" |
The licence the data is published under. |
attribution |
string | "Credit TickerInside with a link to this … |
How to credit the data: a link to this file where the medium allows one, the name where it does not. |
Identifiers that outlive a ticker
/api/v1/identifiers.json Every fund and stock with a file, with its FIGIs, SEC CIK, series and class ids, exchange and asset type
One row for each of the 10,868 funds and stocks with a file here: ticker, name, asset type, the exchange it is listed on, its composite and share class FIGIs from OpenFIGI, its SEC CIK and, for a fund, its SEC series and class ids, in one file of 1.3 MB, and the same rows in /api/v1/identifiers.csv. A ticker can change, and a ticker given up can pass to another security. Key your records on the composite FIGI or, for a fund, its SEC class id, not on the ticker: neither changes with the ticker nor passes to another security. A CIK names the company or trust that files with the SEC, and several securities can share one.
{
"read_on": "2026-10-17",
"count": 10868,
"…": "1 more field",
"fields": ["ticker", "name", "asset_type", "exchange", "composite_figi", "share_class_figi", "cik", "series_id", "class_id"],
"…": "2 more fields",
"securities": [["A", "Agilent Technologies", "stock", "NYSE", "BBG000C2V3D6", "BBG001SCTQY4", "0001090872", null, null], ["AA", "Alcoa Corporation", "stock", "NYSE", "BBG00B3T3HD3", "BBG00B3T3HF1", "0001675149", null, null], "… 10,866 more"],
"…": "2 more fields"
}
| Field | Type | Example | What it is |
|---|---|---|---|
read_ |
string | "2026-10-17" |
The day the sources were last read. Each source's own date is in sources. |
count |
integer | 10868 |
How many securities are listed, the length of securities. |
note |
string | "One row per fund and stock with a file h… |
How to read the rows. |
fields |
array of string | ["ticker", |
The names of the columns of each row, in their order: ticker, name, then the fields of the identifiers object a fund or stock file carries. |
counts |
object | {"securities":10868, |
How many rows there are, by asset_type, and how many have each field. |
sources |
array of object | [{"name":"OpenFIGI", |
Where each column comes from: name, url, the fields it gives, read_on (for the directory, the date of its file) and, for OpenFIGI, its terms. |
securities |
array of [ticker, name, asset_type, exchange, composite_figi, share_class_figi, cik, series_id, class_id] | [["A", |
One row per fund and stock with a file here, in ticker order, in the columns of fields: [ticker, name, asset_type, exchange, composite_figi, share_class_figi, cik, series_id, class_id]. A fund's file is /api/v1/fund/{ticker}.json, a stock's /api/v1/sec/{ticker}.json. |
license |
string | "CC BY 4.0" |
The licence the data is published under. |
attribution |
string | "Credit TickerInside with a link to this … |
How to credit the data: a link to this file where the medium allows one, the name where it does not. |
The identifiers object of a fund or stock file, from /api/v1/fund/ivv.json
| Field | Type | Example | What it is |
|---|---|---|---|
asset_ |
string | "etf" |
etf for a fund; etn for an exchange-traded note, a bank's debt with no holdings; stock for any other listed share: a company's stock, a depositary receipt, a closed-end fund. |
exchange |
string or null | "NYSE Arca" |
The exchange the security is listed on, as Nasdaq Trader's directory names it: Nasdaq, NYSE, NYSE Arca, Cboe BZX and the others its codes stand for. Null when the directory does not list it. Unlike the identifiers, it changes when the listing moves. |
composite_ |
string or null | "BBG000BVZ4F5" |
The Financial Instrument Global Identifier of the US listing (the composite FIGI of exchange code US), from OpenFIGI, asked by ticker. FIGIs are in the public domain. Null until OpenFIGI answers for the ticker with one security of this asset type. |
share_ |
string or null | "BBG001SFB7R6" |
The FIGI of the share class, the same on every market it trades in. Null with composite_figi. |
cik |
string or null | "0001100663" |
The SEC's Central Index Key, ten digits as EDGAR writes it, from the SEC's ticker files: the company's, or for a fund the registrant's, the trust that files for it and for its other funds. Several securities can share one, so key records on composite_figi or class_id instead. Null when the SEC's files do not list the ticker. |
series_ |
string or null | "S000004310" |
For a fund, the SEC's id of its series (S and nine digits), which tells it apart from the other funds of its registrant: from the SEC's fund ticker file, or from the Form N-PORT its holdings are read from where the two differ. Null for a stock, and for a trust that files as a company. |
class_ |
string or null | "C000012040" |
For a fund, the SEC's id of its share class (C and nine digits). Null when series_id is, or when it comes from the Form N-PORT and the fund ticker file lists the ticker under another series. |
Of them, 10,773 have a FIGI, 9,849 a CIK and 5,444 a series id; a field is null where its source does not list the security yet. Each fund and stock file carries its row's values under identifiers.
ETF ownership, every stock
/api/v1/ownership.json How much of each stock the covered US ETFs hold, at least, in one file
The ETF ownership ledger. For each of the 3,345 stocks with a figure, most held first: the share of its shares outstanding held by the covered US ETFs, at least, how many funds were counted, and the basis. The basis is company when the percent is of the company, every class counted, and class when it is of the ticker's class alone. Then the share of the money in the covered US stock ETFs that sits in the ten largest US companies, and the companies held by the most funds. Each figure's parts and dates are in the stock's file, /api/v1/sec/{ticker}.json, under etf_ownership: shares_held, shares_outstanding and shares_outstanding_as_of, funds_counted, and holdings_dates {oldest, newest}. Here as_of is the newest holdings date counted, not a price date.
{
"as_of": "2026-10-16",
"method": "ti-ownership/1",
"…": "1 more field",
"count": 3345,
"…": "1 more field",
"stocks": [["EU", 33.47, 19, "company"], ["URG", 32.89, 16, "company"], ["ATEN", 30.49, 97, "company"], "… 3,342 more"],
"…": "2 more fields",
"top10_share": {"pct": 27.9, "companies": ["NVDA", "AAPL", "GOOGL", "… 7 more"], "funds": 1487, "…": "2 more fields"},
"…": "5 more fields"
}
| Field | Type | Example | What it is |
|---|---|---|---|
as_ |
string | "2026-10-16" |
The newest holdings date among the issuer files the ledger was counted from. Here as_of is a holdings date, not the price date. |
method |
string | "ti-ownership/ |
The method and its version, ti-ownership/1. |
method_ |
string | "https:/ |
Where the method is written down, with its test vectors. |
count |
integer | 3345 |
How many stocks have a figure, the length of stocks. |
note |
string | "Each entry is [ticker, |
How to read the entries. |
stocks |
array of [ticker, percent, funds, basis] | [["EU", |
One entry per stock with a figure, most held first, as [ticker, at least this percent held by the covered US ETFs, how many funds were counted, basis]. basis is as in the stock file. company: the percent is of the company's shares outstanding, every class counted. class: it is of the ticker's class alone, which is not the company's figure (Clearway's class C, while its classes A, B and D are left out). Two tickers of one company on a company basis carry the same figure. |
refused |
object | {"class_ |
How many stocks with a file have no figure, by reason. |
refused_ |
object | {"class_ |
Those reasons in words. |
top10_ |
object | {"pct":27.9, |
The share of the money in the covered US stock ETFs that sits in the ten largest US companies by market value. It gives pct, the companies, and funds, how many funds it is measured over: those whose net assets are at least 80% in US-listed stocks. It also gives how many such funds were left out for want of stated net assets, and the oldest and newest date of the net assets used. Each fund counts by its own net assets, a Vanguard fund by its ETF class's alone. The ten are ranked among every US company a covered fund holds, whether or not it has a stock file here. The weight of a company without a file counts as US stock like any other. |
most_ |
array of [ticker, company, funds, percent, basis] | [["NVDA", |
The 25 companies held by the most covered funds, both layers, one line per company. Each line is [ticker, company name, how many covered funds hold any of its listed classes, the ticker's pct_lower_bound or null, its basis or null]. A fund holding two classes of the company (GOOGL and GOOG) is one fund. The ticker is the company's class held by the most funds. Its pct_lower_bound is that stock file's figure, of the company or of the ticker's class alone as basis says (Visa's is its class A's). A fund whose row under a ticker is another security is not counted: a preferred stock fund, a row named as a preferred share, or a filing whose row is listed under abroad. A line listed abroad has a key of its own (7203.JP beside TM) and is never counted for a US company. |
held_ |
object or null | null |
Null on a normal night. When tonight's ledger is held back, the figures served are those of the last ledger that passed, each with its own dates, and this says why. reason is above_100 when more than five stocks come to over 100% with no split to explain them; failures says how many, and examples which. It is fewer_figures when tonight's ledger has more than 20% fewer figures than the last one that passed (figures, last_figures), a night that lost an input. It is error when the ledger could not be computed tonight; top10_share is then null and most_widely_held empty. A fewer_figures hold lasts at most seven days of holdings dates (last_as_of is the date of the ledger served); after that the lower count is published. The ledger served keeps only the stocks that have a file tonight. |
docs |
string | "https:/ |
Where this file is documented. |
license |
string | "CC BY 4.0" |
The licence the data is published under. |
attribution |
string | "Credit TickerInside with a link to this … |
How to credit the data: a link to this file where the medium allows one, the name where it does not. |
The top10_share object
| Field | Type | Example | What it is |
|---|---|---|---|
pct |
number | 27.9 |
The share, in percent, rounded to one decimal. A share of the money, not a bound, so it is rounded to nearest. |
companies |
array of string | ["NVDA", |
The ten companies, one ticker each: the largest by the market data's capitalisation among the US companies any covered fund holds. A US company is a stock the price data places in a sector, or one whose company files 10-K and 10-Q reports with the SEC. A company with no stock file here is ranked like the others, and its weight in each fund counts in pct. A stock has a file with at least 110 of the 156 weekly returns, or with fewer when a fund read from an issuer file or a stock ETF from SEC filings holds it in a file dated since it listed, the price data has its closes since its listing, or a year of them, the last at most five sessions old, and Nasdaq Trader's directory lists it under its name. |
funds |
integer | 1487 |
How many funds it is measured over. |
funds_ |
integer | 0 |
How many US stock funds were left out because their files state no net assets. |
net_ |
object | {"oldest":"2026-01-31", |
The oldest and newest date of the net assets used: issuer figures are current, SEC filings months old. |
A lower bound, never an estimate of the whole: shares held by ETFs outside the coverage, and by covered funds whose count could not be used, are not in it. One exception: the count of shares outstanding is used when it is at most 2% below a current independent count, so a figure can be up to about 2% of itself too high. The holdings and the count of shares carry different dates, both published.
Methods and test vectors
/api/v1/methods.json The formula, rules and test vectors of the ETF ownership figure (ti-ownership/1), of the ETF Ownership Index (ti-ownership-index/1) and of the overlap of two funds (ti-overlap/1)
Each method a published figure names in its method field, with its version, formula, rules and test vectors: inputs with the output the method gives, to check an implementation against. It holds ti-ownership/1, the ETF ownership ledger, ti-ownership-index/1 and ti-overlap/1.
{
"…": "1 more field",
"methods": [{"id": "ti-ownership/1", "…": "5 more fields", "formula": "pct_lower_bound = floor(100 * shares_held / shares_outstanding, 2 decimals)", "…": "5 more fields", "vectors": [{"name": "two issuer files and one SEC filing", "input": {"ticker": "AAA", "shares_outstanding": {"as_of": "2026-08-01", "classes": [{"class": null, "tickers": ["AAA"], "shares": 1000000}]}, "independent": {"AAA": {"class": 1000000, "company": 1000000}}, "funds": [{"fund": "F1", "layer": "issuer_files", "as_of": "2026-09-24", "shares": {"AAA": 30000}}, {"fund": "F2", "layer": "issuer_files", "as_of": "2026-09-23", "shares": {"AAA": 20000}}, {"fund": "S1", "layer": "sec_nport", "as_of": "2026-06-30", "shares": {"AAA": 5555}}]}, "output": {"pct_lower_bound": 5.55, "basis": "company", "shares_held": 55555, "shares_outstanding": 1000000, "funds_counted": {"issuer_files": 2, "sec_nport": 1}, "not_counted": {}}}, "… 17 more"]}],
"…": "3 more fields"
}
| Field | Type | Example | What it is |
|---|---|---|---|
note |
string | "Each method is named by an id and a vers… |
How methods are named and versioned. |
methods |
array of object | [{"id":"ti-ownership/ |
One entry per method; its fields are described below. |
docs |
string | "https:/ |
Where this file is documented. |
license |
string | "CC BY 4.0" |
The licence the data is published under. |
attribution |
string | "Credit TickerInside with a link to this … |
How to credit the data: a link to this file where the medium allows one, the name where it does not. |
A method
| Field | Type | Example | What it is |
|---|---|---|---|
id |
string | "ti-ownership/ |
The name and version a published figure gives in its method field. |
name |
string | "ETF ownership ledger" |
The method in words. |
version |
integer | 1 |
The version number. Fields are added; a change to what the method computes from inputs it already accepted is a new id, and a rule for an input it did not accept before is listed under changes. |
since |
string | "2026-09-28" |
The first day figures were published under this version. |
changes |
array of object | [{"since":"2026-10-03", |
The rules added to this version for an input it did not accept before, each with since, the first day it was published, rule, its code under not_counted, and what, the change in words. Every earlier test vector keeps its output. |
measures |
string | "For one US company, |
What the figure is, in one sentence. |
formula |
string | "pct_ |
The figure as a formula. |
definitions |
object | {"shares_ |
What each term of the formula is. |
rules |
array of string | ["A fund is counted once. A fund in both … |
The rules of the method, in words. |
not_ |
object | {"no_ |
Each reason an input is left out, as a code and in words. |
refusals |
object | {"no_ |
Each reason no figure is given, as a code and in words. |
vector_ |
string | "input: ticker; shares_ |
The shape of a test vector's input and output. |
vectors |
array of object | [{"name":"two issuer files and one SEC fi… |
Inputs with the output the method gives for them, to check an implementation against. |
A change to what a method computes from inputs it already accepted is a new version, never an edit of the one published. A rule for an input it did not accept before is added to the version with its own test vector, and changes gives the day it was first published.
ETF Ownership Index
/api/v1/ownership-index.json Each stock's share held by the covered US ETFs, its concentration, and the market and sector lines
The ETF Ownership Index (ti-ownership-index/1). For each stock with a figure in the ownership ledger: the share of its shares outstanding held by the covered US ETFs, at least, the funds counted, and top3_share_pct, the share of those funds' holdings held by the three funds holding the most. Then the market line, over one line per company, with the cap-weighted share of the companies' market value the ETFs hold, the mean, the median and the quartiles, and the same line by sector. Its CSV twin, /api/v1/ownership-index.csv, has the same rows. The methodology, with a worked example, is at /etf-ownership/methodology/.
{
"…": "1 more field",
"as_of": "2026-10-16",
"method": "ti-ownership-index/1",
"…": "6 more fields",
"count": 3345,
"columns": ["ticker", "company", "sector", "basis", "pct_lower_bound", "funds_counted", "top3_share_pct", "holdings_newest", "shares_outstanding_as_of"],
"stocks": [["EU", "enCore Energy Corp.", null, "company", 33.47, 19, null, "2026-10-16", "2026-08-10"], ["URG", "Ur Energy Inc", null, "company", 32.89, 16, null, "2026-10-16", "2026-07-31"], "… 3,343 more"],
"market": {"companies": 3241, "cap_weighted_pct": 7.88, "mean_pct": 8.68, "median_pct": 7.92, "p25_pct": 3.7, "p75_pct": 12.8, "companies_without_cap": 129, "cap_b": 83221.2},
"…": "9 more fields",
"cite_as": "TickerInside, ETF Ownership Index (ti-ownership-index/1) of 2026-10-16: at least 7.88% of the combined market value of 3,241 US-listed companies held by the covered US ETFs, https://tickerinside.com/api/v1/ownership-index.json, CC BY 4.0" ,
"…": "4 more fields"
}
| Field | Type | Example | What it is |
|---|---|---|---|
name |
string | "TickerInside ETF Ownership Index" |
The index's name. |
as_ |
string or null | "2026-10-16" |
The date of the ownership ledger the index reads: its newest holdings date. |
method |
string | "ti-ownership-index/ |
The method of the index, ti-ownership-index/1, in /api/v1/methods.json. |
ledger_ |
string | "ti-ownership/ |
The method of the figures it reads, ti-ownership/1. |
method_ |
string | "https:/ |
Where both methods are written down, with their test vectors. |
methodology |
string | "https:/ |
The methodology page: formulas, sources, dates, limits and a worked example. |
holdings_ |
object or null | {"oldest":"2026-01-31", |
The oldest and newest holdings dates counted across the stocks. |
shares_ |
object or null | {"oldest":"2025-10-21", |
The oldest and newest dates of the SEC's counts of shares outstanding used. |
caps_ |
string or null | "2026-10-16" |
The price date of the market caps that weight the lines; they enter no stock's figure. |
count |
integer | 3345 |
How many stocks have a figure, the rows of stocks. |
columns |
array of string | ["ticker", |
The names of the places of each row of stocks. |
stocks |
array of [ticker, company, sector, basis, pct_lower_bound, funds_counted, top3_share_pct, holdings_newest, shares_outstanding_as_of] | [["EU", |
One row per stock with a figure, most held first, as columns names them. |
market |
object or null | {"companies":3241, |
The line over every company: described below. |
sectors |
array of object | [{"sector":"Communication Services", |
The line of each sector with at least 5 companies, by name: the same fields and sector. |
class_ |
integer | 83 |
How many figures of one class alone are in stocks and left out of the lines. |
concentration_ |
integer | 6 |
The fewest funds counted for a top3_share_pct. |
concentration_ |
object | {"fewer_ |
How many stocks have a null top3_share_pct, by reason (refusals of ti-ownership-index/1 in methods.json). |
held_ |
object or null | null |
Set when tonight's ledger was held back by its checks: the index then reads the last ledger that passed. |
failed |
boolean | false |
True when the index could not be computed tonight: no rows and no lines, the history as it was. |
history |
string | "https:/ |
The daily history, with the changes over 5 and 20 market days (history terms). |
csv |
string | "https:/ |
The rows of stocks as CSV, the same columns. |
note |
string | "Each row of stocks is described by colum… |
How to read the file. |
cite_ |
string or null | "TickerInside, |
A citation line: the index, its date, the market line and this file's address. |
cite_ |
string | "<a href=\"https:/ |
The credit as HTML: a link to this file, then its address. |
docs |
string | "https:/ |
Where the file is documented. |
license |
string | "CC BY 4.0" |
CC BY 4.0. |
attribution |
string | "Credit TickerInside with a link to this … |
Credit TickerInside with a link to this file, or to the page that shows the figure, wherever the medium allows a link, and by name where it does not. How you mark the link is up to you. |
The market line, and each line of sectors
| Field | Type | Example | What it is |
|---|---|---|---|
companies |
integer | 3241 |
Companies in the line, one per company on a company basis. |
cap_ |
number or null | 7.88 |
Sum of each company's figure times its market cap over the sum of their caps, rounded down: the share of their combined market value held by the covered US ETFs, at least. |
mean_ |
number or null | 8.68 |
The mean of the companies' figures, rounded down. |
median_ |
number or null | 7.92 |
The median company's figure. |
p25_ |
number or null | 3.7 |
The first quartile, by nearest rank. |
p75_ |
number or null | 12.8 |
The third quartile, by nearest rank. |
companies_ |
integer | 129 |
Companies without a market cap, in the mean and quartiles and left out of cap_weighted_pct. |
cap_ |
number or null | 83221.2 |
The companies' combined market cap, in billions of dollars. |
A lower bound, like the ledger it reads: funds outside the coverage, and covered funds whose count could not be used, are not in it. Market caps weight the lines and enter no stock's figure. Under CC BY 4.0.
ETF Ownership Index, daily history
/api/v1/ownership-index/history.json The index by market close, and each stock's change over 5 and 20 market days (history terms)
One row per market close of the market line and of each sector line: the levels of the night the close was first published, and the change of ETF ownership ending on the close over 1, 5 and 20 market days, weighted by market cap. Then each stock's changes ending on the latest close, in percentage points of its shares outstanding, from the net shares the funds read daily bought and sold, as the ETF flows publish them. Its CSV twin, /api/v1/ownership-index/history.csv, has the rows of every line.
{
"…": "4 more fields",
"first_close": "2026-09-29",
"last_close": "2026-10-12",
"…": "1 more field",
"series_columns": ["date", "as_of", "companies", "cap_weighted_pct", "mean_pct", "median_pct", "p25_pct", "p75_pct", "companies_without_cap", "cap_b", "change_1d_pp", "change_1d_cap_pct", "change_5d_pp", "change_5d_cap_pct", "change_20d_pp", "change_20d_cap_pct", "rebuilt"],
"market": [["2026-10-09", null, null, null, null, null, null, null, null, null, 0.0061, 90.7, 0.0124, 85.5, null, 0.0, true], ["2026-10-12", "2026-10-13", 3503, 11.41, 10.64, 9.88, 3.68, 16.54, 252, 84647.2, 0.0067, 88.8, 0.0233, 83.5, null, 0.0, false]],
"…": "1 more field",
"stocks_columns": ["ticker", "change_1d_pp", "change_5d_pp", "change_20d_pp", "null_1d", "null_5d", "null_20d"],
"stocks": [["A", 0.0121, 0.0328, null, null, null, null], ["AA", 0.0079, 0.0225, null, null, null, null], "… 3,343 more"],
"…": "11 more fields"
}
| Field | Type | Example | What it is |
|---|---|---|---|
name |
string | "TickerInside ETF Ownership Index, |
The history's name. |
method |
string | "ti-ownership-index/ |
The method of the index, ti-ownership-index/1. |
flows_ |
string | "ti-flows/ |
The method of the flows the changes are read from, ti-flows/1. |
methodology |
string | "https:/ |
The methodology page. |
first_ |
string or null | "2026-09-29" |
The first close of the history. |
last_ |
string or null | "2026-10-12" |
The close of the changes in stocks: the flows' latest close. |
windows |
object | {"1d":{"from":"2026-10-09", |
For 1d, 5d and 20d: from, the close the change starts after, to, the close it ends on, and covered, whether every close between is a complete close of the flows. |
series_ |
array of string | ["date", |
The names of the places of each row of market and sectors. |
market |
array of [date, as_of, levels, changes, rebuilt], as series_columns | [["2026-09-29", |
The market line, one row per close, oldest first. |
sectors |
object of the same rows, by sector | {"Communication Services":[["2026-09-29", |
Each sector's line, one row per close, by sector. |
stocks_ |
array of string | ["ticker", |
The names of the places of each row of stocks. |
stocks |
array of [ticker, change_1d_pp, change_5d_pp, change_20d_pp, null_1d, null_5d, null_20d] | [["A", |
Each stock's changes over 1, 5 and 20 market days ending on last_close, in percentage points of its shares outstanding, and the reason each null one is null; a null reason with a null change means the window is not covered. |
not_ |
object | {"1d":{"corporate_ |
For each window, how many stocks have no change, by reason. |
null_ |
object | {"window_ |
Each reason a change is null, in words. |
index |
string | "https:/ |
The index file. |
csv |
string | "https:/ |
market and sectors as CSV rows, with the line's name in line. |
note |
string | "One row per market close, |
How to read the file. |
cite_ |
string or null | "TickerInside, |
A citation line: the closes and this file's address. |
cite_ |
string | "<a href=\"https:/ |
The credit as HTML: a link to this file, then its address. |
docs |
string | "https:/ |
Where the file is documented. |
license |
string | "TickerInside history terms" |
The history terms, not CC BY 4.0. |
terms |
string | "https:/ |
The terms in full, on the legal notice. |
attribution |
string | "Credit TickerInside with a link to this … |
How to credit it, then what the history terms allow. |
A row is written the first night its close is published and never rewritten. The rows before the first night are rebuilt from the flows of that night: their changes only. Not under CC BY 4.0: the history terms apply.
Holdings history, every fund
/api/v1/history.json Every fund with a holdings history: its first and last file dates, how many, its cadence (history terms, not CC BY 4.0)
Every issuer-layer fund that has a history here, with the dates of its oldest and newest files in the archive, how many file dates it holds, how often the issuer publishes, and the address of its history file.
{
"as_of": "2026-10-16",
"since": "2026-09-01",
"count": 633,
"funds": [{"t": "AAXJ", "first": "2026-09-02", "last": "2026-10-15", "file_dates": 31, "cadence": "daily", "traded_pp_from": "2026-09-29", "ended": null, "url": "https://tickerinside.com/api/v1/history/aaxj.json" }, "… 632 more"],
"…": "3 more fields",
"license": "TickerInside history terms",
"terms": "https://tickerinside.com/legal/#history" ,
"…": "1 more field"
}
| Field | Type | Example | What it is |
|---|---|---|---|
as_ |
string | "2026-10-16" |
The newest file date any fund's history reaches. Here as_of is a holdings file date, not the price date. |
since |
string | "2026-09-01" |
The oldest file date any fund's history starts from. It is not the day the archive began, which is since in status.json, under data.archive. |
count |
integer | 633 |
How many funds have a history file, the length of funds. |
funds |
array of object | [{"t":"AAXJ", |
One entry per fund with a history, ended or not; its fields are described below. |
holdings_ |
string or null | null |
The address of a fund's holdings at a date, with {ticker} and {date} to fill, once it is served; null until then. Today any valid date answers 404 not_covered, with reason holdings_at_date_not_enabled and the address of the fund's changes file. |
note |
string | "One file per fund read from its issuer's… |
How to read the files. |
docs |
string | "https:/ |
Where the files are documented. |
license |
string | "TickerInside history terms" |
The terms the history is published under: TickerInside's history terms, not CC BY 4.0. |
terms |
string | "https:/ |
The terms in full, on the legal notice. |
attribution |
string | "Credit TickerInside with a link to this … |
How to credit it, a link to the file where the medium allows one and the name where it does not, then what the history terms allow. |
A fund entry
| Field | Type | Example | What it is |
|---|---|---|---|
t |
string | "AAXJ" |
The fund's ticker. |
first |
string | "2026-09-02" |
The date of the oldest file of the fund in the archive. |
last |
string | "2026-10-15" |
The date of the newest. |
file_ |
integer | 31 |
How many file dates the archive holds for the fund. |
cadence |
string or null | "daily" |
daily when the median gap between two files is at most four days, monthly when it is 25 to 35 days, irregular otherwise; null with a single file. |
traded_ |
string or null | "2026-09-29" |
The date of the first step whose two files both carry share counts, from which traded_pp is measured; null when there is none yet. |
ended |
string or null | null |
Last issuer file's date once no longer read, else null. |
url |
string | "https:/ |
The fund's history file. |
Not under CC BY 4.0: the history terms apply (license, terms). Fetching this list or many funds' history files on a schedule to store them is not allowed.
One fund's holdings history
/api/v1/history/{ticker}.json What changed in one fund from one issuer file to the next, weights only (history terms, not CC BY 4.0)
Each file date the archive holds for the fund, with its position count and top 10 weight. Then each step from a file to the next: the lines that entered and exited with their weights, the lines whose weight moved by 0.05 points or more, and three measures of the step. Then how its overlap with its ten closest funds moved. Every step names the file it is compared with, so a gap in the archive or a monthly file shows. A step across a change of the keys is restated, not read as trades: it has no entered, exited or moved, so read them with a default.
{
"ticker": "SPY",
"…": "3 more fields",
"first": "2026-09-02",
"last": "2026-10-15",
"…": "1 more field",
"cadence": "daily",
"snapshots": {"columns": ["holdings_as_of", "positions", "top10_weight", "key_scheme", "unplaced"], "rows": [["2026-09-02", 504, 37.95, 1, []], ["2026-09-03", 504, 38.13, 1, []], "… 29 more"]},
"…": "5 more fields",
"changes": ["… 10 earlier steps", {"date": "2026-09-18", "previous": "2026-09-17", "entered": [["BE", 0.1187], ["ILMN", 0.0549], ["P", 0.0525]], "exited": [["TAP", 0.0095], ["BLDR", 0.0094], ["TTD", 0.0093]], "moved": [["NVDA", 8.0659, 8.1587], ["AVGO", 2.4967, 2.576], ["AAPL", 7.515, 7.4406], "… 3 more"], "moved_below_threshold": 471, "names_turnover_pp": 0.1272, "weights_moved_pp": 0.9545, "traded_pp": null}, "… 19 later steps"],
"overlap_history": {"with_top_funds_by_overlap": 10, "series": {"IVVW": [["2026-09-24", 99.7], ["2026-09-25", 99.7], "… 14 more"]}},
"…": "3 more fields",
"cite_as": "TickerInside, SPDR S&P 500 ETF Trust (SPY), holdings history from the issuer's files of 2026-09-02 to 2026-10-15, https://tickerinside.com/api/v1/history/spy.json" ,
"…": "5 more fields"
}
| Field | Type | Example | What it is |
|---|---|---|---|
ticker |
string | "SPY" |
The fund's ticker. |
name |
string | "SPDR S&P 500 ETF Trust" |
The fund's name. |
source_ |
string | "issuer" |
Always issuer: the history is read from the issuers' own files. The other funds known from SEC filings have none. |
key_ |
integer | 2 |
The keys the holdings are given in: 2, the scheme of today's files, where a line listed abroad carries its market (7203.JP). Older files are read in these keys. |
first |
string | "2026-09-02" |
The date of the oldest file of the fund in the archive. |
last |
string | "2026-10-15" |
The date of the newest. |
file_ |
integer | 31 |
How many file dates the archive holds for the fund. |
cadence |
string or null | "daily" |
daily, monthly or irregular, from the gaps between the file dates; null with a single file. |
snapshots |
object | {"columns":["holdings_ |
One row per file date, oldest first, with the columns named in columns. |
moved_ |
number | 0.05 |
How far a weight has to move, in percentage points, for its line to be listed under moved: 0.05. |
traded_ |
integer | 20 |
How many steps with share counts on both sides a fund needs before traded_pp is published: 20. |
traded_ |
integer | 14 |
How many of the fund's steps have share counts on both sides. |
traded_ |
string or null | "2026-09-28" |
The date of the first of those steps; null when there is none. |
traded_ |
string or null | "fewer_ |
Why traded_pp is null in every step: fewer_than_20_pairs_with_share_counts. Null once it is published. |
changes |
array | [{"date":"2026-09-03", |
One entry per step from a file to the next, oldest first; its fields are described below. |
overlap_ |
object | {"with_ |
How the fund's overlap by weight with its ten closest funds moved; its fields are described below. |
holdings_ |
string or null | null |
The address of the fund's holdings at any date, with {date} to fill, once it is served; null until then. |
fund |
string | "https:/ |
The fund's current file, with its holdings today, cost, returns and risk. |
ended |
object or null | null |
Null while read; once not, last_file, source_layer and note. |
cite_ |
string | "TickerInside, |
A citation line: the fund, the dates of its oldest and newest files, and this file's address. |
cite_ |
string | "<a href=\"https:/ |
The credit as HTML: a link to this file, then its address. |
docs |
string | "https:/ |
Where the file is documented. |
license |
string | "TickerInside history terms" |
The terms the history is published under: TickerInside's history terms, not CC BY 4.0. |
terms |
string | "https:/ |
The terms in full, on the legal notice. |
attribution |
string | "Credit TickerInside with a link to the p… |
How to credit it, a link to the file where the medium allows one and the name where it does not, then what the history terms allow. |
The snapshots object
| Field | Type | Example | What it is |
|---|---|---|---|
columns |
array of string | ["holdings_ |
The names of the columns of each row. holdings_as_of: the file date. positions: the lines in the file. top10_weight: the weight of its ten largest lines, in percent; null for the files of a fund of funds before its file kept the funds it holds apart from its own lines. key_scheme: the keys the file was written in, 1 or 2. Scheme 1 is for files read before the switch to keys with a market, late in September 2026. The switch date varies by fund (SPY's first scheme 2 file is dated 2026-09-25), and the first scheme 2 step is restated. unplaced: for a file of scheme 1, the old keys that cannot be read as one line today because they stood for two companies in that file (SAN for Santander and Sanofi); null for a file of scheme 2. |
rows |
array of array | [["2026-09-02", |
The rows, oldest first. |
A step, in changes
| Field | Type | Example | What it is |
|---|---|---|---|
date |
string | "2026-09-03" |
The date of the file the step leads to. |
previous |
string | "2026-09-02" |
The date of the file it is compared with: the fund's file before it in the archive, days or a month earlier. |
entered |
array of [key, weight] | [] |
The lines in this file that were not in the previous one, as [key, weight percent], heaviest first. Absent from a restated step, which does not say what entered or exited that day; the snapshots give only its count of positions. Read it with a default, such as step.get("entered", []). A key of digits and a letter is a code the issuer's file gives in place of a ticker. When a ticker exits and such a code enters at about the same weight, and the reverse follows, it is the same security re-keyed, not a trade. |
exited |
array of [key, weight] | [] |
The lines in the previous file that are not in this one, as [key, weight percent in the previous file], heaviest first. Absent from a restated step. |
moved |
array of [key, before, after] | [["AVGO", |
The lines in both files whose weight moved by moved_threshold_pp or more, as [key, weight before, weight after], largest move first. Absent from a restated step. |
moved_ |
integer | 475 |
How many other lines in both files moved by less. Absent from a restated step. |
names_ |
number or null | 0.0 |
Half the weight that entered plus the weight that exited, in percentage points: what the change of names carried. Null on a restated step. |
weights_ |
number or null | 0.6092 |
Half the sum of the absolute changes of weight over every line of either file, in percentage points. It includes price drift, which moves every weight a little each day, so it is not turnover. Null on a restated step. |
traded_ |
number or null | null |
What the share counts say was traded, in percentage points of assets, when both files carry them and the fund has traded_min_pairs such steps; null otherwise. A line held in both counts its weight times the change of its quantity beyond the fund's own growth, a line that entered or exited its weight, and the sum is halved. |
reverted |
array of string | ["OKE"] |
The entered lines the fund held two files earlier, most often a line the issuer's file left out for a day. That exit and this entry are a glitch in the file, not trades, and so is a key of digits and a letter that stood in for the line in the file between. Present when there is one. |
restated |
boolean | true |
true on a step that is a change of the keys or of the reading of the files, not a trade; absent otherwise. A restated step has no entered, exited, moved or moved_below_threshold, so read them with a default. It is set on the step to a file of the current key scheme, where the parser also reads lines the old one dropped. It is set on the first file of a fund of funds that lists the funds it holds apart from their look-through, and on two files whose weights add up to totals 50 points or more apart. It is also set on the first file that keys apart the preferred shares a file writes under their issuer's common ticker (JPM.PFD rather than JPM), and on a date listed after a fix of the reading. |
reason |
string | "key_ |
Why the step is restated. key_scheme_2: the first file in keys with a market. own_lines_separated: a fund of funds whose earlier files listed the funds it holds beside their look-through, about 200% in all. weight_total_changed: the two totals are 50 points or more apart. weights_from_market_values: weights from market values, or the reverse. preferred_keyed_apart: the preferred shares the file writes under their issuer's common ticker are keyed as that ticker and .PFD, at the weight the common ticker carried. Otherwise, the reason given with a listed date. |
rekeyed |
array of [old key, array of key] | [] |
On a restated step, the old keys that read as other keys today, as [old key, [new keys]]. It covers a spelling brought together (A005930 is 005930.KR), a Toronto code under its New York ticker, and a key that stood for several lines, with the lines the new file holds. It also covers a common ticker whose preferred shares took a key of their own (JPM as [JPM.PFD], or [WFC, WFC.PFD] where the fund holds both). |
market_ |
integer | 0 |
On a restated step, how many old keys only took their market (7203 became 7203.JP). Each is in the aliases of the holders shard of its first character. |
coverage_ |
number | 0.0002 |
On a restated step, the weight the new file covers beyond the previous one, in percentage points: lines the old reading dropped, or, below zero, weight the old reading counted twice. |
splits_ |
array of string | null |
The lines whose quantity moved by a split ratio while their weight did not, left out of traded_pp. Present when there is one. |
The overlap_history object
| Field | Type | Example | What it is |
|---|---|---|---|
with_ |
integer | 10 |
How many funds are followed: the funds whose overlap by weight with this one is highest on the latest files, up to ten. |
series |
object of array of [date, overlap] | {"IVVW":[["2026-09-24", |
For each followed fund, most overlapping first, [date, overlap by weight in percent] on every file date of either fund from the first date both have a file. Each fund is taken at its latest file on or before the date. It is the overlap by weight the comparisons print, computed here from the archived files. A file of the old key scheme is read in today's keys, so a point can differ from what a comparison printed on the day. A series can step where either fund's history is restated. |
Weights only: no share count, market value or fund size is served. weights_moved_pp is not turnover, since prices move every weight; traded_pp, from share counts, is. Not under CC BY 4.0: the history terms apply (license, terms). Fetch it per request, one fund at a time; fetching many funds' history on a schedule to store it is not allowed.
ETF flows, the day's summary
/api/v1/flows.json What the ETFs read daily bought and sold on the latest close (history terms)
What the US ETFs read daily from their issuers' files bought and sold, security by security, from the change in shares held between each fund's previous file and its file of date, each file placed at the market close it reflects: the largest net additions and reductions by value, in percent and beyond the funds' own growth, the securities that entered or exited funds tracking the same index, the corporate actions, and each of the last 20 closes. Its CSV twin, /api/v1/flows.csv, lists every security moved on date.
{
"date": "2026-10-12",
"newest_file": "2026-10-16",
"…": "2 more fields",
"coverage": {"funds_read_daily": 624, "funds_counted": 609, "issuers": ["Global X", "Invesco", "SPDR", "iShares"], "net_assets_usd": 6248330747647, "share_of_stock_etf_assets_pct": 71.6, "not_counted": {"fund_of_funds": 10, "no_file_for_date": 5, "no_longer_read": 7, "not_daily": 2}},
"added_by_value": [{"ticker": "NVDA", "name": "Nvidia", "funds_adding": 31, "funds_trimming": 13, "funds_entered": 0, "funds_exited": 0, "net_shares": 1306360, "net_shares_pct": 0.0911, "net_shares_beyond_growth": -113612, "net_value_usd": 293512213, "net_value_beyond_growth_usd": -25718871, "withheld": null}, {"ticker": "AAPL", "name": "Apple Inc.", "funds_adding": 29, "funds_trimming": 13, "funds_entered": 0, "funds_exited": 0, "net_shares": 752399, "net_shares_pct": 0.0882, "net_shares_beyond_growth": -82252, "net_value_usd": 254598223, "net_value_beyond_growth_usd": -28050983, "withheld": null}, "… 8 more"],
"reduced_by_value": [{"ticker": "EBS.AT", "name": "Erste Group Bank AG", "funds_adding": 1, "funds_trimming": 3, "funds_entered": 0, "funds_exited": 1, "net_shares": -94268, "net_shares_pct": -1.2742, "net_shares_beyond_growth": null, "net_value_usd": -11492074, "net_value_beyond_growth_usd": null, "withheld": {"net_shares_beyond_growth": "one_fund_dominant", "net_value_beyond_growth_usd": "one_fund_dominant"}}, {"ticker": "DB1.DE", "name": "Deutsche Boerse AG", "funds_adding": 3, "funds_trimming": 2, "funds_entered": 0, "funds_exited": 0, "net_shares": -21329, "net_shares_pct": -0.4402, "net_shares_beyond_growth": null, "net_value_usd": -7110849, "net_value_beyond_growth_usd": null, "withheld": {"net_shares_beyond_growth": "one_fund_dominant", "net_value_beyond_growth_usd": "one_fund_dominant"}}, "… 8 more"],
"…": "4 more fields",
"index_events": [{"date": "2026-10-09", "ticker": "MRNA", "change": "entered", "funds": ["QQQ", "QQQM"], "same_index_as": "QQQ", "group_funds": 8, "text": "entered 2 of the 8 funds tracking the same index as QQQ on 2026-10-09"}, {"date": "2026-10-08", "ticker": "MRNA", "change": "entered", "funds": ["QYLD", "IQQ", "QNDX", "QYLG", "QRMI", "QTR"], "same_index_as": "QQQ", "group_funds": 8, "text": "entered 6 of the 8 funds tracking the same index as QQQ on 2026-10-08"}, "… 31 more"],
"…": "12 more fields",
"cite_as": "TickerInside, ETF flows of the close of 2026-10-12 from the issuers' files, https://tickerinside.com/api/v1/flows.json" ,
"…": "5 more fields"
}
| Field | Type | Example | What it is |
|---|---|---|---|
date |
string or null | "2026-10-12" |
The market close of the figures: the newest close that nine in ten of the funds counted have a file of. Each file is placed at the close it reflects (Invesco dates a Friday's file on the Saturday), and each fund's change runs from its previous file to its file of this close. |
newest_ |
string or null | "2026-10-16" |
The newest close a file read reflects. A close is published once every fund still publishing has a file of it or of a later close, so date can be older. |
first_ |
string or null | "2026-09-28" |
The first close with a counted change: the first files carrying share counts in today's keys. |
method |
string | "ti-flows/ |
The method of the figures, ti-flows/1. |
coverage |
object | {"funds_ |
Which funds are counted; its fields are described below. |
added_ |
array of object | [{"ticker":"NVDA", |
The ten securities with the largest net additions in dollars on date, the securities in not_ranked left out; a row is described below. |
reduced_ |
array of object | [{"ticker":"EBS.AT", |
The ten with the largest net reductions in dollars. |
added_ |
array of object | [{"ticker":"CRGY", |
The ten largest net additions in percent of the shares the funds held before. |
reduced_ |
array of object | [{"ticker":"TIT.IT", |
The ten largest net reductions in percent. |
added_ |
array of object | [{"ticker":"EL", |
The ten largest net additions beyond the funds' own growth, in dollars: rebalancing and index changes rather than the creations of the funds' shares. |
reduced_ |
array of object | [{"ticker":"AAPL", |
The ten largest net reductions beyond the funds' own growth. |
index_ |
array of object | [{"date":"2026-10-09", |
Securities that entered or exited two or more funds tracking the same index on the same close, in the last 20 trading days, newest first; described below. |
corporate_ |
array of object | [{"date":"2026-10-12", |
Mergers, spin-offs, takeovers, splits and uniform changes the files show in the last 20 trading days, newest first: no trades, so the lines a merger, a spin-off or a split moved are left out of the sums. Described below. |
not_ |
array of object | [{"ticker":"001309.CN", |
The securities moved on date that the six lists leave out, each with its reason: converted (both securities of a merger paid in shares), acquired_or_delisted, distribution, split or uniform_change (within three closes of a corporate action, or on a close where a line of theirs is left out for one), or fund_shares (the shares of a fund the site covers, held by another fund). |
funds_ |
array of object | [{"fund":"BIDD", |
The ten funds whose step to date entered or exited the most lines; described below. |
days |
array of object | [{"date":"2026-10-12", |
Each close of the last 20, newest first: how many funds have a step to it, whether nine in ten do (complete), how many securities moved, and its five largest net additions and reductions as [ticker, dollars, shares], the securities not ranked left out. |
not_ |
array of object | [{"fund":"CORO", |
The funds read daily that are not counted on date, each with its reason and its last file: fund_of_funds, whole_fund_counts (a file that counts every share class of a fund with mutual fund classes), no_share_counts, no_file_for_date, restated (a change of keys), no_previous_file or unreadable_file. |
file_ |
integer | 27 |
How many lines the window leaves out because an issuer's file dropped them for a day and they came back with the same count. |
security |
string | "https:/ |
The address of one security's flows, with {ticker} to fill. |
csv |
string | "https:/ |
Every security moved on date, one row each, largest net value first. |
feed |
string | "https:/ |
This summary as an RSS feed, one item per complete close. |
feed_ |
string | "https:/ |
One fund's holdings changes as an RSS feed, from its history, with {ticker} to fill. |
feed_ |
string | "https:/ |
One security's flows as an RSS feed, with {ticker} to fill. |
note |
string | "Changes in shares held by the covered ET… |
How to read the figures. |
cite_ |
string | "TickerInside, |
A citation line: the close and this file's address. |
cite_ |
string | "<a href=\"https:/ |
The credit as HTML: a link to this file, then its address. |
docs |
string | "https:/ |
Where the file is documented. |
license |
string | "TickerInside history terms" |
The terms the flows are published under: TickerInside's history terms, not CC BY 4.0, as they are computed from the archive. |
terms |
string | "https:/ |
The terms in full, on the legal notice. |
attribution |
string | "Credit TickerInside with a link to the p… |
How to credit it, then what the history terms allow. |
The coverage object
| Field | Type | Example | What it is |
|---|---|---|---|
funds_ |
integer | 624 |
The funds read from their issuers' files every business day. |
funds_ |
integer | 609 |
How many of them have a step to date that is counted. |
issuers |
array of string | ["Global X", |
The issuers of the funds counted. |
net_ |
integer or null | 6248330747647 |
The counted funds' net assets, as their issuers' files state them. |
share_ |
number or null | 71.6 |
The counted funds' share of the assets of the covered US stock ETFs, measured as the universe's share of assets is; null when not measured. |
not_ |
object | {"fund_ |
How many funds of the archive are not counted, by reason, not_daily for a fund whose issuer publishes monthly. |
A row of the six lists
| Field | Type | Example | What it is |
|---|---|---|---|
ticker |
string | "NVDA" |
The security's key: a US ticker, or a local code and market for a line listed abroad (7203.JP). |
name |
string or null | "Nvidia" |
Its name, where known. |
funds_ |
integer | 31 |
How many funds hold more shares of it than in their previous file. |
funds_ |
integer | 13 |
How many hold fewer. |
funds_ |
integer | 0 |
How many of those adding did not hold it before. |
funds_ |
integer | 0 |
How many of those trimming hold none now. |
net_ |
integer or null | 1306360 |
The change in shares held, summed over the funds. Null when fewer than three funds moved it or one fund makes more than 80% of it, as withheld says: a fund's share count is never published. |
net_ |
number or null | 0.0911 |
net_shares in percent of the shares the funds held before; null when fewer than three funds held it before or after, or one fund held more than 80% of it. |
net_ |
integer or null | -113612 |
The same change less the part in proportion to each fund's own growth across its step (b minus k times a, k the fund's median ratio of share counts). |
net_ |
integer or null | 293512213 |
net_shares valued at each file's own price per share: market value over shares, or weight times the fund's stated net assets over shares. Never an outside price. |
net_ |
integer or null | -25718871 |
net_shares_beyond_growth valued the same way. |
withheld |
object or null | null |
Why each null sum is null, as {field: reason}, or null: fewer_than_3_funds, one_fund_dominant (one fund makes more than 80% of the sum, or of the difference two published sums give, such as net_shares less net_shares_beyond_growth), gives_back_a_fund_count (the sums as printed, taken as one or two funds' own or compared with the figures published before for the same close, would give back a fund's share count) or not_all_valued. |
An index event
| Field | Type | Example | What it is |
|---|---|---|---|
date |
string | "2026-10-09" |
The close. |
ticker |
string | "MRNA" |
The security. |
change |
string | "entered" |
entered or exited. |
funds |
array of string | ["QQQ", |
The funds of the group it entered or exited on that close. |
same_ |
string | "QQQ" |
The group's largest fund. Two funds track the same index when they overlap by 98% or more by weight on their latest files. |
group_ |
integer | 8 |
How many funds the group has. |
text |
string | "entered 2 of the 8 funds tracking the sa… |
The event in words, to quote. |
A corporate action
| Field | Type | Example | What it is |
|---|---|---|---|
date |
string | "2026-10-12" |
The first close the funds show it on; funds that book it later show it a close or two after. |
kind |
string | "distribution" |
converted (a merger paid in shares: from exited while to rose, or entered, by the same ratio in funds of three or more indexes), distribution (a spin-off: to entered at the same ratio of from in funds of three or more indexes), acquired_or_delisted (from left the funds of two or more issuers with nothing replacing it, and half its holders left it or its price per share stood still), split (three quarters or more of the funds holding from changed their counts by one ratio within three closes, while its price per share in the files moved by the inverse ratio: a split, a reverse split, a bonus issue or a stock dividend) or uniform_change (the same ratio with no price move to match: named and not ranked, its lines kept in the sums). |
from |
string | "PNN.GB" |
The security converted, the parent of a distribution, the security taken over or delisted, or the security split or changed. |
to |
string or null | "PNNN.GB" |
The security received: from itself for a split; null for acquired_or_delisted and uniform_change. |
ratio |
number or null | 0.4667 |
Shares of to per share of from, as the funds' counts show it (1.2 for a 6-for-5 bonus issue, 0.5 for a 1-for-2 reverse split); null for acquired_or_delisted. |
text |
string | "PNNN.GB distributed to holders of PNN.GB… |
The action in words, to quote. |
A security not ranked
| Field | Type | Example | What it is |
|---|---|---|---|
ticker |
string | "001309.CN" |
The security. |
reason |
string | "split" |
converted, acquired_or_delisted, distribution, split, uniform_change or fund_shares. |
A fund of funds_most_changed
| Field | Type | Example | What it is |
|---|---|---|---|
fund |
string | "BIDD" |
The fund's ticker. |
name |
string or null | "iShares International Dividend Active ET… |
Its name. |
previous |
string | "2026-10-09" |
The date its issuer gives the file its step is compared with. |
date |
string | "2026-10-12" |
The date its issuer gives its file, which can be a day after the close it reflects. |
entered |
integer | 17 |
Lines that entered. |
exited |
integer | 8 |
Lines that exited. |
increased |
integer | 4 |
Lines whose share count rose. |
decreased |
integer | 25 |
Lines whose share count fell. |
growth_ |
number | -1.2181 |
The fund's own growth across the step, in percent: the median change of its share counts, mostly creations and redemptions of its shares. |
not_ |
integer | 0 |
Lines left out of every sum, as no trade (see not_trusted in one security's flows). |
A day of days
| Field | Type | Example | What it is |
|---|---|---|---|
date |
string | "2026-10-12" |
The close. |
funds |
integer | 609 |
How many funds have a counted step to it. |
complete |
boolean | true |
true when nine in ten of the funds counted on date do. |
securities_ |
integer | 7019 |
How many securities a fund moved on it. |
added_ |
array of array of string | [["NVDA", |
Its five largest net additions, as [ticker, dollars, shares]. |
reduced_ |
array of array of string | [["EBS.AT", |
Its five largest net reductions. |
A change in shares held mixes the creations and redemptions of a fund's own shares with its rebalancing: read beyond_growth for the second. Only the funds read daily from their issuers are counted, never the funds known from SEC filings, and only common shares: futures, options and short positions are left out. A split, a bonus issue or a stock dividend, a count in other units, a line a file dropped for a day, a change of ticker and the lines a merger or a spin-off moved are left out as no trade. A sum is published only when three or more funds make it and no one fund more than 80% of it; withheld says why one is null. Feeds: /feeds/flows.xml, /feeds/fund/{ticker}.xml, /feeds/stock/{ticker}.xml (RSS 2.0). Not under CC BY 4.0: the history terms apply. A feed reader may poll the feeds; fetching the shards or many securities' answers on a schedule to keep them is systematic extraction.
ETF flows, one security
/api/v1/flows/{ticker}.json What the ETFs read daily bought and sold of one stock, over the last 20 closes (history terms)
One security's flows: on date, how many funds added and trimmed it, the net change in shares, in dollars at the files' own prices and beyond the funds' own growth, the funds with the largest changes, with their weights only, and the lines left out as no trade; then one row per close of the last 20, its index entries and exits and its corporate actions. Composed when asked from the shard of the key's first character, /api/v1/flows/shards/{c}.json.
| Field | Type | Example | What it is |
|---|---|---|---|
ticker |
string | "NVDA" |
The security's key, as the holdings key it. |
name |
string or null | "Nvidia" |
Its name, where known. |
date |
string or null | "2026-10-12" |
The close of latest, as in /api/v1/flows.json. |
newest_ |
string or null | "2026-10-16" |
The newest close a file read reflects. |
funds_ |
integer | 156 |
How many of the funds counted hold it in their newest file. |
funds_ |
integer | 609 |
How many funds are counted on date. |
latest |
object or null | {"date":"2026-10-12", |
Its flows on date; null when no fund moved it then. Described below. |
series |
object | {"columns":["date", |
One row per close of the last 20 it moved on, oldest first, with the columns named in columns: date, funds_adding, funds_trimming, funds_entered, funds_exited, net_shares, net_shares_beyond_growth, net_value_usd, and withheld, why the first null of the three sums is null (as in latest). No close newer than date is published. |
index_ |
array of object | [] |
Its entries and exits in funds tracking the same index, in the last 20 trading days, as in /api/v1/flows.json. |
corporate_ |
array of object | [] |
The mergers, spin-offs, takeovers, splits and uniform changes it is part of in the last 20 trading days, as in /api/v1/flows.json; the lines a merger, a spin-off or a split moved are left out of its sums. |
method |
string | "ti-flows/ |
The method of the figures, ti-flows/1. |
note |
string | "Changes in shares held by the covered ET… |
How to read the figures. |
summary |
string | "https:/ |
The night's summary. |
feed |
string | "https:/ |
This security's flows as an RSS feed. |
cite_ |
string | "TickerInside, |
A citation line: the security, the closes of the window and this answer's address. |
cite_ |
string | "<a href=\"https:/ |
The credit as HTML: a link to this answer, then its address. |
docs |
string | "https:/ |
Where the answer is documented. |
license |
string | "TickerInside history terms" |
The history terms, not CC BY 4.0. |
terms |
string | "https:/ |
The terms in full, on the legal notice. |
attribution |
string | "Credit TickerInside with a link to the p… |
How to credit it, then what the history terms allow. |
The latest object
| Field | Type | Example | What it is |
|---|---|---|---|
date |
string | "2026-10-12" |
The close. |
funds_ |
integer | 31 |
How many funds hold more shares of it than in their previous file. |
funds_ |
integer | 13 |
How many hold fewer. |
funds_ |
integer | 0 |
How many of those adding did not hold it before. |
funds_ |
integer | 0 |
How many of those trimming hold none now. |
single_ |
boolean | false |
true when one fund alone moved it: every sum is then null. |
net_ |
integer or null | 1306360 |
The change in shares held, summed over the funds. Null when fewer than three funds moved it or one fund makes more than 80% of it, as withheld says: a fund's share count is never published. |
net_ |
integer or null | -113612 |
The same change less the part in proportion to each fund's own growth across its step (b minus k times a, k the fund's median ratio of share counts). |
net_ |
number or null | 0.0911 |
net_shares in percent of the shares the funds held before; null when fewer than three funds held it before or after, or one fund held more than 80% of it. |
net_ |
integer or null | 293512213 |
net_shares valued at each file's own price per share: market value over shares, or weight times the fund's stated net assets over shares. Never an outside price. |
net_ |
integer or null | -25718871 |
net_shares_beyond_growth valued the same way. |
valued_ |
number or null | 100.0 |
The share of the change in shares that a file valued. |
withheld |
object or null | null |
Why each null sum is null, as {field: reason}, or null: fewer_than_3_funds, one_fund_dominant (one fund makes more than 80% of the sum, or of the difference two published sums give, such as net_shares less net_shares_beyond_growth), gives_back_a_fund_count (the sums as printed, taken as one or two funds' own or compared with the figures published before for the same close, would give back a fund's share count) or not_all_valued. |
funds |
object | {"columns":["fund", |
The funds with the largest changes, largest by value first, at most eight, with the columns named in columns: fund, change (entered, exited, increased or decreased), weight_before and weight_after (percent of the fund, as its holdings files print them), previous and date (its two files, as its issuer dates them). No fund's share count is published, nor any figure of its own a count could be worked out from. |
not_ |
array of array of string | [] |
The funds whose line is left out of every sum, as [fund, reason]: price_per_share_jump (a split or a count in other units, by the file's own values), count_weight_mismatch (a count that moved against the weight), split_seen_in_other_files, price_unlike_other_funds (a price per share half again or more away from the other funds' line of the same key: another instrument under it), file_gap, rekeyed (a change of ticker), converted (a merger paid in shares), distribution (a spin-off) or split (a split, a bonus issue or a stock dividend found across the funds). |
A key no fund read daily held or moved in the last 20 trading days answers 404, reason not_held_by_daily_funds. Not under CC BY 4.0: the history terms apply.
The manifest of a build
/api/v1/manifest.json The state of one build: versions, sources and a sha256 of every file
Written last by every build: when it ran, the version of the API's shape and of the calculations, each source with its version, date and age in days, and one sha256 for each family of files. The sha256 of every file under /api/v1/ is in /api/v1/sha256sums.txt.gz, in the format of sha256sum. Give built_at and calculation.version beside a figure to cite the exact state it comes from.
| Field | Type | Example | What it is |
|---|---|---|---|
manifest_ |
integer | 1 |
The version of this file's own shape: 1. A field added keeps it. |
built_ |
string | "2026-10-17T01:56:48Z" |
When the build that wrote every file listed here ran, in UTC. Give it beside a figure to cite the exact state it comes from. |
build_ |
string | "2026-10-17" |
The day of built_at. |
schema |
object | {"api":"v1", |
The version of the API's shape; its fields are described below. |
calculation |
object | {"version":"660f38eea457de64", |
The version of the calculations; its fields are described below. |
sources |
array of object | [{"id":"prices", |
Each source of the data with its version, date and age in days on the day of the build; their fields are described below. |
files |
object | {"count":13633, |
The list of every file with its sha256; its fields are described below. |
families |
object | {"changelog.json":{"files":1, |
One entry per family of files, keyed by a directory followed by a slash (fund/) or by the name of a file at the top (index.json): files, the number of files, bytes, their size, and sha256, the digest of the family's lines of the list, in their order, each ending with a newline. |
methods_ |
string | "https:/ |
The methods of the computed figures, /api/v1/methods.json. |
contract |
string | "https:/ |
The data contract this file belongs to: /contract/. |
docs |
string | "https:/ |
Where this file is documented. |
license |
string | "CC BY 4.0" |
The licence the file is published under. |
attribution |
string | "Credit TickerInside with a link to this … |
How to credit the data: a link to this file where the medium allows one, the name where it does not. |
The schema object
| Field | Type | Example | What it is |
|---|---|---|---|
api |
string | "v1" |
The version in the path: v1. Inside it, fields are added, never removed or retyped. |
digest |
string | "5a654299b364d145e57d393e1722a0260067288c… |
The sha256 of the tables the API reference and the OpenAPI description are written from: the names of the fields and codes and the types they fix, without their words. It is read from the code, never from a night's files, so the night's data never moves it; a field, a code or a type added to those tables does. |
openapi |
string | "https:/ |
The OpenAPI description. |
The calculation object
| Field | Type | Example | What it is |
|---|---|---|---|
version |
string | "660f38eea457de64" |
The first 16 hexadecimal characters of the sha256 of the method ids and the versions under readers: it moves when any of them does, and on no other night. |
methods |
array of object | [{"id":"ti-ownership/ |
Each method of methods.json, as id and since, the first day figures were published under it. |
readers |
object | {"key_ |
The version of each reader and computation named here, by name: it rises when what it makes of the same input changes, and for issuer_file_read, price_read, returns_and_risk and computed_answers with any change to their code. key_scheme is how securities are keyed (2: a line abroad carries its market). Code not named here moves no version: a figure it corrects is recorded in corrections.json. |
A source, in sources
| Field | Type | Example | What it is |
|---|---|---|---|
id |
string | "issuer" |
The source: prices, a layer of fund files by its source_layer (issuer, sec_nport and the others), or directory, Nasdaq Trader's symbol directory. |
name |
string | "Issuers' own holdings files" |
The source in words. |
version |
string or null | null |
The source's own version where it has one: the SEC's quarterly data set read (2026q2) for sec_nport, the file's date for the directory; null otherwise. |
date |
string or null | "2026-10-16" |
The date of the data: the last close for prices, the newest holdings date of the layer's fund files, the directory's file date. |
age_ |
integer or null | 1 |
Days from date to the day of the build. |
oldest |
string or null | "2026-10-01" |
The oldest holdings date of the layer's fund files; null for prices and the directory. |
oldest_ |
integer or null | 16 |
Days from oldest to the day of the build. |
median_ |
integer or null | 2 |
The median, over the layer's fund files, of the days from their holdings date to the day of the build. |
funds |
integer or null | 626 |
How many fund files of the layer; null for prices and the directory. |
The files object
| Field | Type | Example | What it is |
|---|---|---|---|
count |
integer | 13633 |
How many files are listed: every file under /api/v1/ but this one and the list. |
bytes |
integer | 502688159 |
Their size, added up. |
list |
string | "https:/ |
The list, gzipped: /api/v1/sha256sums.txt.gz. |
list_ |
string | "9c33ed58dcbcdc5775cec05ab97cfd877fa407e9… |
The sha256 of the list once unzipped. |
format |
string | "sha256sum: one line per file, |
How the list is written, and the command that checks a copy against it. |
The list holds every file under /api/v1/ but the manifest and the list. A family's sha256 is the digest of its lines of the list, so it is the same on two nights whose files of that family did not change.
Every dated change
/api/v1/changelog.json Every dated change of the site and its data, as What changed prints it
Every entry of /changes/, newest first, each with an id that does not change.
| Field | Type | Example | What it is |
|---|---|---|---|
count |
integer | 41 |
How many entries. |
newest |
string | "2026-10-16" |
The date of the newest entry. |
entries |
array of object | [{"id":"2026-10-16-private-companies-the-… |
Every dated change, newest first; their fields are described below. |
contract |
string | "https:/ |
The data contract this file belongs to: /contract/. |
docs |
string | "https:/ |
Where this file is documented. |
license |
string | "CC BY 4.0" |
The licence the file is published under. |
attribution |
string | "Credit TickerInside with a link to this … |
How to credit the data: a link to this file where the medium allows one, the name where it does not. |
An entry
| Field | Type | Example | What it is |
|---|---|---|---|
id |
string | "2026-10-16-private-companies-the-holding… |
The entry's id: its date and title in lower case words joined by hyphens. It does not change. |
date |
string | "2026-10-16" |
The day the change reached the site. |
title |
string | "Private companies: the holdings the fund… |
What changed, in one line. |
body |
string | "The private companies in US funds, |
What changed and what a program reading the files should do, in words. |
url |
string | "https:/ |
The page that prints the entries: /changes/. |
What is kept for compatibility
/api/v1/deprecations.json What still answers but has a replacement: fields, keys, addresses and MCP tool names
Each field, key, answer, address and MCP tool name kept answering for compatibility, with what replaces it. The fund addresses and the tool names are read from the code that answers them.
| Field | Type | Example | What it is |
|---|---|---|---|
count |
integer | 21 |
How many entries. |
rule |
string | "Nothing listed here is removed inside v1… |
What deprecated means here, in one sentence. |
aliases |
object | {"glov":"gswo", |
Each fund address the Worker answers with a 301 to the fund's file under its new ticker: {old ticker: new ticker}, lower case, as src/index.js lists them. |
entries |
array of object | [{"id":"field-sec-left-out", |
What still answers but has a replacement; their fields are described below. |
contract |
string | "https:/ |
The data contract this file belongs to: /contract/. |
docs |
string | "https:/ |
Where this file is documented. |
license |
string | "CC BY 4.0" |
The licence the file is published under. |
attribution |
string | "Credit TickerInside with a link to this … |
How to credit the data: a link to this file where the medium allows one, the name where it does not. |
An entry
| Field | Type | Example | What it is |
|---|---|---|---|
id |
string | "field-sec-left-out" |
The entry's id. It does not change. |
kind |
string | "field" |
field, a field of a file; key, a way of keying a security; answer, an answer of an address; address, an address that leads to another; mcp_tool, a tool name of the MCP server. |
since |
string | "2026-09-28" |
The day it was replaced. |
what |
string | "left_ |
What is deprecated. |
where |
string | "/ |
The file, address or server where it answers. |
replaced_ |
array of string | ["same_ |
What to read or call instead. |
answers |
string | "An empty list for a stock with a page, |
How it answers today. |
note |
string | "It named the issuer-layer funds whose ro… |
Why, in words. |
removal |
null | null |
Always null: nothing is removed inside v1. |
Nothing listed here is removed inside v1.
The corrections registry
/api/v1/corrections.json Each published figure that was wrong, with its date, scope, tickers and what changed
Each figure that was published wrong and then corrected, newest first: the day the correction reached the files, the families of files it touched, the tickers, and what the files said before and say since.
| Field | Type | Example | What it is |
|---|---|---|---|
count |
integer | 13 |
How many corrections. |
newest |
string | "2026-10-16" |
The date of the newest. |
kinds |
object | {"reading":"How an issuer file or a filin… |
Each kind of correction, by code, in words. |
entries |
array of object | [{"id":"2026-10-16-private-companies-left… |
Every correction, newest first; their fields are described below. |
contract |
string | "https:/ |
The data contract this file belongs to: /contract/. |
report |
string | "A figure that looks wrong: write to the … |
How to report a figure that looks wrong. |
docs |
string | "https:/ |
Where this file is documented. |
license |
string | "CC BY 4.0" |
The licence the file is published under. |
attribution |
string | "Credit TickerInside with a link to this … |
How to credit the data: a link to this file where the medium allows one, the name where it does not. |
A correction
| Field | Type | Example | What it is |
|---|---|---|---|
id |
string | "2026-10-16-private-companies-left-out-fi… |
The correction's id. It does not change. |
date |
string | "2026-10-16" |
The day the correction reached the files. |
kind |
string | "reading" |
Its kind, a code of kinds. |
title |
string | "Private company holdings the funds filed… |
What was wrong, in one line. |
scope |
array of string | ["private-companies"] |
The families of files it touched, as the manifest names them without the slash: fund, etf, sec, holders, compare, history, flows, ownership. |
tickers |
array of string | ["ARKK", |
The funds and securities whose figures were wrong, wherever the files list them: every one when tickers_complete is true, examples otherwise. |
tickers_ |
boolean | false |
Whether tickers lists every fund and security whose figures were wrong. |
before |
string | "A holding counted only when the fund mar… |
What the files said, with the figures. |
after |
string | "Once two funds hold a company as a marke… |
What they say since, with the figures. |
changelog |
string or null | null |
The id of the changelog.json entry that announced it, or null. |
The same entries are on /contract/.
The nightly report
/api/v1/status.json What the last build did, and the date of each layer of the data
What the last build did: when it ran, the date of each layer of the data, and the funds still served from an older file. It also gives the pages it dated as modified, and the versions of the API and of the MCP server. The build writes it with the data, so it is exactly as current as the files it describes.
| Field | Type | Example | What it is |
|---|---|---|---|
schema |
integer | 1 |
The version of this file's shape: 1. Fields are added and never removed or retyped. |
built_ |
string | "2026-10-17T01:56:48Z" |
When the build that wrote this file started, in UTC. The nightly build starts at 22:00 UTC each weekday and is due by 02:00 UTC. The site can also be rebuilt during the day, from the data already fetched. |
run |
object | {"fetch_ |
What the nightly steps reported, when their reports are in the build. run.fetch_holdings, the holdings fetch, publishes only counts, tickers, issuers, dates and a kind of failure. run.fund_figures, the capture of what the issuers state about their funds, which is kept and not served, publishes four totals and nothing else. |
data |
object | {"prices":{"through":"2026-10-16", |
The date of each layer of the data: prices, the issuers' files and the SEC filings, and of the ownership ledger computed from them. |
pages |
object | {"published":1226, |
How many pages the site publishes, and which of them this build dated as modified in the sitemaps. |
versions |
object | {"api":"v1", |
The API version, and the version of the MCP server as an npm package and at its URL. |
live |
string | "https:/ |
The live checks of the site, made every five minutes: the file documented next. |
docs |
string | "https:/ |
Where this file is documented. |
license |
string | "CC BY 4.0" |
The licence the data is published under. |
attribution |
string | "Credit TickerInside with a link to this … |
How to credit the data: a link to this file where the medium allows one, the name where it does not. |
run.fetch_holdings, when the fetch left its report
| Field | Type | Example | What it is |
|---|---|---|---|
funds_ |
integer | 662 |
How many issuer files the fetch tried to read. |
funds_ |
integer | 622 |
How many of them were read and accepted, so the fund now carries the file read that night, whether or not its date moved. A Vanguard file is dated at the month end and keeps its date for weeks. |
funds_ |
integer | 89 |
How many of those carry a file dated later than the one held before. |
kept_ |
array of object | [{"ticker":"ILCB", |
The funds still served from an earlier file, because the new one was refused or missing, or because the issuer no longer lists the fund. Each gives ticker, issuer, since (the first night the fetch found the fund served this way) and holdings_as_of (the date of the file served). The two dates differ: a fund kept since last night can be served from a month end file. |
failed |
array of object | [] |
The funds with a file here whose two attempts both failed that night: ticker, issuer and reason_class. reason_class is http_error (the file could not be downloaded), refused (by the site), empty_file (no holdings came back), rejected_by_gate (its weights did not add up to a whole fund, or its date was too old), parse_error (it could not be read) or other. Each is still served from its earlier file, so it is also in kept_previous. |
failed_ |
integer | 40 |
How many other funds failed that night that have no file here, such as fixed income funds, whose issuer files the fetch tries and does not serve: a fixed income fund is read from its SEC filing. They are counted rather than listed, and with funds_updated and failed they add up to funds_attempted. |
run.fund_figures, when the capture of the issuers' fund figures left its report
| Field | Type | Example | What it is |
|---|---|---|---|
run_ |
string | "2026-10-17" |
The UTC day the capture ran. |
funds |
integer | 624 |
How many funds it captured. |
deadline_ |
boolean | false |
True when it ran out of time before every answer was in. |
warnings |
integer | 1 |
How many warnings it raised, 0 on a normal night. What they say is not published. |
The data object
| Field | Type | Example | What it is |
|---|---|---|---|
prices |
object | {"through":"2026-10-16", |
through, the last close in the price data, which every return and risk figure uses; securities_priced, how many funds and stocks have a weekly series. |
issuer_ |
object | {"funds":626, |
funds, how many funds are read from their issuers' files; newest and oldest file dates; by_date, how many funds carry each of the eight most recent dates. |
sec_ |
object | {"funds":2049, |
funds, how many other US stock ETFs are served from SEC filings; dataset, the SEC quarterly data set the layer was last read from (a fund with a newer filing on EDGAR is served from that filing); report_dates, the oldest and newest quarter end the filings describe. |
universe |
object | {"etfs":5733, |
The coverage measured against the US-listed ETFs, the block of index.json coverage.universe. |
archive |
object | {"funds":633, |
What the archive of issuer files holds: funds; snapshots, one per fund and file date; first and last, the oldest and newest file dates; and since, the day the archive began, which is not the oldest file date. What changed in each fund from one file to the next is served under /api/v1/history/, under the history terms. |
ownership |
object or null | {"method":"ti-ownership/ |
The ETF ownership ledger: method; stocks, how many stocks have a figure; as_of, the newest holdings date it counted; held_back. held_back is true on a night whose ledger failed its checks, when the figures served are those of the last ledger that passed. Null when the build had no ledger. |
The pages object
| Field | Type | Example | What it is |
|---|---|---|---|
published |
integer | 1226 |
How many pages the site publishes. |
redated |
integer | 1027 |
How many of them this build dated as modified. Most nights it is a small number: a page is dated only when a reader would notice the change. |
redated_ |
array of string | ["/ |
The first 50 of those pages, sorted. |
The versions object
| Field | Type | Example | What it is |
|---|---|---|---|
api |
string | "v1" |
The API version, which is also the path prefix: v1. |
mcp_ |
object | {"name":"tickerinside-mcp", |
The npm package tickerinside-mcp: name, version and its page. |
mcp_ |
object | {"url":"https:/ |
The remote MCP server: its URL and the version it announces. |
Live checks
/api/v1/uptime.json Live checks of the pages, the API and the MCP server, every five minutes
Whether the site answers now, and how it has answered. Every five minutes the Worker requests a fund page, the API index and an MCP handshake through the public address, and reads the nightly report. This file gives each check's state, its share of passed checks over 24 hours, 7, 30 and 90 days, 90 days of daily figures, the incidents and the deployments. It is computed when asked and kept one minute at the edge. The examples in the two tables below come from simulated checks, not from the live file.
| Field | Type | Example | What it is |
|---|---|---|---|
schema |
integer | 1 |
The version of this file's shape: 1. |
generated_ |
string | "2026-09-26T12:26:30.000Z" |
When this answer was computed. The file is kept a minute at the edge. |
method |
string | "Every five minutes the Worker requests a… |
How the checks are made, in one paragraph. |
deployed |
object | {"version_ |
The version of the site serving now, or null before the first check saw it. |
components |
array of object | [{"id":"page", |
One entry per check, with the fields of a component. |
today |
object | {"date":"2026-09-26", |
Today's figures so far, per check, in the shape of an entry of days. |
days |
array of object | [{"date":"2026-09-25", |
Up to 90 days of daily figures, newest first: for each check, checks made, failed, no_data (slots with no check), up_pct and, except for the update, p50_ms and p95_ms. For the update, failed counts the checks that found it late. |
incidents |
array of object | [{"id":"2026-09-26T08:20Z-api", |
Open incidents first, then those closed in the last 90 days: id, component, kind (down or late), started, ended, minutes and cause. An incident opens after two failed checks in a row and closes after two good ones. |
status |
string | "https:/ |
The nightly report, as served at /api/v1/status.json. |
docs |
string | "https:/ |
Where this file is documented. |
license |
string | "CC BY 4.0" |
The licence the data is published under. |
A component
| Field | Type | Example | What it is |
|---|---|---|---|
id |
string | "page" |
page, api, mcp or update. |
name |
string | "Fund pages" |
The check in words. |
check |
string | "GET / |
The request made. |
state |
string | "up" |
up or down for page, api and mcp; on time or late for the update; no data when no check has run for 15 minutes; unknown when the record could not be read. |
since |
string | null |
When the current state began, within the last day, or null when it has held all day. |
last_ |
string | "2026-09-26T12:25:00.000Z" |
When the last check ran, in UTC. |
last_ |
integer | 51 |
How long its answer took, in milliseconds, measured from the Cloudflare location that ran the check. |
uptime_ |
object | {"24h":100, |
The share of checks that passed over the last 24 hours, 7, 30 and 90 days. Slots with no check are left out. |
no_ |
number | 0.228 |
The share of five-minute slots with no check over the period on record, up to 90 days. |
open_ |
string | null |
The id of the open incident on this check, or null. |
ms_ |
object | {"p50":68, |
The median and 95th percentile answer time over the last 24 hours, in milliseconds. |
server_ |
string | "1.3.0" |
For the MCP server, the version its handshake announced. |
last_ |
string | "2026-09-25T22:41:07Z" |
For the update, the built_at of the last build seen. |
prices_ |
string | "2026-09-25" |
For the update, the price date of that build. |
next_ |
string | "2026-09-29T02:00:00.000Z" |
For the update, the deadline of the next nightly build: 02:00 UTC the morning after a weekday. |
The checks run on Cloudflare, like the site. An outage of Cloudflare itself stops them too, so it shows as slots with no data, which are never counted as up.