Technical writing
OSHA Violations Database: The Federal Record of 200,000 Annual Workplace Safety Citations
The OSHA enforcement database contains every citation issued after a workplace inspection — violation type, penalty amount, standard violated, and abatement status — covering 200,000+ annual citations across all industries, from construction falls to chemical exposure to machine guarding failures.
OSHA Enforcement Structure
The Occupational Safety and Health Administration is a component of the Department of Labor, created by the Occupational Safety and Health Act of 1970. The OSH Act established a federal framework for workplace safety enforcement that covers roughly 130 million workers across 10 million workplaces in private industry. Federal OSHA employs approximately 1,800 compliance officers — inspectors who conduct site visits, issue citations, and assess penalties. Given those numbers, federal OSHA can statistically expect to visit any given workplace once every 165 years on a purely random schedule. Complaint-driven and programmed emphasis inspections focus resources on the highest-hazard environments.
The enforcement picture is substantially larger than federal OSHA alone. Twenty-two states and territories operate their own OSHA programs under Section 18 of the OSH Act, with an additional six states covering only public-sector workers while private employers remain under federal jurisdiction. State Plan programs must maintain standards “at least as effective” as federal OSHA and are monitored by the federal agency for adequacy. In practice, some State Plans — notably California's Cal/OSHA and Washington's Department of Labor and Industries — maintain more stringent standards in specific areas, including heat illness and ergonomics. Federal OSHA conducts roughly 33,000–35,000 inspections per year; state-plan programs collectively conduct approximately 50,000 additional inspections, bringing total annual inspections across both systems to roughly 85,000.
Penalty maximums are set by statute and adjusted annually for inflation under the Federal Civil Penalties Inflation Adjustment Act Improvements Act of 2015, which accelerated adjustments from the Bipartisan Budget Act of 2016. As of 2024, the maximum penalty for a serious violation is $16,131 per violation. Willful and repeated violations carry a maximum of $161,323 per violation. Failure-to-abate notices accrue at $16,131 per day beyond the abatement deadline. Criminal liability for willful violations causing a worker's death remains a misdemeanor under the OSH Act — up to $10,000 in fines and six months imprisonment — a threshold widely criticized by safety advocates as inadequate to deter deliberate disregard of life-safety requirements.
Violation Types
Every citation in the OSHA enforcement database carries a violation type classification that determines the maximum applicable penalty and carries significant legal weight in any subsequent contest or litigation. Theviol_type field in the violation table encodes these categories as single characters.
Serious violations (code S) are the most common citation type in the database. A serious violation is defined as one where there is a substantial probability that death or serious physical harm could result from the condition, and the employer knew or should have known of the hazard. The “knew or should have known” standard is objective rather than requiring proof of subjective awareness — OSHA does not need to show the employer was thinking about the hazard, only that a reasonable employer in that industry would have recognized it. The maximum penalty is $16,131 per violation.
Other-than-serious violations (codeO) apply when the cited condition violates a standard but is unlikely to directly result in death or serious physical harm. Recordkeeping failures, incomplete safety data sheets, and missing training documentation frequently appear in this category. Maximum penalty is also $16,131, though practical assessed penalties are typically much lower.
Willful violations (code W) are OSHA's most serious classification. A willful violation is one in which the employer either intentionally and knowingly violated the OSH Act or demonstrated plain indifference to employee safety — knowing that a hazard existed and choosing to do nothing about it. Willful citations carry the maximum penalty of $161,323 per violation, disqualify employers from certain federal contracting preferences, and can support criminal referrals to the Department of Justice when a worker has died. An employer cited for willful violations is also ineligible for the informal settlement discounts applied to other violation types.
Repeated violations (code R) are triggered when the same employer is cited for the same or a substantially similar condition at any facility within the previous five years. The maximum penalty matches willful violations at $161,323 per instance, and OSHA applies multipliers for each additional recurrence. An employer cited for a repeated violation at a second facility has demonstrated a systemic failure across its operations rather than an isolated incident at a single site — a legally and analytically meaningful distinction. The five-year lookback window is measured from the date of the prior final order, not the date of the prior inspection.
Failure-to-abate notices are not a new citation but a notice that a previously cited violation has not been corrected by the abatement date specified in the original citation. They accrue daily penalties of $16,131 per day beyond the missed deadline. For an employer who ignores a batch of citations, failure-to-abate penalties can rapidly exceed the original citation amount. The abatement deadline for each violation is recorded in the abate_date field of the violation table.
The Most-Cited Standards
OSHA publishes its annual “Top 10” most-cited standards list, and the rankings have been stable enough across years that they function as a reliable map of systemic compliance failures in American industry. Fall protection in construction has held the top position every year since 2009.
29 CFR 1926.501 — Fall protection(construction) generates more than 7,000 citations per year and has been the most-cited standard in the country for over a decade. Falls are the leading cause of death in construction, accounting for roughly one-third of all construction fatalities annually. The standard requires fall protection systems — guardrails, safety nets, or personal fall arrest systems — for workers exposed to falls of six feet or more in general construction and at any height in specific contexts such as rebar and hoist areas. Its persistent dominance reflects both the ubiquity of fall hazards at construction sites and the relative ease with which compliance officers can identify unprotected edges and leading faces.
29 CFR 1910.1200 — Hazard Communication(general industry, HazCom/GHS) appears in virtually every industry that uses chemicals. The standard requires employers to maintain safety data sheets for all hazardous chemicals, label containers with GHS-compliant pictograms and hazard statements, and provide worker training on chemical hazards and protective measures. HazCom violations are frequently cited as other-than-serious but appear in enormous volume across manufacturing, healthcare, food processing, and service industries.
Other consistently top-cited standards include: 1926.503(fall protection training requirements in construction, paired with 1926.501 because employers who lack the physical systems also tend to lack the training programs);1926.451 (scaffolding in construction, covering erection, capacity, access, and fall protection at scaffold levels);1910.134 (respiratory protection, including fit testing, medical evaluation, and program administration requirements across manufacturing, healthcare, and construction); 1910.147(control of hazardous energy, commonly called lockout/tagout, requiring procedures to de-energize equipment before maintenance — responsible for a disproportionate share of amputations and crush fatalities in general industry);1910.178 (powered industrial trucks, covering forklift operator training, equipment inspection, and safe operation in warehousing and manufacturing); 1910.303 and1910.305 (electrical general requirements and wiring methods, covering improper wiring, missing covers, and overloaded circuits).
The concentration of citations in construction fall protection reflects OSHA's “Fatal Four” framework: falls, struck-by-object incidents, electrocutions, and caught-in/between hazards account for roughly 60 percent of construction worker fatalities each year. Enforcement emphasis on the Fatal Four is deliberate — OSHA's programmed National Emphasis Program on construction falls specifically targets worksites where fall hazard exposure is observed from the street, generating a self-reinforcing pattern of high citation volumes in the most visible hazard category.
Penalty Reduction Factors
The penalty proposed in the original citation is rarely the penalty that an employer ultimately pays. OSHA's penalty calculation methodology incorporates several statutory adjustment factors, and the informal settlement process between employers and OSHA Area Directors regularly produces further reductions. The gap between proposed and final penalties is visible in the enforcement database through the penalty (proposed) and final_order (settled or adjudicated) fields on each violation record.
Good faith adjustments reduce penalties by up to 25 percent for employers who demonstrate a genuine commitment to safety through documented safety programs, employee training, and prompt hazard correction. An employer with a written safety program, active safety committee, and a history of voluntarily correcting hazards before an inspection will typically receive the maximum good faith credit.
Size adjustments are the most significant routine reduction for small employers. OSHA applies a sliding scale: employers with 1–10 employees receive a 70 percent penalty reduction; 11–25 employees receive 60 percent; 26–100 employees receive 40 percent; and 101–250 employees receive 20 percent. Employers with more than 250 employees receive no size reduction. These reductions apply to serious violations and are intended to prevent the penalty structure from being disproportionately burdensome to small employers who may lack dedicated safety staff.
History adjustments provide a 10 percent reduction for employers who have not received any OSHA violations in the prior three years. Employers with a prior violation history in that window may instead receive a 10 percent penalty increase.
Beyond the statutory adjustment factors, most citations are resolved through the informal conference process — a meeting between the employer and the OSHA Area Director that is available to any cited employer within 15 business days of receiving a citation. Informal settlements typically reduce penalties an additional 20–50 percent in exchange for prompt abatement, enhanced safety training, or other corrective commitments. The net effect is that final penalties after informal conference are often 40–60 percent of the originally proposed amounts. An employer cited for $50,000 in proposed penalties across a dozen serious violations may settle for $20,000–$30,000 after applying size reductions and negotiating an informal settlement.
High-Profile Cases in the Enforcement Record
Amazon's warehouse network has been the subject of sustained OSHA attention in recent years. Internal OSHA records and public enforcement data show Amazon fulfillment centers running injury rates roughly double the warehousing industry average. In 2023, OSHA cited Amazon warehouses in multiple states for ergonomic hazards and recordkeeping violations, proposing penalties that critics described as inadequate — a $60,000 proposed penalty at one facility drew particular attention given Amazon's scale and the severity of the documented injury rates. The enforcement records are identifiable in the violations database by establishment name and NAICS code 493 (warehousing and storage).
Tesla's Fremont, California manufacturing plant has appeared in OSHA enforcement records for recordkeeping violations. Investigations found evidence that the company had underreported workplace injury rates on its OSHA 300 logs — an other-than-serious violation in isolation, but significant because the 300 log is the primary data source for OSHA's establishment-level injury surveillance. A facility that suppresses its reported injury rate avoids the programmed inspection targeting that OSHA applies to high-rate establishments, effectively using recordkeeping manipulation to reduce enforcement exposure. Tesla's Fremont plant is in a State Plan state (Cal/OSHA jurisdiction), and while the state-level records are not in the federal enforcement database, federal OSHA investigations of the recordkeeping practices appear in the federal violation table.
Grain entrapment deaths — workers engulfed by flowing grain in bins and silos — generate a recurring category of serious and willful citations in the agricultural and food processing sector under OSHA's confined space standard (29 CFR 1910.146) and the general industry grain handling standard (29 CFR 1910.272). Grain entrapment kills several workers per year in the United States, disproportionately affecting young, seasonal, and temporary workers who may not have received required confined space entry training. The enforcement records for these fatalities are identifiable in the violation table by the combination of hazsub references to grain and citations under 1910.146 and 1910.272.
Heat illness remains a significant gap in federal OSHA enforcement. There is no federal OSHA heat standard as of 2024 — a proposed rulemaking has been in progress but not finalized. OSHA cites heat illness hazards in non-healthcare workplaces under the general duty clause of the OSH Act (Section 5(a)(1)), which requires employers to provide a workplace free from recognized hazards likely to cause death or serious harm. General duty clause citations require substantially more documentation to defend than standard-specific citations and are more easily contested. State Plan states including California, Washington, and Oregon have enacted their own heat illness standards that provide specific temperature thresholds, shade requirements, and acclimatization protocols — and their enforcement records appear in state-level data rather than the federal database.
The COVID-19 pandemic generated an Emergency Temporary Standard (ETS) for healthcare workers in 2021, requiring N95 respirators, physical barriers, and COVID-specific exposure control plans. Citations under the healthcare ETS appear in the federal violation database for the period of its enforcement. For non-healthcare employers, OSHA relied on the general duty clause for COVID-19 exposure enforcement, and those citations are identifiable in the violation table by the hazsub and description fields referencing SARS-CoV-2.
Data Access
OSHA enforcement data is published through two primary access points. The OSHA enforcement landing page at osha.gov/enforcement/ provides downloadable ZIP archives containing flat-file CSVs for inspections and violations. These bulk files are updated periodically and contain the complete historical record going back decades. For most analytical purposes, the bulk download is the right starting point — the full dataset is manageable in memory with appropriate dtype specification in pandas.
OSHA data is also published through the Socrata platform at data.osha.gov. The inspections dataset is available at the endpointdata.osha.gov/api/views/4dwo-mb8e/rows.json and the violations dataset at data.osha.gov/api/views/498h-afjm/rows.json. Both support Socrata Query Language (SoQL) filtering via URL parameters and CSV export via therows.csv?accessType=DOWNLOAD endpoint without requiring an API key for public datasets. The Socrata endpoints are convenient for filtered queries — pulling only violations from a specific date range or a specific CFR section — without downloading the full multi-gigabyte dataset.
Key fields in the violation table for analytical work: activity_nr(the inspection number, primary join key to the inspection table);citation_id (citation and item number within the inspection);hazsub (hazardous substance involved when applicable);viol_type (S/O/W/R/U for Serious, Other-than-Serious, Willful, Repeated, Unclassified); section (the CFR standard cited, encoded as a slash-delimited string like 1926/0501 for 29 CFR 1926.501);issuance_date and abate_date; gravity(1–10 rating driving the penalty calculation); penalty(proposed penalty for this item); final_order (penalty after contest or settlement — the economically meaningful figure); andnr_instances (number of instances of the violation found during the inspection).
Python: Querying the OSHA Violations Dataset
The following script downloads the OSHA violations and inspections datasets from the data.osha.gov Socrata API, then computes five analytical outputs: the top 20 most-cited CFR standards by citation count, the violation type distribution across all records, average proposed versus final penalty by violation type with the implied reduction percentage, penalty reduction rate by 2-digit NAICS industry (joining the inspections table for the NAICS code), and the annual citation count trend from 2010 through 2024.
import requests
import pandas as pd
import io
# ---------------------------------------------------------------------------
# OSHA Violations Database Analysis via Socrata API
# Violations endpoint: https://data.osha.gov/api/views/498h-afjm/rows.json
# Inspections endpoint: https://data.osha.gov/api/views/4dwo-mb8e/rows.json
#
# Key violation fields:
# activity_nr - inspection number (join key to inspections table)
# citation_id - citation and item number within the inspection
# hazsub - hazardous substance involved (when applicable)
# viol_type - S=Serious, O=Other-than-Serious, W=Willful, R=Repeated, U=Unclassified
# section - CFR standard cited (e.g., "1926/0501" for 29 CFR 1926.501)
# issuance_date - date citation was issued
# abate_date - abatement deadline
# gravity - gravity rating 1-10 (drives initial penalty calculation)
# penalty - proposed penalty for this violation item
# final_order - penalty after contest/settlement (economically meaningful figure)
# penalty_status - current status of the penalty
# nr_instances - number of instances of the violation found
# ---------------------------------------------------------------------------
# Socrata CSV export (no API key needed for public datasets)
VIOLATIONS_CSV = (
"https://data.osha.gov/api/views/498h-afjm/rows.csv?accessType=DOWNLOAD"
)
INSPECTIONS_CSV = (
"https://data.osha.gov/api/views/4dwo-mb8e/rows.csv?accessType=DOWNLOAD"
)
print("Downloading OSHA violations dataset (may be several hundred MB)...")
viol_resp = requests.get(VIOLATIONS_CSV, timeout=600, stream=True)
viol_resp.raise_for_status()
viol = pd.read_csv(
io.BytesIO(viol_resp.content),
dtype=str,
low_memory=False,
)
viol.columns = viol.columns.str.strip().str.lower().str.replace(" ", "_")
# Parse numeric and date fields
for col in ["penalty", "final_order", "gravity", "nr_instances"]:
if col in viol.columns:
viol[col] = pd.to_numeric(viol[col], errors="coerce")
if "issuance_date" in viol.columns:
viol["issuance_date"] = pd.to_datetime(viol["issuance_date"], errors="coerce")
viol["year"] = viol["issuance_date"].dt.year
# Normalize viol_type labels
VTYPE_LABELS = {
"S": "Serious",
"O": "Other-than-Serious",
"W": "Willful",
"R": "Repeated",
"U": "Unclassified",
}
if "viol_type" in viol.columns:
viol["vtype_label"] = viol["viol_type"].str.upper().map(VTYPE_LABELS).fillna("Other")
# ---------------------------------------------------------------------------
# (a) Top 20 most-cited CFR standards
# ---------------------------------------------------------------------------
if "section" in viol.columns:
top_standards = (
viol.groupby("section")
.size()
.rename("citation_count")
.reset_index()
.sort_values("citation_count", ascending=False)
.head(20)
.reset_index(drop=True)
)
print("\n=== Top 20 Most-Cited CFR Standards ===")
print(top_standards.to_string(index=False))
# ---------------------------------------------------------------------------
# (b) Violation type distribution
# ---------------------------------------------------------------------------
if "vtype_label" in viol.columns:
vtype_dist = (
viol.groupby("vtype_label")
.size()
.rename("count")
.reset_index()
.sort_values("count", ascending=False)
)
vtype_dist["pct"] = (vtype_dist["count"] / vtype_dist["count"].sum() * 100).round(1)
print("\n=== Violation Type Distribution ===")
print(vtype_dist.to_string(index=False))
# ---------------------------------------------------------------------------
# (c) Average proposed vs. final penalty by violation type
# ---------------------------------------------------------------------------
if "penalty" in viol.columns and "final_order" in viol.columns and "vtype_label" in viol.columns:
penalty_by_type = (
viol[viol["penalty"].notna() & viol["final_order"].notna()]
.groupby("vtype_label")
.agg(
avg_proposed=("penalty", "mean"),
avg_final=("final_order", "mean"),
count=("penalty", "count"),
)
.reset_index()
)
penalty_by_type["reduction_pct"] = (
(1 - penalty_by_type["avg_final"] / penalty_by_type["avg_proposed"]) * 100
).round(1)
penalty_by_type["avg_proposed"] = penalty_by_type["avg_proposed"].round(0).astype(int)
penalty_by_type["avg_final"] = penalty_by_type["avg_final"].round(0).astype(int)
print("\n=== Avg Proposed vs. Final Penalty by Violation Type ===")
print(penalty_by_type.to_string(index=False))
# ---------------------------------------------------------------------------
# (d) Penalty reduction rate by 2-digit NAICS industry
# Requires joining to the inspections table for NAICS codes
# ---------------------------------------------------------------------------
print("\nDownloading OSHA inspections dataset...")
insp_resp = requests.get(INSPECTIONS_CSV, timeout=600, stream=True)
insp_resp.raise_for_status()
insp = pd.read_csv(
io.BytesIO(insp_resp.content),
dtype=str,
low_memory=False,
)
insp.columns = insp.columns.str.strip().str.lower().str.replace(" ", "_")
# Keep only the NAICS code and activity_nr join key
if "naics_code" in insp.columns and "activity_nr" in insp.columns:
insp_slim = insp[["activity_nr", "naics_code"]].copy()
insp_slim["naics2"] = insp_slim["naics_code"].str[:2]
merged = viol.merge(insp_slim, on="activity_nr", how="left")
naics_penalty = (
merged[merged["penalty"].notna() & merged["final_order"].notna() & merged["naics2"].notna()]
.groupby("naics2")
.agg(
citation_count=("penalty", "count"),
avg_proposed=("penalty", "mean"),
avg_final=("final_order", "mean"),
)
.reset_index()
)
naics_penalty["reduction_pct"] = (
(1 - naics_penalty["avg_final"] / naics_penalty["avg_proposed"]) * 100
).round(1)
naics_penalty = naics_penalty.sort_values("citation_count", ascending=False).head(20)
naics_penalty["avg_proposed"] = naics_penalty["avg_proposed"].round(0).astype(int)
naics_penalty["avg_final"] = naics_penalty["avg_final"].round(0).astype(int)
print("\n=== Penalty Reduction Rate by 2-Digit NAICS (Top 20 by Citation Count) ===")
print(naics_penalty.to_string(index=False))
# ---------------------------------------------------------------------------
# (e) Annual citation count trend
# ---------------------------------------------------------------------------
if "year" in viol.columns:
annual_trend = (
viol[viol["year"].between(2010, 2024)]
.groupby("year")
.size()
.rename("citations")
.reset_index()
.sort_values("year")
)
print("\n=== Annual Citation Count Trend (2010-2024) ===")
for _, row in annual_trend.iterrows():
bar = "#" * int(row["citations"] / 5000)
print(f" {int(row['year'])} {int(row['citations']):>8,} {bar}")
A note on the section field encoding: OSHA stores CFR standard references as slash-delimited strings without the CFR prefix (for example,1926/0501 represents 29 CFR 1926.501, and 1910/1200represents 29 CFR 1910.1200). The zero-padding in the subsection portion varies across dataset vintages; normalizing to a consistent format before grouping is necessary to avoid double-counting citations to the same standard encoded differently. Strip the leading zero from the right side of the slash when constructing human-readable CFR citations for display.
The gap between penalty and final_order across violation types reflects the combined effect of informal settlement negotiation, statutory adjustment factors, and review commission decisions on contested citations. Willful violations show the largest absolute gap in dollar terms because the maximum penalty is highest; the percentage reduction for willful violations is typically lower than for serious violations because employers with willful citations face fewer informal settlement options and OSHA is less willing to reduce the penalty for intentional disregard of the law. Repeated violation records show a similar pattern. The penalty reduction analysis by NAICS reveals which industries have been most effective at negotiating down their citation penalties — a combination of employer legal resources, industry group engagement with OSHA, and local Area Office practices.
Extending this analysis: filter on viol_type = 'W' and sort by final_order descending to identify the largest willful penalty cases in the database by industry and establishment. Join to the inspection table on activity_nr to retrieve the employer name, state, and NAICS code for each willful citation. Cross-reference with OSHA press releases for fatality-related cases to identify which willful citations arose from worker deaths. The resulting dataset is a register of the most serious documented safety failures in federal OSHA's enforcement history.