MCP Server For Financial Data by EODHD Learn more

[REVIEW] Delisted Stock Companies Data

When a company is acquired, goes bankrupt, or is otherwise removed from an exchange, its ticker stops trading — but its price history, fundamentals, dividends and splits stay in EODHD. You can list every delisted symbol on an exchange and then query it with the same endpoints you use for active tickers. This is what makes survivorship-bias-free backtesting and long-horizon research possible.

Working with delisted data is a two-step job: find the ticker in the exchange symbol list, then query the regular data endpoints with it. The traps are all in step one — the ticker you remember may now belong to a different company.

Scope at a glance. Delisted symbols are listed per exchange with the delisted=1 flag, and every exchange we cover has them — 60,191 on US alone, 9,587 on Frankfurt, 4,077 on the LSE (September 2026). Once you have a code, the End-of-Day, Fundamentals, Dividends, Splits and Intraday endpoints behave exactly as they do for active tickers. Listing the symbols costs 1 API call.

Step 1 — List Delisted Tickers

Use the Exchange Symbol List endpoint with delisted=1. It returns only the inactive symbols for that exchange; without the flag, or with delisted=0, you get only the active ones. The exchange code goes in the path — US covers the combined US exchanges.

https://eodhd.com/api/exchange-symbol-list/{EXCHANGE}?delisted=1&api_token=YOUR_API_TOKEN

Method GET. Authentication by api_token. The default output is CSV; add fmt=json for a JSON array.

Parameters

api_token string required
Your EODHD API token
delisted enum optional
Set to 1 to return only delisted (inactive) symbols instead of the active ones. Allowed values: 0, 1 (Default: 0)
type enum optional
Filter by instrument group. Allowed values: common_stock, preferred_stock, stock, etf, fund. Any other value returns HTTP 422
fmt enum optional
Output format. Allowed values: csv, json (Default: csv)

Request Example

https://eodhd.com/api/exchange-symbol-list/US?delisted=1&type=common_stock&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/US?delisted=1&type=common_stock&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/US?delisted=1&type=common_stock&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/US?delisted=1&type=common_stock&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/US?delisted=1&type=common_stock&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

Two rows from the delisted common stocks on US — one from 2003, one from 2023:

[
  {
    "Code": "AAAB",
    "Name": "Admiralty Bancorp Inc",
    "Country": "USA",
    "Exchange": "NASDAQ",
    "Currency": "USD",
    "Type": "Common Stock",
    "Isin": null
  },
  {
    "Code": "ATVI",
    "Name": "Activision Blizzard Inc",
    "Country": "USA",
    "Exchange": "NASDAQ",
    "Currency": "USD",
    "Type": "Common Stock",
    "Isin": "US00507V1098"
  }
]

Response Fields

FieldTypeDescription
CodestringTicker symbol code, without the exchange suffix
NamestringCompany or instrument name
CountrystringCountry of the exchange
ExchangestringExchange the ticker was listed on
CurrencystringTrading currency
TypestringInstrument type, for example Common Stock, FUND, ETF or Preferred Stock
Isinstring or nullISIN code, if available

How the type Filter Groups Instruments

The five allowed values are groups, not literal Type strings. On the US delisted list they break down like this:

type=Type values it returnsRows on US
common_stockCommon Stock33,051
preferred_stockPreferred Stock1,241
stockCommon Stock and Preferred Stock34,292
etfETF and ETC3,014
fundFUND and Mutual Fund22,484
(omitted)everything60,191

The groups do not cover the whole list. 401 US rows are typed Unit, Notes, Warrant, BOND or UNIT, and no value of the type parameter returns them. Omit the parameter and filter client-side if you need those.

Delisted Coverage by Exchange

Delisted symbols are not a US-only feature. A sample of exchange codes, measured in September 2026:

Exchange codeMarketDelisted symbols
USAll US exchanges60,191
FFrankfurt9,587
BEBerlin8,077
LSELondon4,077
AUAustralia2,038
VTSX Venture2,022
XETRAXetra1,768
SWSIX Swiss1,715
TOToronto1,656
PAEuronext Paris1,362
NSEIndia NSE940
HKHong Kong806

The full list of exchange codes is in the Exchanges API.

Reused Tickers and the _old Convention

This is the single biggest trap in delisted data, and it fails silently. When a ticker is freed up and later assigned to a different company, EODHD keeps the original company under the same code with an _old suffix. The bare code belongs to whoever holds it today.

