Where an Aircraft Is Registered Is Not Where It Flies: FAA Addresses Explained
On this page
Problem statement
The address in the FAA registry is where the owner receives mail, not where the aircraft is kept or flown. For a private owner that is usually home, near the airfield. For a company it can be anywhere, and a large share of US aircraft are owned through LLCs and corporations set up in states chosen for their law and taxes, or held by trust companies for owners who cannot register an aircraft themselves. The result is that some places hold thousands of aircraft on paper. This page measures how much that distorts state and ZIP-code figures in the 16 October 2026 registry, and what to count instead.
Quick answer
Count valid US registrations by state and divide by 2025 population:
us = reg[(reg.COUNTRY == "US") & (reg["STATUS CODE"] == "V")].copy()
us["owner"] = us["TYPE REGISTRANT"].map(REGISTRANT)
spop = pop.groupby("STATE").POPESTIMATE2025.sum().rename(index={v: k for k, v in STATEFP.items()})
s = pd.DataFrame({"aircraft": us.STATE.value_counts(), "residents": spop}).dropna()
s["per_1000"] = s.aircraft / s.residents * 1000
print(s.nlargest(5, "per_1000").round(2).to_string())
aircraft residents per_1000
STATE
AK 9022 737270.0 12.24
DE 10835 1059952.0 10.22
WY 3170 588753.0 5.38
MT 5943 1144694.0 5.19
ND 2462 799358.0 3.08
Alaska has the most aircraft per resident, 12.24 per 1,000, as expected of a state where flying is everyday transport. Delaware, the second-smallest state by area, is second with 10.22, ahead of Wyoming and Montana.
Who registers where
1. Owner types by state
mix = pd.crosstab(us.STATE, us.owner, normalize="index")
print(mix.loc[["DE", "MT", "AK", "TX", "CA"], ["individual", "LLC", "corporation"]].round(3).to_string())
print(f"US: {(us.owner == 'LLC').mean():.1%} LLC, {(us.owner == 'individual').mean():.1%} individual")
owner individual LLC corporation
STATE
DE 0.034 0.565 0.370
MT 0.295 0.506 0.107
AK 0.551 0.175 0.091
TX 0.456 0.248 0.203
CA 0.403 0.162 0.280
US: 28.3% LLC, 40.7% individual
56.5% of Delaware's aircraft are owned by LLCs and 37.0% by corporations; only 3.4% by individuals. Montana is half LLC as well. In Alaska 55.1% belong to individuals. Nationally 28.3% are LLC-owned and 40.7% individually owned.
2. The ZIP codes behind it
top = us["ZIP CODE"].value_counts().head(8)
t = pd.DataFrame({"aircraft": top, "city": us.groupby("ZIP CODE").CITY.agg(lambda s: s.mode()[0]).loc[top.index],
"state": us.groupby("ZIP CODE").STATE.first().loc[top.index],
"individual": us[us.owner == "individual"]["ZIP CODE"].value_counts().reindex(top.index).fillna(0).astype(int)})
print(t.to_string())
aircraft city state individual
ZIP CODE
94080 3032 S SAN FRAN CA 7
19808 1934 WILMINGTON DE 44
84111 1924 SALT LAKE CITY UT 2
19801 1675 WILMINGTON DE 8
84054 1661 NORTH SALT LAKE UT 5
19810 1574 WILMINGTON DE 6
60606 1249 CHICAGO IL 3
59901 1171 KALISPELL MT 68
The ZIP codes with the most aircraft are company addresses: South San Francisco 94080 with 3,032, three Wilmington, Delaware codes with 1,574 to 1,934 each, Salt Lake City 84111 and North Salt Lake 84054, Chicago 60606 and Kalispell, Montana. Each has only a handful of individual owners.
3. What the address does to a ranking
ind = us[us.owner == "individual"].STATE.value_counts()
s["individual_per_1000"] = ind.reindex(s.index) / s.residents * 1000
r = s.rank(ascending=False)
print(pd.DataFrame({"rank, all owners": r.per_1000, "rank, individuals": r.individual_per_1000}).loc[["DE", "MT", "AK", "ID", "WY"]].astype(int).to_string())
rank, all owners rank, individuals
STATE
DE 2 25
MT 4 2
AK 1 1
ID 8 6
WY 3 4
Counting individually owned aircraft, Delaware drops from 2nd to 25th, while Alaska stays 1st and Montana moves up to 2nd, its LLC aircraft aside. Wyoming and Idaho barely move.
Jets, and what to map instead
The data used on this page
The FAA's Releasable Aircraft Database, public domain, downloaded on 16 October 2026 and saved on this site, because the FAA replaces it every day. The saved copy leaves out the owners' names and street addresses and keeps five-digit ZIP codes; every other column is as published. With it come the Census Bureau's Vintage 2025 county population estimates, 2024 county boundaries and 2024 ZCTA gazetteer.
from pathlib import Path
import zipfile
import geopandas as gpd
import numpy as np
import pandas as pd
import requests
Path("data").mkdir(exist_ok=True)
# FAA Releasable Aircraft Database, 16 October 2026: MASTER.txt without the NAME, STREET, STREET2 and OTHER NAMES
# columns and with five-digit ZIP codes (MASTER-no-names.txt), ACFTREF.txt and ENGINE.txt as published; Census
# Vintage 2025 county estimates, 2024 cartographic boundary counties and 2024 ZCTA gazetteer. Saved here unchanged
# otherwise, because the FAA replaces the file daily.
# Live: https://registry.faa.gov/database/ReleasableAircraft.zip (needs a browser User-Agent),
# https://www2.census.gov/geo/docs/maps-data/data/gazetteer/2024_Gazetteer/2024_Gaz_zcta_national.zip
ARCHIVE = "faa-aircraft-registry-2026-10-16.zip"
if not Path(f"data/{ARCHIVE}").exists():
Path(f"data/{ARCHIVE}").write_bytes(requests.get(f"https://data.spatialworkflow.io/{ARCHIVE}", timeout=600).content)
Z = zipfile.ZipFile(f"data/{ARCHIVE}")
def faa(name):
"""One registry file: comma-separated, every field padded with spaces, a byte-order mark and a trailing comma."""
d = pd.read_csv(Z.open(name), dtype=str, encoding="utf-8-sig", keep_default_na=False)
d.columns = d.columns.str.strip()
d = d.loc[:, [c for c in d.columns if c and not c.startswith("Unnamed")]]
return d.apply(lambda c: c.str.strip())
reg = faa("MASTER-no-names.txt")
ref = faa("ACFTREF.txt")
TYPE_AIRCRAFT = {"1": "glider", "2": "balloon", "3": "blimp", "4": "fixed wing single engine", "5": "fixed wing multi engine",
"6": "rotorcraft", "7": "weight-shift", "8": "powered parachute", "9": "gyroplane", "H": "hybrid lift", "O": "other"}
REGISTRANT = {"1": "individual", "2": "partnership", "3": "corporation", "4": "co-owned", "5": "government", "7": "LLC",
"8": "non-citizen corporation", "9": "non-citizen co-owned", "": "blank"}
Path("data/cb_2024_us_county_20m.zip").write_bytes(Z.read("cb_2024_us_county_20m.zip"))
counties = gpd.read_file("data/cb_2024_us_county_20m.zip")
STATEFP = counties.drop_duplicates("STUSPS").set_index("STUSPS").STATEFP
pop = pd.read_csv(Z.open("co-est2025-alldata.csv"), encoding="latin-1", dtype={"STATE": str, "COUNTY": str})
pop = pop[pop.SUMLEV == 50].assign(GEOID=lambda p: p.STATE + p.COUNTY)
print(f"FAA registry, 16 October 2026: {len(reg):,} aircraft, {len(ref):,} make-and-model codes")
FAA registry, 16 October 2026: 317,604 aircraft, 94,115 make-and-model codes
Example 1: bigger aircraft lean on companies
for label, codes in [("turbojet and turbofan", ["4", "5"]), ("piston", ["1"])]:
k = us[us["TYPE ENGINE"].isin(codes)]
print(f"{label}: {len(k):,} aircraft; registered in DE {(k.STATE == 'DE').mean():.1%}; owned by individuals {(k.owner == 'individual').mean():.1%}")
turbojet and turbofan: 27,365 aircraft; registered in DE 8.0%; owned by individuals 1.6%
piston: 204,171 aircraft; registered in DE 3.3%; owned by individuals 49.6%
Jets lean on companies even more: of 27,365 turbojet and turbofan aircraft, 1.6% are owned by individuals and 8.0% have a Delaware address, against 49.6% and 3.3% of the 204,171 piston aircraft.
Example 2: map all owners against individuals
states = counties[~counties.STUSPS.isin(["AK", "HI", "PR"])].dissolve("STUSPS").to_crs(5070).join(s)
import matplotlib.pyplot as plt
print(states[["per_1000", "individual_per_1000"]].describe().loc[["min", "50%", "max"]].round(2).to_string())
fig, axes = plt.subplots(1, 2, figsize=(14, 5))
for ax, col in zip(axes, ["per_1000", "individual_per_1000"]):
states.plot(column=col, cmap="Blues", ax=ax, legend=True)
ax.set_axis_off()
per_1000 individual_per_1000
min 0.31 0.10
50% 0.91 0.35
max 10.22 1.53
Across the lower 48, aircraft per 1,000 residents ranges from 0.31 to 10.22 with all owners, and from 0.10 to 1.53 counting individuals. Mapping individuals is the closer picture of where aircraft are based, though it leaves out every company fleet, from flight schools to air ambulances.
Internal links
- Registered aircraft per resident โ the county map that uses individual owners
- Fly-in communities by ZIP code โ where individuals' aircraft gather
- Read the FAA registry โ the registrant type column
- Status codes โ the other column to filter on first