# Airworthiness Directive Feed - EASA & FAA Fleet Watch (`prixodik/airworthiness-directive-feed`) Actor

New and revised airworthiness directives for your fleet from the EASA Safety Publications Tool and the FAA Federal Register: proposals, emergency ADs, revisions, EASA-FAA links, supersedures and a changes-only mode.

- **URL**: https://apify.com/prixodik/airworthiness-directive-feed.md
- **Developed by:** [Milchenko Oleksii](https://apify.com/prixodik) (community)
- **Categories:** Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $10.00 / 1,000 airworthiness directives

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/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

## Airworthiness Directive Feed: EASA, FAA and Transport Canada fleet watch

Get **new and revised airworthiness directives (ADs) for the aircraft, engines and helicopters you track**, from two official sources in one machine-readable feed:

- the **EASA Safety Publications Tool**: EASA ADs, emergency ADs and proposed ADs (PAD), plus the FAA, Transport Canada, ANAC, UK CAA and other foreign directives that EASA republishes;
- the **Federal Register**: FAA final ADs, proposed rules (NPRM/SNPRM) with comment deadlines, and corrections.

The feed is built for CAMOs, MROs, operators and aircraft owners, aircraft traders and lessors, and developers of maintenance-tracking software who want ADs in a spreadsheet, database or agent workflow instead of separate e-mail alerts.

### What this Actor adds

- **One watch list across authorities.** List manufacturers and models once (for example `Airbus` / `A320`, `737-8`, `H160`). A model is matched as a whole designation: `737-8` matches `737-8 (MAX)` but not `737-800` or `737-8200`. `737` matches the whole family.
- **EASA ↔ FAA links.** For matched FAA documents the Actor reads the official FAA text on govinfo.gov and lists the EASA, Transport Canada or ANAC directive it is based on (`relatedDirectives`), plus the ADs it supersedes (`supersedes`). Example from our tests: FAA AD 2026-21-02 references EASA AD 2026-0152. `referencesChecked` tells you whether the text was actually read.
- **One record per directive.** An FAA AD republished in the EASA tool and published in the Federal Register is merged into one record, with `seenIn` showing both sources and the FAA docket, amendment and abstract added.
- **Proposals and emergencies.** EASA PADs and FAA NPRMs come with their comment deadline (`commentsCloseOn`). Emergency ADs have `status: emergency`.
- **Revisions.** EASA revisions (`R1`, `R2`) list the revision they replace in `supersedes`.
- **Changes mode.** With a named state store, `changes` mode returns only directives that are new, or whose fields changed, since the previous run with the same watch list. `changedFields` names what changed. Directives already delivered are not charged again.

### Input

| Field | Description |
|---|---|
| `watch` | Up to 100 entries: `manufacturer` and/or `model`, optional `label`. Empty = all directives in the window |
| `sources` | `easa`, `federal-register` (default both) |
| `authorities` | Optional filter: `EASA`, `FAA`, `TCCA`, `ANAC`, `UK CAA`, `CAAI`, `CASA`, `JCAB`, `CAAC`, `CAA NZ`, `OTHER` |
| `includeProposed` | Include PAD and NPRM/SNPRM (default `true`) |
| `lookbackDays` | Window of 1–365 days (default 30) |
| `linkReferences`, `maxTextFetches` | Read official FAA texts for links (default `true`, up to 100 texts per run) |
| `mode`, `stateStoreId` | `snapshot`, or `changes` with a named store |
| `maxRecords` | Upper limit on delivered directives (default 1000) |

Example:

```json
{
  "watch": [
    { "label": "A320 family", "manufacturer": "Airbus", "model": "A320" },
    { "label": "Boeing 737 MAX 8", "model": "737-8" },
    { "label": "H160", "model": "H160" }
  ],
  "lookbackDays": 30,
  "mode": "changes",
  "stateStoreId": "my-fleet-ads"
}
```

### Output

One dataset item per directive:

- `directiveKey` (for example `EASA:2026-0193`, `FAA:2026-20-11`, `FAA-NPRM:2026-20885`), `authority`, `adNumber`, `class`, `status` (`final`, `emergency`, `proposed`, `correction`), `revision`
- `issueDate`, `effectiveDate`, `commentsCloseOn`
- `subject`, `manufacturers`, `models`, `ataChapter`, `abstract`
- FAA details: `docket`, `amendment`, `mcaiProjectId`, `frDocumentNumber`
- `relatedDirectives`, `referencesChecked`, `supersedes`
- `documentUrls` (EASA PDFs, official FAA text), `sourceUrl`, `seenIn`, `matchedWatch`
- `change` (`new`, `updated`, `unchanged`, `not-tracked`), `changedFields`, `observedAt`, `contentHash`

The `SUMMARY` record lists the window, item counts per source, matches per authority and any FAA texts that could not be read.

### Pricing

- **$0.01 per delivered directive**, plus $0.005 per run start.
- In `changes` mode, directives already delivered are not delivered or charged again.
- A run fails without delivering anything if a selected source cannot be read, so you never receive a partial feed that looks complete.

### Data sources and terms

- EASA Safety Publications Tool, ad.easa.europa.eu. EASA states that reproduction is authorised provided the source is acknowledged. Source: EASA.
- Federal Register API and govinfo.gov, U.S. Government works.

This Actor reports what the authorities published. **It does not decide whether a directive applies to a specific serial number, configuration or modification status, and it does not record compliance.** Always use the official directive text and your approved maintenance processes. A directive missing from the feed does not mean that no directive applies. Emergency ADs that the FAA sends directly to owners may appear in the Federal Register only later.

### Limits

- Matching uses the manufacturer and model text published by each source. FAA records are matched on the title and abstract, so models listed only in the full text are not matched.
- Links come from the FAA text only. EASA PDFs are not parsed.
- The EASA export is capped at 4000 items per request. Very long windows without a watch list may hit that cap, and the run then fails with an explanation.

# Actor input Schema

## `watch` (type: `array`):

Up to 100 entries with manufacturer and/or model, plus an optional label. A model matches as a whole designation: 737-8 matches 737-8 (MAX) but not 737-800; 737 matches the whole family. Leave empty to receive every directive in the window.

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

easa = EASA Safety Publications Tool (EASA ADs plus directives of FAA, Transport Canada, ANAC and others that EASA republishes). federal-register = FAA final ADs, proposals (NPRM/SNPRM) and corrections from the Federal Register.

## `authorities` (type: `array`):

Optional filter by issuing authority. Empty means all.

## `includeProposed` (type: `boolean`):

Include EASA proposed ADs (PAD) and FAA proposed rules (NPRM/SNPRM) with their comment deadlines.

## `lookbackDays` (type: `integer`):

Directives issued or published in the last N days (1-365).

## `linkReferences` (type: `boolean`):

Read the official FAA text (govinfo.gov) of matched FAA documents to find the EASA, Transport Canada or ANAC directive behind them and the ADs they supersede.

## `maxTextFetches` (type: `integer`):

Upper limit on official texts read in one run. Texts already read are remembered in the state store.

## `mode` (type: `string`):

snapshot returns every matching directive in the window. changes returns only directives that are new or changed since the previous run with the same state store and watch list.

## `stateStoreId` (type: `string`):

Named key-value store that remembers what was already delivered. Required for changes mode. Letters, digits and hyphens.

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

Upper limit on delivered directives in this run (1-5000).

## Actor input object example

```json
{
  "watch": [
    {
      "label": "A320 family",
      "manufacturer": "Airbus",
      "model": "A320"
    },
    {
      "label": "Boeing 737 MAX 8",
      "model": "737-8"
    },
    {
      "label": "H160",
      "model": "H160"
    }
  ],
  "sources": [
    "easa",
    "federal-register"
  ],
  "authorities": [],
  "includeProposed": true,
  "lookbackDays": 30,
  "linkReferences": true,
  "maxTextFetches": 100,
  "mode": "snapshot",
  "maxRecords": 1000
}
```

# Actor output Schema

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

No description

## `summary` (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 = {
    "watch": [
        {
            "label": "A320 family",
            "manufacturer": "Airbus",
            "model": "A320"
        },
        {
            "label": "Boeing 737 MAX 8",
            "model": "737-8"
        },
        {
            "label": "H160",
            "model": "H160"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("prixodik/airworthiness-directive-feed").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 = { "watch": [
        {
            "label": "A320 family",
            "manufacturer": "Airbus",
            "model": "A320",
        },
        {
            "label": "Boeing 737 MAX 8",
            "model": "737-8",
        },
        {
            "label": "H160",
            "model": "H160",
        },
    ] }

# Run the Actor and wait for it to finish
run = client.actor("prixodik/airworthiness-directive-feed").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 '{
  "watch": [
    {
      "label": "A320 family",
      "manufacturer": "Airbus",
      "model": "A320"
    },
    {
      "label": "Boeing 737 MAX 8",
      "model": "737-8"
    },
    {
      "label": "H160",
      "model": "H160"
    }
  ]
}' |
apify call prixodik/airworthiness-directive-feed --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,prixodik/airworthiness-directive-feed"
        }
    }
}
```

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/8oXsCLEcd3r1YadWG/builds/HACx8yznB4Igas191/openapi.json
