Skip to main content

A Python wrapper for the NTSB aviation accident database

Project description

NTSB API Proxy (ntsb-api)

A local, pip-installable proxy around the NTSB public CAROL API that:

  • simplifies the complex FileExport payloads into simple parameters
  • lets you download raw ZIPs or directly get parsed JSON
  • does not store or host any data – everything runs on the user's machine

You install this library, run the server locally, and your code/CLI talks to http://localhost:8000. All requests to data.ntsb.gov go directly from your machine.


Installation

From PyPI (recommended)

pip install "ntsb-api[server]"

This installs the core client/CLI plus the FastAPI server dependencies so you can run ntsb-server locally.

From a local checkout (for development)

pip install -e .[server]

Running the local server

Start the FastAPI server (which proxies and parses NTSB data):

ntsb-server

Or equivalently, using uvicorn directly:

python -m uvicorn ntsb_api.server.main:app --host 127.0.0.1 --port 8000

The server exposes:

  • Download (ZIP) endpoints: /api/v1/download/*
  • Streaming JSON endpoints: /api/v1/cases, /api/v1/cases/search, /api/v1/stats

Meta endpoints:

  • GET /health – health check
  • GET /docs – Swagger UI
  • GET /redoc – ReDoc

Rate limiting and logging are in-process and exist only to be a good citizen towards NTSB.


Python Usage

1. Client setup

from ntsb_api import NTSBClient

client = NTSBClient(base_url="http://localhost:8000", timeout=60)

Make sure ntsb-server is running before you call the client.

2. Download ZIPs programmatically

# Month ZIP
zip_bytes = client.download_month(2025, 4, mode="Aviation")

# Save to disk
with open("ntsb_2025_04.zip", "wb") as f:
    f.write(zip_bytes)

# Date range ZIP
zip_bytes_range = client.download_date_range(
    start_date="2025-04-01",
    end_date="2025-04-30",
    mode="Aviation",
)

3. Streamed JSON cases

cases_response = client.get_cases(
    start_date="2025-04-01",
    end_date="2025-04-30",
    mode="Aviation",
    limit=100,
)

for case in cases_response["data"]:
    print(case["cm_ntsbNum"], case.get("cm_eventDate"))

This calls /api/v1/cases, which internally:

  1. Hits NTSB FileExport with a date-range payload.
  2. Parses the ZIP in memory (no disk I/O).
  3. Applies pagination/sorting.
  4. Returns a JSON envelope: {"data": [...], "pagination": {...}, "metadata": {...}}.

4. Statistics

stats = client.get_statistics(
    start_date="2025-04-01",
    end_date="2025-04-30",
    mode="Aviation",
)

print(stats["totals"])

This maps to /api/v1/stats and returns aggregate counts computed over the parsed cases (fatalities, injuries, by state, etc.).


CLI Usage

The package installs a ntsb-api CLI.

1. Download a month (ZIP or JSON)

# Download raw ZIP
ntsb-api download --year 2025 --month 4 \
  --mode Aviation \
  -o data/ntsb_2025_04.zip

# Download and immediately extract JSON to disk
ntsb-api download --year 2025 --month 4 \
  --mode Aviation \
  -o data/ntsb_2025_04.json \
  --extract-json

2. Download a date range (ZIP or JSON)

# ZIP
ntsb-api download-range \
  --start-date 2025-04-01 \
  --end-date   2025-04-30 \
  --mode Aviation \
  -o data/ntsb_2025_04_range.zip

# JSON
ntsb-api download-range \
  --start-date 2025-04-01 \
  --end-date   2025-04-30 \
  --mode Aviation \
  -o data/ntsb_2025_04_range.json \
  --extract-json

Under the hood these commands:

  • call your local proxy server (http://localhost:8000/api/v1/download/...)
  • download the NTSB FileExport ZIP
  • optionally extract the first *.json file inside and write it to disk.

3. Streamed JSON cases

Use the proxy's in-memory parsing instead of writing files:

ntsb-api cases \
  --start-date 2025-04-01 \
  --end-date   2025-04-30 \
  --mode Aviation \
  --limit 50

This hits /api/v1/cases on the local server, which:

  • builds an NTSB FileExport payload for the date range + mode
  • downloads + parses the ZIP in memory
  • applies sorting/pagination
  • returns clean JSON (and the CLI prints a short summary).

Design Notes

  • No persistence: the proxy never stores NTSB data in a database.
  • No hosting: you run the FastAPI app locally; the author does not host it.
  • No long-term cache: each request hits the live NTSB API; any in-memory state is per-process and short-lived.
  • Good citizen: a simple in-process rate limiter and retry logic are used to avoid hammering NTSB or failing hard on transient network issues.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ntsb-1.1.0.tar.gz (16.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

ntsb-1.1.0-py3-none-any.whl (16.4 kB view details)

Uploaded Python 3

File details

Details for the file ntsb-1.1.0.tar.gz.

File metadata

  • Download URL: ntsb-1.1.0.tar.gz
  • Upload date:
  • Size: 16.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for ntsb-1.1.0.tar.gz
Algorithm Hash digest
SHA256 d529886cbc1bb35a9c01a4b3436b981c392e89fb39805926f57be37bf71b0aae
MD5 8c807871c477da8abb4f6269a0c5c78d
BLAKE2b-256 a8dd45fc7f0cc8821336e7cf4d7e05f5ebeaa5455e0c4ed59afbed6a23897dd6

See more details on using hashes here.

File details

Details for the file ntsb-1.1.0-py3-none-any.whl.

File metadata

  • Download URL: ntsb-1.1.0-py3-none-any.whl
  • Upload date:
  • Size: 16.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for ntsb-1.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 2bb1884a755e38d464819081a969bdd8af3156603c67bc2fdf0f5cbda85618ed
MD5 2cfbe1df0dbe207ecdbfd7c327343817
BLAKE2b-256 faab253c3da72a374afc0117881c03553b8fc4a1ca7daa679564d5d0cf9cef7a

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page