You ask forYou actually getThe company you meant is at
APC.USARKO Petroleum Corp — active, NASDAQAPC_old.US — Anadarko Petroleum, delisted 2019-08-08
STI.USSolidion Technology Inc. — active, NASDAQSTI_old.US — SunTrust Banks, delisted 2019-12-06
PCLN.USPictet Cleaner Planet ETF — active, NYSE ARCAPCLN_old.US — Booking Holdings, formerly Priceline
BITA.USnot the Chinese car portalBITA_old.US — Bitauto Holdings

Nothing about this is an error. A request for APC.US returns HTTP 200 and a clean price series — it just starts in 2026 and belongs to ARKO Petroleum, not Anadarko. If your backtest quietly loses a company’s history and gains a short, unrelated series, this is why.

1,778 codes on the US delisted list carry the _old suffix. A few use a trailing digit instead, such as TWX1 alongside TWX. The safe pattern is to resolve the company against the delisted symbol list rather than typing a remembered ticker: search the list by Name or Isin, and use the Code it gives you.

Step 2 — Get the Data for a Delisted Ticker

Once you have the code, query the regular endpoints. A delisted ticker keeps its full history up to the delisting date, and nothing about the request changes.

DataEndpointAPI calls
End-of-day prices/api/eod/{TICKER}1
Fundamentals/api/fundamentals/{TICKER}10
Dividends/api/div/{TICKER}1
Splits/api/splits/{TICKER}1
Intraday/api/intraday/{TICKER}5

Request Example

End-of-day prices for ATVI.US — Activision Blizzard, delisted on 13 October 2023 after Microsoft completed the acquisition. The request returns 7,487 daily bars going back to 25 October 1993.

https://eodhd.com/api/eod/ATVI.US?api_token=YOUR_API_TOKEN&fmt=json
(Sign up for free to get an API token)
curl --location "https://eodhd.com/api/eod/ATVI.US?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/eod/ATVI.US?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/eod/ATVI.US?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/eod/ATVI.US?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

The oldest bar and the final two:

[
  {
    "date": "1993-10-25",
    "open": 1.25,
    "high": 1.25,
    "low": 0.9375,
    "close": 0.9375,
    "adjusted_close": 0.0686,
    "volume": 18000
  },
  ...
  {
    "date": "2023-10-12",
    "open": 94.48,
    "high": 94.54,
    "low": 94.305,
    "close": 94.42,
    "adjusted_close": 94.42,
    "volume": 7325799
  },
  {
    "date": "2023-10-13",
    "open": 94.42,
    "high": 94.42,
    "low": 94.42,
    "close": 94.42,
    "adjusted_close": 94.42,
    "volume": 0
  }
]

The last bar of a delisted series is usually a stub: open, high, low and close all equal the final settlement price and volume is 0. Treat it as the delisting marker, not as a trading day — a returns calculation that includes it will see a zero-volume bar, and a liquidity filter will drop it.

Intraday Needs an Explicit Date Range

The Intraday API defaults to a recent window. For a delisted ticker that window sits entirely after the last trade, so a request without from and to returns an empty array with HTTP 200 — which looks like missing data but is not. Pass Unix timestamps that cover the period you actually want.

https://eodhd.com/api/intraday/ATVI.US?interval=5m&from=1696118400&to=1697241600&api_token=YOUR_API_TOKEN&fmt=json

How far back intraday reaches depends on the interval, not on when the ticker was delisted. The 1-minute series goes back furthest; 5-minute and 1-hour start around October 2020. Measured on delisted tickers:

TickerLast traded1m5m1h
MYL.US2020-11-18yesyesyes
WCG.US2020-01-23yesnono
RTN.US2020-04-02yesnono
RHT.US2019-07-08yesnono
ESRX.US2018-12-20nonono
LEH.US2008-09-17nonono

Full parameters and interval rules are on the Intraday Historical Data API page.

Confirming a Ticker Is Delisted

The Fundamentals response carries the status in its General section.

FieldUse it for
General.IsDelistedReliable true or false. This is the field to branch on
General.DelistedDateApproximate. Exact for cleanly processed delistings, but see the warning below
General.UpdatedAtWhen the record was last touched. Not the delisting date — ATVI shows 2023-12-10, two months after it stopped trading

Do not trust DelistedDate on its own. For tickers that stop trading quietly rather than through a processed corporate action, the field is stamped with the date we flagged them, which can be today. SIVBQ.US reports a DelistedDate of 2026-09-17 but its last price bar is 2024-11-07; CITEW.US reports the same date against a last bar of 2025-01-10. The date of the final end-of-day bar is the authoritative last-traded date — take it from the EOD response and cross-check.

