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 Forex — 994 active pairs as of August 2026, a set that moves as pairs are listed and retired, and the exchange symbol list always returns the current one.
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 | Last price plus session OHLC snapshot (1-min updates), not minute bars | 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 delayed snapshot for a symbol: the current price plus the session open, high, low and volume, the previous close, and the change, refreshed about once a minute. 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.
This is a snapshot, not a one-minute bar. The open, high, low and volume describe the whole trading session so far and stay put as the session runs — only the close field moves, and it carries the latest delayed price rather than the close of any particular minute. If you need OHLCV per minute, per five minutes or per hour, use the Intraday Historical Data API.
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 is limited to a small set of tickers — AAPL.US, MSFT.US, TSLA.US, AMZN.US, VTI.US, BTC-USD.CC and EUR.FOREX — and anything else returns HTTP 403.
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.