EODHD APIs offer one of the best ways for trading enthusiasts, developers, and data analysts to incorporate live financial data into their decision-making projects, with a delay of 15-20 min covering almost all stocks on the market and 1 min delay for 1100+ Forex pairs.
Check out our new live dataset for US stocks only but with extended quote.
Compare current live data with similar data feeds we offer:
| Aspect | Real-Time (WebSockets) | Live (Delayed) | Intraday Historical |
|---|---|---|---|
| Transport | WebSocket (push) | HTTPS REST (pull) | HTTPS REST (pull) |
| Latency / Freshness | ~live (<50 ms transport) | Stocks: 15–20 min delay; Currencies: ~1 min | Finalized ~2–3 h after US after-hours close |
| Data types | US trades & quotes; FX ticks; crypto ticks | Latest OHLCV snapshot (1-min updates) | OHLCV bars at 1m / 5m / 1h |
| Time ranges | n/a (streaming) | n/a (snapshot feed) | 1m: 120 d · 5m: 600 d · 1h: 7200 d |
| Markets & assets* | US stocks (pre/post supported), Forex & Digital Currencies | US & Global Stocks, Forex & Digital Currencies | US & Global Stocks, Forex & Digital Currencies |
| Best for | Dashboards, signals, market-making tools | Quote tickers, watchlists, lightweight UIs | Backtests, analytics, charting |
* Get the full list of covered tickers.
Overview
The Live (Delayed) Data API returns the latest OHLCV snapshot for a symbol: open, high, low, close, volume, previous close, and change, refreshed at a one-minute frequency. It covers US and global stocks, ETFs, funds, forex, and cryptocurrencies. Request one symbol in the path, or several at once with the s parameter. Each symbol returns a single quote object.
Prices are delayed: 15-20 minutes for stocks and about 1 minute for forex. For true real-time trades and quotes use the WebSockets Real-Time API instead.
Live (Delayed) Quote
Retrieve the latest delayed quote for a symbol. The path segment is the symbol in TICKER.EXCHANGE form, for example AAPL.US or EUR.FOREX.
https://eodhd.com/api/real-time/{ticker}?api_token=YOUR_TOKEN
Method GET. Authentication by api_token. The default output is CSV; add fmt=json for a JSON object.
- 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
s
string
optional
fmt
enum
optional
filter
enum
optional
Request Example
Here is an example of the live (delayed) quote for AAPL (Apple Inc). The demo token only works for AAPL.US, TSLA.US, VTI.US, AMZN.US, and BTC-USD.
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")
}
Try it now (it's free)!
How to use it (YouTube)
Response Example
{
"code": "AAPL.US",
"timestamp": 1783974420,
"gmtoffset": 0,
"open": 317.015,
"high": 323.45,
"low": 315.78,
"close": 317.31,
"volume": 43138419,
"previousClose": 315.32,
"change": 1.99,
"change_p": 0.6311
}
Response Fields
| Field | Type | Description |
|---|---|---|
| code | string | Ticker with exchange suffix |
| timestamp | integer | Quote time as Unix time, seconds since 1970-01-01 UTC |
| gmtoffset | integer | Offset from UTC, in seconds |
| open | number | Session opening price |
| high | number | Session high |
| low | number | Session low |
| close | number | Latest delayed price |
| volume | integer | Session volume |
| previousClose | number | Previous session close |
| change | number | Absolute change versus previous close |
| change_p | number | Percentage change versus previous close |
Multiple Tickers with One Request
Add the s parameter to fetch several symbols in one request. List the extra symbols comma-separated; the symbol in the path is always included first. For example, this returns AAPL.US, VTI, and EUR.FOREX together, as a JSON array of quote objects.
https://eodhd.com/api/real-time/AAPL.US?s=VTI,EUR.FOREX&api_token=demo&fmt=json
curl --location "https://eodhd.com/api/real-time/AAPL.US?s=VTI,EUR.FOREX&api_token=demo&fmt=json"
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://eodhd.com/api/real-time/AAPL.US?s=VTI,EUR.FOREX&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?s=VTI,EUR.FOREX&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?s=VTI,EUR.FOREX&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)
Single Value Output
Set the filter parameter to a field name to return only that field’s value as a single bare value, instead of the full quote. This is convenient for spreadsheet functions such as the Excel WEBSERVICE function. For example, filter=close returns the latest price and filter=change_p returns the percentage change.
https://eodhd.com/api/real-time/AAPL.US?api_token=demo&fmt=json&filter=close
curl --location "https://eodhd.com/api/real-time/AAPL.US?api_token=demo&fmt=json&filter=close"
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://eodhd.com/api/real-time/AAPL.US?api_token=demo&fmt=json&filter=close',
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&filter=close'
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&filter=close'
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)
Timestamp Field Explanation
We use Unix time for our timestamp field. Unix time represents a point in time by counting the number of seconds that have passed since 00:00:00 Coordinated Universal Time (UTC) on Thursday, January 1, 1970. You can easily check and convert all our timestamps using this tool.