What Data Exists, by Era

How much you get depends on how long ago the company left the exchange. Fundamentals are the dividing line: for older delistings the endpoint still answers with HTTP 200, but returns a 2 KB stub with little more than the name and exchange, rather than the full 400 KB-plus record.

DelistedEnd-of-dayFundamentalsDividends and splitsIntraday
2019 onwardsFull historyFull recordYes1m; 5m and 1h from late 2020
2018 and earlierFull historyStub onlyRarelyNo

Worked examples, all verified against the live API:

TickerDelistedEOD barsFundamentalsDividendsSplits
ATVI.US2023-10-137,487726 KB148
TWTR.US2022-10-282,259284 KB00
TIF.US2021-01-088,489475 KB1314
RTN.US2020-04-035,600449 KB873
CELG.US2019-11-228,135437 KB04
LEH.US2008-09-172,6952 KB stub00
AAAB.US2003-01-291,0232 KB stub00

A zero in the dividends column is not always a gap — CELG.US and TWTR.US never paid one. If you need to confirm coverage for a specific ticker before you build on it, ask support.

Renamed, Not Delisted

A ticker you cannot find is not always a delisting. After a merger or a rebrand the company keeps trading under a new code, and the old one disappears from the active symbol list without ever reaching the delisted one. Check the US Stock Symbol Rename History API before you conclude that a company is gone — it maps old symbols to new ones for US exchanges, and its page carries the full parameter reference.

The same endpoint also explains where a reused ticker came from. Solidion Technology took over the STI code in February 2024, which is why SunTrust’s history now lives at STI_old.US:

{
  "exchange": "US",
  "old_symbol": "NUBI",
  "new_symbol": "STI",
  "company_name": "Solidion Technology, Inc. Common Stock",
  "effective": "2024-02-05"
}

Three practical notes when you query it alongside delisted data. Send from and to together or send neither — sending to on its own currently returns HTTP 500, while omitting both returns the trailing twelve months, which is the useful default. The ex parameter accepts US only; any other exchange returns an empty array rather than an error. And the endpoint answers in JSON whatever you pass in fmt.

Why Delisted Data Matters

A dataset that holds only currently listed companies suffers from survivorship bias. The failures, the bankruptcies and the takeovers are missing, so measured historical returns are too high and backtests are too kind. On US alone that is 60,191 symbols absent from an actives-only universe — including every bank that did not survive 2008 and every company acquired since.

Rebuilding a point-in-time universe means taking the delisted list for the exchange, keeping each symbol in the universe up to its last traded bar, and letting it drop out afterwards rather than deleting it from history. For whole-exchange daily snapshots rather than per-symbol requests, the Bulk API covers an entire exchange in one call.

Errors

CodeMeaningWhen it happens
401UnauthenticatedThe api_token is missing or invalid
403ForbiddenThe token is valid but not entitled to that data. The demo key returns this for every endpoint on this page
404Exchange Not Found / Ticker Not FoundUnknown exchange code, or a symbol that exists on neither the active nor the delisted list
422Validation errorAn invalid type value or a malformed date. The body names the offending parameter and the allowed values
500Server errorCurrently returned by Symbol Change History when to is sent without from
200Empty arrayNot an error. Intraday without a date range, or Symbol Change History with a non-US exchange

Plans and API Calls

There is no separate delisted-data subscription. Listing the symbols is part of the Exchanges API, and each data endpoint is billed and gated exactly as it is for active tickers — a delisted ticker costs the same as a live one. The full accounting of calls, requests and daily limits is on the API Limits page, and the live counter for your own account is on the dashboard.

StepEndpointAPI callsIncluded in
List delisted symbolsExchange Symbol List1All plans
Price historyEnd-of-Day1All-In-One, EOD Historical Data, EOD+Intraday, Free (1 year only)
FundamentalsFundamentals10All-In-One, Fundamentals Data Feed
Dividends, splitsDividends, Splits1 eachAll-In-One, EOD Historical Data, EOD+Intraday, Free (1 year only)
Intraday barsIntraday5All-In-One, EOD+Intraday All World Extended
RenamesSymbol Change History1All plans

The free plan is a poor fit for this particular job. It caps history at one year and allows 20 API calls a day, so you can list the delisted symbols but cannot pull the history of anything that stopped trading more than a year ago — which is most of the list. Full limits are on the API Limits page.

Sign up & Get Data

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