List companies by exchange
Get every company and ticker listed on NYSE, Nasdaq, Cboe or OTC with SEC CIKs, using the SecFeed exchange mapping endpoint built on the SEC's daily ticker file.
A universe of listed companies is the starting point for screens, backfills and coverage reports. /v1/mapping/exchange returns every ticker the SEC associates with an exchange, each with its CIK and company name, in one call. The data comes from the SEC's company_tickers_exchange.json, which the SEC refreshes daily.
Setup
import os
import requests
from collections import Counter
BASE = "https://secfeedapi.com"
HEADERS = {"Authorization": f"Bearer {os.environ['SECFEED_KEY']}"}
def get(path, **params):
r = requests.get(f"{BASE}{path}", params=params, headers=HEADERS, timeout=60)
r.raise_for_status()
return r.json()
Count every exchange
for ex in ["NYSE", "Nasdaq", "CBOE", "OTC"]:
rows = get("/v1/mapping/exchange", exchange=ex)
print(f"{ex:7} {len(rows):6,} tickers {len({r['cik'] for r in rows}):6,} companies")
Output:
NYSE 3,289 tickers 2,600 companies
Nasdaq 4,376 tickers 3,452 companies
CBOE 44 tickers 22 companies
OTC 2,542 tickers 2,033 companies
Each call returns the whole list at once (the NYSE response is about 300 KB), so there is no paging. There are more tickers than companies because preferred shares, warrants, units and second share classes get their own tickers under the same CIK.
The first rows
The SEC's ticker file puts large companies first, so the top of the NYSE list is a recognizable set of large caps:
nyse = get("/v1/mapping/exchange", exchange="NYSE")
for r in nyse[:8]:
print(f" {r['ticker']:6} {r['cik']:>8} {r['name']}")
BRK-B 1067983 BERKSHIRE HATHAWAY INC
LLY 59478 ELI LILLY & Co
JPM 19617 JPMORGAN CHASE & CO
V 1403161 VISA INC.
XOM 2115436 ExxonMobil Holdings Corp
JNJ 200406 JOHNSON & JOHNSON
MA 1141391 Mastercard Inc
ABBV 1551152 AbbVie Inc.
Do not rely on that order for ranking. It is the SEC's file order, not a market cap you can sort by.
One row per company
312 NYSE companies have more than one ticker:
multi = Counter(r["cik"] for r in nyse)
print("NYSE companies with more than one listed ticker:", sum(1 for n in multi.values() if n > 1))
NYSE companies with more than one listed ticker: 312
To get one row per company, keep the first ticker per CIK. Because the SEC lists the main class first, this usually picks the common stock:
companies = {}
for r in nyse:
companies.setdefault(r["cik"], r)
print(len(companies)) # 2600
Putting it to work
A listed universe plus the Filing Query API answers questions like "which of the largest NYSE companies filed an 8-K this month":
ciks = ",".join(str(c) for c in list(companies)[:50])
hits = get("/v1/filings", query=f'cik:({ciks}) AND formType:"8-K" AND filedAt:[2026-10-01 TO 2026-10-13]', size=50)
print(hits["total"])
for f in hits["filings"][:6]:
print(f" {f['filedAt']} {f['ticker']:6} {f['companyName']}")
{'value': 15, 'relation': 'eq'}
2026-10-13 JPM JPMORGAN CHASE & CO
2026-10-13 JPM JPMORGAN CHASE & CO
2026-10-13 C CITIGROUP INC
2026-10-13 GS GOLDMAN SACHS GROUP INC
2026-10-13 UNH UNITEDHEALTH GROUP INC
2026-10-13 JNJ JOHNSON & JOHNSON
Bank earnings season starts mid October, which is why the big banks lead the list. Keep CIK lists to a few hundred values per call; for the whole exchange, loop over chunks.
Other uses:
- Backfills. Feed the list into Bulk download every 10-K.
- Industry screens. Intersect it with an SIC code list from List companies by sector and industry.
- Coverage reports. Compare your database's companies against the current listing to find gaps and delistings.
What "OTC" means here
The OTC list covers companies quoted over the counter that the SEC can match to a filer. It is not a full list of OTC Markets securities: many quoted companies do not file with the SEC at all and do not appear.