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:

URL
cURL
PHP
Python
R
Chat GPT
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")
}
New to coding? Our ChatGPT assistant can generate code in any language tailored to our API. Simply describe how you want to use our data, and get a working piece of code. Don’t forget to replace the API token with your own.

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”:

URL
cURL
PHP
Python
R
Chat GPT
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")
}
New to coding? Our ChatGPT assistant can generate code in any language tailored to our API. Simply describe how you want to use our data, and get a working piece of code. Don’t forget to replace the API token with your own.

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:

URL
cURL
PHP
Python
R
Chat GPT
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")
}
New to coding? Our ChatGPT assistant can generate code in any language tailored to our API. Simply describe how you want to use our data, and get a working piece of code. Don’t forget to replace the API token with your own.

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.

Sign up & Get Data