Fundamental data API for stocks, ETFs, mutual funds, and indices from major US, UK, EU, and Asian exchanges. Because the fundamentals response can be large, especially for stocks, you can request a single section or one field with the filter parameter (see Partial Data Retrieval below). We recommend Fundamentals API v1.1 for all new integrations; see the API Versioning section for what changed. The feed is JSON only.
Be sure to check our glossaries that explain the output fields of the Fundamentals API for common stock and ETFs.
The Endpoint
A single endpoint serves fundamentals for every instrument type: stocks and equities, ETFs, mutual funds, and indices. The set of sections returned depends on the instrument type, and the type-specific sections are described further down this page.
https://eodhd.com/api/v1.1/fundamentals/{ticker}?api_token=YOUR_TOKEN
The ticker has two parts, CODE.EXCHANGE, for example AAPL.US (NASDAQ), VOD.LSE (London), VTI.US (an ETF), or GSPC.INDX (an index). v1.1 is the recommended version; the original /api/fundamentals/ without the version prefix also works.
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)
- 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.
Parameters
api_token
string
required
filter
string
optional
historical
integer
optional
from
date
optional
to
date
optional
Which Fundamental Data is Supported
- Major US companies are covered from 1985 (40+ years); non-US symbols from 2000 (25+ years). Around 11,000 tickers from NYSE, NASDAQ, and ARCA have 25+ years of both yearly and quarterly data. Minor companies have the last 6 years and 20 quarters. The dataset keeps growing.
- More than 20,000 US funds, including equity, balanced, and bond mutual funds.
- More than 10,000 ETFs from exchanges and countries worldwide.
- Index constituents (components) for all major indices worldwide.
- Not every company reports every data point, so some fields may be empty for a given ticker.
- Because of the complex data structure, the fundamentals feed is available in JSON only.
API Versioning
The Fundamentals API uses versioned endpoints. We recommend v1.1 for new integrations: use /api/v1.1/fundamentals/ instead of /api/fundamentals/. All parameters work the same way, and the original endpoint stays available for backward compatibility.
v1.1
- Fixed missing Q4 data in the Earnings Trend. In the original version, quarterly (Q4) and annual estimates sharing the same date could collide and silently drop Q4; in v1.1 all quarters are always present.
- The Earnings Trend is now split into Quarterly and Annual sections instead of one flat list keyed by date.
- Each quarterly entry includes a human-readable quarter field (Q1, Q2, Q3, Q4).
Stocks and Equities Fundamentals
The Fundamentals API returns a single JSON object for a stock or equity ticker, covering company profile, valuation, share statistics, technicals, dividends and splits, ownership, insider transactions, outstanding shares, earnings, and full financial statements. It works for US common stocks and for equities on non-US exchanges. The response is organised into top-level sections, and you can request a single section or field with the filter parameter.
Request URL:
https://eodhd.com/api/fundamentals/{ticker}?api_token={your_api_token}&fmt=json
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)
Response sections are listed below. Expand each one to see the individual fields it contains.
General — company profile fields
- Code — the ticker code of the company
- Type — the instrument type, for example Common Stock
- Name — the company name
- Exchange — the exchange the ticker is listed on
- CurrencyCode — currency code of the listing
- CurrencyName — full name of the listing currency
- CurrencySymbol — symbol of the listing currency
- CountryName — country where the company is registered
- CountryISO — ISO country code
- OpenFigi — the OpenFIGI identifier
- ISIN — International Securities Identification Number
- LEI — Legal Entity Identifier
- PrimaryTicker — the primary ticker for the company
- CUSIP — CUSIP identifier (mainly for US companies)
- CIK — Central Index Key assigned by the SEC (US companies)
- EmployerIdNumber — Employer Identification Number (EIN, US companies)
- FiscalYearEnd — month the fiscal year ends
- IPODate — date of the initial public offering
- InternationalDomestic — international or domestic classification
- Sector — the sector of the company
- Industry — the industry of the company
- GicSector — GICS sector classification
- GicGroup — GICS industry group classification
- GicIndustry — GICS industry classification
- GicSubIndustry — GICS sub-industry classification
- HomeCategory — home category of the ticker, for example Domestic or ADR
- IsDelisted — whether the ticker has been delisted
- Description — a textual description of the company
- Address — the company address as a single string
- AddressData — the address split into Street, City, State, Country, and ZIP
- Listings — other exchange listings for the ticker, each with Code, Exchange, and Name
- Officers — company executives, each with Name, Title, and YearBorn
- Phone — company phone number
- WebURL — company website URL
- LogoURL — path to the company logo image
- FullTimeEmployees — number of full-time employees
- UpdatedAt — date the record was last updated
Highlights — key metrics and estimates
- MarketCapitalization — market capitalization
- MarketCapitalizationMln — market capitalization in millions
- EBITDA — earnings before interest, taxes, depreciation, and amortization
- PERatio — price-to-earnings ratio
- PEGRatio — price/earnings-to-growth ratio
- WallStreetTargetPrice — average analyst target price
- BookValue — book value per share
- DividendShare — dividend per share
- DividendYield — dividend yield
- EarningsShare — earnings per share (EPS)
- EPSEstimateCurrentYear — estimated EPS for the current year
- EPSEstimateNextYear — estimated EPS for the next year
- EPSEstimateNextQuarter — estimated EPS for the next quarter
- EPSEstimateCurrentQuarter — estimated EPS for the current quarter
- MostRecentQuarter — date of the most recent reported quarter
- ProfitMargin — profit margin
- OperatingMarginTTM — operating margin over the trailing twelve months
- ReturnOnAssetsTTM — return on assets over the trailing twelve months
- ReturnOnEquityTTM — return on equity over the trailing twelve months
- RevenueTTM — revenue over the trailing twelve months
- RevenuePerShareTTM — revenue per share over the trailing twelve months
- QuarterlyRevenueGrowthYOY — quarterly revenue growth year over year
- GrossProfitTTM — gross profit over the trailing twelve months
- DilutedEpsTTM — diluted EPS over the trailing twelve months
- QuarterlyEarningsGrowthYOY — quarterly earnings growth year over year
Valuation — market valuation ratios
- TrailingPE — trailing price-to-earnings ratio
- ForwardPE — forward price-to-earnings ratio
- PriceSalesTTM — price-to-sales ratio over the trailing twelve months
- PriceBookMRQ — price-to-book ratio for the most recent quarter
- EnterpriseValue — enterprise value
- EnterpriseValueRevenue — enterprise value to revenue ratio
- EnterpriseValueEbitda — enterprise value to EBITDA ratio
SharesStats — share statistics and ownership
- SharesOutstanding — total shares outstanding
- SharesFloat — shares available for public trading
- PercentInsiders — percentage of shares held by insiders
- PercentInstitutions — percentage of shares held by institutions
- SharesShort — number of shares sold short
- SharesShortPriorMonth — shares sold short in the prior month
- ShortRatio — short interest ratio
- ShortPercentOutstanding — short interest as a percentage of shares outstanding
- ShortPercentFloat — short interest as a percentage of the float
Technicals — technical performance metrics
- Beta — measure of stock volatility relative to the market
- 52WeekHigh — highest price over the last 52 weeks
- 52WeekLow — lowest price over the last 52 weeks
- 50DayMA — 50-day moving average
- 200DayMA — 200-day moving average
- SharesShort — number of shares sold short
- SharesShortPriorMonth — shares sold short in the prior month
- ShortRatio — short interest ratio
- ShortPercent — short interest as a percentage
SplitsDividends — dividends and splits
- ForwardAnnualDividendRate — forward annual dividend rate
- ForwardAnnualDividendYield — forward annual dividend yield
- PayoutRatio — dividend payout ratio
- DividendDate — the dividend payment date
- ExDividendDate — the ex-dividend date
- LastSplitFactor — the factor of the last stock split
- LastSplitDate — the date of the last stock split
- NumberDividendsByYear — count of dividends paid per year, each entry with Year and Count
Holders — institutional and fund ownership
- Institutions — institutional holders, each with name, date, totalShares, totalAssets, currentShares, change, and change_p
- Funds — fund holders, each with name, date, totalShares, totalAssets, currentShares, change, and change_p
- name — name of the holder (institution or fund)
- date — report date of the holding
- totalShares — percentage of total shares held
- totalAssets — percentage of the holder assets in this position
- currentShares — number of shares currently held
- change — change in shares held since the previous report
- change_p — percentage change in shares held
InsiderTransactions — insider trading records
- date — report date of the transaction
- ownerCik — Central Index Key of the owner
- ownerName — name of the owner
- transactionDate — date of the transaction
- transactionCode — the transaction code
- transactionAmount — number of shares in the transaction
- transactionPrice — price per share in the transaction
- transactionAcquiredDisposed — whether shares were acquired or disposed
- postTransactionAmount — shares held after the transaction
- secLink — link to the SEC filing
outstandingShares — historical shares outstanding
- annual — yearly history, each entry with date, dateFormatted, sharesMln, and shares
- quarterly — quarterly history, each entry with date, dateFormatted, sharesMln, and shares
- date — the period label
- dateFormatted — the period end date
- sharesMln — number of shares outstanding in millions
- shares — number of shares outstanding
Earnings — history, trend, and annual
- History — reported earnings, each with reportDate, date, beforeAfterMarket, currency, epsActual, epsEstimate, epsDifference, and surprisePercent
- Trend — analyst estimates by period, including growth, earningsEstimateAvg, earningsEstimateLow, earningsEstimateHigh, revenueEstimateAvg, EPS trend values, and EPS revision counts
- Annual — annual earnings, each with date and epsActual
Financials — Balance Sheet, Income Statement, Cash Flow
- Balance_Sheet — balance sheet data with currency_symbol, plus yearly and quarterly reports (fields include totalAssets, totalLiab, totalStockholderEquity, cash, netDebt, longTermDebt, inventory, retainedEarnings, and more)
- Income_Statement — income statement data with currency_symbol, plus yearly and quarterly reports (fields include totalRevenue, costOfRevenue, grossProfit, operatingIncome, ebit, ebitda, netIncome, researchDevelopment, and more)
- Cash_Flow — cash flow data with currency_symbol, plus yearly and quarterly reports (fields include totalCashFromOperatingActivities, capitalExpenditures, freeCashFlow, dividendsPaid, netIncome, changeInCash, and more)
- Each yearly and quarterly report entry carries its own date and filing_date
US and non-US equities
The same endpoint serves US common stocks and equities on non-US exchanges, and most sections are identical for both. The main differences are that identifiers such as CUSIP, CIK, and EmployerIdNumber are populated mainly for US companies. Non-US equities may include an ExchangeMarket field in the General section. Financial statement history depth also varies: major US companies have data going back several decades, while non-US symbols typically start later. Not all companies report every data point, so some fields may be empty for a given ticker.
Response example
A trimmed response for AAPL.US showing a few representative fields from each section. The full response is much larger.
{
"General": {
"Code": "AAPL",
"Type": "Common Stock",
"Name": "Apple Inc.",
"Exchange": "NASDAQ",
"CurrencyCode": "USD",
"CountryName": "USA",
"CountryISO": "US",
"ISIN": "US0378331005",
"CUSIP": "037833100",
"CIK": "0000320193",
"PrimaryTicker": "AAPL.US",
"FiscalYearEnd": "September",
"IPODate": "1980-12-12",
"Sector": "Technology",
"Industry": "Consumer Electronics",
"GicSector": "Information Technology",
"HomeCategory": "Domestic",
"IsDelisted": false,
"FullTimeEmployees": 166000,
"UpdatedAt": "2026-07-13"
},
"Highlights": {
"MarketCapitalization": 4631217307648,
"EBITDA": 144427003904,
"PERatio": 33.15,
"PEGRatio": 2.09,
"WallStreetTargetPrice": 315.5667,
"EarningsShare": 6.6,
"DividendYield": 0.0034,
"ProfitMargin": 0.2731,
"RevenueTTM": 408625012736
},
"Valuation": {
"TrailingPE": 33.15,
"ForwardPE": 30.77,
"PriceSalesTTM": 8.84,
"PriceBookMRQ": 60.72,
"EnterpriseValue": 4672684000000
},
"SharesStats": {
"SharesOutstanding": 14687356000,
"SharesFloat": 14662387495,
"PercentInsiders": 1.631,
"PercentInstitutions": 65.732
},
"SplitsDividends": {
"ForwardAnnualDividendRate": 1.08,
"ForwardAnnualDividendYield": 0.0034,
"PayoutRatio": 0.127,
"ExDividendDate": "2026-05-11",
"LastSplitFactor": "4:1",
"LastSplitDate": "2020-08-31"
},
"Holders": {
"Institutions": {
"0": {
"name": "Vanguard Group Inc",
"date": "2025-12-31",
"totalShares": 9.711,
"currentShares": 1426283914,
"change_p": 1.9191
}
}
},
"outstandingShares": {
"annual": {
"0": {
"date": "2026",
"dateFormatted": "2026-12-31",
"sharesMln": "14768.1150",
"shares": 14768115000
}
}
},
"Earnings": {
"History": {
"2026-06-30": {
"reportDate": "2026-07-30",
"date": "2026-06-30",
"beforeAfterMarket": "AfterMarket",
"currency": "USD",
"epsEstimate": 1.88
}
},
"Annual": {
"2026-06-30": {
"date": "2026-06-30",
"epsActual": 4.85
}
}
},
"Financials": {
"Income_Statement": {
"currency_symbol": "USD",
"yearly": {
"2025-09-30": {
"date": "2025-09-30",
"totalRevenue": "416161000000.00",
"grossProfit": "195201000000.00",
"operatingIncome": "133050000000.00",
"netIncome": "112010000000.00",
"ebitda": "144427000000.00"
}
}
}
}
}
Partial Data Retrieval Using Filters
The fundamentals response can be large, so the filter parameter lets you retrieve just one section or a single field. Section and field names are the response keys shown in the field lists above. For example, 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)
Filter layers are separated by “::” and can nest to any depth. For example, the yearly balance sheet:
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)
You can also request several sections at once with comma-separated filters:
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)
ETFs Fundamentals
Fundamentals for Exchange Traded Funds from exchanges and countries worldwide. Request an ETF by its ticker in TICKER.EXCHANGE format, for example VTI.US or SPY.US. The response has three top-level sections: General (identity and description), Technicals (price-based indicators), and ETF_Data (fund profile, cost, allocations, holdings, valuations, ratings and performance).
https://eodhd.com/api/fundamentals/VTI.US?api_token=demo&fmt=json
General — identity and description fields
- Code — ticker symbol
- Type — instrument type (ETF)
- Name — fund name
- Exchange — listing exchange
- CurrencyCode — trading currency code
- CurrencyName — trading currency name
- CurrencySymbol — trading currency symbol
- CountryName — country of listing
- CountryISO — ISO country code
- OpenFigi — OpenFIGI identifier
- Description — fund description
- Category — fund category
- UpdatedAt — last update date
Technicals — price-based indicators
- Beta — beta coefficient
- 52WeekHigh — 52-week high price
- 52WeekLow — 52-week low price
- 50DayMA — 50-day moving average
- 200DayMA — 200-day moving average
ETF_Data — fund profile, allocations, holdings and performance
- ISIN — fund ISIN
- Company_Name — issuer name
- Company_URL — issuer website
- ETF_URL — fund page URL
- Domicile — country of domicile
- Index_Name — name of the tracked index
- Yield — current distribution yield, percent
- Dividend_Paying_Frequency — distribution frequency
- Inception_Date — fund launch date
- Max_Annual_Mgmt_Charge — maximum annual management charge
- Ongoing_Charge — ongoing charge figure
- Date_Ongoing_Charge — date of the ongoing charge figure
- NetExpenseRatio — net expense ratio
- AnnualHoldingsTurnover — annual holdings turnover
- TotalAssets — total net assets
- Average_Mkt_Cap_Mil — average market capitalization of holdings, in millions
- Market_Capitalisation — holdings split by cap size: Mega, Big, Medium, Small, Micro
- Asset_Allocation — allocation by asset type, each with Long_%, Short_% and Net_Assets_%
- World_Regions — geographic breakdown, each with Equity_% and Relative_to_Category
- Sector_Weights — sector breakdown, each with Equity_% and Relative_to_Category
- Fixed_Income — fixed-income metrics, each with Fund_% and Relative_to_Category
- Holdings_Count — number of holdings
- Top_10_Holdings — ten largest holdings keyed by ticker
- Holdings — full holdings list keyed by ticker
- Valuations_Growth — valuation and growth rates for the portfolio and relative to category
- MorningStar — Morningstar rating, category benchmark and sustainability rating
- Performance — volatility, expected return, Sharpe ratio and returns YTD, 1Y, 3Y, 5Y, 10Y
Response example for VTI (Vanguard Total Stock Market ETF), trimmed to representative fields:
{
"General": {
"Code": "VTI",
"Type": "ETF",
"Name": "Vanguard Total Stock Market Index Fund ETF Shares",
"Exchange": "NYSE ARCA",
"CurrencyCode": "USD",
"CountryName": "USA",
"CountryISO": "US",
"Category": "Large Blend",
"UpdatedAt": "2026-07-14"
},
"Technicals": {
"Beta": 1.03,
"52WeekHigh": 315.75,
"52WeekLow": 236.42,
"50DayMA": 298.11,
"200DayMA": 285.34
},
"ETF_Data": {
"ISIN": "US9229087690",
"Company_Name": "Vanguard",
"Index_Name": "CRSP US Total Market Index",
"Yield": "1.28000",
"Dividend_Paying_Frequency": "Quarterly",
"Inception_Date": "2001-05-24",
"NetExpenseRatio": "0.0003",
"TotalAssets": "1800000000000",
"Average_Mkt_Cap_Mil": "215430.12",
"Market_Capitalisation": {
"Mega": "40.58125",
"Big": "30.86195",
"Medium": "19.21629",
"Small": "6.35233",
"Micro": "2.20510"
},
"Asset_Allocation": {
"Stock US": { "Long_%": "98.72", "Short_%": "0", "Net_Assets_%": "98.72" },
"Cash": { "Long_%": "0.61602", "Short_%": "0", "Net_Assets_%": "0.61602" }
},
"Sector_Weights": {
"Basic Materials": { "Equity_%": "2.02624", "Relative_to_Category": "2.17980" }
},
"Holdings_Count": 3600,
"Top_10_Holdings": {
"NVDA.US": {
"Code": "NVDA",
"Name": "NVIDIA Corporation",
"Sector": "Technology",
"Assets_%": 6.7
}
},
"MorningStar": {
"Ratio": "3",
"Category_Benchmark": "S&P 500 TR USD",
"Sustainability_Ratio": "2"
},
"Performance": {
"1y_Volatility": "12.91",
"3y_Volatility": "13.73",
"3y_SharpRatio": "1.26",
"Returns_YTD": "9.62",
"Returns_1Y": "24.78",
"Returns_3Y": "20.90",
"Returns_5Y": "12.21",
"Returns_10Y": "14.90"
}
}
}
Funds Fundamentals
Fundamentals for mutual funds. We cover equity, balanced and bond-based US mutual funds. Request a fund by its ticker, for example SWPPX.US, or by its ISIN, for example US8085098551. The response has two top-level sections: General (identity, summary and family) and MutualFund_Data (NAV, net assets, yields, expense ratio, allocations, holdings, valuation and growth measures, sector weights, regions and ratings).
https://eodhd.com/api/fundamentals/SWPPX.US?api_token=demo&fmt=json
General — identity, summary and family fields
- Code — ticker symbol
- Type — instrument type (FUND)
- Name — fund name
- Exchange — listing venue
- CurrencyCode — currency code
- CurrencyName — currency name
- CurrencySymbol — currency symbol
- CountryName — country
- CountryISO — ISO country code
- OpenFigi — OpenFIGI identifier
- ISIN — fund ISIN
- CUSIP — fund CUSIP
- Fund_Summary — fund summary text
- Fund_Family — fund family
- Fund_Category — fund category
- Fund_Style — fund style
- Fiscal_Year_End — fiscal year end
- MarketCapitalization — market capitalization
MutualFund_Data — profile, cost, allocations, holdings and ratings
- Fund_Category — fund category
- Fund_Style — fund style
- Nav — net asset value
- Prev_Close_Price — previous close price
- Update_Date — data update date
- Portfolio_Net_Assets — portfolio net assets
- Share_Class_Net_Assets — share class net assets
- Morning_Star_Rating — Morningstar rating
- Morning_Star_Risk_Rating — Morningstar risk rating
- Morning_Star_Category — Morningstar category
- Inception_Date — fund launch date
- Currency — fund currency
- Domicile — country of domicile
- Yield — current yield
- Yield_YTD — year-to-date yield
- Yield_1Year_YTD — one-year yield
- Yield_3Year_YTD — three-year yield
- Yield_5Year_YTD — five-year yield
- Expense_Ratio — expense ratio
- Expense_Ratio_Date — expense ratio date
- Asset_Allocation — allocation by asset type, each with Net_%, Long_%, Short_%, Category_Average and Benchmark
- Value_Growth — valuation and growth measures, each with Stock_Portfolio, Category_Average and Benchmark
- Top_Holdings — top holdings, each with Name and Weight
- Market_Capitalization — capitalization bands, each with Portfolio_%, Category_Average and Benchmark
- Sector_Weights — sectors grouped by Cyclical, Defensive, Sensitive and Bond Sector, each with Amount_%, Category_Average and Benchmark
- World_Regions — regions grouped by Americas, Greater Asia and Greater Europe, each with Stocks_%, Category_Average and Benchmark
- Top_Countries — top countries, for bond-based funds
Response example for the Schwab S&P 500 Index Fund (SWPPX.US), trimmed to representative fields:
{
"General": {
"Code": "SWPPX",
"Type": "FUND",
"Name": "Schwab S&P 500 Index Fund",
"Exchange": "NMFQS",
"CurrencyCode": "USD",
"CountryName": "USA",
"ISIN": "US8085098551",
"Fund_Family": "Charles Schwab",
"Fund_Category": "Large Blend",
"Fund_Style": "Large Blend"
},
"MutualFund_Data": {
"Fund_Category": "Large Blend",
"Nav": "19.53",
"Prev_Close_Price": "19.28",
"Update_Date": "2026-06-30",
"Portfolio_Net_Assets": "144032650000",
"Inception_Date": "1997-05-19",
"Currency": "USD",
"Domicile": "United States",
"Yield": "0.0101",
"Yield_1Year_YTD": "25.8098",
"Expense_Ratio": "0.0200",
"Expense_Ratio_Date": "2026-02-26",
"Asset_Allocation": {
"0": {
"Type": "Cash",
"Net_%": "0.38104",
"Long_%": "0.38104",
"Short_%": null,
"Category_Average": "1.45886",
"Benchmark": "0.00000"
}
},
"Value_Growth": {
"0": {
"Name": "Price/Prospective Earnings",
"Stock_Portfolio": 21.93272,
"Category_Average": 21.54673,
"Benchmark": 22.2222
}
},
"Top_Holdings": {
"0": { "Name": "NVIDIA Corp", "Weight": "7.82%" }
},
"Sector_Weights": {
"Cyclical": {
"0": {
"Name": "Basic Materials",
"Amount_%": 1.78084,
"Category_Average": 2.17980,
"Benchmark": 1.67602
}
}
},
"World_Regions": {
"Americas": {
"0": {
"Name": "North America",
"Stocks_%": 99.578,
"Category_Average": 97.923,
"Benchmark": 99.375
}
}
}
}
}
Index Constituents
The Fundamentals API returns constituent data for indices when you query an index ticker in the INDX exchange, such as GSPC.INDX for the S&P 500. A full list of covered indices is available here.
For an index ticker the response contains three top-level sections. General holds the index metadata. Components holds the current constituents of the index. HistoricalTickerComponents holds the full membership history, listing every ticker that has ever been part of the index together with the dates it joined and left.
https://eodhd.com/api/fundamentals/{INDEX}.INDX?api_token={YOUR_API_TOKEN}&fmt=json
Fields returned for each entry in the Components section:
Components — current constituent fields
- Code — constituent ticker symbol
- Exchange — exchange code where the constituent trades
- Name — company name of the constituent
- Sector — sector classification of the constituent
- Industry — industry classification of the constituent
- Weight — the constituent’s weight in the index, expressed as a fraction (for example 0.0019 means 0.19 percent)
Fields returned for each entry in the HistoricalTickerComponents section:
HistoricalTickerComponents — membership history fields
- Code — constituent ticker symbol
- Name — company name of the constituent
- StartDate — date the ticker was added to the index
- EndDate — date the ticker was removed from the index, or null if it is still a member
- IsActiveNow — 1 if the ticker is a current member of the index, 0 otherwise
- IsDelisted — 1 if the security has since been delisted, 0 otherwise
You can request a single section with the filter parameter, which keeps the response small when you only need the constituents.
Request example — current components of the S&P 500:
https://eodhd.com/api/fundamentals/GSPC.INDX?api_token={YOUR_API_TOKEN}&fmt=json&filter=Components
curl --location "https://eodhd.com/api/fundamentals/GSPC.INDX?api_token={YOUR_API_TOKEN}&fmt=json&filter=Components"
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://eodhd.com/api/fundamentals/GSPC.INDX?api_token={YOUR_API_TOKEN}&fmt=json&filter=Components',
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&filter=Components'
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&filter=Components'
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 (first entries of 503 components):
{
"0": {
"Code": "AIZ",
"Exchange": "US",
"Name": "Assurant, Inc.",
"Sector": "Financial Services",
"Industry": "Insurance - Property & Casualty",
"Weight": 0.0002
},
"1": {
"Code": "PGR",
"Exchange": "US",
"Name": "Progressive Corp",
"Sector": "Financial Services",
"Industry": "Insurance - Property & Casualty",
"Weight": 0.0019
}
}
Request example — full membership history of the S&P 500:
https://eodhd.com/api/fundamentals/GSPC.INDX?api_token={YOUR_API_TOKEN}&fmt=json&filter=HistoricalTickerComponents
curl --location "https://eodhd.com/api/fundamentals/GSPC.INDX?api_token={YOUR_API_TOKEN}&fmt=json&filter=HistoricalTickerComponents"
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://eodhd.com/api/fundamentals/GSPC.INDX?api_token={YOUR_API_TOKEN}&fmt=json&filter=HistoricalTickerComponents',
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&filter=HistoricalTickerComponents'
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&filter=HistoricalTickerComponents'
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 (one current member and one former member):
{
"0": {
"Code": "A",
"Name": "Agilent Technologies Inc",
"StartDate": "2000-06-05",
"EndDate": null,
"IsActiveNow": 1,
"IsDelisted": 0
},
"1": {
"Code": "AAL",
"Name": "American Airlines Group",
"StartDate": "2015-03-23",
"EndDate": "2024-09-23",
"IsActiveNow": 0,
"IsDelisted": 0
}
}
Historical membership is available two ways. HistoricalTickerComponents (above) lists every past and present constituent with its join and leave dates. Alternatively, add historical=1 with a from and to date range to receive a HistoricalComponents section: point-in-time snapshots of the full index membership on each date in the range.
https://eodhd.com/api/fundamentals/GSPC.INDX?historical=1&from=2010-01-01&to=2010-12-31&api_token=demo&fmt=json
curl --location "https://eodhd.com/api/fundamentals/GSPC.INDX?historical=1&from=2010-01-01&to=2010-12-31&api_token=demo&fmt=json"
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://eodhd.com/api/fundamentals/GSPC.INDX?historical=1&from=2010-01-01&to=2010-12-31&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/GSPC.INDX?historical=1&from=2010-01-01&to=2010-12-31&api_token=demo&fmt=json'
data = requests.get(url).json()
print(data)
library(httr)
library(jsonlite)
url <- 'https://eodhd.com/api/fundamentals/GSPC.INDX?historical=1&from=2010-01-01&to=2010-12-31&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)
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}.