Company subsidiaries from Exhibit 21
Get a company's list of subsidiaries and their jurisdictions from Exhibit 21 of its 10-K as JSON, then summarize where each group has legal entities.
Every 10-K must attach Exhibit 21, the list of the registrant's subsidiaries and the jurisdiction where each is organized. It is the quickest public map of a corporate group: which countries it operates in through local entities, where its holding and finance companies sit, and how many legal entities it runs.
The exhibit is a free-form HTML table or list, different in every filing. /v1/subsidiaries finds the exhibit in the latest 10-K and returns it as JSON:
{"cik": 320193, "accessionNo": "0000320193-25-000079",
"exhibit": "https://www.sec.gov/Archives/edgar/data/320193/000032019325000079/a10-kexhibit21109272025.htm",
"subsidiaries": [{"name": "Apple Asia Limited", "jurisdiction": "Hong Kong"},
{"name": "Apple Insurance Company, Inc.", "jurisdiction": "Arizona, U.S."}]}
The script
Jurisdictions are written as filed ("Delaware", "Arizona, U.S.", "United States"), so the script maps US states to one country before counting.
import collections
import os
import re
import requests
BASE = "https://secfeedapi.com"
HEADERS = {"Authorization": f"Bearer {os.environ['SECFEED_KEY']}"}
US_STATES = {"Alabama", "Alaska", "Arizona", "Arkansas", "California", "Colorado", "Connecticut", "Delaware", "Florida", "Georgia",
"Hawaii", "Idaho", "Illinois", "Indiana", "Iowa", "Kansas", "Kentucky", "Louisiana", "Maine", "Maryland", "Massachusetts",
"Michigan", "Minnesota", "Mississippi", "Missouri", "Montana", "Nebraska", "Nevada", "New Hampshire", "New Jersey",
"New Mexico", "New York", "North Carolina", "North Dakota", "Ohio", "Oklahoma", "Oregon", "Pennsylvania", "Puerto Rico",
"Rhode Island", "South Carolina", "South Dakota", "Tennessee", "Texas", "Utah", "Vermont", "Virginia", "Washington",
"West Virginia", "Wisconsin", "Wyoming", "District of Columbia"}
def country(jurisdiction):
j = re.sub(r",?\s*(U\.S\.A?\.?|USA|United States( of America)?)$", "", (jurisdiction or "").strip())
return "United States" if j in US_STATES or j == "" and jurisdiction else (j or "unknown")
for t in ["KO", "MSFT", "AAPL", "JNJ", "PFE"]:
d = requests.get(f"{BASE}/v1/subsidiaries", params={"ticker": t}, headers=HEADERS, timeout=120).json()
if "subsidiaries" not in d:
print(f"{t}: {d.get('error')}\n")
continue
subs = d["subsidiaries"]
countries = collections.Counter(country(s["jurisdiction"]) for s in subs)
us_states = collections.Counter(s["jurisdiction"].split(",")[0] for s in subs if country(s["jurisdiction"]) == "United States")
print(f"{t}: {len(subs)} subsidiaries in {len(countries)} countries ({d['exhibit'].rsplit('/', 1)[1]})")
print(" top countries: " + ", ".join(f"{c} {n}" for c, n in countries.most_common(5)))
if us_states:
print(" US entities by state: " + ", ".join(f"{s} {n}" for s, n in us_states.most_common(3)))
print()
Output
KO: 38 subsidiaries in 17 countries (a20251231exhibit211.htm)
top countries: United States 15, Ireland 2, China 2, Brazil 2, France 2
US entities by state: Delaware 12, New York 1, Georgia 1
MSFT: 8 subsidiaries in 2 countries (msft-ex21.htm)
top countries: Ireland 4, United States 4
US entities by state: United States 4
AAPL: 19 subsidiaries in 13 countries (a10-kexhibit21109272025.htm)
top countries: United States 3, Ireland 3, Japan 2, Singapore 2, Hong Kong 1
US entities by state: Delaware 1, Arizona 1, Nevada 1
JNJ: 400 subsidiaries in 75 countries (ex21-subsidiariesxform10xk.htm)
top countries: United States 134, Ireland 20, Germany 18, United Kingdom 14, Switzerland 14
US entities by state: Delaware 83, New Jersey 21, Pennsylvania 7
PFE: 286 subsidiaries in 69 countries (pfe-exh21x12312025x10k.htm)
top countries: United States 103, Netherlands 22, Ireland 11, Singapore 11, United Kingdom 9
US entities by state: Delaware 86, Pennsylvania 3, California 2
Reading it
- Exhibit 21 is not always complete. Regulation S-K lets a company leave out subsidiaries that, taken together, would not be a "significant subsidiary". Apple lists 19 entities and Microsoft 8, while Johnson & Johnson lists 400. A short list says more about the company's disclosure choice than about its structure.
- Delaware dominates US entities. 83 of Johnson & Johnson's 134 US subsidiaries and 86 of Pfizer's 103 are Delaware companies.
- Holding and finance hubs stand out. Ireland appears near the top for every company here, and the Netherlands is second for Pfizer. The name often tells you the role, for example "Microsoft Global Finance Unlimited Company".
- Some filers give no state. Microsoft writes "United States" without a state, which is why its US entities are grouped under that label.
Variations
- Changes over time. The endpoint reads the latest 10-K. For earlier years, list older 10-Ks with
/v1/filingsand download their Exhibit 21 with the Download API. New entities often signal acquisitions or new markets. - Find a parent. Search the full text of Exhibit 21 documents for an entity name with Full-Text Search to find which group owns it.
- Join with geography. Combine the country counts with revenue by region from XBRL, see Extract segment revenue.