# OSHA Inspections, Violations & Fatal Accident Scraper (`scrapers_lat/osha-inspections-violations-scraper`) Actor

Scrape US OSHA workplace safety enforcement: inspections with employer site and mailing address, NAICS, citations by standard with penalties, abatement and contest status, plus fatal and catastrophic accident investigations with narrative and victim details. JSON, CSV or Excel.

- **URL**: https://apify.com/scrapers\_lat/osha-inspections-violations-scraper.md
- **Developed by:** [Scrapers Lat](https://apify.com/scrapers_lat) (community)
- **Categories:** Lead generation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $10.20 / 1,000 results

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## OSHA Inspections, Violations & Fatal Accident Scraper

> Pull the complete public enforcement record of **US workplace safety** — every OSHA inspection, every citation with the standard cited and the penalty attached, and the fatal and catastrophic accident investigations behind them, from both federal OSHA and the state-run programs.

**📥 [Input](https://apify.com/scrapers_lat/osha-inspections-violations-scraper/input-schema) · 📤 [Output](https://apify.com/scrapers_lat/osha-inspections-violations-scraper/output-schema) · 💰 [Pricing](https://apify.com/scrapers_lat/osha-inspections-violations-scraper/pricing) · ▶️ [Examples](https://apify.com/scrapers_lat/osha-inspections-violations-scraper/examples)**

Search by employer name, by worksite ZIP code, or **sweep an entire state**. Or come at it from the other direction and search the accident investigations by industry code or hazard keyword to pull every fatal fall, trench collapse or amputation in a sector nationwide. Every match comes back as one flat, spreadsheet-ready row: the employer and the site, what was cited, what it cost, and who got hurt.

Built for **safety and compliance consulting, insurance underwriting, contractor vetting, ESG and supply-chain risk, and industrial lead generation**.

### What you get

**The employer and the site** — establishment name, full worksite street address with city, state and ZIP, plus the separate **mailing address on file**, which is often the head office rather than the job site. NAICS and SIC industry codes with their plain-English names, union status and ownership type.

**The inspection** — inspection number, the OSHA office that ran it, why it happened (planned, complaint, referral, accident, fatality/catastrophe, follow-up), how far it went (complete, partial, records), whether it covered safety or industrial health, the date it opened, the closing conference date, whether the case is still open, and the emphasis programs it was run under.

**Every citation, individually** — the OSHA standard cited **with its plain-English title** (so `19260102 A01` also reads as *Eye and face protection*), the classification (serious, willful, repeat, other-than-serious), issuance and abatement due dates, initial and current penalty, failure-to-abate penalty, contest date and latest event, abatement status, **the number of workers exposed**, the number of instances, the gravity score and the final order date.

**The money, broken out** — violation counts and penalty amounts split across serious, willful, repeat, other and unclassified, both **as originally cited and as they stand today**. That difference is surfaced for you as `penaltyReductionUsd` and `penaltyReductionPct`, so you can see instantly which employers negotiated a six-figure proposal down to a fraction of it.

**Fatal and catastrophic accident investigations** — the investigator's **full narrative** of what happened, OSHA's own hazard keywords, the project type, end use, cost and building height, and for each worker involved their **age, sex, occupation, degree of injury, nature of injury, fall distance and cause**. Rolled up into `fatalitiesCount`, `victimOccupations` and `degreesOfInjury` for quick filtering.

**Related activity** — the worker complaints, referrals, accident investigations and follow-up inspections linked to the same case, each with its activity number, so you can see the full chain of enforcement rather than one isolated event.

**Ready-made risk flags** — `hasWillfulViolations`, `hasRepeatViolations`, `hasSeriousViolations`, `isFatalityOrCatastrophe`, `hasRelatedComplaint`, `isOpenCase`, `topStandardCited`, `topCitationPenaltyUsd` and `maxWorkersExposed`.

### Who is it for

- **Safety consultants and training providers** finding employers that were just cited and need help fixing it, filtered to their industry and territory.
- **Insurance underwriters and brokers** pricing workers' comp and general liability on a real enforcement history rather than a questionnaire.
- **General contractors and procurement teams** vetting subcontractors for willful and repeat violations before they get on site.
- **ESG, supply-chain and investment analysts** scoring labour and safety practice across a portfolio or a supplier list.
- **Unions, journalists and researchers** tracking fatalities, penalty reductions and enforcement patterns by industry, employer or region.
- **PPE, equipment and industrial suppliers** targeting sites cited under the exact standard their product addresses.

### How to use it

1. Choose **Inspections** to search the establishment record, or **Accident investigations** to start from the fatality and catastrophe reports.
2. Enter employer names, site ZIP codes or state codes. For accident searches, enter NAICS codes or a hazard keyword instead.
3. Narrow it down: date range, violations only, open or closed cases, federal or state program, minimum penalty, citation type, inspection type, industry prefix, fatalities only.
4. Set the max number of records and run it. Export to JSON, CSV or Excel.

Employer search matches **whole words**, so `roofing` finds every establishment with *Roofing* in its name. State codes on their own sweep every OSHA office covering that state, which is how you pull a whole state's enforcement history in one run.

### Example input

Every roofing contractor in Texas cited in 2024, with the full citation detail:

```json
{
  "searchType": "inspections",
  "establishmentNames": ["roofing"],
  "states": ["TX"],
  "withViolations": "yes",
  "dateFrom": "2024-01-01",
  "dateTo": "2024-12-31",
  "fetchCitationDetails": true,
  "maxRecords": 500
}
```

Every fatal accident in the roofing industry nationwide, with the narrative and victim details:

```json
{
  "searchType": "accidents",
  "naicsCodes": ["238160"],
  "fatalAccidentsOnly": true,
  "dateFrom": "2025-01-01",
  "dateTo": "2025-12-31",
  "maxRecords": 500
}
```

The serious enforcement cases in Nevada: willful or repeat citations above $10,000.

```json
{
  "searchType": "inspections",
  "states": ["NV"],
  "withViolations": "yes",
  "citationTypes": ["willful", "repeat"],
  "minCurrentPenaltyUsd": 10000,
  "maxRecords": 1000
}
```

Everything at a single industrial ZIP code, construction only:

```json
{
  "searchType": "inspections",
  "siteZipCodes": ["89109"],
  "naicsPrefixes": ["23"],
  "includeAccidentInvestigations": true,
  "maxRecords": 250
}
```

Look up specific inspections you already have the numbers for:

```json
{
  "inspectionNumbers": ["1794125.015", "1795086.015"]
}
```

### FAQ

**Do I need an account, API key or login?**
No. Everything the actor returns is public record, and it handles access internally.

**Am I charged if a run returns nothing?**
No. You are only charged per real record returned. A run that finds no matches or fails costs nothing.

**Does it cover state programs as well as federal OSHA?**
Yes. Both are included by default, and you can restrict to one or the other. Around half of US states run their own OSHA-approved program, so covering only federal inspections would miss most of the enforcement in those states.

**Can I pull an entire state?**
Yes. Give a state code with no employer name or ZIP code and the actor sweeps every OSHA office covering that state, de-duplicating as it goes.

**Why do some inspections have no penalty or violations?**
Because none were issued. Many inspections close with no citation, and on open cases the citation items are only posted after the employer has received them.

**Why does the initial penalty differ from the current one?**
Employers can contest or settle citations, which often reduces the classification and the amount. Both figures are returned, along with the difference in dollars and percent.

**Are accident narratives always available?**
They exist for fatalities and catastrophes that OSHA investigated and wrote up. Routine inspections have no accident report attached.

**Does it lose data if a run times out?**
No. Records are pushed in batches as they are collected, so whatever has been gathered is always in your dataset.

### Related actors

- **SBA PPP Loans Scraper** — US employer loan records with payroll and jobs-reported figures.
- **FDA Warning Letters Scraper** — regulatory enforcement letters issued to companies.
- **CPSC Recalls Scraper** — consumer product safety recalls with hazard and injury detail.
- **USA Restaurant Inspections Scraper** — food establishment health inspections with violations.
- **USAspending Awards Scraper** — federal contract and grant awards by recipient.

***

Built by [scrapers.lat](https://scrapers.lat) — structured data from public registries, tenders and marketplaces.

*This actor is not affiliated with, endorsed by or sponsored by the US Department of Labor or the Occupational Safety and Health Administration. It collects publicly available inspection and enforcement information.*

# Actor input Schema

## `searchType` (type: `string`):

Inspections = search OSHA's establishment record by employer name, site ZIP code or state. Accident investigations = start from the fatality and catastrophe reports (searchable by industry code and keyword nationwide) and return the inspection behind each one, with the narrative and victim details attached.

## `establishmentNames` (type: `array`):

Employer or site names to search, one search per item (for example 'Amazon', 'roofing', 'Tyson Foods'). OSHA matches whole words, so 'roofing' finds every establishment with 'Roofing' in its name. Combine with states to narrow the search.

## `states` (type: `array`):

Two-letter state codes (for example 'TX', 'CA', 'NV'). With an employer name or ZIP code these narrow the search. On their own they sweep every OSHA area and state-plan office covering that state — the way to pull a whole state's enforcement history.

## `siteZipCodes` (type: `array`):

Five-digit ZIP codes of the inspected worksite (for example '89109'). Returns every inspection at that location regardless of employer — the fastest way to cover a metro area or a single industrial park.

## `inspectionNumbers` (type: `array`):

Optional. Look up exact OSHA inspection numbers directly (for example '1794125.015'). The '.015' suffix is added automatically. When given, these are fetched instead of running searches.

## `dateFrom` (type: `string`):

Only inspections opened on or after this date (YYYY-MM-DD). Leave empty for the full archive.

## `dateTo` (type: `string`):

Only inspections opened on or before this date (YYYY-MM-DD). Leave empty for the full archive.

## `withViolations` (type: `string`):

Restrict to inspections that did or did not result in citations.

## `caseStatus` (type: `string`):

Open cases are still in the citation, contest or abatement stage; closed cases are fully resolved.

## `officeType` (type: `string`):

Federal OSHA, the state-run OSHA plans, or both.

## `naicsCodes` (type: `array`):

Accident-investigation searches only. Industry codes to search nationwide, for example '238160' (roofing) or '2382' (building equipment contractors). This is how you pull every fatal accident in an industry.

## `sicCodes` (type: `array`):

Accident-investigation searches only. Four-digit SIC industry codes, used when no NAICS code is given.

## `accidentKeyword` (type: `string`):

Accident-investigation searches only. OSHA's own hazard keyword, for example 'Fall Protection', 'Trench', 'Amputation', 'Heat', 'Forklift'.

## `accidentDescription` (type: `string`):

Accident-investigation searches only. Words from the one-line event description, for example 'crushed' or 'electrocuted'.

## `accidentAbstract` (type: `string`):

Accident-investigation searches only. Words from the full investigator narrative.

## `fatalAccidentsOnly` (type: `boolean`):

Accident-investigation searches only. Return only investigations where a worker was killed.

## `minCurrentPenaltyUsd` (type: `integer`):

Keep only inspections whose current penalty is at least this amount. Use it to isolate the serious enforcement cases.

## `minViolations` (type: `integer`):

Keep only inspections with at least this many current violations.

## `citationTypes` (type: `array`):

Keep only inspections carrying at least one citation of these types. Willful and repeat citations are the strongest risk signals. Leave empty for all types.

## `inspectionTypes` (type: `array`):

Keep only these kinds of inspection, matched on the type text (for example 'Complaint', 'Accident', 'Referral', 'Planned', 'Fat/Cat', 'FollowUp'). Leave empty for all.

## `naicsPrefixes` (type: `array`):

Keep only inspections whose establishment NAICS code starts with one of these (for example '23' for construction, '311' for food manufacturing, '62' for health care).

## `onlyFatalities` (type: `boolean`):

Keep only inspections tied to a worker death or a catastrophe investigation.

## `requireSiteAddress` (type: `boolean`):

Keep only inspections that have a full street address for the worksite.

## `fetchCitationDetails` (type: `boolean`):

For every citation, also fetch the plain-English title of the standard cited, the number of workers exposed, the number of instances, the gravity score, the abatement status and the final order date. Turn off for a faster, lighter run.

## `includeAccidentInvestigations` (type: `boolean`):

Attach OSHA's accident investigation summaries to each inspection: the investigator narrative, hazard keywords, project type and the victim's age, occupation, degree and nature of injury. Always on when searching accident investigations.

## `maxRecords` (type: `integer`):

Maximum number of inspection records to return across all searches.

## `proxyConfiguration` (type: `object`):

Optional. OSHA is reachable without a proxy; enable one only if your network needs it.

## Actor input object example

```json
{
  "searchType": "inspections",
  "establishmentNames": [
    "roofing"
  ],
  "withViolations": "all",
  "caseStatus": "all",
  "officeType": "all",
  "fatalAccidentsOnly": false,
  "onlyFatalities": false,
  "requireSiteAddress": false,
  "fetchCitationDetails": true,
  "includeAccidentInvestigations": false,
  "maxRecords": 30
}
```

# 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 = {
    "establishmentNames": [
        "roofing"
    ],
    "maxRecords": 30
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapers_lat/osha-inspections-violations-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 = {
    "establishmentNames": ["roofing"],
    "maxRecords": 30,
}

# Run the Actor and wait for it to finish
run = client.actor("scrapers_lat/osha-inspections-violations-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 '{
  "establishmentNames": [
    "roofing"
  ],
  "maxRecords": 30
}' |
apify call scrapers_lat/osha-inspections-violations-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapers_lat/osha-inspections-violations-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/dT20AED4FACQb97GW/builds/ntle7sJs3GVnGKWPU/openapi.json
