NewConnect Claude, Gemini, ChatGPT, and other AI agents to API Ninjas via our MCP server →

ETF API

The ETF API provides detailed information about Exchange-Traded Funds including their price, all holdings, expense ratios, assets under management, identifiers, and trailing total-return performance.

Available endpoints:

  • /v1/etf - Get detailed information for a specific ETF by ticker or ISIN
  • /v1/etflist - Get a list of every supported ETF ticker symbol
  • /v1/etfsearch - Search for ETFs by name, AUM, expense ratio, holdings, or country

For data on Mutual Funds, use the Mutual Fund API instead.

Premium members have access to live prices, while free users receive the closing price of the most recent completed trading session.

Online
(4.5)

From 8,061 users

4,100+

Applications using this API

API Status

Online - All Systems Operational

API Response Times

Average
P50
P75
P90
P95
372ms418ms462ms847ms1193ms

Didn't find what you were looking for? Suggest an improvement

3 endpoints

https://api.api-ninjas.com/v1/etf

Returns comprehensive information about any ETF by its ticker or ISIN. Premium members have access to live prices, while free users receive the closing price of the most recent completed trading session.

Parameters

Provide ticker or isin, but not both. To find an ETF by name, use /v1/etfsearch.

  • ticker  optional

    ETF ticker symbol (e.g., QQQ, SPY, VTI). You must pass the complete ticker symbol, including any exchange suffix (dot notation) when the listing requires it. For example, EUNL.DE, not EUNL.

  • isin  optional

    International Securities Identification Number of the ETF (e.g., IE00B5BMR087, US78462F1030). An ISIN identifies the fund rather than one exchange listing, and many funds trade on several exchanges under different tickers. The response is for the most traded listing, and listings shows them all.

Headers

  • X-Api-Key  required

    API Key associated with your account.

Response

