# FAA NASR Airports and Navaids (`automation-lab/faa-nasr-historical-airports-navaids`) Actor

Export official current or archived FAA NASR airport and navigation-aid reference records by effective cycle, as-of date, identifier, state, or text filter.

- **URL**: https://apify.com/automation-lab/faa-nasr-historical-airports-navaids.md
- **Developed by:** [Stas Persiianenko](https://apify.com/automation-lab) (community)
- **Categories:** Travel
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $11.41 / 1,000 item extracteds

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?

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

## FAA NASR Airports and Navaids

Export **FAA NASR airports and navaids** from an official current, preview, or archived 28-day cycle. The Actor resolves the requested effective cycle, downloads the FAA's entity-specific CSV packages, and returns normalized airport and navigation-aid records with source-cycle attribution.

Use it to reproduce an aviation reference snapshot for an audit, simulation, data reconciliation, or longitudinal dataset. No FAA account, API key, browser, or proxy is required.

### What this Actor does

The Actor can:

- resolve the current or preview NASR cycle from the FAA index;
- select an exact listed effective cycle;
- resolve the latest cycle effective on or before an as-of date;
- export airports, navigation aids, or both;
- filter by FAA identifier, state, facility name, city, or ICAO identifier;
- preserve effective date, official source URL, and source filename on every row;
- return typed identity, location, status, and selected technical fields;
- cap the combined dataset at a user-controlled `maxItems` limit.

It reads the official FAA National Airspace System Resources (NASR) subscription files. It does not infer old records from today's data.

### Who is it for?

- **Aviation analysts** reconstructing airport or navaid reference data for a historical period.
- **Simulation teams** pinning inputs to a reproducible NASR cycle.
- **Auditors and compliance teams** checking what facility data FAA supplied as of a date.
- **GIS and data engineers** loading normalized coordinates and identifiers into a pipeline.
- **Researchers** comparing scheduled snapshots produced from multiple Actor runs.

### Why use cycle-attributed records?

Airport and navigation-aid identities, status values, technical attributes, and source coordinates can change. A record without its source cycle is difficult to reproduce later.

Every output row includes `cycleDate`, the record's `effectiveDate`, `sourceUrl`, `sourceFile`, and `retrievedAt`. Store these fields with downstream results to preserve provenance.

### Data extracted

| Field | Meaning |
| --- | --- |
| `recordType` | `airport` or `navaid` |
| `cycleDate` | FAA NASR effective cycle selected for the run |
| `effectiveDate` | Effective date in the source CSV row |
| `identifier` | FAA airport or navaid identifier |
| `name` | Official facility or navaid name |
| `facilityType` | Airport site type or navaid type |
| `status` | FAA source status |
| `city`, `stateCode`, `stateName` | Associated location |
| `countryCode` | FAA country code |
| `latitude`, `longitude` | Decimal source coordinates |
| `elevationFt` | Source elevation in feet, when present |
| `icaoId` | ICAO airport identifier, when present |
| `ownershipType`, `facilityUse` | Airport classification codes |
| `frequency`, `channel` | Navaid frequency/channel, when present |
| `technical` | Entity-specific operational and source fields |
| `sourceUrl`, `sourceFile` | Exact official package and CSV file |
| `retrievedAt` | Retrieval timestamp |

Airport technical fields include site number, region, county, chart, activation date, FAR 139 type, tower type, fuel types, magnetic variation, and position source when available.

Navaid technical fields include region, owner/operator, public/NAS use, operating hours, class, power, voice call, TACAN/DME status, and magnetic variation when available.

### Getting started

1. Open the Actor input page.
2. Keep **Named cycle** set to `current`, or supply an exact/as-of date.
3. Choose airports, navigation aids, or both.
4. Add optional identifier, state, or text filters.
5. Set the maximum combined number of records.
6. Click **Start**.
7. Open the default dataset and export JSON, CSV, Excel, XML, or another supported format.

A useful first run is:

```json
{
  "cycle": "current",
  "entityTypes": ["airport", "navaid"],
  "states": ["CA"],
  "maxItems": 100
}
```

### Input parameters

| Input | Type | Default | Description |
| --- | --- | --- | --- |
| `cycle` | string | `current` | `current` or `preview`; used when no date input is supplied |
| `cycleDate` | string | — | Exact FAA-listed effective date (`YYYY-MM-DD`) |
| `asOfDate` | string | — | Latest listed cycle on or before this date |
| `entityTypes` | array | both | `airport`, `navaid`, or both |
| `airportIds` | string\[] | — | Exact FAA airport identifiers |
| `navaidIds` | string\[] | — | Exact FAA navaid identifiers |
| `states` | string\[] | — | Two-letter state/territory codes |
| `search` | string | — | Case-insensitive identifier/name/city/state/ICAO text |
| `maxItems` | integer | `100` | Combined output limit, from 1 to 10,000 |

`cycleDate` and `asOfDate` are mutually exclusive. When one is present, it takes precedence over the named-cycle choice.

### Real output example

This abbreviated record comes from the NASR cycle effective 2025-07-10:

```json
{
  "recordType": "navaid",
  "cycleDate": "2025-07-10",
  "effectiveDate": "2025-07-10",
  "identifier": "LAX",
  "name": "LOS ANGELES",
  "facilityType": "VORTAC",
  "status": "OPERATIONAL RESTRICTED",
  "city": "LOS ANGELES",
  "stateCode": "CA",
  "countryCode": "US",
  "latitude": 33.93314911,
  "longitude": -118.43201277,
  "elevationFt": 185,
  "frequency": "113.6",
  "channel": "83X",
  "sourceFile": "NAV_BASE.csv"
}
```

Nullable fields are returned as `null` when the FAA source does not provide them.

### Filtering behavior

Identifier filters are exact and case-insensitive. State filters are also exact and case-insensitive.

The `search` value is a case-insensitive substring checked against identifier, name, city, state name, and ICAO identifier. All supplied filters must match. Airport identifiers apply only to airport rows; navaid identifiers apply only to navaid rows.

When both record types are selected, matching airport and navaid rows are interleaved so a small combined limit can represent both families.

### Historical and as-of cycle behavior

An exact `cycleDate` must appear on the FAA NASR subscription index. An `asOfDate` selects the most recent listed cycle whose effective date is not later than the requested date.

FAA controls how many archived cycles remain listed and downloadable. The Actor reports the available range when an exact date is absent, too old, or not an effective cycle. It does not manufacture a record for unlisted dates.

For longitudinal analysis, schedule or run the Actor once per desired cycle and retain `cycleDate` as the join dimension.

### How much does it cost to export FAA NASR records?

Pricing uses one small start event and one `item` event per dataset row. Rows rejected by filters are not charged as items.

The exact six-tier item prices shown by Apify depend on your plan and are visible before starting a run. For estimation, multiply the applicable `item` price by the requested useful rows and add the one-time start fee. A 25-row identifier lookup costs far less than a 10,000-row cycle export.

Infrastructure usage, if shown separately by Apify, depends mainly on downloading and parsing one or two official CSV packages. The Actor deliberately avoids the much larger all-files NASR archive.

### Reliability and failure behavior

Official FAA requests use a 60-second timeout and up to three attempts for network errors, HTTP 429, and temporary 5xx responses. Retries use bounded exponential backoff with jitter.

The Actor fails rather than silently returning an empty success when:

- input dates or filters are malformed;
- the exact cycle is not listed;
- FAA returns a stable client error;
- a response is not a ZIP package;
- the expected base CSV is missing;
- the FAA index no longer has recognizable cycle dates.

A valid query with no matching records succeeds with an empty dataset.

### Performance and limits

The Actor downloads only the requested APT and/or NAV entity package. It parses the base CSV files and does not download runway, remark, or unrelated NASR tables.

Use exact identifiers and one entity type for the smallest run. Use `maxItems` to bound dataset volume; the hard maximum is 10,000 rows.

Selecting both entity types requires two package downloads. No proxy traffic or browser rendering is used.

### Scheduling historical snapshots

Create a scheduled Task with `cycle: current`. Run it once per FAA publication interval and store each dataset with its cycle date.

A downstream workflow can compare stable keys such as:

```text
recordType + identifier + stateCode + facilityType
```

Compare explicit fields rather than retrieval timestamps. Multiple navaids can share an identifier, so do not assume `identifier` alone is globally unique.

### Export and integrations

Use the dataset API or Apify integrations to send rows to:

- Google Sheets or Microsoft Excel;
- Amazon S3, Google Cloud Storage, or another data lake;
- PostgreSQL, BigQuery, Snowflake, or a GIS database;
- Make, Zapier, or webhook-driven audit workflows;
- Python/R notebooks and simulation pipelines.

Preserve the provenance fields when transforming results.

### Run through the API with cURL

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/automation-lab~faa-nasr-historical-airports-navaids/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"cycleDate":"2025-07-10","entityTypes":["navaid"],"navaidIds":["LAX"],"maxItems":20}'
```

Fetch dataset items from the `defaultDatasetId` returned with the completed run.

### Run with JavaScript

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/faa-nasr-historical-airports-navaids').call({
  asOfDate: '2024-12-31',
  entityTypes: ['airport', 'navaid'],
  search: 'LOS ANGELES',
  maxItems: 50,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### Run with Python

```python
import os
from apify_client import ApifyClient

