# FAA Aircraft Document Index — Lien & Bill of Sale Filings (`malekh/faa-aircraft-document-index-lien-filings`) Actor

Check N-numbers against the FAA Aircraft Registry Document Index: liens (security conveyances), releases, repossessions and bills of sale filed for recordation, with FAA document IDs and receipt dates. Deduplicates the FAA's own 2-3x duplicate entries. Not a title search: ~180-day window.

- **URL**: https://apify.com/malekh/faa-aircraft-document-index-lien-filings.md
- **Developed by:** [Malek H](https://apify.com/malekh) (community)
- **Categories:** Automation, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.01 / 1,000 results

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 Aircraft Document Index — Lien, Release & Bill of Sale Filings

Check a list of N-numbers against the **FAA Aircraft Registry Document Index**
and get back every conveyance document filed for recordation against each
aircraft: **security conveyances (liens), lien releases, repossessions, bills
of sale, court documents** — each with its FAA document ID, document type and
receipt date.

Data comes from the FAA Civil Aviation Registry's own published Releasable
Aircraft Database, refreshed every federal working day. No API key, no account.

### Read this first: what this is, and what it is not

**This is not a title search.** The FAA Document Index is a rolling window of
roughly the last **180 days of document receipts**. A security conveyance
recorded in 2019 and never released is not in this dataset at all, so a result
of "no filings" here is **not** a statement that an aircraft is free of liens.

Every run returns the window's real measured start and end dates on every
record, and results say this in words. For a full chain of title, order the
aircraft record from the FAA or buy a title report from a title company.

**What it is good for:**

| Job | How |
|---|---|
| **Gap / date-down check at closing** | Set `sinceDate` to your title report's cutoff and see everything filed since |
| **Collateral monitoring** | Run your loan book on a schedule, filter to `S/A` and `REP`, and get alerted when a competing security conveyance or a repossession lands |
| **Release tracking** | Confirm your `REL` was actually received in Oklahoma City, with the FAA document ID and receipt date |
| **Filing confirmation** | Confirm a bill of sale or registration filing reached the Registry, and when |
| **Portfolio-scale screening** | Up to 2,000 aircraft in one run against one file download |

### Why this beats reading the FAA's inquiry page yourself

**The FAA's own Document Index Inquiry page shows each document more than
once — typically two to three times.** The index carries one row per document
*per party*, and the FAA withdrew all party names under the 49 U.S.C. §44114
procedure for withholding personally identifiable information. What is left on
screen is identical duplicate rows with nothing to distinguish them.

Measured on the live site and in the bulk file, same answer both ways:

| N-number | Entries the FAA shows | Actual distinct documents |
|---|---|---|
| N100HY | 6 | 2 |
| N904AV | 9 | 3 |
| N1001J | 3 | 1 |

Across the whole file, **17,863 index entries are 8,718 distinct documents**.
Telling a lender that four security conveyances were filed against their
collateral when one was is not a rounding error.

This Actor deduplicates and reports **both** numbers — `filingCount` (real) and
`rawIndexEntryCount` (what the FAA page displays) — so you can see the
difference rather than take it on trust.

### Output

One record per aircraft:

```jsonc
{
  "nNumber": "N100HY",
  "referenceId": "LOAN-4471",
  "status": "ok",
  "registrationFound": true,
  "registration": {
    "serialNumber": "2100",
    "manufacturer": "AVIAT AIRCRAFT INC",
    "model": "A-1B",
    "yearManufactured": "",
    "registrantName": "MORELL TIMOTHY SCOTT",
    "registrantType": "Individual",
    "city": "CIRCLE PINES", "state": "MN", "country": "US",
    "statusCode": "V", "statusDescription": "Valid registration",
    "registrationExpirationDate": "2029-08-31"
  },
  "documentIndexWindow": {
    "start": "2026-01-23", "end": "2026-07-28", "days": 186,
    "coversYourSinceDate": true
  },
  "filingCount": 2,
  "rawIndexEntryCount": 6,
  "duplicateIndexEntriesCollapsed": 4,
  "securityConveyanceCount": 1,
  "lienReleaseCount": 0,
  "ownershipEvidenceCount": 1,
  "repossessionCount": 0,
  "hasSecurityConveyanceInWindow": true,
  "hasLienReleaseInWindow": false,
  "netNewSecurityConveyancesInWindow": 1,
  "isTitleSearch": false,
  "guidance": "1 security conveyance (lien) filing(s), 1 ownership document(s) received in the window. ...",
  "filings": [
    {
      "faaDocumentId": "ARE017907387",
      "documentType": "S/A",
      "documentTypeDescription": "Security conveyance / lien",
      "category": "lien",
      "receiptDate": "2026-07-08",
      "processingDate": "2026-07-08",
      "correctionDate": "",
      "correctionType": "",
      "collateralType": "1",
      "collateralTypeDescription": "Aircraft (N-number)",
      "documentSerialId": "2100",
      "matchesRegisteredSerialNumber": true
    }
  ]
}
```

Document type codes are the FAA's own, decoded from the data dictionary the FAA
ships inside the archive:

| Code | Meaning |
|---|---|
| `S/A` | Security conveyance / lien |
| `REL` | Lien release |
| `REP` | Repossession |
| `BOS` | Evidence of ownership (bill of sale) |
| `CSC` | Evidence of ownership with lien |
| `DIS` | Disclaimer |
| `CRT` | Court document |

Codes that appear in the file but are not in the FAA's dictionary are passed
through as received and labelled, never dropped.

### Input

```json
{
  "aircraft": [
    { "referenceId": "LOAN-4471", "nNumber": "N100HY" },
    "N1001J"
  ],
  "sinceDate": "2026-06-01",
  "documentTypes": ["S/A", "REP"],
  "includeRegistration": true
}
```

`N100HY`, `100hy` and `N-100HY` are all accepted.

### How it refuses to fail silently

A lien check that quietly answers "nothing found" when the source was
unreachable is worse than no tool at all, so this one fails the run instead:

1. **Archive integrity** — PK header, required members present, a row-count
   floor, and every Document Index record asserted at its documented 168
   characters. The record is fixed-width *and* comma-delimited; parsing it as
   CSV silently mangles engine and propeller rows whose collateral text
   contains commas, so fields are cut by position from the FAA's dictionary.
2. **Freshness** — the newest receipt date must be within 10 days. The FAA
   updates this file every federal working day, so a stale mirror's silence
   about recent filings means nothing and the run fails rather than reporting it.
3. **Window span** — the receipt window must span at least 150 days, or the
   file is truncated.
4. **Existence** — every N-number is resolved against the registration master
   file. One that is not there comes back `status: "unverified"` with the
   reason, never as a clean zero.

An aircraft that could not be checked is reported as an error and is **not
charged**.

### Known coverage limits, stated plainly

- **~180-day window.** Not a title search. See the top of this page.
- **Engine and propeller liens are indexed under the component's own serial
  number**, not the aircraft's N-number, so they do not appear under the tail
  number. Pass known component serials in `serialNumbers` to catch them.
- **No lienholder names.** The FAA withdrew document party names from public
  distribution under 49 U.S.C. §44114. They are not available from any public
  FAA source, bulk or web — the Actor reports this rather than leaving a blank
  column that looks like a bug.
- **Filed is not recorded.** A document in the index has been *received* for
  recordation. The index does not say whether it was recorded, rejected or
  later withdrawn.
- **US registry only.** Aircraft on foreign registries are not covered.
- Registrant street addresses are deliberately **not** returned. City, state
  and country are, which is enough to confirm you have the right aircraft.

### Pricing

Pay per event, platform costs included:

- **$0.05 per run** — downloads and indexes the FAA archive once per run,
  whether you check one aircraft or two thousand.
- **$0.10 per aircraft checked** — aircraft the Actor could not check are not
  charged.

A title company charges $85 for a single aircraft title search. Different
product — that one covers the full chain of title and this one covers the
current window — but at $0.10 you can watch a 300-aircraft loan book every week
for about $12 a month.

### Source and attribution

U.S. Federal Aviation Administration, Civil Aviation Registry, Aircraft
Registration Branch (AFS-750) — Releasable Aircraft Database
(`DOCINDEX.txt`, `MASTER.txt`, `ACFTREF.txt`),
<https://registry.faa.gov/database/ReleasableAircraft.zip>. A U.S. government
work, in the public domain. This Actor is not endorsed by or affiliated with
the FAA. Field layouts are taken from `ardata.pdf`, the FAA's own data
dictionary shipped inside that archive.

# Actor input Schema

## `aircraft` (type: `array`):

One entry per aircraft. Either a plain tail number string ("N100HY", "100hy" and "N-100HY" all work) or an object with nNumber plus your own referenceId, which is echoed back so results reconcile with your loan book or deal file. Up to 2,000 per run.

## `sinceDate` (type: `string`):

ISO date, e.g. 2026-06-01. Use your title report's cutoff date to see only what has been filed since. If your date is earlier than the start of the FAA's current window, the result says so explicitly rather than pretending to cover it — the window is roughly 180 days and moves every working day.

## `documentTypes` (type: `array`):

Leave empty for all. S/A = security conveyance (lien), REL = lien release, REP = repossession, BOS = evidence of ownership (bill of sale), CSC = evidence of ownership with lien, DIS = disclaimer, CRT = court document. Filtering to S/A + REP is the usual collateral-monitoring setup.

## `includeRegistration` (type: `boolean`):

Strongly recommended, and on by default. Without it, a mistyped tail number returns 'no filings' and looks exactly like a clean aircraft. With it, an N-number that is not on the FAA master file comes back status=unverified with the reason. Also fills in owner, make/model, serial and registration status.

## `serialNumbers` (type: `array`):

Optional and exact-match. Engine and propeller liens are indexed against the component's own serial number, not the aircraft's tail number, so they do NOT appear under the N-number. If you know the engine or propeller serials, list them here to catch those filings too.

## Actor input object example

```json
{
  "aircraft": [
    {
      "referenceId": "LOAN-4471",
      "nNumber": "N100HY"
    },
    {
      "referenceId": "LOAN-4472",
      "nNumber": "N904AV"
    },
    "N1001J"
  ],
  "includeRegistration": true
}
```

# 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 = {
    "aircraft": [
        {
            "referenceId": "LOAN-4471",
            "nNumber": "N100HY"
        },
        {
            "referenceId": "LOAN-4472",
            "nNumber": "N904AV"
        },
        "N1001J"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("malekh/faa-aircraft-document-index-lien-filings").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 = { "aircraft": [
        {
            "referenceId": "LOAN-4471",
            "nNumber": "N100HY",
        },
        {
            "referenceId": "LOAN-4472",
            "nNumber": "N904AV",
        },
        "N1001J",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("malekh/faa-aircraft-document-index-lien-filings").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 '{
  "aircraft": [
    {
      "referenceId": "LOAN-4471",
      "nNumber": "N100HY"
    },
    {
      "referenceId": "LOAN-4472",
      "nNumber": "N904AV"
    },
    "N1001J"
  ]
}' |
apify call malekh/faa-aircraft-document-index-lien-filings --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=malekh/faa-aircraft-document-index-lien-filings",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

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