Skip to main content
GET
Get ETF / index-fund holdings

Overview

The Financial Datasets ETF holdings API returns the full list of holdings of an ETF or index fund and each position’s percent of net assets, largest first, with a fund header that carries the as-of period and coverage counts. It covers 500+ funds with 5+ years of history, updated daily, from SEC fund holdings filings. To see which funds hold a given stock, use Funds (by holding). You can call it as a REST endpoint with an API key, or from Claude, ChatGPT, Cursor, and other AI apps through the MCP server, or pay per request with x402. Pricing starts at $20. Use this to answer “what’s in SPY, and at what weight?” for index replication, exposure analysis, and overlap checks. To get started, please create an account and grab your API key at financialdatasets.ai. You will use the API key to authenticate your API requests.

Coverage

The “latest” definition

Without an as_of filter, this endpoint returns the fund’s most recent filing. To reconstruct a historical composition, pass as_of=YYYY-MM-DD and the response is the composition in effect on or before that date.

All holdings, labeled

Every position is returned, including bonds, derivatives, and cash, each labeled with an asset_class (equity, bond, or other). name is included when available; ticker is null for securities without a US listing (e.g., many bonds and foreign holdings). To narrow the list, pass asset_class=equity or asset_class=bond.

Find available tickers

To discover which funds are available, hit the helper endpoint:
Tickers

Filtering the Data

ticker is required. Optional filters:
  • as_of — the composition in effect on/before this date (YYYY-MM-DD). Defaults to the latest filing.
  • asset_class — equity or bond. Defaults to all holdings.
By default, limit is 50 (max 1000). Use offset to page through a fund’s constituents.

Examples

FAQ

Which funds are covered?

500+ ETFs and index funds. Get the list with a free request to /index-funds/tickers/. It needs no API key.

Can I see what a fund held on a past date?

Yes. Pass as_of=YYYY-MM-DD to get the composition in effect on or before that date. Without as_of, you get the fund’s most recent filing.

Does it include bonds and cash?

Yes. Every position is returned, including bonds, derivatives, and cash, each labeled with an asset_class of equity, bond, or other. Pass asset_class=equity to get equities only. ticker is null for securities without a US listing.

Can an AI agent use this data?

Yes. Claude, ChatGPT, Cursor, and other MCP clients reach it through the Financial Datasets MCP server. An agent with a wallet can also pay per request with x402, with no account.

Authorizations

X-API-KEY
string
header
required

API key for authentication.

Query Parameters

ticker
string

The fund's ticker symbol (e.g., SPY). Returns that fund's holdings. Mutually exclusive with holding.

holding
string

A held security's ticker symbol (e.g., AAPL). Returns the funds whose latest filing holds it. Mutually exclusive with ticker.

as_of
string<date>

Only valid with ticker. Returns the fund composition in effect on or before this date (YYYY-MM-DD). Without it, the fund's latest filing is returned.

asset_class
enum<string>

Only valid with ticker. Filter constituents by instrument type: equity or bond. Omit for all holdings.

Available options:
equity,
bond
limit
integer
default:50

The total number of rows to return (default: 50; no maximum). This is the total across all pages, not a page size: each page holds up to 10 records, linked by next_page_url.

offset
integer
default:0

The number of rows to skip, for pagination (default: 0).

cursor
string

Opaque pagination cursor from a previous response's next_page_url. When provided, all other query parameters are ignored: the cursor carries the original request's filters. Treat it as opaque; do not construct or modify it.

Response

Index fund holdings response. The shape depends on the query direction: ticker returns a fund header + constituents; holding returns a security header + funds.

Forward response (?ticker=...): a fund header plus its constituents, sorted by weight descending.

ticker
string

The fund ticker echoed back from the request.

fund
object

Fund header: identity, the as-of period, and coverage counts for the full fund (not the returned page).

holdings
object[]
next_page_url
string

Absolute URL of the next page of results. Present only when more results remain; request it as-is to continue. Each page holds up to 10 records.