PULSCAR ANALYSIS OF NHTSA PUBLIC DATA — CONTROL ARMS, BUSHINGS AND BALL JOINTS PulsCar analysis of NHTSA public data, September 2026. License: CC BY 4.0. Files in this folder may be reused with attribution to PulsCar (pulscar.io). -------------------------------------------------------------------------- 1. SOURCE FILES -------------------------------------------------------------------------- NHTSA public flat files downloaded from static.nhtsa.gov and loaded into a local SQLite database: Complaints FLAT_CMPL.txt 777,040 owner complaints (ODINO), received 1 January 2015 - 8 September 2026. Field definitions: https://static.nhtsa.gov/odi/ffdd/cmpl/CMPL.txt Recalls FLAT_RCL.txt one row per make/model/model year per campaign; campaigns counted DISTINCT on the campaign number. Field definitions: https://static.nhtsa.gov/odi/ffdd/rcl/RCL.txt Communications FLAT_TSBS.txt manufacturer communications; counted DISTINCT on the NHTSA document id. Field definitions: https://static.nhtsa.gov/odi/ffdd/tsbs/TSBS.txt What these files are, and are not. A complaint is an owner's own account of what happened, filed voluntarily. It is not a verified repair, not a failure rate, and it carries no denominator: nobody publishes how many of each model are on the road, so a make with more complaints may simply have sold more cars, or older ones, or have owners who file more. Nothing in this folder ranks reliability, and nothing here should be read as a per-vehicle risk. -------------------------------------------------------------------------- 2. THE COMPLAINT QUERY (4,253 -> 3,894 -> 3,661) -------------------------------------------------------------------------- Step 1 - full-text search (FTS5) of the complaint narrative for "control arm" OR "control arms" OR "controlarm" -> 4,253 complaints. Step 2 - failure proximity. The phrase "control arm(s)" had to sit within 60 characters of one of: fail* | broke* | broken | break* | bent | bend* | crack* | snap* | separat* | came off | came apart | fell off | worn | wear | bad | defect* | replac* | clunk* | clank* | knock* | rattl* | squeak* | creak* | pop* | loose | play | bushing* | ball joint* | collaps* | rust* | corrod* | corros* | seiz* | weld* | detach* | fractur* | gave way | noise | noisy and the same 120-character window must NOT contain a negation ("no damage", "no issue", "no problem", "no wear", "not damaged", "not worn", "not bent", "not broken"). -> 3,661 complaints. An intermediate, looser run used a 180-character window and no negation filter and returned 3,894. Reading 30 random matches from that run turned up three clear false positives — a crash report listing undamaged control arms, a death-wobble complaint where arms appeared only in a list of associated parts, and a complaint where the arms had been replaced as an unsuccessful attempt to fix something else. Tightening the window to 60 characters and adding the negation filter removed 233 rows. Sample reading of the final set: 30 random complaints read in full. 27 of 30 named a control arm, its bushing or its ball joint as the failed, damaged or replaced part. 3 of 30 were false positives — one crash-damage report, one aftermarket lift kit fitted with non-certified upper arms, and one steering complaint in which an arm was replaced during an unsuccessful diagnosis. Measured false-positive rate: 10% (3/30). All counts published here should be read with that 10% attached; it is a keyword set, not a curated file. Dates in the final set: complaints received 2 January 2015 - 5 September 2026. -------------------------------------------------------------------------- 3. MILEAGE -------------------------------------------------------------------------- Mileage is the owner-entered failure mileage. Rows with miles <= 0 or >= 400,000 were dropped as unusable. 2,219 of the 3,661 complaints (60.6%) carry a usable mileage; the other 39.4% left the field blank, so every median in these files is a median of the subset that filled it in, and nothing corrects for that. Whole set: median 104,000 miles, first quartile 67,658, third quartile 141,308. 11.8% at or under 36,000 miles; 54.8% at or over 100,000. -------------------------------------------------------------------------- 4. CONTEXT SUBSETS (control-arm-complaints-by-context.csv) -------------------------------------------------------------------------- Each subset is a regex over the complaint narrative. Subsets overlap: a complaint that says a corroded arm broke is counted in both the corrosion and the break row. Shares are of the 3,661-complaint set. corrosion rust* | corrod* | corros* | rotted | rotten break broke* | broken | fractur* | snap* | separat* | came off | came apart | fell off | detach* | collaps* | gave way | crack* noise clunk* | clank* | knock* | rattl* | squeak* | creak* | pop* | noise | noisy | grind* | squeal* noise only matches noise and matches neither break nor corrosion bushing bushing* ball joint ball joint alignment/wear alignment | aligned | tire wear | tires wear | uneven tire wheel off wheel (came|fell|separat|detach|collaps)* | lost (a|the) wheel recall mention recall* | campaign number coverage denied not covered | denied | refus* | not included in the recall | vin was not included pothole/curb pothole | curb strike | hit a curb Baseline row: the towed and crash shares of all 777,040 complaints in the file (5.11% towed, 4.37% crash), so subset shares can be read against something. The baseline is every complaint about every system, which is the only denominator this file offers. -------------------------------------------------------------------------- 5. MAKE AND MODEL (control-arm-complaints-by-make-and-model.csv) -------------------------------------------------------------------------- Rows with fewer than 10 complaints are omitted. "level" is make or model. Make and model strings are printed as NHTSA stores them, so MERCEDES-BENZ and MERCEDES BENZ are separate rows in the source file; they were left unmerged rather than silently combined. Read this as a count of reports, not a ranking. A high row means that make or model has many owners who filed; it does not mean the part fails more often per vehicle, and no arithmetic here can turn it into that. -------------------------------------------------------------------------- 6. RECALLS (control-arm-recalls.csv) -------------------------------------------------------------------------- Query: any recall row whose defect, component or remedy text contains "control arm". Counted DISTINCT on campaign number: 149 campaigns, 4,239,803 vehicles potentially affected in total (the flat file's own "potentially affected" figure, taken as the maximum across the campaign's rows). 60 of the 149 were reported in 2020 or later. corrosion_related = the defect text contains "corros" or "rust" (14 of 149). limited_to_listed_states = the defect text contains "currently registered in" or "originally sold" (13 of 149, covering 2,486,034 vehicles). These are the salt-belt campaigns, which apply only to cars sold or registered in a named list of states. Both flags are computed from the first 400 characters of the defect text as published in the CSV, so a campaign that names corrosion only in a later paragraph is flagged N. Equipment recalls (aftermarket and replacement arms, campaign numbers ending in E) are included and are visible in the manufacturer column. -------------------------------------------------------------------------- 7. WHAT OWNERS SAID THEY PAID (control-arm-owner-reported-amounts.csv) -------------------------------------------------------------------------- This is the weakest file here and is published with its limits stated. Query: within the 3,661-complaint set, the first dollar figure between $80 and $12,000 whose 400-character window also names a control arm, a bushing or a ball joint, and does not name a clearly different repair (engine, transmission, door, headlight, window, spark plug, fuel pump, transfer case, catalytic converter, air conditioning, radiator, infotainment, battery, paint, seat sensor, skid plate, frame repair). One figure per complaint. Result: 187 figures. Published columns: odino, make, model, model year, failure miles, amount and the bundled flag below. The matched narrative is not republished; the ODI number is given so any row can be looked up in NHTSA's own file. Distribution: median $1,200; first quartile $700; third quartile $2,000; range $92 - $11,583. 10.2% under $300, 9.1% $300-$600, 17.6% $600-$1,000, 32.1% $1,000-$2,000, 31.0% $2,000 and above. bundled_with_structure = the same window also names a subframe, crossmember, cradle, K-frame, steering rack, axle or driveshaft (31 of 187). Median for those: $2,000. Median for the other 156: $1,100. Sample reading: 20 random rows read in full. 17 attached the figure to work that included a control arm, a bushing or a ball joint. 3 did not — one was a used-part price quoted from an online listing, one belonged to a broken coil spring, and one could not be tied to any named repair. Measured precision 85% (17/20). This file is a distribution of what owners wrote, not a price estimate. It is also selected: people file with NHTSA when something breaks, not when a $400 bushing job goes normally, so the whole file is weighted toward the expensive tail. It should be read against published estimator ranges, not in place of them. -------------------------------------------------------------------------- 8. MANUFACTURER COMMUNICATIONS -------------------------------------------------------------------------- Query: FTS5 on the bulletin summary for "control arm" OR "control arms", counted DISTINCT on the NHTSA document id: 239 documents. Of those, 91 name a noise (noise, clunk, squeak, creak, rattle, pop), 56 name a bushing, 10 name corrosion or rust and 7 name alignment, camber or caster. No CSV is published for this query; the four bulletins cited in the article are linked individually to their own NHTSA PDF. -------------------------------------------------------------------------- 9. LIMITATIONS, IN ONE PLACE -------------------------------------------------------------------------- - Complaints are self-reported and unverified. - There is no denominator. Nothing here is a failure rate. - Keyword sets carry the false-positive rates measured in sections 2 and 7. - 39.4% of the set has no mileage; medians describe the rest. - The file is selected toward failures that frightened or cost someone. - Subsets overlap and do not sum to the total. - Recall "potentially affected" counts are the manufacturer's own estimate of the population, not the number of vehicles that actually failed. Questions or a correction: support@pulscar.io ------------------------------------------------------------------------------ CASE SENSITIVITY — SECTION ADDED 19 SEPTEMBER 2026 ------------------------------------------------------------------------------ NHTSA stores complaint narratives in ALL CAPS for records filed through roughly 2020 and in mixed case for records filed from 2021 on. A case-SENSITIVE search of the narrative field loses about 92% of the complaints filed after 2020, so this is the single largest way an analysis of this database can go wrong while still looking finished. Every query behind this file is case-insensitive. SQLite's LIKE and its FTS5 full-text index both ignore case by default, and no query in this work uses GLOB or any case-sensitive comparison. This was not taken on trust. On 19 September 2026 every published folder was re-checked against the same database, comparing the figures here with what a case-sensitive query would have returned. The result: the complaint set published here (4,253) is LARGER than the absolute ceiling a case-sensitive search of the same terms could have returned (2,503 narratives). A case-sensitive query cannot produce a bigger set than itself, so the bug is ruled out for this folder by arithmetic, not by assurance.