Technical writing
FCC Universal Licensing System: The Federal Database Behind Every US Radio License
The FCC Universal Licensing System contains every active radio license in the United States — AM and FM broadcast stations, TV stations, cellular carriers, commercial satellite operators, amateur radio operators, and 1,500+ other wireless service categories — totaling over 10 million active licenses.
What the ULS Is
The FCC Universal Licensing System is the online database and licensing management system the Federal Communications Commission uses to issue, renew, modify, and cancel every wireless radio license under its jurisdiction. Launched in 1999, the ULS replaced a patchwork of service-specific paper and electronic files with a unified system accessible through a public web interface and a structured bulk-data download.
The scope of the ULS is broad. It covers Wireless Radio Services — cellular (850 MHz), Personal Communications Service (PCS), Advanced Wireless Services (AWS), 700 MHz, 600 MHz, and millimeter-wave 5G bands — as well as Broadcast services including AM and FM radio stations, full-power TV, low-power TV (LPTV), and FM and TV translators. Experimental licenses, Amateur radio operators, Ship and aircraft stations, General Mobile Radio Service (GMRS), Public Safety (police, fire, EMS), Private Microwave, and satellite earth stations all live in the same ULS database. What the ULS does not cover is cable television franchises and wireline telephone infrastructure, which are governed by separate FCC systems and state public utility commission filings.
As of early 2027 the ULS holds more than 10 million active licenses across more than 1,500 distinct radio service categories. When expired, cancelled, and historical records are included, the total record count is substantially larger. Every record is publicly searchable without charge at wireless.fcc.gov/uls and available in bulk pipe-delimited downloads at data.fcc.gov/download/pub/uls/complete/.
Spectrum and Radio Services Structure
The FCC organizes radio services by a two-character service code that appears in every ULS record. The service code identifies the regulatory framework governing the license — its eligibility rules, technical standards, license term, and geographic scope. Understanding service codes is the first step in working with ULS data analytically.
Commercial Wireless Service Codes
Mobile broadband services covering the major carriers span dozens of service codes keyed to spectrum band and block:
| Service Code | Band | Notes |
|---|---|---|
| CE | Cellular (850 MHz) | Original cellular, licensed by CMA |
| WY | PCS A-block (1900 MHz) | BTA-licensed; WX, WZ, WU, WV = other PCS blocks |
| EA / EB / EC / ED | 700 MHz A/B/C/D blocks | AT&T (B, C), Verizon (A block) |
| AW | AWS-1 (1.7 / 2.1 GHz) | AWS-3 uses AT, AWS-4 uses DW |
| BL | 600 MHz (Auction 1001) | T-Mobile dominance; also AT&T, US Cellular |
| EU | C-band (3.7–3.98 GHz) | Auction 110 ($81B); AT&T, Verizon, T-Mobile |
| NN | 24 GHz mmWave | Auctions 101/102; licensed by PEA |
| WA | 39 GHz mmWave | Auction 103; very high capacity, short range |
Broadcast Service Codes
Broadcast services are administered by the FCC's Media Bureau and use their own service code namespace. Full-power AM stations carry code AM; AM experimental stations use AX. Full-power FM stations are FM; FM educational stations are FL; FM translators are FX. Full-power television stations are TV; digital TV is DT; translator TV uses TX; LPTV uses TP; Class A TV (elevated LPTV) uses CD.
Amateur, Public Safety, and Satellite Codes
Amateur radio licenses carry service code HA for the standard amateur service and HV for amateur vanity call sign records. Public safety land mobile radio — the P25 digital trunked systems used by county sheriffs, state police, and fire departments — is coded PW (Public Safety Pool, Conventional) and YW (Industrial/Business Pool). Satellite services split between geostationary earth orbit (GE) and non-geostationary orbit (LS), with earth station registrations under separate codes depending on the band.
Spectrum allocation across all these services is governed by the Table of Frequency Allocations codified at 47 CFR Part 2. The United States falls in ITU Region 2 (the Americas), so US allocations follow the Region 2 column of the international ITU Radio Regulations table, with US-specific footnotes adjusting specific bands for domestic conditions. The Table distinguishes primary allocations (the service receives interference protection) from secondary allocations (the service must accept interference from primary services and may not cause harmful interference to them).
Entity Types
Every ULS licensee has an entity type recorded in the EN (entity) table. The major categories are: Common Carrier — AT&T, Verizon, T-Mobile, and hundreds of smaller carriers offering telecommunications service to the public for hire; Non-Common Carrier — private businesses operating radio for internal use (trucking dispatchers, utility companies, retailers);Broadcast — holders of AM, FM, TV, or translator licenses;Government — state and local government agencies (the federal government uses NTIA-administered spectrum rather than FCC-licensed spectrum for most uses); and Individual — amateur radio operators and GMRS licensees.
Commercial Wireless Licenses and Spectrum Auctions
The commercial wireless records in the ULS represent the outcome of FCC spectrum auctions that have collectively raised over $250 billion since 1994. Each auction assigns geographic-area licenses granting the winner the exclusive right to operate in a defined frequency block within a defined territory for a ten-year term, renewable upon showing of compliance with build-out requirements.
Three auctions define the current commercial mobile landscape:
- Auction 110 (C-band, 2021, $81 billion) — the largest spectrum auction in US history by proceeds. The 3.7–3.98 GHz C-band, vacated by satellite operators who received $9.7 billion in relocation payments, was licensed in 5,684 Partial Economic Area (PEA) licenses. Verizon spent $45.45 billion, AT&T $23.4 billion, and T-Mobile $9.3 billion. C-band is the mid-band foundation of 5G capacity deployment through the late 2020s.
- Auction 110 (3.45 GHz, 2021, $22 billion) — spectrum adjacent to the C-band, cleared through coordination with incumbent Department of Defense radar systems under sharing agreements managed by the NTIA.
- Auction 1001 (600 MHz Incentive Auction, 2017, $19.8 billion) — a two-sided auction in which UHF television broadcasters received payments to relinquish or repack their licenses, and wireless carriers purchased the cleared spectrum in the forward auction. T-Mobile spent approximately $8 billion to acquire nationwide 600 MHz coverage, which became the backbone of its 5G network.
Commercial wireless licenses are assigned using geographic license areas that vary by band and historical auction design. The original 850 MHz cellular service used Cellular Market Areas (CMAs) — 306 Metropolitan Statistical Areas and 428 Rural Service Areas. PCS at 1900 MHz used Basic Trading Areas (BTAs, 492 areas) and Major Trading Areas (MTAs, 51 areas) defined by Rand McNally. AWS and subsequent bands shifted to Economic Areas (EAs, 176 areas defined by the Bureau of Economic Analysis) and eventually Partial Economic Areas (PEAs, 416 areas) for millimeter-wave bands where short propagation made smaller geographic units appropriate.
Build-out requirements attach to every commercial wireless geographic area license. A licensee acquiring a ten-year license at auction must demonstrate, typically at the five-year midterm and the ten-year renewal, that it has constructed facilities serving a threshold percentage of the population in the license area — often 40 percent at five years and 75 percent at ten years, though thresholds vary by service. Failure to meet build-out benchmarks results in the license area shrinking (a “safe harbor” reduction) or cancellation of the license. The ULS tracks these construction milestones in the license record history.
The four major licensee groups that dominate the commercial wireless ULS records are:AT&T (B and C block 700 MHz, WCS at 2.3 GHz, AWS-3, C-band, FirstNet Band 14 at 758–798 MHz);Verizon (A block 700 MHz, AWS-1, C-band, mmWave 28/37/39 GHz);T-Mobile (600 MHz dominant position nationwide, Sprint PCS A-block at 1900 MHz acquired in 2020, 2.5 GHz EBS/BRS from Sprint, C-band); and Dish Network / EchoStar (AWS-4 at 2 GHz, H-block at 1.9 GHz, 600 MHz licenses, and an FCC-mandated obligation to build a 5G network after acquiring spectrum from Sprint in the T-Mobile merger condition).
Broadcast Database: AM and FM Licensing
Broadcast records in the ULS (and in the FCC's parallel Licensing Management System for newer filings) contain engineering parameters beyond the basic call sign and licensee fields that appear in wireless records.
AM Broadcasting
The FCC licenses approximately 4,600 active AM broadcast stations across the 535–1705 kHz band (with an experimental 1610–1700 kHz band for travelers' information and other services). AM propagation creates a fundamental engineering challenge: during daytime hours, AM signals propagate primarily as ground waves with coverage limited to tens of miles. After sunset, ionospheric conditions allow AM signals to propagate as sky waves over hundreds or thousands of miles, creating potential interference between stations sharing the same frequency across the country. The FCC manages this through a classification system with directional antenna requirements for nighttime operation.
Clear channel stations (now called Class A) — a handful of 50,000-watt stations like WLW (700 kHz, Cincinnati) and WSB (750 kHz, Atlanta) — operate with unlimited hours and receive nationwide skywave protection at night. Regional stations (Class B) operate at up to 50,000 watts daytime but with directional antennas at night to protect Class A stations on the same frequency. Local stations (Class C and D) operate at lower power levels. The ULS record for each AM station contains the daytime and nighttime antenna patterns (as a series of azimuth-by-field-strength coordinates for directional antennas) and the authorized power for each.
FM Broadcasting
The FCC licenses approximately 10,700 active FM broadcast stations in the 88.1–107.9 MHz band, plus the noncommercial educational reserved band at 88.1–91.9 MHz. FM stations are classified by power and antenna height into classes that determine their maximum coverage area:
| Class | Max ERP | Max HAAT | Typical coverage |
|---|---|---|---|
| A | 6 kW | 100 m | Small city / suburban area |
| A1 | 9 kW | 100 m | Small city, Puerto Rico and USVI only |
| B1 | 25 kW | 100 m | Smaller metro area, Northeast US |
| B | 50 kW | 150 m | Metro area, Northeast US |
| C3 | 25 kW | 100 m | Smaller market, Southern/Western US |
| C2 | 50 kW | 150 m | Mid-size market |
| C1 | 100 kW | 299 m | Large market |
| C | 100 kW | 600 m | Major market; widest FM coverage radius |
HAAT is height above average terrain — the antenna's elevation above the average ground elevation in the surrounding terrain, a more meaningful propagation predictor than height above ground level. Class C stations can radiate 100 kW into an antenna at 600 m HAAT, producing a protected service contour covering roughly a 60-mile radius. Class A stations at 6 kW and 100 m HAAT cover roughly a 15-mile radius. The FCC's FM allocation rules space stations on the same or adjacent frequencies far enough apart that their protected service contours do not overlap, using a channel separation table based on station class.
FM translators (service code FX) and FM boosters are secondary-status facilities that rebroadcast a primary FM or AM station's signal to fill coverage gaps. As secondary stations they must yield to full-power primary FM stations and may not cause harmful interference. The FCC authorized a wave of new FM translator applications beginning in 2003 and again in 2013, resulting in thousands of translator stations now operating across the country. A single primary station may have a dozen or more associated translators extending its coverage into terrain shadows.
TV Broadcasting
The June 2009 digital TV transition ended analog NTSC broadcasting and converted all full-power TV stations to ATSC digital. Television stations now hold a licensed RF channel (the actual broadcast frequency) that may differ from the virtual channel they display on screen — a station might broadcast on RF channel 32 while displaying as virtual channel 5 on cable and over-the-air receivers, preserving viewer familiarity with its pre-transition channel number. The ULS and LMS records track the licensed RF channel; the virtual channel mapping is maintained separately by the station and transmitted in the PSIP (Program and System Information Protocol) data within the broadcast signal.
LPTV stations (service code TP) and TV translators (TX) operate as secondary facilities and were granted digital construction permits to transition their own signals to digital. The spectrum repack following the 600 MHz incentive auction moved hundreds of full-power TV stations to new RF channels to clear the 600 MHz band for wireless carriers, with the FCC maintaining a repack tracker in the ULS and LMS showing each station's pre- and post-repack channel assignment.
Data Access: API and Bulk Downloads
The FCC provides two primary mechanisms for accessing ULS data programmatically: a JSON API for individual license lookups and a bulk download system for full-service archives.
FCC License View API
The FCC License View API at data.fcc.gov/api/license-view/basicSearch/getLicenses accepts query parameters including callSign, frn (FCC Registration Number), service (service code), statusDesc (Active, Cancelled, Expired, Terminated), and state. Results are paginated via limit and offset parameters and returned as JSON with a Licenses.License array. The API is appropriate for targeted queries returning hundreds to a few thousand records. Examples:
- All active AM stations in Colorado:
?format=json&service=AM&statusDesc=Active&state=CO - Lookup by call sign:
?format=json&callSign=WBZ - All active cellular licenses in a state:
?format=json&service=CE&statusDesc=Active&state=TX
Key fields in the API response include: callSign, radioServiceCode, licenseeName, frn, status, statusDesc, grantDate, expiredDate, market, frequencyLow, frequencyHigh, city, state, and uniqueSystemIdentifier. Geographic area licenses (cellular, AWS, C-band) carry a market field identifying the license territory; individual station licenses carry city / state and latitude/longitude in extended record data.
For broadcast station records including engineering parameters (power, HAAT, antenna coordinates, directional pattern), the FCC Public File system at publicfiles.fcc.gov is the authoritative source. Each broadcast licensee must maintain a public file containing its license, ownership reports, political advertising documentation, and quarterly issue and program lists. The public file is accessible by call sign without registration.
ULS Bulk Weekly Downloads
For analysis spanning full service categories, the ULS bulk download at data.fcc.gov/download/pub/uls/complete/ provides pipe-delimited zip archives updated weekly. Archive names follow the pattern l_<service>.zip: l_amat.zip for amateur radio, l_cell.zip for cellular, l_broad.zip for broadcast, l_micro.zip for private microwave. Within each archive, pipe-delimited .dat files correspond to ULS table codes: HD.dat (header/license), EN.dat (entity), LO.dat (location), FR.dat (frequency), AN.dat (antenna), HS.dat (history). Records are linked across tables by unique_system_id. The encoding is Latin-1 throughout; use encoding='latin-1' in pandas or equivalent when reading.
The weekly download index is published at fcc.gov/uls/index.htm?job=transaction&page=weekly, with links to the current full archives and to incremental “transaction” files covering only the changes since the previous week's download. For a full database mirror, start with the complete archives and apply weekly transaction files to keep current without re-downloading the full dataset each week.
Python: Querying the FCC Data API for Broadcast and Cellular Licenses
The script below uses the FCC License View API to retrieve all active AM and FM broadcast stations in Texas, display a ranked table of stations by frequency, then query the cellular service code (CE) to demonstrate how geographic-area commercial wireless licenses appear in the same API. It handles pagination automatically, printing structured tables for each service.
import requests
import pandas as pd
from datetime import datetime
# FCC License View API base
# Docs: https://www.fcc.gov/licensing-databases/licensing
FCC_API = 'https://data.fcc.gov/api/license-view/basicSearch/getLicenses'
def get_active_broadcast_licenses(service_code: str, state: str, rows: int = 500) -> pd.DataFrame:
"""
Fetch active broadcast licenses from the FCC License View API.
service_code: \'AM\' for AM broadcast, \'FM\' for FM broadcast,
\'TV\' for full-power TV, \'BR\' for FM translators
state: two-letter state abbreviation, e.g. \'TX\' or \'CA\'
rows: maximum rows per request (API cap varies; 500 is safe)
"""
params = {
'format': 'json',
'service': service_code,
'statusDesc': 'Active',
'state': state,
'limit': rows,
'offset': 0,
}
all_rows = []
while True:
resp = requests.get(FCC_API, params=params, timeout=30)
resp.raise_for_status()
data = resp.json()
licenses = data.get(\'Licenses\', {}).get(\'License\', [])
if isinstance(licenses, dict):
licenses = [licenses]
if not licenses:
break
all_rows.extend(licenses)
# Pagination: check if more pages exist
total = int(data.get(\'Licenses\', {}).get(\'totalRows\', 0))
params[\'offset\'] += rows
if params[\'offset\'] >= total:
break
return pd.DataFrame(all_rows)
# ── Step 1: Active AM stations in Texas ──────────────────────────────────────
print('Fetching active AM broadcast licenses in Texas...')
am_tx = get_active_broadcast_licenses(\'AM\', \'TX\')
print(f'AM stations found: {len(am_tx)}')
AM_COLS = [\'callSign\', \'frequencyLow\', \'licenseeName\',
\'city\', \'state\', \'expiredDate\', \'radioServiceCode\']
am_display = am_tx[[c for c in AM_COLS if c in am_tx.columns]].copy()
am_display = am_display.sort_values(\'frequencyLow\', key=lambda s: pd.to_numeric(s, errors=\'coerce\')).head(20)
print(\'\\nTop 20 Texas AM stations (by frequency):\')
print(f" {'Call Sign':<10} {'Freq (kHz)':<12} {'Licensee':<36} {'City':<18} Expires")
print(\' \' + \'-\' * 88)
for _, r in am_display.iterrows():
freq = str(r.get(\'frequencyLow\', \'\'))
exp = str(r.get(\'expiredDate\', \'\'))[:10]
print(f" {r.get(\'callSign\', \'\'):<10} {freq:<12} {str(r.get(\'licenseeName\', \'\'))[:35]:<36} {str(r.get(\'city\', \'\'))[:17]:<18} {exp}")
# ── Step 2: Active FM stations in Texas ──────────────────────────────────────
print(\'\\nFetching active FM broadcast licenses in Texas...\')
fm_tx = get_active_broadcast_licenses(\'FM\', \'TX\')
print(f\'FM stations found: {len(fm_tx)}\')
FM_COLS = [\'callSign\', \'frequencyLow\', \'licenseeName\', \'city\', \'state\',
\'radioServiceCode\', \'expiredDate\']
fm_display = fm_tx[[c for c in FM_COLS if c in fm_tx.columns]].copy()
fm_display = fm_display.sort_values(\'frequencyLow\', key=lambda s: pd.to_numeric(s, errors=\'coerce\')).head(20)
print(\'\\nTop 20 Texas FM stations (by frequency):\')
print(f" {'Call Sign':<10} {'Freq (MHz)':<12} {'Licensee':<36} {'City':<18} {'Svc':<4} Expires")
print(\' \' + \'-\' * 94)
for _, r in fm_display.iterrows():
freq = str(r.get(\'frequencyLow\', \'\'))
svc = str(r.get(\'radioServiceCode\', \'\'))
exp = str(r.get(\'expiredDate\', \'\'))[:10]
print(f" {r.get(\'callSign\', \'\'):<10} {freq:<12} {str(r.get(\'licenseeName\', \'\'))[:35]:<36} {str(r.get(\'city\', \'\'))[:17]:<18} {svc:<4} {exp}")
# ── Step 3: Cellular licenses (service code CE) in an area code / state ──────
# For commercial wireless, the API accepts service code \'CE\' (Cellular)
# Results represent geographic area licenses, not individual tower registrations
print(\'\\nFetching active Cellular (CE) licenses in Texas...\')
cell_tx = get_active_broadcast_licenses(\'CE\', \'TX\')
print(f\'Cellular license records found: {len(cell_tx)}\')
if not cell_tx.empty:
CELL_COLS = [\'callSign\', \'licenseeName\', \'market\', \'frequencyLow\',
\'frequencyHigh\', \'grantDate\', \'expiredDate\']
cell_display = cell_tx[[c for c in CELL_COLS if c in cell_tx.columns]].head(15)
print(\'\\nCellular geographic-area licenses in Texas (sample):\')
print(f" {'Call Sign':<12} {'Licensee':<30} {'Market':<10} {'Freq Low':<10} {'Freq High':<10} Expires")
print(\' \' + \'-\' * 84)
for _, r in cell_display.iterrows():
print(
f" {str(r.get(\'callSign\', \'\')):<12} "
f"{str(r.get(\'licenseeName\', \'\'))[:29]:<30} "
f"{str(r.get(\'market\', \'\'))[:9]:<10} "
f"{str(r.get(\'frequencyLow\', \'\')):<10} "
f"{str(r.get(\'frequencyHigh\', \'\')):<10} "
f"{str(r.get(\'expiredDate\', \'\'))[:10]}"
)
# ── Summary table across both broadcast services ──────────────────────────────
print(\'\\n\' + \'=\' * 60)
print(\'Texas Broadcast License Summary\')
print(\'=\' * 60)
print(f\' Active AM stations: {len(am_tx):>6,}\')
print(f\' Active FM stations: {len(fm_tx):>6,}\')
print(f\' Cellular licenses: {len(cell_tx):>6,}\')
now = datetime.utcnow().strftime(\'%Y-%m-%d %H:%M UTC\')
print(f\'\\nData retrieved: {now}\')
print(\'Source: FCC License View API — data.fcc.gov\')
A few notes on working with the FCC API. The service parameter accepts the two-character radio service code exactly as it appears in the ULS —AM, FM, TV, CE, and so on. The API is case-sensitive for some parameters. Results for geographic area licenses (cellular, AWS, C-band) show a market field rather than a city, since these licenses cover an entire BTA, EA, or county cluster rather than a single transmitter location. For broadcast stations the frequencyLow field carries the channel frequency in MHz for FM (e.g., 98.1) or kHz for AM (e.g., 1080), making it possible to sort stations by their dial position. The API returns up to several hundred records per request depending on the service; large services like amateur radio or FM require iteration through the full bulk download rather than the API for complete analysis.
Related: FCC spectrum data · FHWA National Bridge Inventory
Part of the Federal Regulatory Data Hub.