The /v1/etf endpoint returns a JSON object with the following fields, or an error if the request is unsuccessful.

  • etf_ticker

    ETF ticker symbol.

  • etf_name

    ETF name.

  • isin

    International Securities Identification Number (ISIN) of the ETF.

  • cusip

    Nine-character Committee on Uniform Security Identification Procedures (CUSIP) identifier for the ETF.

  • country

    ISO country code of the exchange the ETF is listed on (e.g. a Tokyo-listed ETF is JP). See domicile for the fund's legal home.

  • domicile

    ISO country code of the fund's legal domicile, which can differ from where it trades (e.g. an Ireland-domiciled UCITS listed in London is country: GB, domicile: IE).

  • price

    Current price of this listing, in its trading currency (the matching entry in listings gives the currency). Premium members receive the live price; free users receive the closing price of the most recent completed trading session.

  • expense_ratio Premium only

    Annual expense ratio of the ETF as a percentage. For example, 0.2% would be 0.2.

  • aum Premium only

    Assets under management of the ETF, expressed in the fund's local trading currency (see aum_currency). For a USD figure use aum_usd.

  • aum_currency Premium only

    ISO 4217 currency code that aum is denominated in (e.g. USD, JPY, EUR).

  • aum_usd Premium only

    Assets under management converted to USD.

  • num_holdings Premium only

    Number of holdings in the ETF.

  • holdings Premium only

    Array of all holdings in the ETF. Each entry contains ticker, num_shares (number of shares held), weight (portfolio weight as a decimal fraction), value (position value in the listing's trading currency), and last_updated (Unix timestamp).

  • performance Business tier and above

    Trailing returns for this ETF, built from monthly total returns: net of fees, with distributions reinvested. Values are percents: 17.75 means +17.75%. Available on the Business tier and above.

    FieldDescription
    as_ofLast month-end the figures cover.
    months_availableNumber of monthly returns on file.
    return_1m
    return_3m
    return_6m
    return_ytd
    Total return over the last 1, 3 and 6 months, and year to date.
    return_1y
    return_3y
    return_5y
    Cumulative total return over the last 1, 3 and 5 years.
    annualized_3y
    annualized_5y
    The 3- and 5-year returns, annualized.
    sinceFirst month of history.
    return_since
    annualized_since
    Cumulative and annualized return since the specified start date.
    best_month
    worst_month
    Best and worst single month, as month and total_return.
    volatility_3yAnnualized standard deviation of monthly returns over the last 3 years.
    monthly_returnsEvery month on file, oldest first, as month and total_return.
    • Figures come from quarterly fund reports, not live prices, which is why as_of lags.
  • listings

    Every exchange this fund trades on, most traded first. One fund can trade under several tickers and currencies: IE00B5BMR087 is CSPX.L in USD, SXR8.DE in EUR and CSP1.L in GBX. Holdings, expense ratio and aum_usd are the same whichever listing you look up. Listings with no trades in the last 14 days are left out.

    FieldDescription
    tickerTicker on that exchange.
    exchangeExchange code, e.g. LSE, XETRA, NASDAQ.
    countryISO country code of the exchange.
    currencyISO 4217 code, or GBX (UK pence) or ZAC (South African cents).
    price Premium onlyLatest price on that exchange, in currency.
    volume Premium onlyShares traded in the latest session.
    avg_volume Premium onlyAverage shares traded per day.

Live Demo

Live demo · no API key required
Query parameters
ticker
isin

Get a free API key to get started — no credit card required.

Headers
X-Api-KeyLog in or sign up to get your API key
GET
https://api.api-ninjas.com/v1/etf?ticker=QQQ
Sample response
{
"etf_ticker": "QQQ",
"etf_name": "Invesco QQQ Trust",
"price": 515.59,
"isin": "US46090E1038",
"cusip": "46090E103",
"country": "US",
"domicile": "US",
"expense_ratio": 0.2,
"aum": 305184502800,
"aum_currency": "USD",
"aum_usd": 305184502800,
"num_holdings": 101,
"holdings": [
{
"ticker": "MSFT",
"num_shares": 61773595,
"weight": 0.08689999999999999,
"value": 27752405289.7,
"last_updated": 1747184735
},
{
"ticker": "AAPL",
"num_shares": 124827810,
"weight": 0.08239,
"value": 26312454069.9,
"last_updated": 1747184735
},
{
"ticker": "NVDA",
"num_shares": 202754805,
"weight": 0.07809,
"value": 24938841015,
"last_updated": 1747184735
},
"..."
],
"performance": {
"as_of": "2026-03-31",
"months_available": 81,
"return_1m": -4.9823,
"return_3m": -4.3428,
"return_6m": -1.8111,
"return_ytd": -4.3428,
"return_1y": 17.7655,
"return_3y": 65.4779,
"return_5y": 76.4149,
"annualized_3y": 18.2805,
"annualized_5y": 12.023,
"since": "2019-07-01",
"return_since": 145.8548,
"annualized_since": 14.2558,
"best_month": {
"month": "2020-04",
"total_return": 12.82
},
"worst_month": {
"month": "2020-03",
"total_return": -12.3811
},
"volatility_3y": 12.0571,
"monthly_returns": [
{
"month": "2026-01",
"total_return": 1.4465
},
{
"month": "2026-02",
"total_return": -0.7625
},
{
"month": "2026-03",
"total_return": -4.9823
}
]
},
"listings": [
{
"ticker": "QQQ",
"exchange": "NASDAQ",
"country": "US",
"currency": "USD",
"price": 515.59,
"volume": 41352620,
"avg_volume": 47219864
}
]
}

Code Examples

curl -X GET "https://api.api-ninjas.com/v1/etf?ticker=SPY" \ -H "X-Api-Key: YOUR_API_KEY"

If your programming language is not listed in the Code Example above, you can still make API calls by using a HTTP request library written in your programming language and following the above documentation.

Business tier and above, or any annual plan

https://api.api-ninjas.com/v1/etflist

Returns ETF ticker symbols supported by the ETF API, paginated up to 1000 per call. Useful for discovering which tickers can be passed to /v1/etf or /v1/etfsearch. Increment the offset parameter by 1000 until fewer than 1000 results are returned to walk the entire list.

Parameters

  • offset  optional

    Number of results to skip for pagination. Default 0. Page size is 1000.

Headers

  • X-Api-Key  required

    API Key associated with your account.

Response

The /v1/etflist endpoint returns a JSON array of strings (up to 1000 supported ETF ticker symbols starting at offset) or an error if the request is unsuccessful.

Live Demo

Live demo
Query parameters
offset

Get a free API key to get started — no credit card required.

Headers
X-Api-KeyLog in or sign up to get your API key
GET
https://api.api-ninjas.com/v1/etflist
Sample response
[
"AAA",
"AADR",
"AAXJ",
"ACES",
"ACIO",
"ACWI",
"ACWV",
"ACWX",
"ADRA",
"ADRD",
"..."
]

Code Examples

curl -X GET "https://api.api-ninjas.com/v1/etflist?offset=0" \ -H "X-Api-Key: YOUR_API_KEY"

Business tier and above, or any annual plan

https://api.api-ninjas.com/v1/etfsearch

Search for ETFs by name, or by any combination of filters. Results are sorted by assets under management (descending) and capped at 50 per page. Use the offset parameter to paginate. At least one filter parameter is required.

Parameters

At least one of the following parameters must be provided.

  • name  optional

    Fund name to search for (e.g. vanguard 500 matches Vanguard S&P 500 ETF). Case-insensitive. Each word must match the start of a word in the fund name, in any order, so ark matches ARK Innovation ETF but not Emerging Markets. Up to 12 words.

  • min_aum  optional

    Minimum assets under management in USD (e.g. 10000000000 for $10B).

  • max_aum  optional

    Maximum assets under management in USD.

  • min_expense_ratio  optional

    Minimum annual expense ratio as a percentage (e.g. 0.1 for 0.1%).

  • max_expense_ratio  optional

    Maximum annual expense ratio as a percentage.

  • holdings  optional

    Comma-separated list of ticker symbols. Only ETFs that hold every listed ticker will be returned (AND match). Example: AAPL,MSFT.

  • country  optional

    Filter by ISO listing-country code — the exchange the ETF trades on (e.g. US, GB, JP), not the fund's domicile.

  • offset  optional

    Number of results to skip for pagination. Default 0. Page size is 50.

Headers

  • X-Api-Key  required

    API Key associated with your account.

Response

The /v1/etfsearch endpoint returns a JSON array of up to 50 matching ETFs (sorted by USD AUM descending) or an error if the request is unsuccessful. Each entry contains the following fields. To retrieve full holdings for a specific result, call /v1/etf with its symbol.

  • symbol

    ETF ticker symbol.

  • name

    ETF name.

  • country

    ISO country code of the exchange the ETF is listed on. See domicile for the fund's legal home.

  • domicile

    ISO country code of the fund's legal domicile, which can differ from where it trades.

  • expense_ratio

    Annual expense ratio of the ETF as a percentage. For example, 0.09% would be 0.09.

  • aum

    Assets under management of the ETF, expressed in the fund's local trading currency (see aum_currency). For a USD figure use aum_usd.

  • aum_currency

    ISO 4217 currency code that aum is denominated in (e.g. USD, JPY, EUR).

  • aum_usd

    Assets under management converted to USD. Results are sorted by this field.

  • num_holdings

    Number of holdings in the ETF.

Live Demo

Live demo
Query parameters
name
min_aum
max_aum
min_expense_ratio
max_expense_ratio
holdings
country
offset

Get a free API key to get started — no credit card required.

Headers
X-Api-KeyLog in or sign up to get your API key
GET
https://api.api-ninjas.com/v1/etfsearch?min_aum=10000000000&country=US
Sample response
[
{
"symbol": "SPY",
"name": "SPDR S&P 500 ETF Trust",
"country": "US",
"domicile": "US",
"expense_ratio": 0.09,
"aum": 762117890000,
"aum_currency": "USD",
"aum_usd": 762117890000,
"num_holdings": 504
},
{
"symbol": "IVV",
"name": "iShares Core S&P 500 ETF",
"country": "US",
"domicile": "US",
"expense_ratio": 0.03,
"aum": 615420180000,
"aum_currency": "USD",
"aum_usd": 615420180000,
"num_holdings": 503
},
{
"symbol": "VOO",
"name": "Vanguard S&P 500 ETF",
"country": "US",
"domicile": "US",
"expense_ratio": 0.03,
"aum": 598220910000,
"aum_currency": "USD",
"aum_usd": 598220910000,
"num_holdings": 506
}
]

Code Examples

curl -X GET "https://api.api-ninjas.com/v1/etfsearch?min_aum=10000000000&country=US" \ -H "X-Api-Key: YOUR_API_KEY"

Frequently Asked Questions

  • Yes, but you must have a premium subscription. Commercial use of the ETF API is not permitted on the free tier. See our pricing page to choose a plan that fits your needs.
  • Sign up for a free account to instantly get your API key, then pass it in the X-Api-Key header on every request. The documentation above includes ready-to-run examples in cURL, Python, JavaScript, Node.js, and more.
  • Your API requests will simply be denied once you hit your monthly quota — you will never be charged more than the plan you signed up for. To increase your quota, you can upgrade your plan any time on our pricing page.
  • The API responds with a standard HTTP status code and a JSON error message describing the problem. See our error codes reference for the full list of codes and how to resolve each one, or contact support if you need help.
  • Call the /v1/etf endpoint with the required ticker parameter (e.g. ticker=SPY, including any exchange suffix like EUNL.DE when required); the response includes a holdings array where each entry has the constituent ticker, num_shares, percentage weight, and value, alongside num_holdings, aum, and expense_ratio. For live quotes on those individual constituents, see the Stock Price API.
  • Use the /v1/etfsearch endpoint, which accepts filters including name (e.g. vanguard 500; each word matches the start of a word in the fund name, in any order), holdings (a comma-separated AND match like AAPL,MSFT that returns only ETFs holding every listed ticker), min_aum/max_aum, min_expense_ratio/max_expense_ratio, and country; results are sorted by AUM descending, capped at 50 per page, and you paginate with offset. These search and listing endpoints require a Business, Professional, or annual subscription, shown on pricing.
  • The /v1/etflist endpoint returns a JSON array of supported ticker symbols, paginated up to 1000 per call; increment the offset parameter by 1000 until fewer than 1000 results come back to walk the entire list. To verify or resolve any individual symbol you can also use the Ticker API.
  • Premium members receive live prices; free users receive the closing price of the most recent completed trading session. The aum, expense_ratio, num_holdings, and holdings fields on /v1/etf are premium only. See pricing for the plans that unlock live prices and these fields, or use the Mutual Fund API for fund equivalents.