Simple access to fundamental data API for stocks, ETFs, Mutual Funds, and Indices from different exchanges and countries. Almost all major US, UK, EU and Asia exchanges.
Since we provide extensive fundamental data, especially for stocks, the response can be large and include many data sections (see the full list of fields below). To manage this, you have the option to retrieve a specific section or a single field using filters. Read more about this feature below.
We recommend using Fundamentals API v1.1 for all new integrations. See the API Versioning section for details on what changed.
Be sure to check our glossaries that explain the output fields of the Fundamentals API for common stock and ETFs.
Quick jump:
- 1 Quick Start
- 2 Which Fundamental Data is supported by our APIs
- 3 API Versioning
- 4 Stocks Fundamentals Data API
- 5 Partial Data Retrieval using filters
- 6 Equities Fundamentals Data API
- 7 ETFs Fundamentals Data API
- 8 Funds Fundamentals Data API
- 9 Current and Historical Index Constituents API
- 10 Historical Constituents for the S&P 500 (GSPC)
- 11 Bulk Fundamentals API
- 12 Fundamental Data Glossaries
Quick Start
Request example:
https://eodhd.com/api/v1.1/fundamentals/AAPL.US?api_token=demo&fmt=json
curl --location "https://eodhd.com/api/v1.1/fundamentals/AAPL.US?api_token=demo&fmt=json"
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://eodhd.com/api/v1.1/fundamentals/AAPL.US?api_token=demo&fmt=json',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'GET',
));
$data = curl_exec($curl);
curl_close($curl);
try {
$data = json_decode($data, true, 512, JSON_THROW_ON_ERROR);
var_dump($data);
} catch (Exception $e) {
echo 'Error. '.$e->getMessage();
}
import requests url = f'https://eodhd.com/api/v1.1/fundamentals/AAPL.US?api_token=demo&fmt=json' data = requests.get(url).json() print(data)
library(httr) library(jsonlite) url <- 'https://eodhd.com/api/v1.1/fundamentals/AAPL.US?api_token=demo&fmt=json' response <- GET(url) if (http_type(response) == "application/json") { content <- content(response, "text", encoding = "UTF-8") cat(content) } else { cat("Error while receiving data\n") }
Try it now (it's free)!
How to use it (YouTube)
- v1.1 – the recommended API version. You can also use the original endpoint without the version prefix (/api/fundamentals/), but we recommend v1.1 for all new integrations.
- AAPL.US consists of two parts: {SYMBOL_NAME}.{EXCHANGE_CODE}, then you can use, for example, AAPL.MX for Mexican Stock Exchange. Or AAPL.US for NASDAQ.
- api_token – your API key, provided after registration. To access the Fundamentals API you should be subscribed to the ‘Fundamentals’ package or higher.
- You can start with “DEMO” API key to test the data for a few tickers only: AAPL.US, TSLA.US, VTI.US, AMZN.US, BTC-USD.CC and EURUSD.FOREX. For these tickers, all of our types of data (APIs), including Real-Time Data, are available without limitations.
- Register for the free plan to receive your API key (limited to 20 API calls per day) with access to End-Of-Day Historical Stock Market Data API for any ticker, but within the past year only. Plus a List of tickers per Exchange is available.
- We recommend to explore our plans, starting from $19.99, to access the necessary type of data without limitations.
Which Fundamental Data is supported by our APIs
- Major US companies are supported from 1985, more than 40 years, and non-US symbols are supported from 2000, more than 25 years of financial data. Symbols from major US exchanges (around 11,000 tickers in total from NYSE, NASDAQ, and ARCA) supported for 25+ years both yearly and quarterly. For minor companies, we have data for the last 6 years and the previous 20 quarters. The dataset continues to grow over time.
- We support more than 20,000 US Funds. Our database has equity funds as well as balanced and bond-based mutual funds.
- We also support details for more than 10,000 ETFs from different exchanges and countries.
- We provide Index Constituents (or Index Components) data for all major indices all around the world.
- Please note: not all companies report the whole financial data, therefore it cannot be guaranteed that each company will have all available data points filled with data.
- Due to a very complex data structure, we support fundamental data feeds only in JSON format.
API Versioning
The Fundamentals API uses versioned endpoints. We recommend v1.1 for all new integrations. Simply use /api/v1.1/fundamentals/ instead of /api/fundamentals/. All existing parameters work the same way.
The original endpoint (without version prefix) remains available for backward compatibility.
v1.1
- Fixed missing Q4 data in Earnings Trend. In the original version, quarterly (Q4) and annual estimates that share the same date could collide, causing Q4 data to be silently dropped. In v1.1, all quarters are always present.
- Earnings Trend response is now split into Quarterly and Annual sections instead of a flat list.
- Each quarterly entry includes a human-readable quarter field (Q1, Q2, Q3, Q4).
Stocks Fundamentals Data API
For stocks, we provide the following data fields:
General Company Details:
- Code and name of the company
- Address, including website URL and phone number
- Company logo (available for major companies worldwide)
- CIK (Central Index Key) and Employer Identification Number (EIN)
- Fiscal year-end and IPO date
- International or domestic classification of the company
- Exchange, currency, and country information
- Sector, industry, and company description
- Home category (Domestic or ADR)
- Is delisted – indicates whether the ticker has been delisted
- Delisted date – the date when the ticker was delisted
- Listings – other exchange listings for the ticker
- Officers – list of company executives
Financial Highlights and Key Metrics:
- Market Capitalization
- EBITDA, PE ratio, PEG ratio
- Earnings per share (EPS), book value, dividend share, dividend yield
- Profit margin, operating margin, return on assets and return on equity
- Revenue, revenue per share, gross profit, diluted EPS, and quarterly earnings growth (year-over-year)
Market Valuation Metrics:
- Trailing P/E ratio
- Forward P/E ratio
- Price-to-Sales ratio
- Price-to-Book ratio
- Enterprise Value-to-Revenue ratio
- Enterprise Value-to-EBITDA ratio
Shareholder & Ownership Data:
- Total shares outstanding
- Floating shares (shares available for trading)
- Percentage held by insiders
- Percentage held by institutional investors
Technical Performance Metrics:
- Beta (measure of stock volatility)
- 52-week high and low
- 50-day and 200-day moving averages
Splits and Dividends:
- Forward annual dividend rate and yield
- Payout ratio
- Dividend date and ex-dividend date
- Last split factor and split date
Institutional Holders:
- Name of the holder (institution or fund)
- Total shares held and percentage of ownership
- Report date and changes in holdings
Insider Transactions:
- Report date
- Owner CIK, owner name, owner relationship, and owner title
- Transaction date, transaction amount, transaction price, and transaction type
- Post-transaction amount
- SEC filing link
* Insider transactions data includes both SEC Form 4 filings (corporate insiders) and congressional stock disclosures. All listed fields are also available in the standalone Insider Transactions API.
Outstanding Shares:
- Date
- Number of outstanding shares on the specified date (in millions)
Earnings:
- Historical data and trends
- Quarterly and annual earnings reports
- Earnings Trend with separated Quarterly/Annual sections and human-readable quarter labels (Q1–Q4)
Financial Reports:
- Annual and quarterly reports
- Balance sheet
- Cash flow statement
- Income statement
Stock response example
This is a JSON response example for the AAPL ticker using v1.1. Only a portion of the data is shown below. To retrieve the full data, even with the “demo” key, click here to open the full request in a new tab.
{
"General": {
"Code": "AAPL",
"Type": "Common Stock",
"Name": "Apple Inc",
"Exchange": "NASDAQ",
"CurrencyCode": "USD",
"CountryName": "USA",
"CountryISO": "US",
"ISIN": "US0378331005",
"PrimaryTicker": "AAPL.US",
"CIK": "320193",
"FiscalYearEnd": "September",
"IPODate": "1980-12-12",
"Sector": "Technology",
"Industry": "Consumer Electronics",
"GicSector": "Information Technology",
"HomeCategory": "Domestic",
"IsDelisted": false,
"Description": "Apple Inc. designs, manufactures, and markets smartphones, personal computers, tablets, wearables, and accessories worldwide...",
"WebURL": "https://www.apple.com",
"LogoURL": "/img/logos/US/aapl.png",
"FullTimeEmployees": 164000
},
"Highlights": {
"MarketCapitalization": 3458400518144,
"EBITDA": 134660997120,
"PERatio": 37.8639,
"PEGRatio": 2.0958,
"EarningsShare": 5.88,
"DividendShare": 0.98,
"DividendYield": 0.0043,
"BookValue": 3.767,
"ProfitMargin": 0.2397,
"ReturnOnEquityTTM": 1.5741,
"RevenueTTM": 391034994688
},
"Valuation": {
"TrailingPE": 37.8639,
"ForwardPE": 30.7692,
"PriceSalesTTM": 8.8442,
"PriceBookMRQ": 60.7271,
"EnterpriseValue": 3499868262520,
"EnterpriseValueRevenue": 8.9503,
"EnterpriseValueEbitda": 25.9902
},
"Technicals": {
"Beta": 1.24,
"52WeekHigh": 260.1,
"52WeekLow": 163.4884,
"50DayMA": 239.2966,
"200DayMA": 217.0157
},
"SplitsDividends": {
"ForwardAnnualDividendRate": 1,
"ForwardAnnualDividendYield": 0.0043,
"PayoutRatio": 0.1467,
"DividendDate": "2024-11-14",
"ExDividendDate": "2024-11-08",
"LastSplitFactor": "4:1",
"LastSplitDate": "2020-08-31"
},
"AnalystRatings": {
"Rating": 4.1064,
"TargetPrice": 247.925,
"StrongBuy": 24,
"Buy": 8,
"Hold": 12,
"Sell": 2,
"StrongSell": 1
},
"Holders": {
"Institutions": {
"0": {
"name": "Vanguard Group Inc",
"date": "2024-09-30",
"totalShares": 8.9087,
"currentShares": 1346616669,
"change": 21646442,
"change_p": 1.6337
},
"1": {
"name": "BlackRock Inc",
"date": "2024-09-30",
"totalShares": 7.2349,
"currentShares": 1093618174,
"change": 43402422,
"change_p": 4.1327
},
"2": {
"name": "State Street Corp",
"date": "2024-09-30",
"totalShares": 3.8636,
"currentShares": 584010284,
"change": 55935105,
"change_p": 10.5923
}
},
"Funds": {
"0": {
"name": "Vanguard Total Stock Mkt Idx Inv",
"date": "2024-12-31",
"totalShares": 3.1349,
"currentShares": 473862940,
"change": 19839097,
"change_p": 4.3696
},
"1": {
"name": "Vanguard Institutional 500 Index Trust",
"date": "2024-12-31",
"totalShares": 2.7081,
"currentShares": 409358272,
"change": 564051,
"change_p": 0.138
},
"2": {
"name": "SPDR® S&P 500® ETF Trust",
"date": "2024-12-31",
"totalShares": 1.2573,
"currentShares": 190052772,
"change": 2195583,
"change_p": 1.1688
}
}
},
"InsiderTransactions": {
"0": {
"date": "2024-12-16",
"ownerName": "Jeffrey E Williams",
"transactionDate": "2024-12-16",
"transactionCode": "S",
"transactionAmount": 100000,
"transactionPrice": 249.97,
"transactionAcquiredDisposed": "D",
"secLink": "http://www.sec.gov/Archives/edgar/data/320193/..."
},
"1": {
"date": "2024-10-02",
"ownerName": "Timothy D Cook",
"transactionDate": "2024-10-02",
"transactionCode": "S",
"transactionAmount": 223986,
"transactionPrice": 224.46,
"transactionAcquiredDisposed": "D",
"secLink": "http://www.sec.gov/Archives/edgar/data/320193/..."
}
},
"Financials": {
"Balance_Sheet": { "yearly": { ... }, "quarterly": { ... } },
"Income_Statement": { "yearly": { ... }, "quarterly": { ... } },
"Cash_Flow": { "yearly": { ... }, "quarterly": { ... } }
}
}
Partial Data Retrieval using filters
Since we provide extensive fundamental data, especially for stocks, the response can be large. To manage this, you have the option to retrieve a specific section or a single field using the parameter ‘filter=’.
Section names and field names can be referenced from the response example above. Multi-layer filtering is also supported. For example, if you want to retrieve only the ‘Code’ field from the ‘General’ block:
https://eodhd.com/api/v1.1/fundamentals/AAPL.US?filter=General::Code&api_token=demo&fmt=json
curl --location "https://eodhd.com/api/v1.1/fundamentals/AAPL.US?filter=General::Code&api_token=demo&fmt=json"
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://eodhd.com/api/v1.1/fundamentals/AAPL.US?filter=General::Code&api_token=demo&fmt=json',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'GET',
));
$data = curl_exec($curl);
curl_close($curl);
try {
$data = json_decode($data, true, 512, JSON_THROW_ON_ERROR);
var_dump($data);
} catch (Exception $e) {
echo 'Error. '.$e->getMessage();
}
import requests url = f'https://eodhd.com/api/v1.1/fundamentals/AAPL.US?filter=General::Code&api_token=demo&fmt=json' data = requests.get(url).json() print(data)
library(httr) library(jsonlite) url <- 'https://eodhd.com/api/v1.1/fundamentals/AAPL.US?filter=General::Code&api_token=demo&fmt=json' response <- GET(url) if (http_type(response) == "application/json") { content <- content(response, "text", encoding = "UTF-8") cat(content) } else { cat("Error while receiving data\n") }
Try it now (it's free)!
How to use it (YouTube)
Different filter layers are separated by “::” and can have any number of layers as needed. For example:
https://eodhd.com/api/v1.1/fundamentals/AAPL.US?filter=Financials::Balance_Sheet::yearly&api_token=demo&fmt=json
curl --location "https://eodhd.com/api/v1.1/fundamentals/AAPL.US?filter=Financials::Balance_Sheet::yearly&api_token=demo&fmt=json"
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://eodhd.com/api/v1.1/fundamentals/AAPL.US?filter=Financials::Balance_Sheet::yearly&api_token=demo&fmt=json',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'GET',
));
$data = curl_exec($curl);
curl_close($curl);
try {
$data = json_decode($data, true, 512, JSON_THROW_ON_ERROR);
var_dump($data);
} catch (Exception $e) {
echo 'Error. '.$e->getMessage();
}
import requests url = f'https://eodhd.com/api/v1.1/fundamentals/AAPL.US?filter=Financials::Balance_Sheet::yearly&api_token=demo&fmt=json' data = requests.get(url).json() print(data)
library(httr) library(jsonlite) url <- 'https://eodhd.com/api/v1.1/fundamentals/AAPL.US?filter=Financials::Balance_Sheet::yearly&api_token=demo&fmt=json' response <- GET(url) if (http_type(response) == "application/json") { content <- content(response, "text", encoding = "UTF-8") cat(content) } else { cat("Error while receiving data\n") }
Try it now (it's free)!
How to use it (YouTube)
It’s also possible to use multiple comma-separated filters. For example:
https://eodhd.com/api/v1.1/fundamentals/AAPL.US?filter=General::Code,General,Earnings&api_token=demo&fmt=json
curl --location "https://eodhd.com/api/v1.1/fundamentals/AAPL.US?filter=General::Code,General,Earnings&api_token=demo&fmt=json"
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://eodhd.com/api/v1.1/fundamentals/AAPL.US?filter=General::Code,General,Earnings&api_token=demo&fmt=json',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'GET',
));
$data = curl_exec($curl);
curl_close($curl);
try {
$data = json_decode($data, true, 512, JSON_THROW_ON_ERROR);
var_dump($data);
} catch (Exception $e) {
echo 'Error. '.$e->getMessage();
}
import requests url = f'https://eodhd.com/api/v1.1/fundamentals/AAPL.US?filter=General::Code,General,Earnings&api_token=demo&fmt=json' data = requests.get(url).json() print(data)
library(httr) library(jsonlite) url <- 'https://eodhd.com/api/v1.1/fundamentals/AAPL.US?filter=General::Code,General,Earnings&api_token=demo&fmt=json' response <- GET(url) if (http_type(response) == "application/json") { content <- content(response, "text", encoding = "UTF-8") cat(content) } else { cat("Error while receiving data\n") }
Try it now (it's free)!
How to use it (YouTube)
For example, to retrieve only the Earnings Trend data with separated Quarterly/Annual sections:
https://eodhd.com/api/v1.1/fundamentals/AAPL.US?filter=Earnings::Trend&api_token=demo&fmt=json
curl --location "https://eodhd.com/api/v1.1/fundamentals/AAPL.US?filter=Earnings::Trend&api_token=demo&fmt=json"
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://eodhd.com/api/v1.1/fundamentals/AAPL.US?filter=Earnings::Trend&api_token=demo&fmt=json',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'GET',
));
$data = curl_exec($curl);
curl_close($curl);
try {
$data = json_decode($data, true, 512, JSON_THROW_ON_ERROR);
var_dump($data);
} catch (Exception $e) {
echo 'Error. '.$e->getMessage();
}
import requests url = f'https://eodhd.com/api/v1.1/fundamentals/AAPL.US?filter=Earnings::Trend&api_token=demo&fmt=json' data = requests.get(url).json() print(data)
library(httr) library(jsonlite) url <- 'https://eodhd.com/api/v1.1/fundamentals/AAPL.US?filter=Earnings::Trend&api_token=demo&fmt=json' response <- GET(url) if (http_type(response) == "application/json") { content <- content(response, "text", encoding = "UTF-8") cat(content) } else { cat("Error while receiving data\n") }
Try it now (it's free)!
How to use it (YouTube)
Equities Fundamentals Data API
We support the following data for Equity symbols:
General Data and Fundamental Highlights:
Includes sector, industry, company description, market capitalization, EBITDA, book value, dividend share, dividend yield, earnings per share (EPS), estimated EPS for the current and next year/quarter, and price-to-earnings (P/E) ratio.
Earnings:
- History – EPS actual, EPS estimate, difference, and surprise percentage
- Trend – Earnings estimates and revenue estimates for different periods, with separated Quarterly/Annual sections and human-readable quarter labels (Q1–Q4).
Financial Reports (We support both US and non-US companies):
- Major US companies have financial data available from 1985 (over 40 years)
- Non-US symbols are supported from 2000 (over 25 years)
- Symbols from major US exchanges (approximately 11,000 tickers from NYSE, NASDAQ, and ARCA) have 25+ years of both yearly and quarterly data
- For smaller companies, data is available for the last six years and the previous 20 quarters
- The dataset continues to grow over time
Please note that not all companies report complete financial data, so some data points may be unavailable for certain companies.
ETFs Fundamentals Data API
We support details for more than 10,000 ETFs from different exchanges and countries. Here is an overview of the ETF data we provide:
- ETF General Data – Company name, URL, current yield, dividend payment frequency, inception date, net expense ratio, annual holdings turnover, total net assets, average market capitalization.
- Technicals – Beta, 52-week high/low, 50/200-day moving average.
- Breakdowns – Market capitalization, asset allocation, world regions, sector weights, top 10 holdings, valuation and growth rates compared to the ETF category.
- Performance – Volatility, expected returns, Sharpe ratio, returns YTD / 3 years / 5 years / 10 years.
Here is a response example for SPY (SPDR S&P 500 ETF Trust), filtered to show key sections:
https://eodhd.com/api/fundamentals/SPY.US?filter=General,ETF_Data,Technicals&api_token=demo&fmt=json
curl --location "https://eodhd.com/api/fundamentals/SPY.US?filter=General,ETF_Data,Technicals&api_token=demo&fmt=json"
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://eodhd.com/api/fundamentals/SPY.US?filter=General,ETF_Data,Technicals&api_token=demo&fmt=json',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'GET',
));
$data = curl_exec($curl);
curl_close($curl);
try {
$data = json_decode($data, true, 512, JSON_THROW_ON_ERROR);
var_dump($data);
} catch (Exception $e) {
echo 'Error. '.$e->getMessage();
}
import requests url = f'https://eodhd.com/api/fundamentals/SPY.US?filter=General,ETF_Data,Technicals&api_token=demo&fmt=json' data = requests.get(url).json() print(data)
library(httr) library(jsonlite) url <- 'https://eodhd.com/api/fundamentals/SPY.US?filter=General,ETF_Data,Technicals&api_token=demo&fmt=json' response <- GET(url) if (http_type(response) == "application/json") { content <- content(response, "text", encoding = "UTF-8") cat(content) } else { cat("Error while receiving data\n") }
Try it now (it's free)!
How to use it (YouTube)
{
"General": {
"Code": "SPY",
"Type": "ETF",
"Name": "SPDR S&P 500 ETF Trust",
"Exchange": "NYSE ARCA",
"CurrencyCode": "USD",
"CountryName": "USA",
"CountryISO": "US",
"Description": "The trust seeks to achieve its investment objective by holding a portfolio of the common stocks that are included in the index...",
"UpdatedAt": "2026-04-28"
},
"Technicals": {
"Beta": 1,
"52WeekHigh": 715.61,
"52WeekLow": 535.3737,
"50DayMA": 677.672,
"200DayMA": 669.1013
},
"ETF_Data": {
"ISIN": "US78462F1030",
"Company_Name": "State Street Investment Management",
"Company_URL": "http://www.spdrs.com",
"Yield": "1.140000",
"Dividend_Paying_Frequency": "Quarterly",
"Inception_Date": "1993-01-22",
"Average_Mkt_Cap_Mil": "425358.16238",
"Asset_Allocation": {
"Cash": { "Net_Assets_%": "0.29269" },
"Stock US": { "Net_Assets_%": "99.16838" },
"Stock non-US": { "Net_Assets_%": "0.53893" },
"Bond": { "Net_Assets_%": "0" }
},
"Top_10_Holdings": {
"NVDA.US": {
"Code": "NVDA",
"Name": "NVIDIA Corporation",
"Sector": "Technology",
"Assets_%": 7.9465
},
"AAPL.US": {
"Code": "AAPL",
"Name": "Apple Inc",
"Sector": "Technology",
"Assets_%": 6.57546
},
"MSFT.US": {
"Code": "MSFT",
"Name": "Microsoft Corporation",
"Sector": "Technology",
"Assets_%": 5.05686
},
"AMZN.US": {
"Code": "AMZN",
"Name": "Amazon.com Inc",
"Sector": "Consumer Cyclical",
"Assets_%": 4.08157
},
"AVGO.US": {
"Code": "AVGO",
"Name": "Broadcom Inc",
"Sector": "Technology",
"Assets_%": 3.26126
}
}
}
}
Funds Fundamentals Data API
We support more than 20,000 US Mutual Funds. Our database has equity funds as well as balanced and bond-based mutual funds. We support all major information about almost all mutual funds on the market, including:
- General Information – Fund summary, fund family, inception date.
- Asset Allocation – Cash, US stocks, non-US stocks, bonds, other.
- Value Growth Measures – Price/Prospective Earnings, Price/Book, Price/Sales, Price/Cash Flow, and many other metrics.
- Sector Weightings – Cyclical, sensitive, defensive.
- World Regions (for equity and balanced funds) – America, Europe, Asia, and other regions. Market classification: developed and emerging markets.
- Top Countries (for bond-based mutual funds).
It’s also possible to get data from Mutual Fund by ticker. For example, for “Schwab S&P 500 Index” both identifications are correct: SWPPX.US and US8085098551.
Here is a response example for the Charles Schwab fund “Schwab S&P 500 Index” (SWPPX.US):
https://eodhd.com/api/fundamentals/SWPPX.US?filter=General,MutualFund_Data&api_token=demo&fmt=json
curl --location "https://eodhd.com/api/fundamentals/SWPPX.US?filter=General,MutualFund_Data&api_token=demo&fmt=json"
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://eodhd.com/api/fundamentals/SWPPX.US?filter=General,MutualFund_Data&api_token=demo&fmt=json',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'GET',
));
$data = curl_exec($curl);
curl_close($curl);
try {
$data = json_decode($data, true, 512, JSON_THROW_ON_ERROR);
var_dump($data);
} catch (Exception $e) {
echo 'Error. '.$e->getMessage();
}
import requests url = f'https://eodhd.com/api/fundamentals/SWPPX.US?filter=General,MutualFund_Data&api_token=demo&fmt=json' data = requests.get(url).json() print(data)
library(httr) library(jsonlite) url <- 'https://eodhd.com/api/fundamentals/SWPPX.US?filter=General,MutualFund_Data&api_token=demo&fmt=json' response <- GET(url) if (http_type(response) == "application/json") { content <- content(response, "text", encoding = "UTF-8") cat(content) } else { cat("Error while receiving data\n") }
Try it now (it's free)!
How to use it (YouTube)
{
"General": {
"Code": "SWPPX",
"Type": "FUND",
"Name": "Schwab S&P 500 Index Fund",
"Exchange": "NMFQS",
"CurrencyCode": "USD",
"CountryName": "USA"
},
"MutualFund_Data": {
"Fund_Category": "Large Blend",
"Fund_Style": "Large Blend",
"Yield": "0.0116",
"Inception_Date": "1997-05-19",
"Asset_Allocation": [
{ "Type": "Cash", "Net_%": "0.36203" },
{ "Type": "US Stock", "Net_%": "99.09082" },
{ "Type": "Non US Stock", "Net_%": "0.54715" },
{ "Type": "Bond", "Net_%": "0.00000" }
],
"Sector_Weights": {
"Cyclical": [
{ "Name": "Basic Materials", "Amount_%": 1.90293 },
{ "Name": "Consumer Cyclical", "Amount_%": 10.00562 },
{ "Name": "Financial Services", "Amount_%": 12.35409 },
{ "Name": "Real Estate", "Amount_%": 1.95446 }
],
"Sensitive": [
{ "Name": "Communication Services", "Amount_%": 10.47618 },
{ "Name": "Energy", "Amount_%": 4.01506 },
{ "Name": "Industrials", "Amount_%": 8.46582 },
{ "Name": "Technology", "Amount_%": 33.56007 }
],
"Defensive": [
{ "Name": "Consumer Defensive", "Amount_%": 5.2563 },
{ "Name": "Healthcare", "Amount_%": 9.46837 },
{ "Name": "Utilities", "Amount_%": 2.54111 }
]
},
"Top_Holdings": [
{ "Name": "NVIDIA Corp", "Weight": "7.80%" },
{ "Name": "Apple Inc", "Weight": "6.44%" },
{ "Name": "Microsoft Corp", "Weight": "5.37%" },
{ "Name": "Amazon.com Inc", "Weight": "3.91%" },
{ "Name": "Alphabet Inc", "Weight": "3.30%" }
]
}
}
Don’t forget that we also have End-Of-Day data with our Stock Price Data API and live data with our Live/Real-time Stock Prices API for SWPPX and other funds.
Current and Historical Index Constituents API
1. Current components
Through the Fundamentals API package, we provide Index Constituents (or Index Components) data for all major indices worldwide. A full list can be found here.
Available data for each component:
- Code
- Exchange
- Name
- Sector
- Industry
- Weight
Query example:
https://eodhd.com/api/fundamentals/GSPC.INDX?api_token={YOUR_API_TOKEN}&fmt=json
curl --location "https://eodhd.com/api/fundamentals/GSPC.INDX?api_token={YOUR_API_TOKEN}&fmt=json"
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://eodhd.com/api/fundamentals/GSPC.INDX?api_token={YOUR_API_TOKEN}&fmt=json',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'GET',
));
$data = curl_exec($curl);
curl_close($curl);
try {
$data = json_decode($data, true, 512, JSON_THROW_ON_ERROR);
var_dump($data);
} catch (Exception $e) {
echo 'Error. '.$e->getMessage();
}
import requests url = f'https://eodhd.com/api/fundamentals/GSPC.INDX?api_token={YOUR_API_TOKEN}&fmt=json' data = requests.get(url).json() print(data)
library(httr) library(jsonlite) url <- 'https://eodhd.com/api/fundamentals/GSPC.INDX?api_token={YOUR_API_TOKEN}&fmt=json' response <- GET(url) if (http_type(response) == "application/json") { content <- content(response, "text", encoding = "UTF-8") cat(content) } else { cat("Error while receiving data\n") }
Try it now (it's free)!
How to use it (YouTube)
Response example for S&P 500 (GSPC.INDX) — showing first 5 of 503 components:
{
"General": {
"Code": "GSPC",
"Type": "INDEX",
"Name": "S&P 500 Index",
"Exchange": "INDX",
"MarketCap": 61359390473801,
"CurrencyCode": "USD",
"CountryName": "USA"
},
"Components": {
"0": {
"Code": "AIZ",
"Exchange": "US",
"Name": "Assurant Inc",
"Sector": "Financial Services",
"Industry": "Insurance - Property & Casualty",
"Weight": 0.0002
},
"1": {
"Code": "MNST",
"Exchange": "US",
"Name": "Monster Beverage Corp",
"Sector": "Consumer Defensive",
"Industry": "Beverages - Non-Alcoholic",
"Weight": 0.0009
},
"2": {
"Code": "PGR",
"Exchange": "US",
"Name": "Progressive Corp",
"Sector": "Financial Services",
"Industry": "Insurance - Property & Casualty",
"Weight": 0.0019
},
"3": {
"Code": "CSX",
"Exchange": "US",
"Name": "CSX Corporation",
"Sector": "Industrials",
"Industry": "Railroads",
"Weight": 0.0014
},
"4": {
"Code": "ADP",
"Exchange": "US",
"Name": "Automatic Data Processing Inc",
"Sector": "Technology",
"Industry": "Software - Application",
"Weight": 0.0013
}
}
}
2. Historical data
A list of all components that have ever been in an index is available for the following indices. To view this section in JSON response, purchase the Indices Historical Constituents Data API (this data is part of that dataset).
Available indices:
- SPSIOP (S&P)
- SPSIRE (S&P)
- OEX (S&P)
- MID (S&P)
- GSPC (S&P)
- SML (S&P)
- DJC (Dow Jones)
- DJI (Dow Jones)
- DJT (Dow Jones)
- DJU (Dow Jones)
The response includes not only the current list of active constituents but non-active constituents as well, along with the dates of their addition and exclusion. Non-active constituents are available under the “HistoricalTickerComponents” section. Plus there is an additional data field “Weight” (based on “free float market cap” for S&P and “price-weighted” for DJ).
For more detailed data on S&P and Dow Jones indices, we offer a standalone product available through our API Marketplace. This product provides daily updated index components with additional parameters for over 100 indices, including the S&P 500, 600, 100, 400, Dow Jones, and more. Visit our product page to learn more.
Historical Constituents for the S&P 500 (GSPC)
Through the Fundamentals API package, historical data for the S&P 500 (also known as GSPC or simply S&P) is available in the form of snapshots for each date, providing the list of all 500 components for a specific date. We track the data from the 1960s, though the most complete data starts from 2016.
Parameters:
- historical=1 – Adds historical snapshot data to the response under the “HistoricalComponents” section.
- from= and to= – Additional parameters to set the time period. These only take effect if changes occurred during the specified period. Without these parameters, the entire dataset will be returned.
If you are looking for historical data not only for the S&P 500 but also for other S&P and Dow Jones indices, take a look at our product available on our API Marketplace. For 30 major S&P and Dow Jones indices (see the list on our product page), this endpoint offers 2 to 12 years of historical records, marking each addition and exclusion of a component with the corresponding date.
Request example:
https://eodhd.com/api/fundamentals/GSPC.INDX?historical=1&from=2020-01-01&to=2023-01-01&api_token={YOUR_API_TOKEN}&fmt=json
curl --location "https://eodhd.com/api/fundamentals/GSPC.INDX?historical=1&from=2020-01-01&to=2023-01-01&api_token={YOUR_API_TOKEN}&fmt=json"
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://eodhd.com/api/fundamentals/GSPC.INDX?historical=1&from=2020-01-01&to=2023-01-01&api_token={YOUR_API_TOKEN}&fmt=json',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'GET',
));
$data = curl_exec($curl);
curl_close($curl);
try {
$data = json_decode($data, true, 512, JSON_THROW_ON_ERROR);
var_dump($data);
} catch (Exception $e) {
echo 'Error. '.$e->getMessage();
}
import requests url = f'https://eodhd.com/api/fundamentals/GSPC.INDX?historical=1&from=2020-01-01&to=2023-01-01&api_token={YOUR_API_TOKEN}&fmt=json' data = requests.get(url).json() print(data)
library(httr) library(jsonlite) url <- 'https://eodhd.com/api/fundamentals/GSPC.INDX?historical=1&from=2020-01-01&to=2023-01-01&api_token={YOUR_API_TOKEN}&fmt=json' response <- GET(url) if (http_type(response) == "application/json") { content <- content(response, "text", encoding = "UTF-8") cat(content) } else { cat("Error while receiving data\n") }
Try it now (it's free)!
How to use it (YouTube)
Response example (“HistoricalComponents” section):
{
"HistoricalComponents": {
"2020-01-28": {
"0": {
"Date": "2020-01-28",
"Code": "AIZ",
"Exchange": "US",
"Name": "Assurant Inc",
"Sector": "Financial Services",
"Industry": "Insurance - Property & Casualty"
},
"1": {
"Date": "2020-01-28",
"Code": "MNST",
"Exchange": "US",
"Name": "Monster Beverage Corp",
"Sector": "Consumer Defensive",
"Industry": "Beverages - Non-Alcoholic"
},
"2": {
"Date": "2020-01-28",
"Code": "PGR",
"Exchange": "US",
"Name": "Progressive Corp",
"Sector": "Financial Services",
"Industry": "Insurance - Property & Casualty"
}
}
}
}
Bulk Fundamentals API
Learn how to get Fundamental Data for multiple tickers or entire exchanges here. Bulk Fundamentals is also available in v1.1 at /api/v1.1/bulk-fundamentals/{EXCHANGE_CODE}.