# OSHA Enforcement violations & inspections (`ayoub_highlighter/osha-enforcement-leads`) Actor

US employers with OSHA citations from DOL's bulk Inspection + Violation API (federal + all state plans, daily). Ranked hottest-first by penalty and willful/repeat severity. Company, address, NAICS, decoded standards, penalties, contest status — for OSHA defense attorneys & safety consultants.

- **URL**: https://apify.com/ayoub\_highlighter/osha-enforcement-leads.md
- **Developed by:** [Ayoub Ali](https://apify.com/ayoub_highlighter) (community)
- **Categories:** Business, Lead generation
- **Stats:** 1 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-usage

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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 Enforcement Leads — ranked by penalty & willful/repeat

US employers with OSHA citations, pulled from **DOL's bulk Inspection + Violation
API** (`api.dol.gov/v4`) — federal + all state plans, **updated daily**. Joined on
`activity_nr`, ranked **hottest-first** by penalty and willful/repeat severity.

Buyers: **OSHA defense attorneys** (open cases, contestable fines) and **safety
consulting firms** (willful/repeat — systemic failures).

### Why this is the better engine

- **API-first, not HTML scraping.** Structured JSON, daily refresh. Doesn't rot when
  OSHA changes a web page (the failure mode of the old IMIS scraper).
- **Ranks the whole recent universe**, not a shallow oldest-first sample.
- **Fixed urgency scoring.** Penalty + violation severity drive the score; recency is
  a bonus, not a cap — so a big willful case ranks *critical* regardless of age. (The
  old actor could never exceed "medium.")
- **Fails loud.** Schema-checks both datasets first; if DOL renames a field, the run
  errors instead of emitting junk.
- **Readable standards.** `19100212 A01` → `1910.212(a)(1)`.

### Setup — DOL API key (required)

The OSHA data is gated behind a free key:
1. Register at **dataportal.dol.gov** (Login.gov).
2. Copy your API key.
3. Paste it into the actor's **"DOL API key"** input.

**Rate limit:** DOL allows ~**250 requests/hour** with a small burst. The fetch layer
paces at ~15s/request and backs off long on 429, so a normal run stays within quota.
Don't fire many runs back-to-back in the same hour.

### Filters (all dropdowns, except typed date + max records)

| Filter | Default | Notes |
|---|---|---|
| DOL API key | — | required |
| Inspection opened on/after | last 365 days | typed/picked exact date |
| Violation type | All | willful / repeat / willful-or-repeat / serious+ |
| States | All | multi-select (incl. territories) |
| Industry sector | All | construction, manufacturing, healthcare, … |
| Minimum penalty | Any | $5k / $10k / $25k / $50k / $100k+ |
| Case status | Both | open (attorneys) / closed (consultants) |
| Lead type | All | open hazard / contest / safety rebuild / multiple |
| Max records | All | typed number |

### How it works

1. Pull inspections opened ≥ date floor + violations issued ≥ date floor (server-side).
2. Join on `activity_nr`; keep only cited inspections.
3. Aggregate violations → penalties, willful/repeat/serious counts, decoded standards.
4. Classify lead type, score urgency, rank hottest-first, apply filters, cap, push.

### Output (36 columns, ordered)

company, recipient_* (enrichment hook — blank until Apollo added), full address,
state (full name), NAICS + sector, employee_count, inspection id/type/dates,
case_open, violation counts (serious/willful/repeat/other), decoded standards_cited,
initial & current penalty + display, abatement_outstanding, contest_filed, lead_type,
urgency, urgency_score, signal, recommended_supply, osha_inspection_url, scraped_at.

### Source

DOL v4 API — OSHA Inspection (`/get/OSHA/inspection/json`) + Violation
(`/get/OSHA/violation/json`).

### Not included (by design)

- **Contact enrichment** — `recipient_*` fields are wired but blank in v1; add an
  Apollo pass to fill person + email.

# Actor input Schema

## `dolApiKey` (type: `string`):

Your free DOL Open Data API key from dataportal.dol.gov. Required — the OSHA data is gated behind it.
## `openedOnOrAfter` (type: `string`):

Type or pick an exact date. Pulls inspections opened on/after this day. Leave blank to default to the last 365 days. Citations post ~30–60 days after the inspection opens.
## `violationType` (type: `string`):

Filter by the worst violation type on the case.
## `states` (type: `array`):

Leave blank for all states + territories. Pick to limit to a client's territory.
## `naicsSector` (type: `string`):

Leave blank for all industries.
## `minPenalty` (type: `integer`):

Optional. Type the exact dollar amount. Only cases with at least this much in current penalties. Leave blank for any amount.
## `caseStatus` (type: `string`):

Open = still in the legal window (defense attorneys). Closed = settled/adjudicated (safety consultants).
## `leadType` (type: `string`):

Filter to a specific lead category.
## `minEmployees` (type: `integer`):

Optional. Type the minimum number of employees at the cited site. Larger employers are far more likely to have a website (higher enrichment rate). Leave blank for no minimum. Rows with no reported employee count are dropped when a minimum is set.
## `companiesOnly` (type: `boolean`):

On (default): drop sole-proprietor person names and junk, so every row is a real, enrichable company. Off: include one-person businesses listed under the owner's name.
## `maxRecords` (type: `integer`):

Optional. Type any number to cap results (hottest-first). Leave blank for all matching.

## Actor input object example

```json
{
  "violationType": "",
  "states": [],
  "naicsSector": "",
  "caseStatus": "",
  "leadType": "",
  "companiesOnly": true
}
````

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("ayoub_highlighter/osha-enforcement-leads").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("ayoub_highlighter/osha-enforcement-leads").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{}' |
apify call ayoub_highlighter/osha-enforcement-leads --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=ayoub_highlighter/osha-enforcement-leads",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "OSHA Enforcement violations & inspections",
        "description": "US employers with OSHA citations from DOL's bulk Inspection + Violation API (federal + all state plans, daily). Ranked hottest-first by penalty and willful/repeat severity. Company, address, NAICS, decoded standards, penalties, contest status — for OSHA defense attorneys & safety consultants.",
        "version": "1.0",
        "x-build-id": "1xPnM5y7UWDtDQlHo"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/ayoub_highlighter~osha-enforcement-leads/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-ayoub_highlighter-osha-enforcement-leads",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/ayoub_highlighter~osha-enforcement-leads/runs": {
            "post": {
                "operationId": "runs-sync-ayoub_highlighter-osha-enforcement-leads",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/ayoub_highlighter~osha-enforcement-leads/run-sync": {
            "post": {
                "operationId": "run-sync-ayoub_highlighter-osha-enforcement-leads",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "dolApiKey"
                ],
                "properties": {
                    "dolApiKey": {
                        "title": "DOL API key (required)",
                        "type": "string",
                        "description": "Your free DOL Open Data API key from dataportal.dol.gov. Required — the OSHA data is gated behind it."
                    },
                    "openedOnOrAfter": {
                        "title": "Inspection opened on or after (exact date)",
                        "type": "string",
                        "description": "Type or pick an exact date. Pulls inspections opened on/after this day. Leave blank to default to the last 365 days. Citations post ~30–60 days after the inspection opens."
                    },
                    "violationType": {
                        "title": "Violation type",
                        "enum": [
                            "",
                            "W",
                            "R",
                            "WR",
                            "S"
                        ],
                        "type": "string",
                        "description": "Filter by the worst violation type on the case.",
                        "default": ""
                    },
                    "states": {
                        "title": "States",
                        "type": "array",
                        "description": "Leave blank for all states + territories. Pick to limit to a client's territory.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "AL",
                                "AK",
                                "AZ",
                                "AR",
                                "CA",
                                "CO",
                                "CT",
                                "DE",
                                "DC",
                                "FL",
                                "GA",
                                "GU",
                                "HI",
                                "ID",
                                "IL",
                                "IN",
                                "IA",
                                "KS",
                                "KY",
                                "LA",
                                "ME",
                                "MD",
                                "MA",
                                "MI",
                                "MN",
                                "MS",
                                "MO",
                                "MT",
                                "NE",
                                "NV",
                                "NH",
                                "NJ",
                                "NM",
                                "NY",
                                "NC",
                                "ND",
                                "OH",
                                "OK",
                                "OR",
                                "PA",
                                "PR",
                                "RI",
                                "SC",
                                "SD",
                                "TN",
                                "TX",
                                "UT",
                                "VT",
                                "VA",
                                "VI",
                                "WA",
                                "WV",
                                "WI",
                                "WY"
                            ],
                            "enumTitles": [
                                "Alabama",
                                "Alaska",
                                "Arizona",
                                "Arkansas",
                                "California",
                                "Colorado",
                                "Connecticut",
                                "Delaware",
                                "District of Columbia",
                                "Florida",
                                "Guam",
                                "Hawaii",
                                "Idaho",
                                "Illinois",
                                "Indiana",
                                "Iowa",
                                "Kansas",
                                "Kentucky",
                                "Louisiana",
                                "Maine",
                                "Maryland",
                                "Massachusetts",
                                "Michigan",
                                "Minnesota",
                                "Mississippi",
                                "Missouri",
                                "Montana",
                                "Nebraska",
                                "Nevada",
                                "New Hampshire",
                                "New Jersey",
                                "New Mexico",
                                "New York",
                                "North Carolina",
                                "North Dakota",
                                "Ohio",
                                "Oklahoma",
                                "Oregon",
                                "Pennsylvania",
                                "Puerto Rico",
                                "Rhode Island",
                                "South Carolina",
                                "South Dakota",
                                "Tennessee",
                                "Texas",
                                "Utah",
                                "Vermont",
                                "Virginia",
                                "U.S. Virgin Islands",
                                "Washington",
                                "West Virginia",
                                "Wisconsin",
                                "Wyoming"
                            ]
                        },
                        "default": []
                    },
                    "naicsSector": {
                        "title": "Industry sector",
                        "enum": [
                            "",
                            "construction",
                            "manufacturing",
                            "transport_warehouse",
                            "healthcare",
                            "agriculture",
                            "wholesale",
                            "retail",
                            "waste",
                            "food_service",
                            "utilities"
                        ],
                        "type": "string",
                        "description": "Leave blank for all industries.",
                        "default": ""
                    },
                    "minPenalty": {
                        "title": "Minimum total penalty",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Optional. Type the exact dollar amount. Only cases with at least this much in current penalties. Leave blank for any amount."
                    },
                    "caseStatus": {
                        "title": "Case status",
                        "enum": [
                            "",
                            "open",
                            "closed"
                        ],
                        "type": "string",
                        "description": "Open = still in the legal window (defense attorneys). Closed = settled/adjudicated (safety consultants).",
                        "default": ""
                    },
                    "leadType": {
                        "title": "Lead type",
                        "enum": [
                            "",
                            "OPEN_HAZARD",
                            "CONTEST_OPPORTUNITY",
                            "SAFETY_REBUILD",
                            "MULTIPLE"
                        ],
                        "type": "string",
                        "description": "Filter to a specific lead category.",
                        "default": ""
                    },
                    "minEmployees": {
                        "title": "Minimum employees at site",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Optional. Type the minimum number of employees at the cited site. Larger employers are far more likely to have a website (higher enrichment rate). Leave blank for no minimum. Rows with no reported employee count are dropped when a minimum is set."
                    },
                    "companiesOnly": {
                        "title": "Companies only (enrichment-ready names)",
                        "type": "boolean",
                        "description": "On (default): drop sole-proprietor person names and junk, so every row is a real, enrichable company. Off: include one-person businesses listed under the owner's name.",
                        "default": true
                    },
                    "maxRecords": {
                        "title": "Max records",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Optional. Type any number to cap results (hottest-first). Leave blank for all matching."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
