NTSB findings
What NTSB found in 24,558 investigations, coded in a tree of 5 categories, 21 subcategories, 130 sections and 792 subsections. NTSB marks the findings that are part of the probable cause (a cause or contributing factor); the rest are other findings. NTSB publishes the codes’ names but not their definitions.
Accident and incident, 49 CFR 830.2NTSB coding manual, before 2008 (PDF)
By category
Cases with a finding in each category, per year: in green, those with one in the probable cause. Findings are coded with the final report, often a year or more after the event, so the latest years are incomplete.
| 2008 | 1,297 |
|---|---|
| 2009 | 1,286 |
| 2010 | 1,161 |
| 2011 | 1,213 |
| 2012 | 1,206 |
| 2013 | 1,003 |
| 2014 | 1,047 |
| 2015 | 1,034 |
| 2016 | 1,075 |
| 2017 | 1,060 |
| 2018 | 1,065 |
| 2019 | 1,048 |
| 2020 | 921 |
| 2021 | 950 |
| 2022 | 1,010 |
| 2023 | 975 |
| 2024 | 924 |
| 2025 | 637 |
| 2026 | 263 |
19,176 cases · 18,374 in the probable cause
| 2008 | 1,113 |
|---|---|
| 2009 | 1,219 |
| 2010 | 1,155 |
| 2011 | 1,262 |
| 2012 | 1,264 |
| 2013 | 1,025 |
| 2014 | 1,068 |
| 2015 | 1,038 |
| 2016 | 1,051 |
| 2017 | 1,072 |
| 2018 | 1,079 |
| 2019 | 1,051 |
| 2020 | 908 |
| 2021 | 938 |
| 2022 | 999 |
| 2023 | 918 |
| 2024 | 872 |
| 2025 | 655 |
| 2026 | 280 |
18,967 cases · 18,419 in the probable cause
| 2008 | 933 |
|---|---|
| 2009 | 669 |
| 2010 | 591 |
| 2011 | 564 |
| 2012 | 566 |
| 2013 | 507 |
| 2014 | 612 |
| 2015 | 568 |
| 2016 | 665 |
| 2017 | 700 |
| 2018 | 663 |
| 2019 | 613 |
| 2020 | 441 |
| 2021 | 463 |
| 2022 | 428 |
| 2023 | 437 |
| 2024 | 423 |
| 2025 | 310 |
| 2026 | 132 |
10,285 cases · 5,684 in the probable cause
| 2008 | 150 |
|---|---|
| 2009 | 199 |
| 2010 | 195 |
| 2011 | 156 |
| 2012 | 171 |
| 2013 | 128 |
| 2014 | 150 |
| 2015 | 163 |
| 2016 | 137 |
| 2017 | 135 |
| 2018 | 143 |
| 2019 | 118 |
| 2020 | 86 |
| 2021 | 98 |
| 2022 | 76 |
| 2023 | 68 |
| 2024 | 37 |
| 2025 | 28 |
| 2026 | 9 |
2,247 cases · 2,176 in the probable cause
| 2008 | 47 |
|---|---|
| 2009 | 37 |
| 2010 | 45 |
| 2011 | 37 |
| 2012 | 49 |
| 2013 | 33 |
| 2014 | 39 |
| 2015 | 33 |
| 2016 | 24 |
| 2017 | 24 |
| 2018 | 22 |
| 2019 | 15 |
| 2020 | 7 |
| 2021 | 12 |
| 2022 | 21 |
| 2023 | 22 |
| 2024 | 29 |
| 2025 | 6 |
| 2026 | 2 |
504 cases · 388 in the probable cause
Query with SQL
duckdb -csv -c "SELECT left(f.\"findingCode\", 2) AS category, max(f.\"tier1Name\") AS name, year(c.\"eventDate\") AS year,
count(DISTINCT f.case_mkey) AS cases,
count(DISTINCT f.case_mkey) FILTER (WHERE f.\"inProbableCause\") AS in_probable_cause
FROM 'https://openairdocs.org/data/latest/ntsb_findings.parquet' f JOIN 'https://openairdocs.org/data/latest/ntsb_case_detail.parquet' c ON c.\"mKey\" = f.case_mkey
WHERE c.\"eventDate\" >= DATE '2008-01-01' AND f.\"findingCode\" GLOB '[0-9][0-9]*'
GROUP BY 1, 3
ORDER BY 1, 3"Prints the counts as CSV. It reads the release’s Parquet files over HTTPS, so there’s nothing to download first. Install DuckDB to run it.
SELECT left(f."findingCode", 2) AS category, max(f."tier1Name") AS name, year(c."eventDate") AS year, count(DISTINCT f.case_mkey) AS cases, count(DISTINCT f.case_mkey) FILTER (WHERE f."inProbableCause") AS in_probable_cause FROM 'https://openairdocs.org/data/latest/ntsb_findings.parquet' f JOIN 'https://openairdocs.org/data/latest/ntsb_case_detail.parquet' c ON c."mKey" = f.case_mkey WHERE c."eventDate" >= DATE '2008-01-01' AND f."findingCode" GLOB '[0-9][0-9]*' GROUP BY 1, 3 ORDER BY 1, 3
Run it at the DuckDB prompt, or in any tool that reads Parquet over HTTPS. More ways to query the release are on Use the data.
Most often in the probable cause
Query with SQL
duckdb -csv -c "-- The page charts the top 5 by in_probable_cause, and by fatal_cases
SELECT left(f.\"findingCode\", 8) AS finding, max(f.\"tier4Name\") AS name, max(f.\"tier1Name\") AS category,
count(DISTINCT f.case_mkey) AS cases,
count(DISTINCT f.case_mkey) FILTER (WHERE f.\"inProbableCause\") AS in_probable_cause,
count(DISTINCT f.case_mkey) FILTER (WHERE c.\"highestInjuryLevel\" = 'Fatal') AS fatal_cases
FROM 'https://openairdocs.org/data/latest/ntsb_findings.parquet' f JOIN 'https://openairdocs.org/data/latest/ntsb_case_detail.parquet' c ON c.\"mKey\" = f.case_mkey
WHERE f.\"findingCode\" GLOB '[0-9][0-9]*'
GROUP BY 1
ORDER BY in_probable_cause DESC, cases DESC"Prints the counts as CSV. It reads the release’s Parquet files over HTTPS, so there’s nothing to download first. Install DuckDB to run it.
-- The page charts the top 5 by in_probable_cause, and by fatal_cases SELECT left(f."findingCode", 8) AS finding, max(f."tier4Name") AS name, max(f."tier1Name") AS category, count(DISTINCT f.case_mkey) AS cases, count(DISTINCT f.case_mkey) FILTER (WHERE f."inProbableCause") AS in_probable_cause, count(DISTINCT f.case_mkey) FILTER (WHERE c."highestInjuryLevel" = 'Fatal') AS fatal_cases FROM 'https://openairdocs.org/data/latest/ntsb_findings.parquet' f JOIN 'https://openairdocs.org/data/latest/ntsb_case_detail.parquet' c ON c."mKey" = f.case_mkey WHERE f."findingCode" GLOB '[0-9][0-9]*' GROUP BY 1 ORDER BY in_probable_cause DESC, cases DESC
Run it at the DuckDB prompt, or in any tool that reads Parquet over HTTPS. More ways to query the release are on Use the data.
Every finding
The whole tree, with the cases under each code. Open a level to see the one below.
5 categories, 21 subcategories, 130 sections and 792 subsections
Aircraft19,176
Aircraft oper/perf/capability12,312
Performance/control parameters11,908
- Directional control3,958
- Airspeed1,681
- Altitude1,310
- Landing flare1,285
- Performance/control parameters, general1,269
- Angle of attack990
- Descent/approach/glide path809
- Pitch control526
- Lateral/bank control390
- Climb rate265
- Descent rate241
- Surface speed/braking238
- Crosswind correction184
- Prop/rotor parameters182
- Yaw control149
- Heading/course82
- Powerplant parameters81
- Configuration80
- Engine out control35
- Dynamic load10
- Glide7
Aircraft systems3,616
Landing gear system1,783
- Gear extension and retract sys416
- Brake297
- Main landing gear241
- Nose/tail landing gear185
- Landing gear system, general113
- Landing gear brakes system92
- Main gear strut/axle/truck86
- Main landing gear attach sec66
- Landing gear actuator54
- Landing gear selector54
- Wheel/ski/float48
- Gear position and warning37
- Nose/tail gear strut/axle36
- Tire casing36
- Landing gear steering system32
- Nose/tail gear attach section29
- Master cylinder/brake valve21
- Tube19
- Landing gear/wheel fairing9
- Land gear sys wiring9
- Aux gear (tail/rotorcrft skid)7
- Landing gear door retract sec5
- Anti-skid section5
- Landing gear door actuator4
- Steering unit4
- Shimmy damper3
- Emergency floatation section1
Flight control system458
- Rudder control system92
- Elevator control system74
- TE flap control system74
- Flight control system, general65
- Aileron control system45
- Elevator tab control system37
- Control column section21
- Gust lock or damper14
- Stabilizer control system13
- Drag control system10
- Rudder tab control system6
- TE flap actuator6
- LE flap control system3
- Aileron tab control system2
- TE flap position ind system2
- Rudder actuator1
- Stabilizer position ind system1
- Stabilizer actuator1
- Drag control actuator1
- Flight control sys wiring1
Electrical power system183
- Electrical power system, general48
- Electrical pwr sys wiring44
- Battery/charger37
- Alternator-generator drive sys25
- AC generator-alternator14
- DC power distribution system13
- DC generation system6
- DC generator-alternator5
- AC generation system4
- Starter-generator4
- DC regulator4
- AC power distribution system4
- DC indicating system2
- External power system2
- AC inverter1
- AC regulator1
- DC rectifier-converter1
Navigation system54
- Navigation system, general13
- Pitot/static system7
- Ground proximity system7
- Airspeed/mach indicating6
- Attitude gyro & indication5
- Stall warning system4
- Flt management computing sys4
- Global positioning sys (GPS)3
- Attitude & direction2
- Directional gyro & indication2
- Flight environment data1
- Altimeter, barometric/encoder1
- Magnetic compass1
- Glide slope system1
- Weather radar system1
- Dependent position determining1
- ATC transponder system1
Aircraft power plant2,721
Engine fuel and control431
- Fuel control/carburetor195
- Fuel controlling system59
- Fuel distribution55
- Engine fuel and control, general49
- Fuel pump34
- Fuel injector nozzle20
- Fuel control electronic6
- Turbine governor5
- Fuel divider5
- Fuel flow indicating4
- Fuel oil cooler3
- Fuel flow sensor3
- Fuel indicating system1
- Fuel pressure indicating1
- Fuel press sensor1
- Eng fuel sys wiring1
Aircraft structures652
Wing structure206
- Wing structure, general48
- Spar (on wing)43
- Trailing edge flaps33
- Attach fittings (on wing)21
- Flight surfaces (wing)20
- Ailerons12
- Plates/skins (on wing)11
- Main frame (on wing)8
- Spoilers8
- Ribs/bulkheads (on wing)4
- Wing auxiliary structure3
- Fus (attach fitting on wing)3
- Landing gear (fitting on wing)3
- Leading edge devices3
- Center wing box (on wing)2
Fuselage125
- Seat/cargo attach fitting27
- Fuselage main structure24
- Gear attach fittings (on fus)16
- Rotorcraft tail boom12
- Frames (main fuselage)8
- Bulkheads (main fuselage)8
- Aerial tow equipment section7
- Fuselage attach fittings sys5
- Aerodynamic fairings structure5
- Fuselage, general4
- Longerons/stringers (main fus)4
- Plates/skins (aux fuselage)4
- Equip attach fittings (on fus)3
- Wing attach fittings (on fus)2
- Engine attach fitting (on fus)2
- Floor panels (aux fuselage)1
Empennage structure81
- Horizontal stabilizer23
- Rudder15
- Empennage structure, general14
- Vertical stabilizer10
- Elevators6
- Tab structure (on elevator)4
- Horiz stab misc structure3
- Elevator misc structure3
- Rudder misc structure3
- Attach fittings (flt controls)3
- Elevator/tab attach fitting3
- Spars/ribs (horizontal stab)2
- Vertical stab attach fitting2
- Rudder/tab attach fitting2
- Spars/ribs (on elevator)1
- Spars/ribs (on vert stab)1
- Ventral struc (on vert stab)1
- Vertical stab misc structure1
- Spars/ribs (on rudder)1
- Horizontal stab attach fitting1
Personnel issues18,967
Task performance13,659
Action/decision7,287
Psychological2,516
Experience/knowledge1,090
Physical674
Environmental issues10,285
Physical environment5,691
Object/animal/substance3,470
- Tree(s)933
- Wire588
- Animal(s)/bird(s)358
- Fence/fence post313
- Object/animal/substance, general224
- Sign/marker214
- Pole142
- Ground vehicle132
- Aircraft115
- Runway/taxi/approach light106
- Debris/dirt/foreign object101
- Snow/ice67
- Residence/building58
- Tower/antenna (incl guy wires)55
- Ground equipment52
- Airport structure50
- Hidden/submerged object36
- Wall/barricade29
- Person17
- Wind sock12
- Water/moisture10
- Bridge/overpass1
Conditions/weather/phenomena5,623
Wind3,020
- Gusts1,199
- Crosswind1,008
- Tailwind594
- Downdraft178
- Sudden wind shift114
- Variable wind113
- High wind112
- Wind, general110
- Windshear90
- Dust devil/whirlwind38
- Updraft14
- Microburst10
Operating environment293
Airport facilities/design204
- Runway/landing area condition61
- Airport facilities/design, general52
- Runway/landing area length34
- Runway lighting18
- Airport lighting8
- Runway markings/signage8
- Taxiway markings/signage6
- Ground support/equipment6
- Taxiway lighting5
- Taxiway condition4
- Ramp facilities4
- Security4
- Obstruction markings/lighting3
- Snow removal service/equipment3
- Airport communication2
- Fuel service/equipment2
- Emergency/fire/rescue services1
Not determined2,247
Not determined2,247
Query with SQL
duckdb -csv -c "SELECT l.level, left(f.\"findingCode\", l.level * 2) AS code,
max([f.\"tier1Name\", f.\"tier2Name\", f.\"tier3Name\", f.\"tier4Name\"][l.level]) AS name,
count(DISTINCT f.case_mkey) AS cases,
count(DISTINCT f.case_mkey) FILTER (WHERE f.\"inProbableCause\") AS in_probable_cause,
count(DISTINCT f.case_mkey) FILTER (WHERE c.\"highestInjuryLevel\" = 'Fatal') AS fatal_cases
FROM 'https://openairdocs.org/data/latest/ntsb_findings.parquet' f JOIN 'https://openairdocs.org/data/latest/ntsb_case_detail.parquet' c ON c.\"mKey\" = f.case_mkey CROSS JOIN range(1, 5) AS l(level)
WHERE f.\"findingCode\" GLOB '[0-9][0-9]*'
GROUP BY 1, 2
ORDER BY code"Prints the counts as CSV. It reads the release’s Parquet files over HTTPS, so there’s nothing to download first. Install DuckDB to run it.
SELECT l.level, left(f."findingCode", l.level * 2) AS code, max([f."tier1Name", f."tier2Name", f."tier3Name", f."tier4Name"][l.level]) AS name, count(DISTINCT f.case_mkey) AS cases, count(DISTINCT f.case_mkey) FILTER (WHERE f."inProbableCause") AS in_probable_cause, count(DISTINCT f.case_mkey) FILTER (WHERE c."highestInjuryLevel" = 'Fatal') AS fatal_cases FROM 'https://openairdocs.org/data/latest/ntsb_findings.parquet' f JOIN 'https://openairdocs.org/data/latest/ntsb_case_detail.parquet' c ON c."mKey" = f.case_mkey CROSS JOIN range(1, 5) AS l(level) WHERE f."findingCode" GLOB '[0-9][0-9]*' GROUP BY 1, 2 ORDER BY code
Run it at the DuckDB prompt, or in any tool that reads Parquet over HTTPS. More ways to query the release are on Use the data.
NTSB has coded findings and defining events since 2008. Earlier cases used its older occurrence and cause codes, so they aren’t counted here.