Two endpoints answer two questions: which exchanges EODHD covers, and what is listed on a given exchange. The first returns every supported exchange — 70 as of August 2026, and the number grows as coverage does — with its code, operating MIC, country and trading currency. The second returns either the active tickers on an exchange or the delisted ones, depending on the delisted parameter.
The exchange code you get from the first endpoint is the code you use everywhere else in the platform: as the suffix in a symbol such as CDR.WAR, and as the path parameter of every bulk endpoint. Start here when you are mapping our coverage onto your own instrument universe.
List of supported exchanges
https://eodhd.com/api/exchanges-list/?api_token=YOUR_API_TOKEN
Parameters
api_token
string
required
This endpoint always answers in JSON. Unlike the ticker endpoint below, it has no fmt parameter — passing fmt=csv is accepted and ignored, and the response is still JSON.
Request Example
https://eodhd.com/api/exchanges-list/?api_token={YOUR_API_TOKEN}
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")
}
Try it now (it's free)!
How to use it (YouTube)
Response Example
[
{
"Name": "USA Stocks",
"Code": "US",
"OperatingMIC": "XNAS, XNYS, OTCM, XCBO",
"Country": "USA",
"Currency": "USD",
"CountryISO2": "US",
"CountryISO3": "USA"
},
{
"Name": "London Exchange",
"Code": "LSE",
"OperatingMIC": "XLON",
"Country": "UK",
"Currency": "GBP",
"CountryISO2": "GB",
"CountryISO3": "GBR"
}
]
Response Fields
| Field | Type | Description |
|---|---|---|
| Name | string | Full name of the exchange |
| Code | string | Exchange code used across the EODHD APIs — the suffix in a symbol and the path parameter of the bulk endpoints |
| OperatingMIC | string or null | ISO 10383 operating MIC codes, comma-separated where a code covers several venues. Null on the virtual exchanges |
| Country | string | Country the exchange operates in, or “Unknown” for a virtual exchange |
| Currency | string | Default trading currency, or “Unknown” where instruments are quoted in several currencies |
| CountryISO2 | string | ISO 3166-1 alpha-2 country code. Empty on the virtual exchanges |
| CountryISO3 | string | ISO 3166-1 alpha-3 country code. Empty on the virtual exchanges |
Virtual exchanges
Five entries in that list are not physical venues. They are containers for asset classes that have no single exchange, and they behave like any other exchange code — you pass them to the ticker endpoint and you use them as symbol suffixes:
| Code | Name in the response | What it holds |
|---|---|---|
| CC | Cryptocurrencies | Cryptocurrency pairs, for example BTC-USD.CC — see List of Supported Crypto Currencies |
| FOREX | FOREX | Currency pairs, for example EURUSD.FOREX — see List of Supported FOREX Currencies |
| MONEY | Money Market Virtual Exchange | Reference and policy rates and other money-market benchmarks |
| GBOND | Government Bonds | Government bond instruments |
| EUFUND | Europe Fund Virtual Exchange | European mutual funds, quoted in EUR |
These are the rows where Country and Currency read “Unknown” and the ISO country fields come back empty — there is no country to report for an asset class.
All five work with the ticker endpoint exactly like a physical exchange. Their sizes differ wildly: EUFUND holds 69,327 instruments — the largest list on the platform, larger than the whole of the US — against 997 on FOREX, 240 on GBOND and 90 on MONEY.
Tickers listed on an exchange
https://eodhd.com/api/exchange-symbol-list/WAR?api_token=YOUR_API_TOKEN&fmt=json
Replace WAR with any code from the exchange list — US, LSE, XETRA, CC and so on. Without a fmt parameter this endpoint returns CSV, so add fmt=json when you want JSON.
Path Parameter
exchangeCode
string
required
Query Parameters
api_token
string
required
fmt
enum
optional
delisted
integer
optional
type
enum
optional
symbols
string
optional
The delisted parameter replaces the result set rather than extending it. A request with delisted=1 returns only tickers that are no longer traded, and none of the active ones — on the Warsaw exchange that is 417 delisted against 612 active. To build a full historical universe, call the endpoint twice and merge the two responses on the Code field.
A few behaviours worth knowing before you build against this endpoint. The filters combine with AND, so symbols together with type returns only the listed codes that also match the type. Codes in the symbols list that do not exist on the exchange are skipped silently — you get the rows that matched and HTTP 200, never an error, so compare the response against your request if a missing symbol matters. An exchange code that does not exist returns HTTP 404 with “Exchange Not Found.” The values stock and common_stock behave identically. And there is no pagination: the whole exchange arrives in one response, which for US is roughly 7.7 MB of JSON and for EUFUND considerably more, so stream or buffer accordingly. CSV responses carry a header row.
Request Example
https://eodhd.com/api/exchange-symbol-list/WAR?api_token={YOUR_API_TOKEN}&fmt=json
curl --location "https://eodhd.com/api/exchange-symbol-list/WAR?api_token={YOUR_API_TOKEN}&fmt=json"
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://eodhd.com/api/exchange-symbol-list/WAR?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/WAR?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/WAR?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)
Response Example
[
{
"Code": "CDR",
"Name": "CD PROJEKT SA",
"Country": "Poland",
"Exchange": "WAR",
"Currency": "PLN",
"Type": "Common Stock",
"Isin": "PLOPTTC00011"
},
{
"Code": "PKN",
"Name": "PKN Orlen SA",
"Country": "Poland",
"Exchange": "WAR",
"Currency": "PLN",
"Type": "Common Stock",
"Isin": "PLPKN0000018"
}
]
Response Fields
| Field | Type | Description |
|---|---|---|
| Code | string | Ticker code without the exchange suffix. Append the exchange code to use it elsewhere, for example CDR.WAR |
| Name | string | Company or instrument name |
| Country | string | Country of the listing |
| Exchange | string | Exchange code. On the composite US code this is the specific venue — NYSE, NASDAQ, NYSE ARCA, BATS, PINK, NMFQS and so on |
| Currency | string | Trading currency of the listing |
| Type | string | Instrument type: Common Stock, Preferred Stock, ETF, FUND, Mutual Fund, Warrant, Unit, Notes and others |
| Isin | string or null | ISIN where we have one. Coverage is partial — on the US exchange roughly 29% of tickers have no ISIN, mostly funds and OTC lines |
The type filter accepts fewer values than the Type field returns. Common Stock, Preferred Stock, ETF and FUND are all reachable through it, but Mutual Fund, Warrant, Unit and Notes are not — to isolate those, request the exchange without the filter and select on the Type field yourself.
The US exchange code
US is a composite code: one request returns every US listing across all venues — around 51,600 tickers, of which NASDAQ, NYSE, NYSE ARCA and BATS are the exchange-traded part and the rest sits on NMFQS and the OTC tiers. The Exchange field on each row tells you which venue the ticker actually belongs to, so you can filter after the fact.
If you would rather have the venue narrow the request instead, pass it as the exchange code directly: NYSE, NASDAQ, BATS, OTCQB, PINK, OTCQX, OTCMKTS, NMFQS, NYSE MKT, OTCBB, OTCGREY and OTC all work in place of US.
Where to go next
Once you have an exchange code and its tickers, the rest of the platform takes the same symbols. Trading calendars and session times come from the Trading Hours and Market Holidays API. Price history comes from the End-of-Day API, and a whole exchange at once from the Bulk API. Company data comes from the Fundamental Data API.
To resolve a name or an identifier into a ticker rather than enumerate a whole exchange, use the Search API. For the asset-class lists in one place, see List of Supported Tickers, and for call costs and rate limits, API Limits. Our full coverage is also browsable at list of stock markets.
Rendering exchanges or tickers in a product? Our Stock Market Logos API on the EODHD Marketplace returns a company logo for any ticker across 60+ equity exchanges, keyed by the same symbols you get here.