client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('automation-lab/faa-nasr-historical-airports-navaids').call(run_input={
    'cycle': 'current',
    'entityTypes': ['airport'],
    'states': ['TX'],
    'maxItems': 25,
})
items = client.dataset(run['defaultDatasetId']).list_items().items
print(items)
```

### Use with Apify MCP

Add the Actor to Claude Code:

```bash
claude mcp add --transport http apify \
  "https://mcp.apify.com?tools=automation-lab/faa-nasr-historical-airports-navaids"
```

#### Claude Desktop, Cursor, and VS Code setup

Use this HTTP MCP configuration in Claude Desktop, Cursor, or VS Code:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=automation-lab/faa-nasr-historical-airports-navaids"
    }
  }
}
```

Example prompts:

- “Export current public-use airport reference records in Texas from FAA NASR.”
- “Retrieve LAX navigation aids from the cycle effective 2025-07-10.”
- “Build an as-of 2024 year-end Los Angeles airport and navaid snapshot.”

### Legality and responsible use

FAA NASR subscription data is official public aviation reference data. Confirm suitability for your use case and retain source attribution.

Do not treat this dataset as a substitute for current operational notices, NOTAMs, charts, flight planning, or safety-critical navigation systems. Validate safety-critical decisions against current authoritative FAA products and applicable regulations.

