Aviation data, open to people and LLMs.
FAA airworthiness directives, NTSB accident investigations, bulletins, data sheets, STCs, advisory circulars, the aircraft registry and more. Download, search and access.
About OpenAirDocs
OpenAirDocs is an independent project to aggregate and organize public aviation data. This data is collected from various APIs and websites of U.S. federal sources.
Our mission is to support a safe and thriving aviation ecosystem.
Our objective with OpenAirDocs is to make aviation data more accessible to human readers, as well as AI models. We publish LLM-friendly data definitions, and our Parquet databases can be queried without download.
More about OpenAirDocsCases since 2008, when NTSB began coding them.
Cases since 2008, when NTSB began coding them.
Use the data
Permalinks for all documents
Every document has its own predictable URL at openairdocs.org.
Each document has an AI-friendly Markdown version at the same URL plus .md, to give to an LLM.
Give your model these directions
Paste them into ChatGPT, Claude or another assistant that can run code. It will query the DuckDB file over HTTPS, with no API key, and link the pages it used.
You can query OpenAirDocs, an open, public-domain copy of U.S. aviation data: FAA ADs, SAIBs, STCs, data sheets, the aircraft registry, SDRs, and FAA and NTSB accident reports. 1. Read https://openairdocs.org/llms.txt first: every table, join and caveat. 2. Query with DuckDB 1.2+: ATTACH 'https://openairdocs.org/data/latest/openair.duckdb' AS openair (READ_ONLY); USE openair; 3. Cite each record by its page; add .md for a Markdown copy (https://openairdocs.org/aircraft/N333UM.md).
Query the DuckDB file
Every table is in one DuckDB file, 1.0 GB. Attach it over HTTPS and DuckDB fetches only the parts a query needs, so there’s nothing to download first. Or download it and work offline.
Install DuckDB (1.2 or later), start it in a terminal, then run a query.
duckdb
ATTACH 'https://openairdocs.org/data/latest/openair.duckdb' AS openair (READ_ONLY); USE openair; -- ADs that name a model SELECT d.ad_number, d.status, d.subject, d.effective_date FROM faa_directive_product p JOIN faa_directive d USING (ad_id) WHERE p.model_key = 'PA28181' ORDER BY d.effective_date DESC; -- Every table and column is described in the file SELECT column_name, data_type, comment FROM duckdb_columns() WHERE table_name = 'faa_directive';
Query SQLite offline
Every table in two files, indexed for lookups and full-text search. Download once and query offline.
The files are compressed with zstd. Unpack them with zstd -d.
curl -O https://openairdocs.org/data/latest/openair.sqlite.zst zstd -d openair.sqlite.zst sqlite3 openair.sqlite " SELECT ad_number, subject, effective_date FROM faa_directive WHERE status = 'Current' ORDER BY effective_date DESC LIMIT 10;"
Load it from Hugging Face
Every table is also on Hugging Face, in the dataset openairdocs/openairdocs. Browse a table in its viewer, or load it with the datasets library or DuckDB.
Each release is a tag there, so code pinned to one keeps getting the same rows.
from datasets import load_dataset
# One table (a subset) at a time
ads = load_dataset("openairdocs/openairdocs", "faa_directive",
split="train")
# Pinned to a release
ads = load_dataset("openairdocs/openairdocs", "faa_directive",
split="train", revision="2026-10-23")SELECT ad_number, subject, effective_date FROM 'hf://datasets/openairdocs/openairdocs/faa_directive.parquet' ORDER BY effective_date DESC LIMIT 10;