# FCC ULS License Database Scraper (`jungle_synthesizer/fcc-uls-license-database-scraper`) Actor

Bulk export of the FCC's complete Universal Licensing System (ULS) radio license database — amateur, GMRS, land-mobile, aircraft, marine, microwave, paging, and more.

- **URL**: https://apify.com/jungle_synthesizer/fcc-uls-license-database-scraper.md
- **Developed by:** [BowTiedRaccoon](https://apify.com/jungle_synthesizer) (community)
- **Categories:** Lead generation, Business, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.80 / 1,000 record scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## FCC ULS License Database Scraper

Export the FCC's Universal Licensing System (ULS) radio license database in bulk. Returns call signs, license status, grant and expiration dates, and the licensee's name and address for amateur, GMRS, land-mobile, aircraft, marine, cellular, microwave, paging, and market-based radio licenses — millions of records across 14 FCC service categories, refreshed weekly straight from the source.

***

### FCC ULS License Database Scraper Features

- Pulls the FCC's own weekly-refreshed license tables, not a scraped search results page
- Covers all 14 ULS license categories: amateur, GMRS, land-mobile (private/commercial/broadcast), aircraft, coast, cellular, microwave, paging, ship, market-based, and BRS/EBS
- Joins the FCC's separate license-header and entity-name tables for you — one flat record per license, name and address included
- Filters by license status (active, expired, cancelled, terminated)
- Returns amateur radio operator class (Technician/General/Advanced/Extra) where the license carries one
- No account, API key, or CAPTCHA to deal with — it's a public federal dataset

***

### Who Uses FCC License Data?

- **Ham radio data products** — build a callsign lookup tool or operator-class directory without maintaining your own ULS mirror
- **RF and wireless equipment vendors** — target active license holders by service and operator class
- **Antenna and tower siting firms** — cross-reference land-mobile and microwave licensees against a project area
- **Spectrum compliance teams** — track status changes (active, expired, cancelled) across a watchlist of call signs
- **Telecom due diligence** — pull commercial land-mobile, cellular, and market-based license holders with current contact addresses
- **GMRS/amateur radio retailers** — build a lead list from active license holders in a given state

***

### How FCC ULS License Database Scraper Works

1. Pick which ULS service categories you want — amateur, GMRS, land-mobile, aircraft, and so on — or leave it blank to pull all 14.
2. Optionally filter by license status, so you only get active licenses, or only expired ones, or any combination.
3. The scraper reads the FCC's license-header and entity-name tables for each requested service and joins them into one record per license, with the holder's name, address, and FCC Registration Number attached.
4. Records stream out as they're read — set `maxItems` to cap a run, or leave it high for a full category export.

***

### Input

```json
{
  "services": ["amat", "gmrs"],
  "licenseStatus": ["A"],
  "maxItems": 5000
}
```

| Field           | Type    | Default         | Description |
|-----------------|---------|-----------------|--------------|
| `services`      | array   | all 14 services | Which ULS service categories to include: `amat` (Amateur Radio), `gmrs` (GMRS), `LMpriv` (Land Mobile — Private), `LMcomm` (Land Mobile — Commercial), `LMbcast` (Land Mobile — Broadcast Auxiliary), `aircr` (Aircraft), `coast` (Coast/Maritime), `cell` (Cellular), `micro` (Microwave), `paging` (Paging), `ship` (Ship/Maritime Vessels), `market` (Market-Based/Auctioned Licenses), `mdsitfs` (BRS/EBS), `frc` (Marine Coast & Rural Radiotelephone). Leave empty for all. |
| `licenseStatus` | array   | all statuses    | Filter by license status: `A` (Active), `E` (Expired), `C` (Cancelled), `T` (Terminated). Leave empty for no filter. |
| `maxItems`      | integer | 10              | Maximum number of license records to return across all requested services. |

***

### FCC ULS License Database Scraper Output Fields

```json
{
  "call_sign": "AA6RV",
  "unique_system_identifier": "218379",
  "license_status": "A",
  "radio_service_code": "HA",
  "grant_date": "10/31/2015",
  "expired_date": "01/24/2026",
  "cancellation_date": null,
  "entity_type": "L",
  "entity_name": "Malin, David H",
  "first_name": "David",
  "last_name": "Malin",
  "street_address": "14415 NE 76th Ave",
  "city": "Vancouver",
  "state": "WA",
  "zip_code": "98662",
  "frn": "0006290605",
  "operator_class": "E",
  "service_db": "amat",
  "scraped_at": "2026-10-15T09:48:37.455Z"
}
```

| Field                      | Type   | Description                                                                    |
|----------------------------|--------|--------------------------------------------------------------------------------|
| `call_sign`                | string | FCC call sign for this license                                                 |
| `unique_system_identifier` | string | FCC ULS unique system identifier                                               |
| `license_status`           | string | `A` Active, `E` Expired, `C` Cancelled, `T` Terminated                         |
| `radio_service_code`       | string | FCC radio service code for this license (e.g. `HA` = amateur)                  |
| `grant_date`               | string | Date the license was granted                                                   |
| `expired_date`             | string | Date the license expires (or expired)                                          |
| `cancellation_date`        | string | Date the license was cancelled, if applicable                                  |
| `entity_type`              | string | Entity type code (e.g. `L` = Licensee)                                         |
| `entity_name`              | string | Licensee/entity name as filed with the FCC                                     |
| `first_name`               | string | Licensee first name, for individual licensees                                  |
| `last_name`                | string | Licensee last name, for individual licensees                                   |
| `street_address`           | string | Licensee street address on file with the FCC                                   |
| `city`                     | string | Licensee city                                                                  |
| `state`                    | string | Licensee state                                                                 |
| `zip_code`                 | string | Licensee ZIP code                                                              |
| `frn`                      | string | FCC Registration Number for the licensee                                       |
| `operator_class`           | string | Amateur operator class (`T`/`G`/`A`/`E`) — populated only for amateur licenses |
| `service_db`               | string | Which ULS service category this record came from                               |
| `scraped_at`               | string | ISO-8601 timestamp when the record was collected                               |

***

### FAQ

#### How do I scrape the FCC license database?

FCC ULS License Database Scraper needs no account and no API key. Pick a service category — or leave it blank for all 14 — and run it. You get back license records with call sign, status, and holder name and address attached.

#### What data can I get from the FCC ULS?

Every license category the FCC publishes: amateur radio, GMRS, land-mobile (private, commercial, and broadcast auxiliary), aircraft, coast and ship (maritime), cellular, microwave, paging, and market-based/auctioned licenses. Amateur licenses alone number in the millions.

#### Can I filter by license status?

Yes. Set `licenseStatus` to `A` for active-only, or any combination of active, expired, cancelled, and terminated. Leave it empty to get everything.

#### How often is the data refreshed?

The FCC republishes its license tables weekly, and each run reads the current published tables — so a scheduled run stays current without you tracking the FCC's release calendar yourself.

#### Do amateur radio records include operator class?

Yes — `operator_class` (Technician/General/Advanced/Extra) is populated on amateur licenses that carry one. It's left blank on non-amateur services and on a small number of club/trustee amateur licenses that don't carry their own class.

***

### Need More Features?

Need a different filter, an additional field, or a different FCC dataset entirely? [File an issue](https://console.apify.com/actors/issues) or get in touch.

### Why Use FCC ULS License Database Scraper?

- **Straight from the source** — reads the FCC's own published license tables, not a third-party mirror or a scraped search page
- **Full category coverage** — the three other FCC license tools on Apify each cover one narrow slice (a single wireless band, a geographic lookup tool, or single-callsign search); this one exports any or all of the FCC's 14 license categories in one run
- **Name and address included** — license-header and entity-name records are joined for you, so you're not stitching two FCC tables together yourself

# Actor input Schema

## `sp_intended_usage` (type: `string`):

What will this data feed? E.g. lead lists, KYB checks, price tracking.

## `sp_improvement_suggestions` (type: `string`):

Provide any feedback or suggestions for improvements.

## `sp_contact` (type: `string`):

We'll personally help with your use case. No spam.

## `services` (type: `array`):

Which FCC ULS radio service databases to ingest. Leave empty to ingest all 14 services (the full ULS complete database).

## `licenseStatus` (type: `array`):

Filter by license status. Leave empty to include all statuses.

## `maxItems` (type: `integer`):

Maximum number of license records to scrape across all requested services.

## Actor input object example

```json
{
  "sp_contact": "Share your email here...",
  "maxItems": 10
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "sp_contact": "Share your email here...",
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("jungle_synthesizer/fcc-uls-license-database-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "sp_contact": "Share your email here...",
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("jungle_synthesizer/fcc-uls-license-database-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "sp_contact": "Share your email here...",
  "maxItems": 10
}' |
apify call jungle_synthesizer/fcc-uls-license-database-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,jungle_synthesizer/fcc-uls-license-database-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/glXEWqVl8fcTnwhzT/builds/9Xt4brZmf3l5bU7oA/openapi.json