### Troubleshooting

#### Why was my exact cycle rejected?

NASR effective dates follow a publication schedule and are not every calendar date. Use `asOfDate` when you mean “the cycle in effect on this date,” or choose an effective date listed by FAA.

#### Why did my identifier return multiple rows?

Navaid identifiers are not always globally unique, and one identifier can represent multiple facility types or locations. Add a state or search filter and use type/name/location fields when forming downstream keys.

#### Why did I get no records?

Check that the selected `entityTypes` includes the entity targeted by your ID filter. Remove filters one at a time, verify the state code, and remember that all supplied filters must match.

#### Does this include runways and remarks?

No. This release uses the airport and navaid base tables. It exposes selected base-table technical fields but does not join runway, checkpoint, or remark tables.

### FAQ

#### Does the Actor support current data?

Yes. Use `cycle: current` (the default). `preview` selects the FAA preview cycle when published.

#### Does it support archived data?

Yes, for cycle packages currently listed and downloadable from the FAA NASR index. The available archive window is controlled by FAA.

#### Is a proxy or FAA login needed?

No. The Actor uses public official ZIP and CSV downloads directly.

#### Are airport and navaid rows charged separately?

No. Both are included under the same per-row `item` event. There is no extra event based on record type.

#### Can I compare two cycles in one run?

Not in this release. Run or schedule one input per cycle and compare the resulting cycle-attributed datasets downstream.

### Related automation-lab Actor

For live operational disruptions rather than reference data, use [FAA Airport Delays Scraper](https://apify.com/automation-lab/faa-nas-status-airport-delays-scraper). It covers delays, closures, ground stops, and advisories; this Actor covers airport and navaid reference records by NASR cycle.

### Support

If a listed FAA cycle starts failing, include the input, effective date, run URL, and expected identifier in your report. Do not include API tokens or other secrets.

# Actor input Schema

## `cycle` (type: `string`):

Use the FAA current or preview cycle when no exact/as-of date is supplied.

## `cycleDate` (type: `string`):

An FAA-listed NASR effective date in YYYY-MM-DD format. Cannot be combined with asOfDate.

## `asOfDate` (type: `string`):

Select the latest FAA NASR cycle effective on or before this YYYY-MM-DD date.

## `entityTypes` (type: `array`):

Export airports, navigation aids, or both.

## `airportIds` (type: `array`):

Optional exact FAA location identifiers, such as LAX or JFK.

## `navaidIds` (type: `array`):

Optional exact FAA navigation-aid identifiers, such as LAX.

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

Optional two-letter state or territory codes, such as CA or TX.

## `search` (type: `string`):

Optional case-insensitive text found in the identifier, facility name, city, state name, or ICAO identifier.

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

Maximum combined airport and navaid records saved to the dataset.

## Actor input object example

```json
{
  "cycle": "current",
  "entityTypes": [
    "airport",
    "navaid"
  ],
  "maxItems": 20
}
```

# Actor output Schema

## `overview` (type: `string`):

Normalized FAA NASR airport and navigation-aid records with effective-cycle provenance.

# 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 = {
    "entityTypes": [
        "airport",
        "navaid"
    ],
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/faa-nasr-historical-airports-navaids").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 = {
    "entityTypes": [
        "airport",
        "navaid",
    ],
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/faa-nasr-historical-airports-navaids").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 '{
  "entityTypes": [
    "airport",
    "navaid"
  ],
  "maxItems": 20
}' |
apify call automation-lab/faa-nasr-historical-airports-navaids --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,automation-lab/faa-nasr-historical-airports-navaids"
        }
    }
}

```

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/uCYZI0Kb3a3TWGEii/builds/909qSd7HpN5sv6DoU/openapi.json
