# FAA Airmen Database — Pilot Certificates & Ratings (`jobito/faa-airmen-scraper`) Actor

Search the official FAA Releasable Airmen Certification Database: pilot certificates, ratings, medical class, and mailing addresses. Filter by state, certificate type, and level.

- **URL**: https://apify.com/jobito/faa-airmen-scraper.md
- **Developed by:** [Joseph Ellis](https://apify.com/jobito) (community)
- **Categories:** Lead generation, Automation, Open source
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 airman record delivereds

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

## FAA Airmen Database — Pilot Certificates & Ratings

Search the **official FAA Releasable Airmen Certification Database** and get clean,
structured records for US-certificated pilots and airmen: certificates, ratings,
medical class and dates, and mailing address (where released).

The FAA publishes this data as a bulky monthly zip of raw CSV files. This actor
downloads the latest release, joins the basic and certificate files, and gives you
filtered, analysis-ready JSON/CSV/Excel output in minutes — no manual downloads,
no Access databases, no cleanup.

### Who uses this data

- **Aviation insurers** — verify certificate level, ratings, and medical currency.
- **Flight schools & CFIs** — find pilots by state and certificate level for outreach
  (e.g., every Private Pilot in your state is a prospective instrument student).
- **Part 135 / charter operators** — pre-screen and audit pilot credentials.
- **Aircraft lenders & brokers** — confirm buyer credentials; target ATP/Commercial holders.
- **Recruiters** — source certificated mechanics (include non-pilot airmen).

### Input

| Field | Description |
|---|---|
| `states` | Two-letter state codes to include. Empty = all. |
| `certificateTypes` | `P` pilot, `F` flight instructor, `U` remote pilot (Part 107), `M` mechanic (non-pilot), etc. |
| `certificateLevels` | `A` ATP, `C` Commercial, `P` Private, `V` Recreational, `T` Sport, `S` Student. |
| `includeNonPilots` | Also include mechanics, dispatchers, riggers... |
| `requireAddress` | Only airmen who released their mailing address. |
| `maxRecords` | Cap output (0 = unlimited). |
| `downloadUrl` | Optional direct URL to a specific monthly FAA zip. |

### Output example

```json
{
  "unique_id": "A0000000",
  "first_name": "JANE",
  "last_name": "EXAMPLE",
  "city": "LOS ANGELES",
  "state": "CA",
  "zip_code": "90001",
  "medical_class": "3",
  "medical_expire_date": "032027",
  "certificates": [
    {
      "type": "P",
      "level": "C",
      "expire_date": "",
      "ratings": ["P/ASEL", "P/INSTA"],
      "type_ratings": []
    }
  ]
}
```

### Data source, freshness & legality

Data comes directly from the FAA's public
[Releasable Airmen Certification Database](https://www.faa.gov/licenses_certificates/airmen_certification/releasable_airmen_download),
updated monthly by the FAA. It contains only records the FAA is legally permitted
to release: certificate numbers are excluded, and addresses appear only for airmen
who have not opted out under the Privacy Act. This actor redistributes public
government data as-is and adds structure and filtering.

# Actor input Schema

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

Two-letter US state codes to include (e.g. CA, TX). Leave empty for all states.

## `certificateTypes` (type: `array`):

FAA certificate type codes to include. Pilot-file codes: P = Pilot, F = Flight Instructor (CFI), A = Authorized Aircraft Instructor, U = Remote Pilot (Part 107 drone), E = Flight Engineer. Non-pilot codes (enable 'Include non-pilot airmen'): G = Ground Instructor, M = Mechanic, R = Repairman, D = Dispatcher, W = Parachute Rigger, T = Control Tower Operator. Leave empty for all types.

## `certificateLevels` (type: `array`):

Certificate level codes to include. Codes: A = Airline Transport Pilot, C = Commercial, P = Private, V = Recreational, T = Sport, S = Student. Leave empty for all levels.

## `includeNonPilots` (type: `boolean`):

Also parse NONPILOT files (mechanics, dispatchers, riggers, etc.).

## `requireAddress` (type: `boolean`):

Skip airmen who opted out of address release (their address fields are blank in the FAA file).

## `maxRecords` (type: `integer`):

Stop after this many records have been pushed. 0 = unlimited.

## `downloadUrl` (type: `string`):

Optional direct URL of the FAA airmen zip. If empty, the actor tries the current and previous months at the standard FAA location.

## Actor input object example

```json
{
  "states": [
    "CA"
  ],
  "certificateTypes": [
    "P"
  ],
  "includeNonPilots": false,
  "requireAddress": false,
  "maxRecords": 10000
}
```

# 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 = {
    "states": [
        "CA"
    ],
    "certificateTypes": [
        "P"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("jobito/faa-airmen-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 = {
    "states": ["CA"],
    "certificateTypes": ["P"],
}

# Run the Actor and wait for it to finish
run = client.actor("jobito/faa-airmen-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 '{
  "states": [
    "CA"
  ],
  "certificateTypes": [
    "P"
  ]
}' |
apify call jobito/faa-airmen-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,jobito/faa-airmen-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/rjDd5xNRs63zugaHr/builds/cjbIel2Bg10x1CYM0/openapi.json
