# NTSB Aviation Accident Reports and Docket PDF Scraper (`jungle_synthesizer/ntsb-carol-aviation-accident-pdf-scraper`) Actor

Scrape NTSB aviation accident investigations with probable cause, findings, narratives, aircraft, injuries, Final Report text and every Public Docket PDF. Built for aviation insurance, litigation, fleet-risk analytics and safety benchmarking.

- **URL**: https://apify.com/jungle_synthesizer/ntsb-carol-aviation-accident-pdf-scraper.md
- **Developed by:** [BowTiedRaccoon](https://apify.com/jungle_synthesizer) (community)
- **Categories:** Business, Other, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $8.00 / 1,000 record scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## NTSB Aviation Accident Reports and Docket PDF Scraper

Scrape aviation accident and incident investigations from the [NTSB CAROL database](https://carol.ntsb.gov/). Each investigation comes back as a structured record with the probable cause, findings, narratives, aircraft, injuries and the text of the investigation report PDF. Every document in the Public Docket (factual reports, witness statements, ATC records, maintenance records) comes back as its own record with the PDF text extracted. Coverage runs from 1962 to the latest events.

***

### NTSB Aviation Accident Scraper Features

- Pull recent events (last 90 days), a whole year range, or specific NTSB numbers such as `ENG22LA049`
- Probable cause statement, finding statements, and the factual and analysis narratives as clean text
- Aircraft registration, make, model, serial number, engine type and damage level for every aircraft involved
- Operator, regulation the flight was flown under (Part 91, 121, 135 and others), flight phase and the defining event
- Fatal, serious, minor and uninjured counts
- Full text of the newest investigation report PDF, preliminary or final
- Every Public Docket attachment as its own row, with page count, title, type, download link and extracted text
- OCR fallback for scanned PDFs such as logbooks, ATC strips and handwritten statements
- Docket PDF links collected on each event record, so you can fetch the originals yourself

***

### Who Uses NTSB Accident Data?

- **Aviation insurance underwriters** price operators and aircraft types from probable causes and findings across years of accidents
- **Aviation litigators** pull the factual reports, witness statements and maintenance records filed in a case docket
- **Safety and risk teams** benchmark their own incident rates against NTSB trends by flight phase, regulation part or aircraft model
- **Fleet and maintenance analysts** search findings for component failures on a specific make and model
- **Aviation journalists** get the text of a probable cause or docket document without paging through the site

***

### How the NTSB Scraper Works

1. Choose an event source: the last 90 days, a year range, or a list of NTSB numbers.
2. The scraper lists every matching aviation event, newest first.
3. For each event it collects the case details and, when you ask for it, extracts the text of the report PDF.
4. When a Public Docket exists, it lists the attachments and extracts the text of each PDF.
5. You get one `event` row per investigation and one `docket_document` row per attachment.

Rows from events and from docket attachments both count toward `maxItems`. A docket with 40 attachments uses 41 rows.

***

### Input

```json
{
  "eventMode": "year_range",
  "yearFrom": 2022,
  "yearTo": 2023,
  "includeReportPdfText": true,
  "includeDocketPdfs": true,
  "ocrFallback": true,
  "maxItems": 100
}
```

| Field                  | Type    | Default      | Description                                                               |
|------------------------|---------|--------------|---------------------------------------------------------------------------|
| `eventMode`            | string  | `recent`     | `recent` (last 90 days), `year_range`, or `event_ids`.                    |
| `yearFrom`             | integer | `2024`       | First year when `eventMode` is `year_range`. Coverage starts in 1962.     |
| `yearTo`               | integer | current year | Last year when `eventMode` is `year_range`.                               |
| `eventIds`             | array   | `[]`         | NTSB numbers such as `ENG22LA049`, used when `eventMode` is `event_ids`.  |
| `includeReportPdfText` | boolean | `true`       | Extract the text of the newest investigation report PDF.                  |
| `includeDocketPdfs`    | boolean | `true`       | Return every Public Docket attachment as its own row with extracted text. |
| `ocrFallback`          | boolean | `true`       | OCR image-only PDFs. Limited to the first 30 pages of each file.          |
| `maxItems`             | integer | `20`         | Maximum rows returned. Event rows and docket attachment rows both count.  |

Look up one known investigation:

```json
{
  "eventMode": "event_ids",
  "eventIds": ["ENG22LA049"],
  "maxItems": 10
}
```

Events only, no PDF text, for a fast trend dataset:

```json
{
  "eventMode": "year_range",
  "yearFrom": 2015,
  "yearTo": 2025,
  "includeReportPdfText": false,
  "includeDocketPdfs": false,
  "maxItems": 5000
}
```

***

### NTSB Aviation Accident Scraper Output Fields

An `event` row:

```json
{
  "record_type": "event",
  "event_id": "ENG22LA049",
  "case_key": "106762",
  "event_type": "INC",
  "event_date": "2022-03-31",
  "event_datetime": "2022-03-31T19:05:00Z",
  "location": { "city": "Riyadh", "state": null, "country": "SA", "latitude": 24.715122, "longitude": 46.658257, "airport_id": null, "airport_name": null },
  "aircraft": [{ "registration": "9H-VIG", "make": "BOMBARDIER", "model": "Global 7500", "serial_number": "70086", "category": "AIR", "engine_count": 2, "engine_type": "TF", "damage": "Minor", "amateur_built": false }],
  "operator": "VistaJet Ltd",
  "far_part": "NUSC",
  "flight_phase": "Initial Climb",
  "defining_event": "Fire/smoke (non-impact)",
  "injury_summary": { "fatal": null, "serious": null, "minor": null, "none": null },
  "probable_cause_text": "An in-flight engine fire resulted from a fuel leak from fuel nozzle No. 18 pigtail-to-fuel manifold b-nut connection...",
  "findings": ["Aircraft Fuel distribution - Design", "Personnel issues Installation - Maintenance personnel"],
  "has_safety_recommendations": false,
  "investigation_status": "Completed",
  "latest_report_type": "Final",
  "report_pdf_url": "https://data.ntsb.gov/carol-repgen/api/Aviation/ReportMain/GenerateNewestReport/106762/pdf",
  "report_text": "Aviation Investigation Final Report ...",
  "report_pages": 12,
  "docket_url": "https://data.ntsb.gov/Docket?ProjectID=106762",
  "docket_document_count": 2,
  "public_docket_pdf_urls": ["https://data.ntsb.gov/Docket/Document/docBLOB?ID=15334415&FileExtension=pdf&FileName=GE%20Passport%20Fire%20-%20Saudi%20Arabia-Rel.pdf"]
}
```

A `docket_document` row:

```json
{
  "record_type": "docket_document",
  "event_id": "ENG22LA049",
  "case_key": "106762",
  "event_date": "2022-03-31",
  "document_number": 1,
  "document_title": "POWERPLANTS GROUP CHAIRMAN'S FACTUAL REPORT",
  "document_type": "Text/Image",
  "document_pages": 43,
  "document_url": "https://data.ntsb.gov/Docket/Document/docBLOB?ID=15334415&FileExtension=pdf&FileName=GE%20Passport%20Fire%20-%20Saudi%20Arabia-Rel.pdf",
  "document_text": "NATIONAL TRANSPORTATION SAFETY BOARD Office of Aviation Safety ...",
  "text_source": "pdf_text",
  "text_truncated": false,
  "docket_url": "https://data.ntsb.gov/Docket?ProjectID=106762"
}
```

| Field                        | Type    | Description |
|------------------------------|---------|---------------------------------------------------------------------------------------------|
| `record_type`                | string  | `event` or `docket_document` |
| `event_id`                   | string  | NTSB event number |
| `case_key`                   | string  | NTSB internal case key used by CAROL and the Public Docket |
| `event_type`                 | string  | `ACC` accident or `INC` incident |
| `event_date`                 | string  | Event date, YYYY-MM-DD |
| `event_datetime`             | string  | Event date and time as published (UTC) |
| `location`                   | object  | City, state, country, latitude, longitude, airport id and name |
| `aircraft`                   | array   | One entry per aircraft: registration, make, model, serial number, category, engines, damage |
| `operator`                   | string  | Operator name when published |
| `far_part`                   | string  | Regulation the flight was conducted under, for example `091`, `121`, `135` |
| `flight_phase`               | string  | Phase of flight of the defining event |
| `defining_event`             | string  | First occurrence in the event sequence |
| `injury_summary`             | object  | Fatal, serious, minor and uninjured counts |
| `probable_cause_text`        | string  | Probable cause statement, once the investigation reaches its final determination |
| `findings`                   | array   | Finding statements |
| `factual_narrative`          | string  | Factual narrative from the investigation record |
| `analysis_narrative`         | string  | Analysis narrative from the investigation record |
| `has_safety_recommendations` | boolean | Whether the NTSB issued safety recommendations |
| `investigation_status`       | string  | `In work` or `Completed` |
| `latest_report_type`         | string  | `Prelim` or `Final` |
| `report_pdf_url`             | string  | Newest investigation report PDF |
| `report_text`                | string  | Extracted text of that PDF |
| `report_pages`               | integer | Page count of that PDF |
| `docket_url`                 | string  | Public Docket page for the event |
| `docket_document_count`      | integer | Number of docket attachments |
| `public_docket_pdf_urls`     | array   | Links to every PDF attachment in the docket |
| `document_number`            | integer | Position of the attachment in the docket (`docket_document` rows) |
| `document_title`             | string  | Attachment title |
| `document_type`              | string  | Attachment type as listed in the docket |
| `document_pages`             | integer | Page count listed in the docket |
| `document_url`               | string  | Download link of the attachment |
| `document_text`              | string  | Extracted attachment text |
| `text_source`                | string  | `pdf_text`, `ocr`, `too_large` (file over 25 MB, not parsed), or `none` when nothing could be extracted |
| `text_truncated`             | boolean | `true` when the text was cut at 900,000 characters |
| `source_url`                 | string  | Page the record was taken from |

Newly opened investigations have only the basics: aircraft, location, injuries and the opening report. The probable cause, findings and narratives appear once the NTSB publishes its final determination. Docket attachments that are not PDFs (photos, spreadsheets) are listed with their link and no text. Foreign-state investigations often have fewer fields than NTSB-led ones.

***

### FAQ

#### How do I scrape NTSB aviation accident reports?

Choose an event source and run the actor. No NTSB account is needed. Use `event_ids` when you already know the event numbers, `year_range` for a historical pull, or `recent` for the latest 90 days.

#### What is in the NTSB Public Docket?

Factual reports from each investigative group, witness interview summaries, ATC records, maintenance and training records, photos and test reports. Larger accidents carry dozens of attachments. This actor returns each one as a row.

#### Does it read scanned PDFs?

Yes. Text PDFs are read directly. Image-only PDFs go through OCR when `ocrFallback` is on, up to 30 pages per file. A file that cannot be read, or is over 25 MB, comes back with `text_source` of `none` or `too_large` and its link, so you can still download the original.

#### How far back does the data go?

Coverage starts in 1962. Older records carry fewer fields than recent ones, and most have no docket.

#### Why did my run return fewer rows than `maxItems`?

`maxItems` is a ceiling. A run returns fewer rows when fewer events match your filters, or when docket attachments are switched off.

***

### Need More Features?

Need custom fields, filters, or other NTSB transportation modes? [File an issue](https://console.apify.com/actors/issues) or get in touch.

### Why Use the NTSB Aviation Accident Scraper?

- **Reports and docket in one run** - the investigation record, the report text and every docket attachment, not just the summary page
- **Clean, structured fields** - probable cause, findings and aircraft come back as fields and arrays, ready for a database
- **Full history** - from the latest event back to 1962, by year range or by event number

# Actor input Schema

## `sp_intended_usage` (type: `string`):

What will this data feed? E.g. lead lists, KYB checks, price tracking.

## `sp_improvement_suggestions` (type: `string`):

Provide any feedback or suggestions for improvements.

## `sp_contact` (type: `string`):

We'll personally help with your use case. No spam.

## `eventMode` (type: `string`):

Recent: accidents from the last 90 days. Year Range: all events between Year From and Year To. Specific Event IDs: only the NTSB numbers you list.

## `yearFrom` (type: `integer`):

First year to include when Event Source is Year Range. Coverage starts in 1962.

## `yearTo` (type: `integer`):

Last year to include when Event Source is Year Range. Leave blank for the current year.

## `eventIds` (type: `array`):

Specific NTSB event numbers such as ENG22LA049 or WPR24LA123. Used when Event Source is Specific Event IDs.

## `includeReportPdfText` (type: `boolean`):

Download the investigation report PDF for each event and return its full text.

## `includeDocketPdfs` (type: `boolean`):

Return every Public Docket attachment as its own row with the extracted PDF text. Slower, and each attachment counts toward Max Items.

## `ocrFallback` (type: `boolean`):

Run OCR on image-only PDFs (scanned logbooks, ATC strips, handwritten statements). Limited to the first 30 pages of each file.

## `maxItems` (type: `integer`):

Maximum number of rows to return. Event rows and docket attachment rows both count.

## Actor input object example

```json
{
  "sp_contact": "Share your email here...",
  "eventMode": "recent",
  "yearFrom": 2024,
  "eventIds": [],
  "includeReportPdfText": true,
  "includeDocketPdfs": true,
  "ocrFallback": true,
  "maxItems": 20
}
```

# Actor output Schema

## `results` (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 = {
    "sp_contact": "Share your email here...",
    "eventMode": "recent",
    "yearFrom": 2024,
    "eventIds": [],
    "includeReportPdfText": true,
    "includeDocketPdfs": true,
    "ocrFallback": true,
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("jungle_synthesizer/ntsb-carol-aviation-accident-pdf-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 = {
    "sp_contact": "Share your email here...",
    "eventMode": "recent",
    "yearFrom": 2024,
    "eventIds": [],
    "includeReportPdfText": True,
    "includeDocketPdfs": True,
    "ocrFallback": True,
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("jungle_synthesizer/ntsb-carol-aviation-accident-pdf-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 '{
  "sp_contact": "Share your email here...",
  "eventMode": "recent",
  "yearFrom": 2024,
  "eventIds": [],
  "includeReportPdfText": true,
  "includeDocketPdfs": true,
  "ocrFallback": true,
  "maxItems": 20
}' |
apify call jungle_synthesizer/ntsb-carol-aviation-accident-pdf-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,jungle_synthesizer/ntsb-carol-aviation-accident-pdf-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/LWaPitYOQO04zVhJF/builds/MI0Lp16xpgICFDocZ/openapi.json
