Welcome to EODHD! We specialize in providing extensive financial data through our APIs. With our services, you can seamlessly integrate a wide range of financial data into your projects, including end-of-day (EOD), real-time, intraday, and historical data for stocks, ETFs, funds, indices, futures, bonds, options, forex pairs, and alternative currencies, across various programming languages.
Our API is designed to be user-friendly, and to further simplify the development process, we offer libraries for the most popular programming languages, including PHP, C#, and R, among others. You can find these libraries here and also follow us on GitHub for updates.
Let’s start a quick tour through our most popular API endpoints and useful widgets. All examples we provide are in JSON format, and we highly recommend installing the JSON Viewer Plugin for Chrome before testing API requests in your browser. It will ensure that all returned data appears well-structured and easier to read.
API Key (token)
An API key or token looks like 15d35814de0491.03453438 (each API key is different) and is necessary to make any API requests for our data. The key will be generated automatically after registration and can be found in the user dashboard or in the email sent right after signing up.
All API requests include this token as a parameter. This is how our server determines which data is available to which user, as we offer different plans and have an API call quota for each user. Refer to the API request examples further in this article – all of them use the “demo” API key or your API key if you are already a registered user and logged in.
Important! Do not share this API key publicly, as other users might use your plan quota.
It is possible to re-generate API key on user dashboard page.
Demo mode
Without registration (or without API key) you can test a few stock & forex tickers for getting almost all types of data we offer – Fundamental Data, EOD Historical Data, Live Data, Real-time, Financial News API. For demo API requests simply use “demo” for API key in JSON API requests.
Users can use “demo” API key in our Excel & Google Sheets as well. It will be set there by default after installation.
Tickers which are working with demo key are:
AAPL.US | TSLA.US | VTI.US | AMZN.US | MSFT.US | EUR-USD.
Free plan
If you are a registered user but haven’t subscribed to any of our extended payed plans, you are probably on our free plan. Free plan is a great way to test our data deeper. It offers access to most of stocks, forex pairs, ETFs and covers EOD Historical (limited 1 year history only) data, Live data, Splits & Dividents and more. Visit our pricing page to see all the data included.
API call limits
To maintain the stability of our data servers and provide all users with equal quality service, we have two types of API limits: Minute API Limit and Daily API Limit. Each plan in our pricing mentions the number of API calls included. To learn more about how API call limits work, read the article.
It is possible to buy extra API calls and keep them as a buffer. Additionally, you can increase your daily API call limits for an extra fee. These options are available on the user dashboard page.
Stock Prices and more in Excel and Google Sheets
If you are not a developer but still in need of data such as stock prices, end-of-day (with charts), intraday, and fundamental data API, among others, we recommend you try our Excel and Google Sheets add-ins. They can work with “demo” key as well (set there by default) but we reccomend to sign up for free to get an API key from free plan. With it, more data will be available.
Financial Data API examples
Let’s begin testing our API with some of the most common requests, which you can try out directly in your browser.
Using our Exchanges and Get List of Tickers API, here’s how to request a list of all supported exchanges along with their codes (please note that this specific API returns data only in JSON format):
https://eodhd.com/api/exchanges-list/?api_token={YOUR_API_TOKEN}&fmt=json
curl --location "https://eodhd.com/api/exchanges-list/?api_token={YOUR_API_TOKEN}&fmt=json"
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://eodhd.com/api/exchanges-list/?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/exchanges-list/?api_token={YOUR_API_TOKEN}&fmt=json'
data = requests.get(url).json()
print(data)
library(httr)
library(jsonlite)
url <- 'https://eodhd.com/api/exchanges-list/?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")
}
Now, let’s retrieve the list of tickers per exchange. For the USA, the exchange code will be ‘US’. Please note that this API can return data in both CSV and JSON formats (using the parameter ‘&fmt’), with CSV being the default when no ‘&fmt’ is specified. In our case, we are expecting JSON:
https://eodhd.com/api/exchange-symbol-list/{EXCHANGE_CODE}?api_token={YOUR_API_TOKEN}&fmt=json
curl --location "https://eodhd.com/api/exchange-symbol-list/{EXCHANGE_CODE}?api_token={YOUR_API_TOKEN}&fmt=json"
$curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => 'https://eodhd.com/api/exchange-symbol-list/{EXCHANGE_CODE}?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/exchange-symbol-list/{EXCHANGE_CODE}?api_token={YOUR_API_TOKEN}&fmt=json' data = requests.get(url).json() print(data)
library(httr) library(jsonlite) url <- 'https://eodhd.com/api/exchange-symbol-list/{EXCHANGE_CODE}?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") }
To get End Of Day (EOD data) please use our End-Of-Day Historical Stock Market Data API:
https://eodhd.com/api/eod/AAPL.US?api_token=demo&fmt=json
curl --location "https://eodhd.com/api/eod/AAPL.US?api_token=demo&fmt=json"
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://eodhd.com/api/eod/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/eod/AAPL.US?api_token=demo&fmt=json'
data = requests.get(url).json()
print(data)
library(httr)
library(jsonlite)
url <- 'https://eodhd.com/api/eod/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")
}
To get Live/Delayed (15-minutes delayed data) please use our Live (Delayed) Stock Prices API:
https://eodhd.com/api/real-time/AAPL.US?api_token=demo&fmt=json
curl --location "https://eodhd.com/api/real-time/AAPL.US?api_token=demo&fmt=json"
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://eodhd.com/api/real-time/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/real-time/AAPL.US?api_token=demo&fmt=json'
data = requests.get(url).json()
print(data)
library(httr)
library(jsonlite)
url <- 'https://eodhd.com/api/real-time/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")
}
To get Fundamental Data please use our Fundamental Data: Stocks, ETFs, Mutual Funds, Indices:
https://eodhd.com/api/fundamentals/AAPL.US?api_token=demo&fmt=json
curl --location "https://eodhd.com/api/fundamentals/AAPL.US?api_token=demo&fmt=json"
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://eodhd.com/api/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/fundamentals/AAPL.US?api_token=demo&fmt=json'
data = requests.get(url).json()
print(data)
library(httr)
library(jsonlite)
url <- 'https://eodhd.com/api/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")
}
To get Intraday Data please use our Intraday Historical Data API:
https://eodhd.com/api/intraday/AAPL.US?api_token=demo&fmt=json
curl --location "https://eodhd.com/api/intraday/AAPL.US?api_token=demo&fmt=json"
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://eodhd.com/api/intraday/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/intraday/AAPL.US?api_token=demo&fmt=json'
data = requests.get(url).json()
print(data)
library(httr)
library(jsonlite)
url <- 'https://eodhd.com/api/intraday/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")
}
To get Splits please use our Historical Splits and Dividends API:
https://eodhd.com/api/splits/AAPL.US?from=2000-01-01&api_token=demo&fmt=json
curl --location "https://eodhd.com/api/splits/AAPL.US?from=2000-01-01&api_token=demo&fmt=json"
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://eodhd.com/api/splits/AAPL.US?from=2000-01-01&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/splits/AAPL.US?from=2000-01-01&api_token=demo&fmt=json'
data = requests.get(url).json()
print(data)
library(httr)
library(jsonlite)
url <- 'https://eodhd.com/api/splits/AAPL.US?from=2000-01-01&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")
}
To get Dividends please use our Historical Splits and Dividends API:
https://eodhd.com/api/div/AAPL.US?from=2000-01-01&api_token=demo&fmt=json
curl --location "https://eodhd.com/api/div/AAPL.US?from=2000-01-01&api_token=demo&fmt=json"
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://eodhd.com/api/div/AAPL.US?from=2000-01-01&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/div/AAPL.US?from=2000-01-01&api_token=demo&fmt=json'
data = requests.get(url).json()
print(data)
library(httr)
library(jsonlite)
url <- 'https://eodhd.com/api/div/AAPL.US?from=2000-01-01&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")
}
To Search stocks and any other assets please use our Search API:
https://eodhd.com/api/search/{query_string}?api_token={YOUR_API_TOKEN}&fmt=json
curl --location "https://eodhd.com/api/search/{query_string}?api_token={YOUR_API_TOKEN}&fmt=json"
$curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => 'https://eodhd.com/api/search/{query_string}?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/search/{query_string}?api_token={YOUR_API_TOKEN}&fmt=json' data = requests.get(url).json() print(data)
library(httr) library(jsonlite) url <- 'https://eodhd.com/api/search/{query_string}?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") }
These are a few examples, but we recommend studying our documentation and exploring additional APIs for various types of data. We offer over 50 API endpoints and continually add new data sources, APIs, and applied libraries.
Documentation & useful articles
For detailed documentation, please visit our Documentation section. Feel free to use the Search feature to find information on specific topics.
Explore all the different ways you can make the most of our Financial Data API in our educational Academy section. This collection, gathered over several years from the insights of top traders, programmers, and market enthusiasts, offers articles on diverse trading strategies, analytical methods, and the application of AI in financial data analysis.
API Marketplace
In addition to our main data plans, our Marketplace offers unique data packages from both our partners and ourselves. All packages operate via APIs and work seamlessly with the same EODHD accounts and API tokens. Explore tools for technical analysis, ESG data, S&P historical indices, and much more.
24/7 live support
One of our points of pride is our live support, which can not only advise you on any questions related to EODHD features and pricing plans but also resolve most technical issues while you’re online. You can contact support via the live chat in the lower right corner of every page on our site.