# FCC License & Antenna Tower Leads Scraper (`scrapesage/fcc-license-scraper`) Actor

Scrape official FCC bulk data: wireless licensees (ULS) and antenna-structure (ASR) tower owners with phone, email, address, FRN, license/registration status, dates, structure heights & GPS. Telecom & broadcast B2B leads. Filters, lead scoring & monitoring. No browser, no API key.

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

## Pricing

$5.00 / 1,000 license / tower records

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## FCC License & Antenna Tower Leads Scraper — Wireless Licensees, Tower Owners, Phones & Emails

Turn the official **FCC bulk databases** into a clean, contact-rich **B2B lead list**. This actor unifies two government feeds into one schema:

- **ULS wireless licenses** — every licensee in a radio service (land-mobile commercial/private two-way radio, fleets, public safety, microwave, paging, cellular/PCS/AWS carriers, maritime) with **call sign, FRN, radio service, status, grant/expiration dates** and the licensee's **phone, email, contact name and full mailing address**.
- **ASR antenna structures (towers)** — every registered tower/monopole/mast with **structure type, heights (AGL/AMSL), GPS coordinates, status, FAA study number** and the **tower owner's phone, email, contact name and address**.

No login, no API key, no browser — direct extraction from the FCC's weekly public data files with phone on ~100% of records and email on up to ~90% (towers).

### Why this FCC scraper?

Other FCC tools are single-purpose: a call-sign lookup, a 3650 MHz export, a coordinate converter. This actor is the **richest all-in-one lead product** in the category — it joins the license/registration tables to the **entity tables that hold the contacts**, scores every record, and lets you monitor for new ones.

| Data | Typical FCC tools | This actor |
|---|---|---|
| Wireless licensees **and** tower owners in one schema | ❌ | ✅ |
| Owner / licensee **phone** | partial | ✅ ~100% |
| Owner / licensee **email** | ❌ | ✅ up to ~90% (towers) |
| Contact name + title, full mailing address, FRN | ❌ | ✅ |
| Tower **height (AGL/AMSL)**, structure type, **GPS** | partial | ✅ |
| Radio service, license status & grant/expiration dates | partial | ✅ |
| Business-vs-individual flag + 0–100 lead score | ❌ | ✅ |
| New-records-only monitor mode | ❌ | ✅ |

### Use cases

- **Telecom infrastructure sales** — tower owners are buyers of site maintenance, ground-lease management, structural engineering, lighting/marking compliance, generators, fiber backhaul and equipment. Filter by `minHeightMeters` to find the largest assets.
- **Tower & site acquisition / M\&A** — every registered structure with owner contact, coordinates and height; perfect for site-acquisition and roll-up prospecting.
- **Two-way radio & wireless equipment dealers** — land-mobile commercial/private licensees are fleets, security firms, construction, utilities, public safety — all buyers of radios, repeaters and FCC license renewal services.
- **Carrier & spectrum intelligence** — market-based (cellular/PCS/AWS/700 MHz) and microwave licensees by company, service and date.
- **FCC compliance & legal services** — license renewal, ASR marking/lighting compliance, frequency coordination — reach licensees before their licenses expire (`grantedAfter`, lead signal `expiringSoon`).
- **Maritime & aviation comms** — coast/ship and microwave licensees with full contacts.

### How to use

