# GET /api/v1/screen?holds={holds}

One endpoint of the TickerInside API, with data through 2026-10-16. Contents of the reference, each section and endpoint as a file: https://tickerinside.com/api/sections/index.md. The whole reference as Markdown: https://tickerinside.com/api/index.md

`GET /screen?holds={holds}`: funds by `issuer`, `category`, `layer`, `expense_ratio_max`, `aum_min`, or `holds` (a stock) with `min_weight`; `sort`, `limit` and `offset`. CSV: /screen.csv. https://tickerinside.com/api/v1/screen?holds=NVDA&min_weight=10

## Response

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.

```json
{
  "…": "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"
}
```

- `as_of` (string): The date of funds.json, the price date.
- `filters` (object): 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): 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): How many funds pass the filters.
- `offset` (integer): Where this page starts in them.
- `limit` (integer): How many funds a page holds at most.
- `count` (integer): How many funds this page holds.
- `funds` (array of object): The funds of this page.
- `next` (string or null): The address of the next page. Null on the last one.
- `source` (object): The files read, under api_urls: funds.json and, for holds, the stock file; and cite_as.
- `license` (string): The licence the data is published under.
- `attribution` (string): 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): The reference of this endpoint.

A fund, in funds:

- `ticker` (string): The fund's ticker.
- `name` (string): Its name.
- `layer` (string): 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): Its issuer, as funds.json names it. Null when unknown.
- `category` (string or null): 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_id` (string or null): The id of that category, which never changes meaning. Null with category.
- `expense_ratio` (number or null): Its expense ratio, in percent a year. Null when unknown.
- `aum_b` (number or null): Its assets in billions of US dollars, from market data. Null when unknown.
- `net_assets` (number or 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): How many positions its file lists.
- `report_date` (string or 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_pct` (number): With holds: the security's weight in the fund, in percent.
- `holdings_as_of` (string): With holds: the date of the fund's file the weight is read from.
- `holdings_source` (string): With holds: issuer file or SEC Form N-PORT.
- `fund_file` (string): The address of its file.
- `page_url` (string or null): Its page. Null without one.

holds reads the funds the stock's file lists, as the MCP tool find_etfs_holding_stock does.

## Errors and redirects

| 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 | `no_such_endpoint` | No endpoint at this address. | `covered`: `index.json`. |
| 405 |  | A computed answer asked with another method than GET or HEAD (`method_not_allowed`). | Use GET. |
| 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`.
