Skip to main content
ETF Screening selects exchange-traded funds by conditions rather than by name. A screen returns one row per US-listed share class, filtered on what the fund is labelled as and on what its book measures. It answers questions that start from a condition — the cheapest large-cap biotech funds by size, leveraged funds bleeding assets, short-duration treasury funds under ten basis points.
Plan: Fund · Credits: 1 per call; screen facets are free

What You Can Use ETF Screening For

Detailed ETF Filter Pages

By asset class

The four-level taxonomy filters.

By geography

Measured US/EM shares and region/country segments.

By wrapper & structure

The nine tiers and filed flags.

By size & fees

Class-level AUM and expense ratios.

By portfolio shape

Concentration, cap bands, duration.

By flows & premium

20-day flows and premium/discount.
Build a peer group from scratch. Find funds whose measured portfolio contradicts their name. Rank a segment by fee, size, concentration or twenty-day flow. Locate the funds most exposed to a region or a cap band without relying on the fund’s own marketing label.

Start With ETF Screen Facets

Call the ETF screen facets endpoint first. It is free and returns the label vocabulary as it is actually carried by funds, with a count for each value, plus measured coverage totals. This matters for two reasons. It is the only place ETF coverage is a number rather than prose. And an empty result from a label filter almost always means the code was misspelled rather than that no such funds exist — the facets response settles which.

Two ETF Label Axes That Are Not the Same Question

tier filters on the wrapper — what kind of instrument the fund is. It takes a comma-separated list of the nine values: leveraged_inverse, structured_outcome, option_income, physical_commodity, futures_commodity, crypto, currency, alternative, plain_beta. asset_class, category, segment and specializations filter on the holdings-derived taxonomy — what the fund actually holds. taxonomy_prefix matches a dotted-path prefix at any level, so equity.sector finds every sector fund in one filter. A fund can be a leveraged wrapper around a health-care segment. Filtering on one axis says nothing about the other.

Measured Filters Versus Label Filters

Some filters read a label; others read a measurement taken from the fund’s holdings. The distinction decides how a question must be phrased. Sector funds carry no cap-band label, because cap bands are a separate facet. “Large-cap biotech” is therefore not one label but a segment plus a specialization plus a measured floor: segment=equity.sector.health_care, specializations=equity.sector.health_care.biotechnology, min_large_share=0.5. The cap share is measured from holdings. The measured filters are min_n_holdings, min_top10_share and max_top10_share for concentration; min_us_share and min_em_share for geography; min_large_share, max_large_share and min_small_share for cap bands; min_duration, max_duration and min_treasury_share for bond books; min_flow_20d and max_flow_20d for flows; min_premium and max_premium for premium and discount.

How ETF Screen Sorting Handles Unknowns

Sorting drops rows whose sort key is null, and on this dataset that is a large and non-random group. Ranking by expense ratio drops every trust that files no fee table, SPY and GLD included. Ranking by assets drops multi-class portfolios with no derivable class-level size. When that happens the response carries an unranked block saying how many funds matched the filters but could not be ranked. An apparently empty first page with a large unranked count means the filters worked and the sort did not — re-run with sort=ticker to see the matches.

Two Cadences in One ETF Screen Row

Labels are recomputed monthly; the measured columns — assets, flows, premium, expense coverage — refresh daily. A newly launched fund can therefore carry a complete set of labels while every measured column is still null. A label filter finds it; any numeric sort moves it into the unranked count.

How ETF Assets Are Measured in a Screen

aum is the class-level figure. It is either filed by the fund or derived as published NAV multiplied by published shares on multi-class portfolios, and aum_is_derived says which. A portfolio-level number is never served as a share class’s size.

Query the ETF Screen

Use the ETF screen endpoint to select funds. Every filter is combined with AND; a comma-separated value inside one filter means ANY of the listed values. No filter is required.
string
Comma-separated wrapper tiers.
string
Comma-separated level-3 taxonomy codes — the peer-group key.
string
A dotted-path prefix matching any taxonomy level, e.g. equity.sector.
number
Class-level assets floor in USD. max_aum sets the ceiling.
number
Net expense ratio ceiling as a decimal — 0.001 is ten basis points. min_expense_ratio sets the floor.
number
Twenty-day net flow floor in USD; a negative value finds outflows. max_flow_20d sets the ceiling.
string
default:"aum"
aum, net_expense_ratio, flow_20d, top10_share, premium_discount, or ticker. aum defaults to descending; net_expense_ratio and ticker default to ascending. order overrides the direction.
integer
default:"100"
Rows per page, between 1 and 1000. Page through with cursor.
The full filter set also covers q, exchange, active, exposure_hidden, asset_class, category, specializations, is_index, is_fund_of_fund, multi_inverse, and the measured filters listed above. See also ETF Classification for the vocabulary these filters use, ETF Holdings for the data the measured filters are computed from, ETF Fees for why fee sorting drops funds, and Company Screening and Adviser Screening for the same pattern on other datasets.