Technical writing
OSHA Inspections: The Federal Database Behind Every Workplace Safety Violation and Citation
Every workplace inspection the Occupational Safety and Health Administration has ever conducted — more than 2.5 million records going back to 1972 — is publicly available in a structured database. It names the employer, identifies the establishment, records every violation found, cites the specific federal safety standard broken, and lists the penalty assessed. OSHA covers roughly 130 million workers across 10 million workplaces. The database is the paper trail behind all of it.
What the OSHA Enforcement Database Is
The OSHA Enforcement Data, maintained by the Department of Labor and published at enforcedata.dol.gov and data.dol.gov, is the authoritative record of federal OSHA enforcement activity. Each inspection generates at minimum one record in the inspection table; if violations are found, corresponding records appear in the violation table identifying which 29 CFR standard was breached, the violation type, the gravity rating, the initial penalty, and the current penalty after any informal conference or settlement. The two tables join on a unique inspection identifier called activity_nr.
The database is not a statistical sample. It is the complete population of federal OSHA inspections — every site visited, every citation issued, every dollar penalized, every abatement date set. That completeness makes it uniquely useful for pattern analysis: identifying which employers have been repeatedly cited, which industries generate the most willful violations, which geographic clusters show anomalous injury rates, and how enforcement intensity has shifted across administrations.
An important boundary: the database covers only federal OSHA jurisdiction. Twenty-eight states and territories operate their own State Plan programs approved by federal OSHA with at least as stringent standards. California (Cal/OSHA), Michigan (MIOSHA), Washington (L&I), North Carolina, and their peers conduct their own inspections under their own recordkeeping systems. Those inspections are collected separately; they do not flow into the federal enforcement database. Any analysis of OSHA enforcement coverage for a State Plan state should account for this division.
The Three Inspection Types
OSHA classifies every inspection into one of three broad categories, which the data encodes in the insp_type field.
Unprogrammed inspections are reactive. They arise from a worker complaint, a referral from another federal or state agency, a fatality or catastrophe response, or a follow-up check on a prior inspection. Worker complaints are the most common trigger: any worker (or their representative) can file a complaint with OSHA alleging a specific hazard, and OSHA must respond — either by inspecting or by sending a letter to the employer requesting information. Fatality and catastrophe inspections are mandatory: an employer must report any work-related fatality to OSHA within 8 hours, and any work-related inpatient hospitalization, amputation, or loss of an eye within 24 hours. That report automatically triggers an inspection. The underlying Severe Injury Reporting System has operated in its current form since January 2015 and creates a near-real-time feed of the most serious workplace incidents in the country.
Programmed inspections are proactive. OSHA identifies high-hazard industries or workplaces in advance and schedules inspections without waiting for a complaint. The primary vehicle is the National Emphasis Program (NEP): a targeted initiative directed at a specific hazard type — combustible dust, amputations, process safety management at refineries and chemical plants, heat illness in outdoor workers, silica in construction. NEPs generate lists of establishments to inspect based on NAICS codes, injury and illness rates from OSHA's 300 log data, or process hazard criteria. Local Emphasis Programs (LEPs) operate at the OSHA Area Office level and target hazards prevalent in a specific region.
Follow-up inspections verify that the employer has abated previously cited violations by the deadline specified in the citation. An employer that has not corrected a hazard by the abatement date is subject to a Failure-to-Abate notice, which carries daily penalties until the condition is corrected.
The Citation Taxonomy
When an OSHA compliance officer finds a violation during an inspection, the agency issues a citation that classifies the violation by type and assesses a penalty. The classification affects the maximum penalty and carries significant legal and reputational weight. The violtype field in the violation table encodes these categories.
Willful violations are the most serious. OSHA defines a willful violation as one in which the employer either knowingly violated the standard or demonstrated plain indifference to employee safety — knowing the hazard existed and doing nothing. The maximum penalty for a single willful violation as of 2024 is $156,259. An employer with multiple willful violations on a single inspection can face aggregate penalties in the millions. Willful citations also disqualify employers from certain federal contracts and can support criminal referrals when a worker dies.
Repeat violations are triggered when an employer is cited for the same or substantially similar condition at any facility within the previous five years. The maximum penalty is the same as for willful violations — $156,259 per instance — and OSHA typically applies a multiplier to the base penalty for each additional recurrence. Repeat citations are analytically important: a company showing repeat violations at multiple sites in the database has demonstrated a pattern of non-compliance across its operations, not merely a one-time failure.
Serious violations are the most common citation type. A serious violation exists where there is 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 maximum penalty is $15,625 per violation. Because the standard is objective — substantial probability, not certainty — most citations in high-hazard industries land here.
Other-than-Serious violations apply when a condition violates a standard but is unlikely to directly cause death or serious harm. The maximum is also $15,625, though penalties in practice are often much lower. Recordkeeping failures (not maintaining an OSHA 300 log, not posting the annual summary) are frequently cited as Other-than-Serious.
De Minimis violations are technical non-conformances with no direct or immediate relationship to employee safety or health. No penalty is assessed; OSHA notes the condition in the inspection record but does not require formal abatement documentation.
Failure-to-Abate is not a new citation type but a notice that a previously cited violation has not been corrected. It carries a daily penalty of up to $15,625 per day beyond the abatement deadline. Failure-to-Abate notices can accumulate rapidly for employers who ignore prior citations.
Database Schema: Key Fields
The OSHA enforcement data is organized into two primary tables that analysts work with directly: the inspection table and the violation table.
The inspection table contains one row per inspection and includes:
activity_nr— unique inspection number, the primary join key to the violation table.estab_name— the establishment name as recorded by the compliance officer. Spelling and abbreviation vary; entity resolution against a canonical employer list is required for multi-site analysis.site_address,site_city,site_state,site_zip— the physical address of the inspected workplace.naics_code— the six-digit NAICS code assigned to the establishment, enabling industry-level aggregation at any NAICS hierarchy level by truncating the code.insp_type— inspection type code (programmed, unprogrammed, follow-up).open_dateandclose_date— the dates the inspection was initiated and closed. Inspection duration varies from a single day for simple unprogrammed inspections to months for complex process safety or catastrophe investigations.nr_in_estab— the number of employees at the establishment at the time of inspection, reported by the employer. This field enables size-normalized comparisons of penalty rates across establishments.total_initial_penalty— the aggregate penalty assessed in the original citation package before any informal conference or contest.total_current_penalty— the penalty after informal conference settlement, contest, or reduction. This is the economically meaningful figure for deterrence analysis.union_status— whether the establishment was unionized at the time of inspection. Research consistently finds higher penalty levels and greater citation thoroughness at unionized establishments, reflecting union representatives' formal right to accompany compliance officers during walkarounds.
The violation table contains one row per citation item and includes:
citation_id— the citation and item number within the inspection.standard— the 29 CFR standard number violated (e.g., 1926.502 for fall protection in construction, 1910.147 for lockout/tagout in general industry).violtype— the citation type: Willful, Repeat, Serious, Other-than-Serious, De Minimis, Failure-to-Abate.gravity— a numerical gravity rating (1–10) that compliance officers assign based on probability of injury and severity. Gravity drives the initial penalty calculation under OSHA's penalty formula.penalty— the penalty for this specific violation item.hazsub— the hazardous substance involved, when applicable (chemical name or identifier).
The Most-Cited Standards
OSHA publishes its annual list of the ten most-frequently cited standards — the “Top 10” — and has done so consistently enough that the rankings have become a stable feature of occupational safety policy discourse. Fall protection in construction (29 CFR 1926.502) has occupied the top position every year for over a decade, and it is the most cited standard in the database in aggregate.
The consistent top offenders across recent years:
- 1926.502 — Fall protection systems criteria and practices (construction). The leading cause of construction fatalities; consistently #1.
- 1910.1200 — Hazard communication (“HazCom” or the Global Harmonized System standard). Requires safety data sheets, chemical labeling, and worker training for hazardous chemicals. Cited across virtually every industry.
- 1926.451 — Scaffolding (construction). Scaffold failures, inadequate guardrails, and overloading generate thousands of citations annually.
- 1910.134 — Respiratory protection. Proper respirator selection, fit testing, and maintenance programs are consistently deficient across manufacturing, healthcare, and construction.
- 1910.147 — Control of hazardous energy (lockout/tagout). Failure to de-energize equipment before maintenance is responsible for a disproportionate share of amputation and crush injuries in general industry.
- 1910.178 — Powered industrial trucks (forklifts). Operator training deficiencies and equipment inspection failures in warehousing and manufacturing.
- 1910.212 — Machine guarding. Point-of-operation guarding and barrier requirements at presses, mills, and other machinery.
- 1910.305 — Electrical wiring methods, components, and equipment. Improper wiring, missing covers, and overloaded circuits across general industry.
- 1926.503 — Fall protection training requirements (construction). Paired with 1926.502; employers who lack the physical systems also tend to lack the training programs.
- 1910.132 — Personal protective equipment general requirements. Hazard assessments, PPE selection, and training obligations.
The dominance of fall protection reflects OSHA's “Fatal Four” in construction: falls, struck-by-object incidents, electrocutions, and caught-in/between hazards account for roughly 60 percent of construction worker fatalities. Falls alone account for approximately a third of all construction deaths annually. The concentration of citations and fatalities in a single standard makes 1926.502 the single most consequential regulatory compliance requirement in the construction sector.
High-Profile Incidents Visible in the Data
The enforcement database is a forensic record of the worst workplace disasters in modern US history — wherever they fell under federal OSHA jurisdiction.
The Imperial Sugar refinery explosion in Port Wentworth, Georgia in February 2008 killed 14 workers and injured dozens more when accumulated combustible sugar dust ignited in the packing building. The inspection record reflects the investigation that followed: OSHA cited Imperial Sugar for multiple willful violations related to combustible dust accumulation and housekeeping failures, assessing what was then the maximum penalty of $8.78 million. The incident directly triggered a multi-year OSHA National Emphasis Program on combustible dust, which generated thousands of subsequent inspections visible in the database by NEP identifier.
The Deepwater Horizon blowout in April 2010 killed 11 workers on the drilling rig. OSHA investigated the incident alongside the Bureau of Safety and Environmental Enforcement (then part of MMS) and issued citations for process safety management violations under 29 CFR 1910.119. The PSM standard, which governs facilities handling threshold quantities of highly hazardous chemicals, applies to oil refinery operations under OSHA jurisdiction; offshore drilling platforms at the time occupied a regulatory boundary between OSHA and BSEE that has since been clarified.
Amazon's warehouse network has been a recurring subject of OSHA inspection data analysis in recent years. Internal OSHA records, obtained through FOIA requests and confirmed against the public enforcement database, show Amazon's recordable injury rate running roughly double the industry average for warehousing and storage (NAICS 4930). Several Amazon fulfillment centers have been cited for ergonomic hazards and recordkeeping violations. The enforcement data provides the inspection-level record for each site; pairing it with OSHA's 300 log summary data (separately reported by large employers) produces a fuller picture of injury exposure by facility.
Note that mine safety is outside OSHA jurisdiction. The Mine Safety and Health Administration (MSHA), a separate agency within DOL, regulates coal mines, metal and nonmetal mines, and stone quarries under the Federal Mine Safety and Health Act. The Upper Big Branch coal mine disaster in 2010, which killed 29 miners, appears in MSHA's enforcement records, not in the OSHA database.
State Plan Programs and Their Relationship to Federal Data
The Occupational Safety and Health Act of 1970 permits states to develop and enforce their own occupational safety and health programs, provided those programs are “at least as effective” as the federal program. Twenty-eight states and territories have exercised that option and operate approved State Plans. Some cover both private and public sector workers; others cover only public sector workers (in states where private employers remain under federal OSHA jurisdiction).
State Plan states with significant inspection volumes include California (Cal/OSHA is one of the most active enforcement programs in the country), Washington (Department of Labor and Industries), Michigan (MIOSHA), North Carolina, and Oregon. These programs conduct their own inspections, issue their own citations, and maintain their own databases. Federal OSHA monitors State Plans for adequacy but does not consolidate their inspection records into the federal enforcement database.
The practical consequence for data analysis: if you pull the federal OSHA enforcement database and filter to California, you will find very few records — because almost all California workplace inspections are Cal/OSHA inspections conducted under state authority. A comprehensive national enforcement picture requires either aggregating state plan data separately (where states make it available) or explicitly scoping the federal database analysis to non-State-Plan jurisdictions. Federal OSHA's annual report on State Plan performance provides aggregate inspection and citation counts by state but not the individual inspection records.
The Severe Injury Reporting System
Since January 1, 2015, federal OSHA has required all covered employers — regardless of industry or size — to report severe injuries directly to OSHA, not merely record them in the establishment's OSHA 300 log. The reporting thresholds are: any work-related fatality within 8 hours, and any work-related inpatient hospitalization, amputation, or loss of an eye within 24 hours.
This reporting requirement creates a near-real-time feed of the most severe workplace incidents in federal OSHA jurisdiction. OSHA publishes the Severe Injury Report data (formerly the Integrated Management Information System severe injury supplement) with a lag, but it is distinct from the enforcement database: a severe injury report triggers an OSHA response that may or may not lead to a full inspection. When it does lead to an inspection, the resulting record appears in the enforcement database linked to the inspection's open date. When OSHA investigates remotely without a site visit, only the severe injury report record exists.
Analysts tracking workplace safety trends should be aware of the structural break in 2015: pre-2015 severe injury reporting was limited to fatalities and catastrophes (3+ hospitalizations), so the historical series overstates the apparent improvement in severe injury rates after 2015 unless the pre- and post-2015 data are compared on consistent definitions.
Python: Querying OSHA Enforcement Data by NAICS Sector
The following script downloads the OSHA inspection file from enforcedata.dol.gov, filters to inspections closed in the past three years with a positive current penalty, groups records by 3-digit NAICS sector, and identifies the 15 most-penalized industries by total current penalty. The NAICS truncation to three digits maps individual six-digit codes to major subsectors: 236 (construction of buildings), 331 (primary metals), 493 (warehousing and storage), and so forth.
import requests
import pandas as pd
import io, zipfile
# OSHA enforcement data is available at enforcedata.dol.gov
# Bulk CSV files for inspections and violations can be downloaded directly.
# This example fetches the inspection-level file and the violation-level file,
# joins them, filters to inspections closed in the past 3 years with a
# positive current penalty, groups by 3-digit NAICS sector, and computes
# total and average penalty per inspection for the 15 most-penalized sectors.
BASE = "https://enforcedata.dol.gov/views/data_summary.php"
# --- Step 1: Download inspection records ---
# The OSHA inspection file contains one row per inspection.
# Fields: activity_nr, estab_name, site_state, naics_code,
# insp_type, open_date, close_date, total_current_penalty,
# total_initial_penalty, nr_in_estab, union_status, etc.
insp_url = "https://enforcedata.dol.gov/api/inspections/csv"
insp_resp = requests.get(insp_url, timeout=300)
insp_resp.raise_for_status()
with zipfile.ZipFile(io.BytesIO(insp_resp.content)) as zf:
csv_names = [n for n in zf.namelist() if n.endswith(".csv")]
with zf.open(csv_names[0]) as f:
insp = pd.read_csv(f, dtype=str, low_memory=False)
# Normalize column names to lowercase with underscores
insp.columns = insp.columns.str.strip().str.lower().str.replace(" ", "_")
# Parse dates and numeric penalty fields
insp["close_date"] = pd.to_datetime(insp["close_date"], errors="coerce")
insp["total_current_penalty"] = pd.to_numeric(
insp["total_current_penalty"], errors="coerce"
).fillna(0)
# Filter: closed in the last 3 years, penalty > 0
cutoff = pd.Timestamp.today() - pd.DateOffset(years=3)
recent = insp[
(insp["close_date"] >= cutoff)
& (insp["total_current_penalty"] > 0)
& insp["naics_code"].notna()
].copy()
# Extract 3-digit NAICS sector
recent["naics3"] = recent["naics_code"].str[:3]
# --- Step 2: Aggregate by sector ---
agg = (
recent.groupby("naics3")
.agg(
inspection_count=("activity_nr", "count"),
total_penalty=("total_current_penalty", "sum"),
)
.reset_index()
)
agg["avg_penalty_per_inspection"] = (
agg["total_penalty"] / agg["inspection_count"]
).round(2)
# Sort by total penalty descending, take top 15
top15 = agg.sort_values("total_penalty", ascending=False).head(15).reset_index(drop=True)
# Format for display (avoid format specs; use integer rounding)
top15["total_penalty_k"] = (top15["total_penalty"] / 1000).round(1)
top15["avg_penalty"] = top15["avg_penalty_per_inspection"].round(0).astype(int)
print(
top15[["naics3", "inspection_count", "total_penalty_k", "avg_penalty"]]
.rename(
columns={
"naics3": "NAICS3",
"inspection_count": "Inspections",
"total_penalty_k": "Total_Penalty_$K",
"avg_penalty": "Avg_Penalty_$",
}
)
.to_string(index=False)
)
A few notes on the implementation. The enforcedata.dol.gov bulk files are ZIP archives of CSVs; the column naming conventions vary across file vintages, so lowercasing and stripping whitespace from column names before use is defensive practice. Thetotal_current_penalty field reflects the penalty after any informal conference reduction, which is the economically relevant figure — the initial penalty is often 30–50 percent higher before settlement. Inspections with zero current penalty include cases where all citations were vacated on contest or where the employer corrected violations before formal citation.
Extending this pattern: join the inspection table to the violation table onactivity_nr to break out penalty by violation type (willful, repeat, serious), or filter on insp_type to compare programmed NEP inspections against complaint-driven inspections in the same NAICS sector.
Connecting OSHA Data to Other Federal Datasets
OSHA enforcement data gains analytical depth when joined to other federal sources. The NAICS code on each inspection links directly to BLS employment and wage data, enabling penalty-per-worker normalization and comparison of enforcement intensity against industry injury rates.
OSHA's own 300A summary data — collected under the electronic injury and illness recordkeeping rule from large establishments and high-hazard industries — provides establishment-level injury rates that can be matched to inspection records by establishment name and address. Establishments with elevated injury rates relative to their industry peers that have never received an OSHA inspection are potential targets for programmed inspection scheduling and gap analysis in enforcement coverage.
The DOL Wage and Hour Division enforcement database (separate from OSHA) covers Fair Labor Standards Act violations, overtime and minimum wage enforcement, and H-2A and H-2B agricultural and temporary worker compliance. Pairing WHD and OSHA enforcement records by employer name and address surfaces employers who simultaneously violate safety standards and wage laws — a pattern associated with lower-wage workforces and weaker labor market power. Similarly, NLRB unfair labor practice filings and union election petitions in the same time period as OSHA complaint-triggered inspections can reveal whether workers are filing both safety complaints and labor organizing activity at the same employer.
For workforce context — employment counts and average wages by industry and county to normalize OSHA penalty figures per worker — see BLS QCEW: The County-Level Employment and Wages Dataset Behind Every Local Economic Analysis.
For DOL enforcement context in a related labor compliance program — H-2A and H-2B temporary worker disclosure data — see DOL H-2 Visa Disclosures: Foreign Temporary Worker Program Data.
For comparison with federal civil enforcement in financial regulation — how CFPB constructs its enforcement action database and what it contains — see CFPB Enforcement Actions: The Federal Database of Consumer Financial Protection Orders.