With the Bulk Fundamentals API endpoint, you can download fundamental data for hundreds of companies in a single request.
To get access to the Bulk Fundamentals API, you need to subscribe to the Extended Fundamentals subscription plan. Details of this plan are provided upon request – please contact support@eodhistoricaldata.com.
API Call Cost
- A regular Fundamentals API request costs 10 API calls.
- AÂ Bulk Fundamentals APIÂ request:
- Costs 100 API calls if no symbols are specified.
- Costs 100 + the number of symbols if the “symbols” parameter is used.
For example, a bulk request for 3 symbols will cost 103 API calls.
Limitations
Due to the high load of these requests and other technical reasons, the Bulk Fundamentals API has the following limitations:
- Only stocks are supported. ETFs and Mutual Funds are not supported.
- By default:
- offset is set to 0
- limit is set to 500
- If limit is greater than 500, it will automatically be reset to 500.
- The following US exchanges can be addressed separately in addition to the general US code:
- NASDAQ
- NYSE (or NYSE MKT)
- BATS
- AMEX
- All non-US exchanges are supported as usual.
You can find the full list of supported exchanges and their codes here.
Request Examples
Get fundamentals for an entire exchange:
https://eodhd.com/api/bulk-fundamentals/NASDAQ?api_token={YOUR_API_TOKEN}&fmt=json
curl --location "https://eodhd.com/api/bulk-fundamentals/NASDAQ?api_token={YOUR_API_TOKEN}&fmt=json"
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://eodhd.com/api/bulk-fundamentals/NASDAQ?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/bulk-fundamentals/NASDAQ?api_token={YOUR_API_TOKEN}&fmt=json'
data = requests.get(url).json()
print(data)
library(httr)
library(jsonlite)
url <- 'https://eodhd.com/api/bulk-fundamentals/NASDAQ?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)
The default output format is CSV. To receive data in JSON format, you must add &fmt=json. We strongly recommend using the JSON format.
Pagination with offset and limit
To reduce the amount of data returned in a single request, you can use the “offset” and “limit” parameters, which work like pagination:
- limit – number of symbols to return
- offset – starting symbol position
Example: “to retrieve 200 symbols starting from symbol #1000”:
https://eodhd.com/api/bulk-fundamentals/NASDAQ?offset=500&limit=100&api_token={YOUR_API_TOKEN}&fmt=json
curl --location "https://eodhd.com/api/bulk-fundamentals/NASDAQ?offset=500&limit=100&api_token={YOUR_API_TOKEN}&fmt=json"
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://eodhd.com/api/bulk-fundamentals/NASDAQ?offset=500&limit=100&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/bulk-fundamentals/NASDAQ?offset=500&limit=100&api_token={YOUR_API_TOKEN}&fmt=json' data = requests.get(url).json() print(data)
library(httr) library(jsonlite) url <- 'https://eodhd.com/api/bulk-fundamentals/NASDAQ?offset=500&limit=100&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)
Request data for specific symbols
You can also retrieve fundamentals data for specific symbols instead of an entire exchange by using the “symbols” parameter.
When “symbols” is specified, the exchange code is ignored.
Example:
https://eodhd.com/api/bulk-fundamentals/NASDAQ?&symbols=AAPL.US,MSFT.US&api_token={YOUR_API_TOKEN}&fmt=json
curl --location "https://eodhd.com/api/bulk-fundamentals/NASDAQ?&symbols=AAPL.US,MSFT.US&api_token={YOUR_API_TOKEN}&fmt=json"
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://eodhd.com/api/bulk-fundamentals/NASDAQ?&symbols=AAPL.US,MSFT.US&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/bulk-fundamentals/NASDAQ?&symbols=AAPL.US,MSFT.US&api_token={YOUR_API_TOKEN}&fmt=json' data = requests.get(url).json() print(data)
library(httr) library(jsonlite) url <- 'https://eodhd.com/api/bulk-fundamentals/NASDAQ?&symbols=AAPL.US,MSFT.US&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)
Bulk Fundamentals Output
Here is an example of the Bulk Fundamentals API output for Apple Inc. (AAPL.US) and Microsoft Corporation (MSFT.US) in CSV format.
Most fields are the same as in the standard Fundamentals API, with the following differences:
- The bulk output contains fewer fields than the single-symbol fundamentals response.
- Historical data is limited to:
- The last 4 quarters
- The last 4 years
- The original Bulk Fundamentals API was developed based on an earlier version of the fundamentals template, which is why some newer fields may be missing.
Version 1.2 Output
If you need the output to be as close as possible to the current Fundamentals API template, you can add the parameter:
&version=1.2
With version 1.2:
- The output fields closely match those of the single-symbol fundamentals request (for example, Earnings Trends will be included).
- The 4 quarters / 4 years historical data limitation still applies.
- Version 1.2 output is available only in JSON format.