1. [Sign up for Apify](https://console.apify.com/sign-up) — the free plan is enough to try this actor.
2. Open the **FCC License & Antenna Tower Leads Scraper**, choose your **sources**, add **states** and any filters, and click **Start**.
3. Watch results stream into the dataset table.
4. **Export** as JSON, CSV, Excel, XML, or RSS — or pull results programmatically via the [Apify API](https://docs.apify.com/api/v2).

### Input

```json
{
    "sources": ["antennaStructures", "landMobileCommercial"],
    "states": ["TX", "OK"],
    "activeOnly": true,
    "businessOwnersOnly": true,
    "withPhoneOnly": true,
    "minHeightMeters": 60,
    "sortBy": "leadScore",
    "maxResults": 1000
}
```

- **sources** — any of `antennaStructures` (tower owners), `landMobileCommercial`, `landMobilePrivate`, `microwave`, `paging`, `marketBased` (cellular/PCS/AWS/700 MHz), `maritimeCoast`, `ship`.
- **states** — two-letter codes; matches owner/licensee state and (for towers) the structure state.
- **activeOnly** *(default true)* — active wireless licenses + constructed/granted towers only.
- **businessOwnersOnly / withEmailOnly / withPhoneOnly** — contactability filters.
- **nameQuery / frnQuery / callSignQuery** — find a specific company, FRN or call sign.
- **structureTypes / minHeightMeters / maxHeightMeters** — antenna-structure filters (e.g. `monopole`, `guyed`, towers ≥ 60 m).
- **grantedAfter / grantedBefore** — recency window on grant/registration date (catch newly-licensed entities).
- **minLeadScore** — keep only high-quality leads.
- **sortBy** — `newest`, `lastAction`, `leadScore`, or `heightHigh`.
- **monitorMode** *(default false)* — emit only records not seen on previous runs (see below).
- **includeRawFields** *(default false)* — attach the raw FCC source rows for full transparency.

### Output

One record per license or tower. **Antenna structure (tower owner):**

```json
{
    "recordType": "antennaStructure",
    "source": "Antenna Structure (Tower)",
    "registrationNumber": "A1384374",
    "uniqueSystemId": "1274815",
    "name": "AT&T Mobility Spectrum LLC",
    "isBusiness": true,
    "contactName": "Jaime A Ochoa",
    "contactTitle": "Assistant Secretary",
    "phone": "(855) 699-7073",
    "email": "attnrc@att.com",
    "addressFull": "3400 W Plano Pkwy, Plano, TX, 75075",
    "structureType": "Pole",
    "registrationStatusLabel": "Constructed",
    "heightOverallAGLm": 32.3,
    "heightAMSLm": 1361.8,
    "structureCity": "Gillette",
    "structureState": "WY",
    "latitude": 44.339306,
    "longitude": -105.523639,
    "faaStudyNumber": "2026-ANM-2416-OE",
    "dateIssued": "2026-05-08",
    "leadSignals": ["hasEmail", "hasPhone", "businessEntity", "constructed"],
    "leadScore": 86,
    "sourceUrl": "https://wireless2.fcc.gov/UlsApp/AsrSearch/asrRegistration.jsp?regKey=A1384374",
    "scrapedAt": "2026-06-21T03:36:41.026Z"
}
```

**Wireless license (licensee):**

```json
{
    "recordType": "wirelessLicense",
    "source": "Land Mobile — Commercial",
    "callSign": "WSMD460",
    "frn": "0021431044",
    "name": "Tata Chemicals North America",
    "isBusiness": true,
    "phone": "(307) 872-3643",
    "email": "sbagshaw@tatachemicals.com",
    "addressFull": "324 Allied Chemical RD, Green River, WY, 82935",
    "radioServiceLabel": "Land Mobile — Commercial",
    "licenseStatusLabel": "Active",
    "grantDate": "2026-03-20",
    "expiredDate": "2036-03-20",
    "leadSignals": ["hasEmail", "hasPhone", "businessEntity", "activeLicense", "newlyLicensed"],
    "leadScore": 100,
    "sourceUrl": "https://wireless2.fcc.gov/UlsApp/UlsSearch/license.jsp?__callsign=WSMD460",
    "scrapedAt": "2026-06-21T03:36:41.026Z"
}
```

### Monitor mode — only new records

Turn the scraper into a recurring **new-licensee / new-tower feed**. With `monitorMode` on, the actor remembers every record it has emitted (in a key-value store keyed by `monitorKey`) and returns only **new** ones on the next run — ideal for catching newly-licensed companies and newly-registered towers as they appear.

Monitor mode is **independent of the Apify scheduler**: it deduplicates across runs by content, so you can safely combine it with [Schedules](https://docs.apify.com/platform/schedules) (e.g. weekly, matching the FCC's weekly data refresh) without double-counting. Use different `monitorKey` values for different filter setups so each tracks its own state.

### Automate & schedule

- **[Apify API](https://docs.apify.com/api/v2)** — start runs, fetch datasets, manage schedules over REST.
- **[apify-client for JavaScript](https://docs.apify.com/api/client/js/)** and **[Python](https://docs.apify.com/api/client/python/)** — official SDKs.
- **[Schedules](https://docs.apify.com/platform/schedules)** — run weekly (the FCC refreshes the bulk files weekly) with `monitorMode` to pull only new licenses and towers.
- **[Webhooks](https://docs.apify.com/platform/integrations/webhooks)** — trigger CRM import, Slack alert, or an email sequence the moment a run finishes.

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

const client = new ApifyClient({ token: 'MY_APIFY_TOKEN' });

const run = await client.actor('scrapesage/fcc-license-scraper').call({
    sources: ['antennaStructures'],
    states: ['TX'],
    minHeightMeters: 60,
    sortBy: 'leadScore',
    maxResults: 2000,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Got ${items.length} FCC leads`);
```

### Integrate with any app

Connect the dataset to 5,000+ apps — no code required:

- **[Make](https://docs.apify.com/platform/integrations/make)** — multi-step automation scenarios.
- **[Zapier](https://docs.apify.com/platform/integrations/zapier)** — push new tower-owner leads straight into your CRM.
- **[Slack](https://docs.apify.com/platform/integrations/slack)** — get notified when a monitored search finds new licenses.
- **[Google Drive / Sheets](https://docs.apify.com/platform/integrations/drive)** — auto-export every run to a spreadsheet.
- **[Airbyte](https://docs.apify.com/platform/integrations/airbyte)** — pipe results into your data warehouse.
- **[GitHub](https://docs.apify.com/platform/integrations/github)** — trigger runs from commits or releases.

### Use with AI assistants (MCP)

The output is clean, LLM-ready JSON. Call this actor from Claude, ChatGPT, or any agent framework through the **[Apify MCP server](https://docs.apify.com/platform/integrations/mcp)** — ask your assistant to "find every tower over 100 m in Texas with the owner's phone and email" and let it run this scraper for you.

### Agent-ready: autonomous payments (x402 & Skyfire)

This actor is **agent-ready** — AI agents can discover it, run it, and **pay for it autonomously**, with no Apify account and no human in the loop. It uses [pay-per-event](https://docs.apify.com/platform/actors/publishing/monetize/pay-per-event) pricing and [limited permissions](https://docs.apify.com/platform/actors/development/permissions), so it qualifies for Apify's agentic-payment standards:

- **[x402](https://docs.apify.com/platform/integrations/x402)** — an open, HTTP-native payment protocol. Agents pay per run in USDC on the Base network directly through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp) — no account, no API key.
- **[Skyfire](https://docs.apify.com/platform/integrations/skyfire)** — agent-to-service payments for fully autonomous AI-agent workflows.

Building an AI agent, MCP tool, or autonomous data pipeline? This scraper is ready to plug in and pay as it goes.

### More scrapers from scrapesage

Build a complete **US gov-data B2B lead stack**:

- **[FAA Aircraft Registry Scraper](https://apify.com/scrapesage/faa-aircraft-registry-scraper)** — aircraft owners (LLCs, corporations) with full mailing addresses.
- **[FMCSA Trucking Scraper](https://apify.com/scrapesage/fmcsa-trucking-scraper)** — motor carriers & new-authority leads with contacts.
- **[EPA ECHO Scraper](https://apify.com/scrapesage/epa-echo-scraper)** — regulated facilities, compliance & violation leads.
- **[US Business Formation Scraper](https://apify.com/scrapesage/us-business-formation-scraper)** — newly registered LLCs & corporations.
- **[SBA Loan Leads Scraper](https://apify.com/scrapesage/sba-loan-leads-scraper)** — financed small businesses (7(a) & 504).
- **[US Property Records Scraper](https://apify.com/scrapesage/us-property-records-scraper)** — parcels & owner leads with mailing addresses (great for tower ground leases).
- **[US Banks & Credit Unions Scraper](https://apify.com/scrapesage/us-banks-credit-unions-scraper)** — every FDIC bank & NCUA credit union.
- **[USAspending Scraper](https://apify.com/scrapesage/usaspending-scraper)** — federal award recipients & spending data.

### Tips

- **Towers carry the best emails** (~90%); ULS wireless licensees carry phones on ~100% but emails on ~40% — combine sources for the widest contact coverage.
- **Cost & speed**: each source is one weekly bulk file (35–80 MB). Selecting fewer sources and adding a `states` filter keeps runs fast and cheap.
- **Tall = valuable**: `minHeightMeters: 60` (≈200 ft) focuses on macro towers; `≥ 150` targets the largest broadcast/cellular structures.
- **Recurring monitoring**: combine [Schedules](https://docs.apify.com/platform/schedules) (weekly) with `monitorMode` to track only newly registered towers and newly licensed companies.

### FAQ

**Where does the data come from?** The official FCC public bulk databases: the Universal Licensing System (ULS) weekly license downloads and the Antenna Structure Registration (ASR) weekly download — both free, public, and updated weekly. No API key or login is required.

**Where do the emails and phones come from?** Directly from the FCC entity records — licensees and tower owners provide a contact phone, email and mailing address as part of registration. This actor surfaces those fields; it does not crawl third-party sites.

**Can I get only newly licensed companies or new towers?** Yes — enable `monitorMode` and schedule weekly runs. Only records not seen before are returned.

**Which states are covered?** All US states and territories. Filter with the `states` input or leave it empty for nationwide.

**Can I export to Google Sheets, CSV, or Excel?** Yes — one click in the dataset view, or automatically on every run via the [Google Drive integration](https://docs.apify.com/platform/integrations/drive).

**A field is null — why?** Some records genuinely omit a field (e.g. a licensee with no email on file, or a tower without a published structure type). Fields are `null` only when the FCC data doesn't contain them, never because the scraper skipped them.

**Is this legal?** This actor collects publicly available US government data only. You are responsible for using it in compliance with applicable laws and the FCC's data terms.

### Need help?

Open an issue on the actor's **Issues** tab, or visit the [Apify help center](https://help.apify.com/). Feature requests — more ULS services, broadcast (TV/FM/AM) station owners, frequency details — are welcome; this actor is actively maintained.

# Actor input Schema

## `sources` (type: `array`):

Which official FCC bulk feeds to scrape. <b>antennaStructures</b> = ASR tower owners (phone ~100%, email ~90%). The rest are ULS wireless services (licensee phone ~100%, email ~40%): land-mobile commercial/private (two-way radio, fleets, public safety), microwave, paging, market-based (cellular/PCS/AWS/700 MHz carriers), maritime coast & ship.

## `states` (type: `array`):

Two-letter US state codes to include (e.g. <code>TX</code>, <code>CA</code>, <code>NY</code>). Matches the owner/licensee state and, for towers, the structure state. Leave empty for all states.

## `activeOnly` (type: `boolean`):

Only include active records: wireless licenses with status Active, and antenna structures that are Constructed or Granted. Turn off to include cancelled/expired/terminated records too.

## `businessOwnersOnly` (type: `boolean`):

Only include records whose owner/licensee is an organization (LLC, corporation, company, authority, etc.) — filters out individuals.

## `withEmailOnly` (type: `boolean`):

Only include records that have a contact email address.

## `withPhoneOnly` (type: `boolean`):

Only include records that have a contact phone number.

## `nameQuery` (type: `string`):

Case-insensitive substring match on the owner/licensee name (e.g. <code>american tower</code>, <code>crown castle</code>, <code>city of</code>).

## `frnQuery` (type: `string`):

Exact FCC Registration Number (FRN) to match (ULS wireless licenses only).

## `callSignQuery` (type: `string`):

Exact call sign to match (ULS wireless licenses only), e.g. <code>KAA220</code>.

## `structureTypes` (type: `array`):

Filter antenna structures by type, e.g. <code>tower</code>, <code>monopole</code>, <code>guyed</code>, <code>lattice</code>, <code>pole</code>, <code>mast</code>, <code>building</code>. Substring match.

## `minHeightMeters` (type: `integer`):

Only include towers at least this tall (overall height above ground level, in meters). Tall towers = higher-value telecom infrastructure leads.

## `maxHeightMeters` (type: `integer`):

Only include towers at most this tall (overall height above ground level, in meters).

## `grantedAfter` (type: `string`):

Only include records first granted (wireless) or registered (towers) on or after this date (YYYY-MM-DD). Great for catching newly-licensed entities.

## `grantedBefore` (type: `string`):

Only include records first granted/registered on or before this date (YYYY-MM-DD).

## `minLeadScore` (type: `integer`):

Only include records with a lead score (0–100) at or above this value.

## `maxResults` (type: `integer`):

Maximum number of records to return across all selected sources.

## `sortBy` (type: `string`):

Order of returned records. Newest = most recent grant/registration date.

## `deduplicateResults` (type: `boolean`):

Remove duplicate records (same registration / call sign + system id).

## `includeRawFields` (type: `boolean`):

Attach the raw FCC source rows (sourceFields) to each record for full transparency / advanced use.

## `monitorMode` (type: `boolean`):

Remember records seen on previous runs (in a key-value store) and emit only NEW ones each run. Ideal with Apify Schedules to track newly-licensed entities and newly-registered towers. Works independently of the Apify scheduler.

## `monitorKey` (type: `string`):

Name for this monitor's saved state. Use different keys for different filter setups so they track independently.

## `proxyConfiguration` (type: `object`):

Proxy settings. The FCC bulk data is public and works fine with no proxy (the default).

## Actor input object example

```json
{
  "sources": [
    "antennaStructures",
    "landMobileCommercial"
  ],
  "states": [
    "TX"
  ],
  "activeOnly": true,
  "businessOwnersOnly": false,
  "withEmailOnly": false,
  "withPhoneOnly": false,
  "maxResults": 1000,
  "sortBy": "newest",
  "deduplicateResults": true,
  "includeRawFields": false,
  "monitorMode": false,
  "monitorKey": "default",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

All scraped FCC license and antenna-structure records in the default dataset, each with its owner/licensee contact details and a lead score.

# 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 = {
    "sources": [
        "antennaStructures",
        "landMobileCommercial"
    ],
    "states": [
        "TX"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapesage/fcc-license-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 = {
    "sources": [
        "antennaStructures",
        "landMobileCommercial",
    ],
    "states": ["TX"],
}

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

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

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

```

## CLI example

```bash
echo '{
  "sources": [
    "antennaStructures",
    "landMobileCommercial"
  ],
  "states": [
    "TX"
  ]
}' |
apify call scrapesage/fcc-license-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=scrapesage/fcc-license-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/m6BYQqeegNafgukrs/builds/pnjLTIwLL4bhnfJ8P/openapi.json
