# How to get a list of every US stock ticker, delisted ones included

Every US-listed ticker, the dead ones included — which free files stop at today's names, which go back years, and why a ticker is the wrong key to store.

*https://stockmarketstack.com/how-to/get-a-list-of-every-ticker · next to Stock Market Data APIs*

**Answer:** Nobody publishes one official master list. The SEC's free ticker files map today's symbols to CIKs and contain no delisted names at all. Alpha Vantage's free LISTING_STATUS call returns active and delisted US stocks and ETFs as CSV, for any date since 2010. Massive, EODHD and Norgate Data go deeper. Whichever you use, store a permanent identifier beside the ticker, because symbols are reused, renamed and spelled differently by every source.

## The tools that do this

*In the order this page recommends trying them. Paid placement does not affect this order.*

1. [Alpha Vantage](https://stockmarketstack.com/tools/alpha-vantage.md) — One free CSV call for active listings and one for delisted, as of any date after 2010. US stocks and ETFs, in two asset types only.
2. [SEC EDGAR](https://stockmarketstack.com/tools/sec-edgar.md) — Free, keyless JSON mapping today's tickers to CIKs, OTC included. No delisted names, and ETFs split across two files by legal structure.
3. [Massive](https://stockmarketstack.com/tools/massive.md) — A paged tickers endpoint with active=false, a point-in-time date, FIGIs and a delisting timestamp. Free at five calls a minute.
4. [EODHD](https://stockmarketstack.com/tools/eodhd.md) — One request returns the whole US composite, OTC and funds included, and a second with delisted=1 returns the dead. One call each.
5. [Norgate Data](https://stockmarketstack.com/tools/norgate-data.md) — Delisted US securities essentially complete back to late 1992, renames stitched into one series. Windows only, from $630 a year.

## The short way

[Alpha Vantage](https://stockmarketstack.com/tools/alpha-vantage) answers the whole question in two requests on a free key.
`LISTING_STATUS` returns active listings by default and delisted ones with `state=delisted`, and
it returns CSV rather than JSON:

```python
import csv
import io

import requests

URL = "https://www.alphavantage.co/query"

def listing(state, date=None):
    params = {"function": "LISTING_STATUS", "state": state, "apikey": "YOUR_API_KEY"}
    if date:
        params["date"] = date  # any YYYY-MM-DD after 2010-01-01
    return list(csv.DictReader(io.StringIO(requests.get(URL, params=params).text)))

universe = listing("active") + listing("delisted")
# columns: symbol, name, exchange, assetType, ipoDate, delistingDate, status
```

The `date` parameter is the part worth noticing. Without it you get the list as of the latest
trading day; with it, the endpoint returns the listings as they stood on that date. That is not
the same thing as today's list filtered by IPO date, and the difference is the whole of
[survivorship bias](https://stockmarketstack.com/glossary/survivorship-bias): a list rebuilt from today's names backwards
contains nothing that died in between.

Two requests is two of the free key's 25 a day. What it does not give you is anything before
2010, an asset type finer than `Stock` and `ETF`, or — in the file served while this page was
written — any over-the-counter venue.

## What the options are

**The regulator's mapping, current names only.** [SEC EDGAR](https://stockmarketstack.com/tools/sec-edgar) publishes three
JSON files, free and keyless with a `User-Agent` that names you: `company_tickers.json` (CIK,
ticker, name), `company_tickers_exchange.json` (the same plus an exchange, with OTC names in it),
and `company_tickers_mf.json` (fund CIK, series, class and ticker). The SEC says it updates them
periodically for EDGAR's own search and does not guarantee accuracy or scope. They are the right
way to attach a CIK to a live ticker. They are no help with the past: there is no delisted file.

**A reference endpoint with the history kept.** [Massive](https://stockmarketstack.com/tools/massive), formerly Polygon.io,
serves `/v3/reference/tickers`. `active` defaults to true; set it false for delisted names, each
carrying a `delisted_utc`. A `date` parameter returns the tickers available on that day, and each
record carries `cik`, `composite_figi` and `share_class_figi` where known. Pages hold at most 1,000
rows and chain through `next_url`, and the free Basic plan is five requests a minute, so a full
pull is minutes rather than seconds. Stocks and OTC are separate `market` values: ask for
`market=stocks` and the OTC tier is not in the answer. Renames live in a separate, experimental
ticker events endpoint, which records `ticker_change` and nothing else, back to September 2003 on
paid plans and two years on Basic.

**The whole US composite in one call.** [EODHD](https://stockmarketstack.com/tools/eodhd) serves
`/api/exchange-symbol-list/US`, a composite code returning every US listing across venues — about
51,600 tickers by its own count, of which NASDAQ, NYSE, NYSE Arca and BATS are the
exchange-traded part and the rest sit on the OTC tiers and in the mutual-fund listing. Add
`delisted=1` for the dead ones. Each request is one API call, and the lists are on every plan,
including the free one at 20 calls a day. A separate symbol-change-history endpoint covers
renames, US exchanges only.

**Survivorship-free, delivered as software.** [Norgate Data](https://stockmarketstack.com/tools/norgate-data) is the deep
end: its US listed-and-delisted dataset is, in its own words, essentially complete back to late
1992. It is not an API. The data sits in a local database kept by a Windows updater, read through
a Python package or a charting plugin, and delisted securities start at the Platinum tier, $630 a
year. The two cheaper tiers are current listings only.

## Where this breaks

**There is no neutral list.** Every source above is somebody's answer to "what counts as listed",
and they draw the line differently. Alpha Vantage's file is US stocks and ETFs on exchanges.
The SEC's exchange file includes OTC names. EODHD's composite includes the OTC tiers and mutual
funds. Two correct lists of "every US ticker" can differ by tens of thousands of rows before a
single one of them is wrong. Decide what your universe is, then filter to it, rather than
treating any one vendor's default as the definition.

**One share class, three spellings.** Berkshire Hathaway's class B is `BRK-B` in the SEC's file
and in Alpha Vantage's CSV, and `BRK.B` in Massive, which writes class shares with a dot and
preferreds with a lower-case `p`. Nasdaq's own convention table lists the class suffix as `.B`
under CQS and in its integrated platform, and as a bare `B` after a space under CMS; warrants,
units and rights diverge further. The dangerous part is not the difference but the failure mode:
Massive's documentation says an unknown symbol returns an empty result rather than an error, so a
dash sent where a dot was expected reads as "no data". Normalise punctuation on the way in, once,
in one function. [Symbology](https://stockmarketstack.com/glossary/symbology) is the longer version of this.

**A ticker is a lease.** Symbols are reassigned after a delisting, and Massive says plainly that a
ticker reused by a different company is possible and that you should check the details for the
date range you care about. A table keyed on the bare ticker will concatenate two unrelated
companies into one row and nothing will error. Keep a permanent identifier beside every symbol —
a CIK for the issuer, a composite FIGI for the instrument — and store the ticker with the dates it
was valid. Note the CIK is one level too coarse for share classes: both Berkshire tickers sit
under a single CIK in the SEC's file.

**The same rename, three answers.** When a company changes its symbol, Norgate moves the entire
price history under the new symbol and drops the old one from the database. Massive does the
opposite: the history stays under both symbols as it was published, unstitched, and the events
endpoint is how you find the join. EODHD keeps a separate change log. None of these is wrong, but
a list assembled from one vendor and prices fetched from another will disagree about whether the
old symbol exists at all.

**Delisted is not always the end.** Norgate's own example is Enron: it traded on the NYSE as ENE
until 10 January 2002, then over the counter as ENRNQ until November 2004. An exchange-only list
records the first date; a list that includes OTC records the second. Norgate only appends its
`-YYYYMM` suffix, `ENRNQ-200411` here, once a security really stops trading, which is also how
it keeps a reused symbol from colliding with its previous owner.

**ETFs, warrants and units are mixed in, and the type field is coarse.** Alpha Vantage has two
asset types, so in the file served while this page was written a SPAC's warrants and units sat
under `Stock` beside its class A shares. EODHD's `type` filter accepts fewer values than its
`Type` field returns — warrants, units and notes cannot be filtered for and have to be selected
after the download. The SEC's files split ETFs by legal structure: a standalone trust like SPY is
in the exchange file, while an ETF that is one series of a larger trust, such as IVV or VTI, is
in the fund file instead. Filter by asset type deliberately, and expect to clean what the filter
misses.

**Depth is the number that differs most.** Alpha Vantage goes back to 2010. Massive's rename log
starts in September 2003. EODHD's delisted names carry end-of-day prices only if they left before
2018, with fundamentals, dividends and splits after that and intraday after 2021, and the vendor
asks you to contact support to confirm coverage for a specific ticker. Norgate reaches late 1992.
Any universe older than your source's floor is survivorship-biased by construction, whatever the
list looks like.

## If you outgrow this

**When the list has to feed a price history**, the next page is
[how to download historical prices in Python](https://stockmarketstack.com/how-to/download-historical-prices-in-python) — and
the same rename problem arrives there as a gap in a series.

**When the question is "what was in the index"**, a list of every ticker is the wrong object.
Constituent history is its own dataset, and [historical index
constituents](https://stockmarketstack.com/guides/historical-index-constituents) explains who sells it and why it is licensed
separately.

**When the identifiers themselves are the problem**, [CUSIP, ISIN, FIGI and the
rest](https://stockmarketstack.com/guides/cusip-isin-figi-identifiers) sets out which registry covers what, and which of them
costs money to use.

The rest of the field is in [market data APIs](https://stockmarketstack.com/categories/market-data-apis).

## FAQ

### Is there an official list of every US ticker?

Not one that covers the dead. The SEC publishes ticker-to-CIK files for EDGAR's own search and says it does not guarantee their accuracy or scope, and they hold current associations only. Each exchange publishes its own listings. A list that includes delisted names is always a vendor's reconstruction, and the vendors disagree at the edges — which is why the depth of their delisted history is the number to compare.

### Can I get delisted tickers for free?

Yes, within limits. Alpha Vantage's LISTING_STATUS call returns delisted US stocks and ETFs on the free key, for any date after 1 January 2010. Massive's free Basic plan serves the same tickers endpoint with active=false, at five requests a minute. EODHD's free package includes the exchange ticker lists at 20 calls a day. None of the three reaches the 1990s; that is what Norgate Data's paid tiers sell.

### What should I use as the key instead of the ticker?

Something that survives a rename and is never reassigned. A CIK identifies the filer, so it is one value for both Berkshire Hathaway share classes. A composite FIGI identifies the instrument in a market, and a share-class FIGI the class across markets. Store the ticker as an attribute with the date range it was valid for, and join on the identifier.

### Why does a ticker I know exists come back empty?

Usually punctuation. Massive writes share classes with a dot, BRK.A, where the SEC's file and Alpha Vantage's CSV write BRK-A, and Massive's documentation says an unknown symbol returns an empty result rather than an error. The other common cause is that the list was filtered to active listings by default and the name has since been delisted or renamed.

## Sources

1. [Alpha Vantage API Documentation — Listing & Delisting Status](https://www.alphavantage.co/documentation/#listing-status) — Alpha Vantage, read 2026-09-26
2. [Accessing EDGAR Data — CIK, ticker, and exchange associations](https://www.sec.gov/search-filings/edgar-search-assistance/accessing-edgar-data) — U.S. Securities and Exchange Commission, read 2026-09-26
3. [All Tickers — Stocks REST API](https://massive.com/docs/rest/stocks/tickers/all-tickers) — Massive, read 2026-09-26
4. [Ticker Events — Stocks REST API](https://massive.com/docs/rest/stocks/corporate-actions/ticker-events) — Massive, read 2026-09-26
5. [What does Massive do with delisted tickers?](https://massive.com/knowledge-base/article/what-does-massive-do-with-delisted-tickers) — Massive, read 2026-09-26
6. [How does Massive handle ticker changes and acquisitions?](https://massive.com/knowledge-base/article/how-does-massive-handle-ticker-changes-and-acquisitions) — Massive, read 2026-09-26
7. [Why are ticker symbols with dashes not showing in Massive's system?](https://massive.com/knowledge-base/article/why-are-ticker-symbols-with-dashes-not-showing-in-massives-system) — Massive, read 2026-09-26
8. [Exchanges API — Supported Exchanges and Ticker Lists](https://eodhd.com/financial-apis/exchanges-api-list-of-tickers-and-trading-hours) — EODHD, read 2026-09-26
9. [Delisted Stock Companies Data](https://eodhd.com/financial-apis/delisted-stock-companies-data-2) — EODHD, read 2026-09-26
10. [Norgate Data FAQ](https://norgatedata.com/data-package-faq.php) — Norgate Data, read 2026-09-26
11. [CQS Symbol Convention](https://nasdaqtrader.com/Trader.aspx?id=CQSSymbolConvention) — Nasdaq, Inc., read 2026-09-26

*Last updated 2026-09-26. A reference page, corrected in place — not a dated post.*
