Plan: Fund · Credits: 1 per call
What You Can Use ETF Holdings For
Look through a fund to the companies it actually owns, rather than relying on its stated objective. Measure how concentrated a fund is, and how that concentration changed over time. Find every ETF holding a given company by joiningcompany_id back to the company registry. Rebuild sector, country or credit-quality exposure from the underlying lines instead of from a label. Track a fund’s turnover by differencing consecutive portfolio dates.
ETF Holdings Coverage
Holdings are collected from the files ETF issuers publish themselves, so coverage follows what each sponsor discloses and how often. Most large US sponsors publish daily; some publish monthly, and some publish only summary exposure rather than full lines. Coverage is reported as a measured number rather than described in prose. Call ETF screen facets, which is free, to read the current totals, and read thecoverage block returned alongside every holdings response for the specific fund you queried.
Key ETF Holdings Fields
weight_pct is the line’s weight in the portfolio, as a percentage. quantity is the number of shares or units held; par_value carries face value for debt lines. market_value is the line’s value in the fund’s reporting currency, and notional_value carries economic exposure where the two differ. price, currency and fx_rate describe how the value was struck.
row_kind classifies the line as one of equity, bond, fund, cash, fx, derivative, physical, crypto or other. underlying_exposure, derivative_kind and counterparty describe derivative lines further.
cusip, isin, sedol, figi and ticker_as_filed are the identifiers as the fund printed them on that date. company_id is FocusAlpha’s link from the line to the company registry, where an identifier matched.
Bond lines additionally carry maturity, coupon_pct, duration, ytm_pct and bond_issuer_type. Equity lines carry exchange, country and sector.
ETF Holdings Date Convention
Three dates appear on every holdings row, and all three are real rather than alternatives.valuation_date is the portfolio valuation date: the closing-price date the file prices at. This is the date to filter and group on.
position_date is the day the quantities are effective. It is either the same day as valuation_date or the next trading day, depending on whether the fund publishes before or after creations settle. It is null where the offset could not be confirmed.
issuer_date is the date label the issuer printed on the file. It is kept because it is the issuer’s own claim, and it does not always equal either of the other two.
One holdings file therefore carries two genuinely different dates — a price date and a quantity date — which is why a single as-of column cannot represent it faithfully.
ETF Holdings Sources
Holdings come from the issuers’ own published holdings files. Nothing on this dataset is vendor-supplied, and no line is imputed: a fund that does not publish full lines has no rows rather than estimated ones.company_id is calculated by FocusAlpha rather than reported by the issuer. A null company_id is a legitimate terminal state — options, swap legs, bonds and cash are not companies — and the newest portfolio day can lag one run behind on linking and row classification. The coverage block’s classified value says how much of that day is classified.
Query ETF Holdings
Use the ETF Holdings endpoint to retrieve security-level holdings for one fund. Pass anetf_id, ticker, ISIN or CUSIP as the identifier; the newest portfolio date is returned unless you ask for a specific one.
string
required
etf_id (E000011), a ticker (SPY), an ISIN, or a CUSIP. Ticker lookup is exact and unambiguous or nothing: an ambiguous symbol returns no row rather than a guess.string
A specific portfolio valuation date,
YYYY-MM-DD. Defaults to the newest date on file.string
Comma-separated list of row kinds to include:
equity, bond, fund, cash, fx, derivative, physical, crypto, other. Defaults to all.boolean
default:"false"
Return only lines that resolved to a
company_id.integer
default:"500"
Rows per page, between 1 and 1000. Page through with
cursor.valuation_date served, a data array of holdings lines, a next_cursor, and a coverage block reporting how many rows the day holds, the sum of absolute weights, and the classified share.