Options Data for US Stocks: End-of-Day and Historical Learn more

Exchanges API: Get List of Supported Exchanges

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
Your EODHD API token. This endpoint takes no other parameters

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}
(Sign up for free to get an API token)
curl --location "https://eodhd.com/api/exchanges-list/?api_token={YOUR_API_TOKEN}&fmt=json"
(Sign up for free to get an API token)
$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();
}
(Sign up for free to get an API token)
import requests

url = f'https://eodhd.com/api/exchanges-list/?api_token={YOUR_API_TOKEN}&fmt=json'
data = requests.get(url).json()

print(data)
(Sign up for free to get an API token)
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")
}
(Sign up for free to get an API token)
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)

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

FieldTypeDescription
NamestringFull name of the exchange
CodestringExchange code used across the EODHD APIs — the suffix in a symbol and the path parameter of the bulk endpoints
OperatingMICstring or nullISO 10383 operating MIC codes, comma-separated where a code covers several venues. Null on the virtual exchanges
CountrystringCountry the exchange operates in, or “Unknown” for a virtual exchange
CurrencystringDefault trading currency, or “Unknown” where instruments are quoted in several currencies
CountryISO2stringISO 3166-1 alpha-2 country code. Empty on the virtual exchanges
CountryISO3stringISO 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:

CodeName in the responseWhat it holds
CCCryptocurrenciesCryptocurrency pairs, for example BTC-USD.CC — see List of Supported Crypto Currencies
FOREXFOREXCurrency pairs, for example EURUSD.FOREX — see List of Supported FOREX Currencies
MONEYMoney Market Virtual ExchangeReference and policy rates and other money-market benchmarks
GBONDGovernment BondsGovernment bond instruments
EUFUNDEurope Fund Virtual ExchangeEuropean 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.

Sign up & Get Data

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
Exchange code from the list above, for example US, LSE, WAR or CC. Case-insensitive

Query Parameters

api_token string required
Your EODHD API token
fmt enum optional
Response format. Allowed values: json, csv. Omitting the parameter returns CSV (Default: csv)
delisted integer optional
Set to 1 to return delisted tickers instead of active ones. The two sets do not overlap, so request the endpoint twice if you need both (Default: 0)
type enum optional
Filter by instrument type. Allowed values: common_stock, preferred_stock, stock, etf, fund. Case-insensitive; an unsupported value returns HTTP 422 with the allowed list
symbols string optional
Return only the listed tickers, comma-separated and without the exchange suffix, for example CDR,PKN. A cheap way to check whether specific symbols are covered

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
(Sign up for free to get an API token)
curl --location "https://eodhd.com/api/exchange-symbol-list/WAR?api_token={YOUR_API_TOKEN}&fmt=json"
(Sign up for free to get an API token)
$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();
}
(Sign up for free to get an API token)
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)
(Sign up for free to get an API token)
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")
}
(Sign up for free to get an API token)
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)

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

FieldTypeDescription
CodestringTicker code without the exchange suffix. Append the exchange code to use it elsewhere, for example CDR.WAR
NamestringCompany or instrument name
CountrystringCountry of the listing
ExchangestringExchange code. On the composite US code this is the specific venue — NYSE, NASDAQ, NYSE ARCA, BATS, PINK, NMFQS and so on
CurrencystringTrading currency of the listing
TypestringInstrument type: Common Stock, Preferred Stock, ETF, FUND, Mutual Fund, Warrant, Unit, Notes and others
Isinstring or nullISIN 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.

Compare plans and find your fit
Free and paid plans for individual and commercial use
Go to Pricing
Chat