AIDEVELOPER TOOLS

Industrial Safety Intelligence

Build comprehensive safety profiles for any U.S. company or industry by combining OSHA accident reports, OSHA workplace inspections, and MSHA mining data into a single risk-scored report. Search by company name, state, NAICS industry code, or date range and get back fatality counts, hospitalization numbers, inspection histories, mine information, violation counts, and a computed risk score from 0-100 with detailed scoring factors.

0
Users (30d)
0
Runs (30d)
90
Actively maintained
Maintenance Pulse
Free
Per event

Maintenance Pulse

90/100
Last Build
Today
Last Version
1d ago
Builds (30d)
8
Issue Response
N/A

Documentation

Build comprehensive safety profiles for any U.S. company or industry by combining OSHA accident reports, OSHA workplace inspections, and MSHA mining data into a single risk-scored report. Search by company name, state, NAICS industry code, or date range and get back fatality counts, hospitalization numbers, inspection histories, mine information, violation counts, and a computed risk score from 0-100 with detailed scoring factors.

Industrial Safety Intelligence queries the Department of Labor's open data API across three datasets simultaneously: OSHA accident and injury reports, OSHA workplace inspections, and MSHA mine information with violation counts. Results are unified into a single safety profile with aggregate statistics and a risk assessment that weighs fatalities, hospitalizations, injuries, inspection volume, and mining violations into a composite score with a severity level (LOW, MODERATE, HIGH, or CRITICAL).

What data can you extract?

Data PointSourceExample
OSHA accidentsDOL OSHA accident datasetEmployer, event date, description, fatalities, hospitalizations, injuries
OSHA inspectionsDOL OSHA inspection datasetEstablishment, open date, inspection type, NAICS code
MSHA minesDOL MSHA mines datasetMine name, operator, type (Surface/Underground), status, employees
MSHA violationsDOL MSHA violations datasetTotal violation count across all mines
Risk scoreComputed0-100 score with LOW/MODERATE/HIGH/CRITICAL level
Risk factorsComputedItemized breakdown of scoring factors

Why use Industrial Safety Intelligence?

Safety research across DOL datasets is fragmented. OSHA accidents, OSHA inspections, and MSHA mining data live in separate API endpoints with different schemas and query parameters. Cross-referencing a company's safety record requires multiple API calls, data normalization, and manual aggregation.

This actor combines all three data sources into a single query with a unified risk score. One search gives you a complete safety picture: accident severity, inspection frequency, mine operations, and violation history.

Built on the Apify platform, Industrial Safety Intelligence gives you:

  • Scheduling -- monitor safety records quarterly or monthly for portfolio companies, suppliers, or clients
  • API access -- integrate into due diligence platforms, ESG scoring tools, or supply chain monitoring systems
  • No API key management -- the actor handles DOL API authentication with your key securely
  • Integrations -- connect to Google Sheets, Zapier, Make, or webhooks

Features

  • Three-source intelligence -- combines OSHA accidents, OSHA inspections, and MSHA mining data in a single query
  • Composite risk scoring -- 0-100 risk score computed from fatalities (up to 90 pts), hospitalizations (up to 40 pts), injuries (up to 20 pts), accident volume (up to 15 pts), inspection volume (up to 15 pts), MSHA violations (up to 25 pts), and mine count (up to 5 pts)
  • Severity levels -- risk score mapped to CRITICAL (75+), HIGH (50-74), MODERATE (25-49), or LOW (0-24) with itemized scoring factors
  • Multi-filter search -- search by company name, U.S. state, NAICS industry code, and date range (all filters combinable)
  • Fatalities-only mode -- filter OSHA accidents to show only cases involving fatalities
  • Selective data sources -- enable or disable OSHA accidents, OSHA inspections, and MSHA data independently
  • Parallel data fetching -- all three data sources are fetched concurrently for faster results
  • Rate limit handling -- exponential backoff with up to 4 retries on DOL API rate limits (429 responses)
  • Dry run mode -- test without an API key to see the output format before committing to a DOL API registration

Use cases for industrial safety data

ESG and responsible investing

ESG analysts evaluate companies' workplace safety records as part of environmental, social, and governance scoring. High fatality counts and OSHA violations are material ESG risk factors.

Supply chain due diligence

Procurement teams assess supplier safety records before awarding contracts. A supplier with a CRITICAL risk score may pose regulatory, reputational, and operational risks to the buyer.

Insurance underwriting

Commercial insurance underwriters evaluate workplace safety profiles when pricing workers' compensation, general liability, and commercial property policies.

Regulatory compliance monitoring

EHS (Environment, Health & Safety) teams monitor their own company's safety record and track how it compares to industry benchmarks. Scheduled runs flag new incidents automatically.

Investigative journalism

Journalists research companies with poor safety records for accountability reporting. The risk score and factor breakdown provide a structured narrative starting point.

Private equity due diligence

PE firms evaluate acquisition targets' safety profiles. Companies with high MSHA violation counts or OSHA fatalities carry regulatory and litigation risk that affects valuation.

How to build safety profiles

  1. Get a DOL API key -- Register for a free API key at https://dataportal.dol.gov/registration. This is required for real data (or use dry run mode to test).
  2. Enter search criteria -- Provide a company name, state, NAICS code, date range, or any combination.
  3. Configure options -- Enable or disable individual data sources (OSHA accidents, inspections, MSHA). Set the fatalities-only filter if needed.
  4. Run the actor -- Click "Start" to begin. The actor queries all enabled data sources in parallel and computes the risk assessment.
  5. Download results -- Once finished, download your safety profile as JSON, CSV, or Excel from the Dataset tab.

Input parameters

ParameterTypeRequiredDefaultDescription
apiKeystringNo*--DOL Open Data Portal API key. Register free at dataportal.dol.gov/registration. Not needed for dry run mode.
dryRunbooleanNotrueWhen true (or when no API key is provided), runs without calling the DOL API. Set to false with an API key for real data.
companyNamestringNo--Search by company/establishment name (partial match, case-insensitive).
statestringNo--Filter by U.S. state (2-letter code, e.g., TX, CA, WV).
naicsCodestringNo--Filter by NAICS industry code (2-6 digits). Prefix matching, e.g., "21" matches all mining codes.
dateFromstringNo--Start date filter (YYYY-MM-DD). Applies to event/open dates.
dateTostringNo--End date filter (YYYY-MM-DD). Applies to event/open dates.
fatalitiesOnlybooleanNofalseWhen true, only return OSHA accident cases involving fatalities.
includeOshaAccidentsbooleanNotrueInclude OSHA accident and injury data in the safety profile.
includeOshaInspectionsbooleanNotrueInclude OSHA workplace inspection records in the safety profile.
includeMshabooleanNotrueInclude MSHA mine information and violation counts in the safety profile.
maxResultsintegerNo100Maximum number of records to return per dataset (1-5,000).

*API key is required unless using dry run mode.

Input examples

Company safety profile:

{
    "apiKey": "YOUR_DOL_API_KEY",
    "dryRun": false,
    "companyName": "TYSON",
    "maxResults": 200
}

State and industry filter:

{
    "apiKey": "YOUR_DOL_API_KEY",
    "dryRun": false,
    "state": "WV",
    "naicsCode": "21",
    "maxResults": 500
}

Fatalities only in a date range:

{
    "apiKey": "YOUR_DOL_API_KEY",
    "dryRun": false,
    "companyName": "AMAZON",
    "dateFrom": "2020-01-01",
    "dateTo": "2024-12-31",
    "fatalitiesOnly": true
}

OSHA only (no mining data):

{
    "apiKey": "YOUR_DOL_API_KEY",
    "dryRun": false,
    "companyName": "WALMART",
    "includeMsha": false
}

Input tips

  • Register for a DOL API key first -- It is free at dataportal.dol.gov/registration. Without a key, the actor only runs in dry mode.
  • Use NAICS codes for industry-wide searches -- NAICS code "21" covers all mining, "23" covers construction, "3116" covers meat processing. Use 2-digit codes for broad searches or 4-6 digit codes for specific industries.
  • Set date ranges for recent data -- Without a date filter, the API returns all historical records. Use dateFrom to focus on recent years.
  • Increase maxResults for large companies -- Major employers like Walmart or Amazon may have hundreds of OSHA records. The default of 100 may not capture the full picture.

Output example

Each run produces a single safety profile:

{
    "company": "TYSON",
    "state": null,
    "generatedAt": "2026-03-18T14:30:00.000Z",
    "oshaAccidents": {
        "totalCases": 47,
        "totalFatalities": 3,
        "totalHospitalizations": 28,
        "totalInjuries": 52,
        "cases": [
            {
                "summaryNumber": "1234567",
                "employer": "TYSON FOODS INC",
                "eventDate": "2024-03-15",
                "eventDescription": "Employee was injured when caught in a conveyor belt mechanism",
                "keyword": "Caught in/between",
                "city": "SPRINGDALE",
                "state": "AR",
                "fatalities": 0,
                "hospitalizations": 1,
                "injuries": 1
            }
        ]
    },
    "oshaInspections": {
        "totalInspections": 89,
        "inspections": [
            {
                "activityNumber": "987654321",
                "establishment": "TYSON FOODS INC",
                "openDate": "2024-06-10",
                "type": "Complaint",
                "state": "AR",
                "city": "SPRINGDALE",
                "naics": "311615"
            }
        ]
    },
    "mshaData": {
        "totalMines": 0,
        "totalViolations": 0,
        "mines": []
    },
    "riskAssessment": {
        "score": 72,
        "level": "HIGH",
        "factors": [
            "3 OSHA fatalities (+90)",
            "28 OSHA hospitalizations (+40)",
            "52 OSHA injuries (+20)",
            "47 accident reports (+15)",
            "89 inspections (+15)"
        ]
    }
}

Output fields

FieldTypeDescription
companystring/nullCompany name from the search input
statestring/nullState filter applied (uppercase 2-letter code)
generatedAtstringISO timestamp of when the profile was generated
oshaAccidentsobject/nullOSHA accident data (null if disabled)
oshaAccidents.totalCasesnumberTotal accident cases found
oshaAccidents.totalFatalitiesnumberSum of fatalities across all cases
oshaAccidents.totalHospitalizationsnumberSum of hospitalizations across all cases
oshaAccidents.totalInjuriesnumberSum of injuries across all cases
oshaAccidents.casesobject[]Individual accident records with summaryNumber, employer, eventDate, eventDescription, keyword, city, state, fatalities, hospitalizations, injuries
oshaInspectionsobject/nullOSHA inspection data (null if disabled)
oshaInspections.totalInspectionsnumberTotal inspections found
oshaInspections.inspectionsobject[]Individual inspection records with activityNumber, establishment, openDate, type, state, city, naics
mshaDataobject/nullMSHA mining data (null if disabled)
mshaData.totalMinesnumberTotal mines found for the operator
mshaData.totalViolationsnumberTotal MSHA violations across all mines (up to 10 mines checked)
mshaData.minesobject[]Individual mine records with mineId, mineName, operator, state, type, status, employees
riskAssessment.scorenumberComposite risk score from 0 (no risk indicators) to 100 (maximum risk)
riskAssessment.levelstringRisk level: LOW (0-24), MODERATE (25-49), HIGH (50-74), CRITICAL (75-100)
riskAssessment.factorsstring[]Itemized list of scoring factors with point values

How much does it cost?

Industrial Safety Intelligence uses compute-based pricing on the Apify platform. The DOL API itself is free to use (with your own key).

ScenarioData SourcesRecordsEst. RuntimeEst. Cost
Single company profileAll 3100~15 sec~$0.005
Large company (high maxResults)All 31,000~30 sec~$0.01
State-wide industry searchAll 35,000~1 min~$0.02
OSHA only (no MSHA)2100~10 sec~$0.003

Apify Free Tier: New Apify accounts receive $5 of free platform credits each month.

Build safety profiles using the API

Python

from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_API_TOKEN")

run = client.actor("ryanclinton/industrial-safety-intel").call(run_input={
    "apiKey": "YOUR_DOL_API_KEY",
    "dryRun": False,
    "companyName": "TYSON",
    "maxResults": 200,
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    risk = item["riskAssessment"]
    print(f"{item['company']}: Risk {risk['level']} ({risk['score']}/100)")
    for factor in risk["factors"]:
        print(f"  - {factor}")
    if item.get("oshaAccidents"):
        osha = item["oshaAccidents"]
        print(f"  OSHA: {osha['totalFatalities']} fatalities, {osha['totalHospitalizations']} hospitalizations")

JavaScript

import { ApifyClient } from "apify-client";

const client = new ApifyClient({ token: "YOUR_APIFY_API_TOKEN" });

const run = await client.actor("ryanclinton/industrial-safety-intel").call({
    apiKey: "YOUR_DOL_API_KEY",
    dryRun: false,
    companyName: "TYSON",
    maxResults: 200,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
for (const item of items) {
    const risk = item.riskAssessment;
    console.log(`${item.company}: Risk ${risk.level} (${risk.score}/100)`);
    risk.factors.forEach(f => console.log(`  - ${f}`));
}

cURL

# Start the actor run
curl -X POST "https://api.apify.com/v2/acts/ryanclinton~industrial-safety-intel/runs?token=YOUR_APIFY_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "apiKey": "YOUR_DOL_API_KEY",
    "dryRun": false,
    "companyName": "TYSON",
    "maxResults": 200
  }'

# Fetch results (replace DATASET_ID from the run response)
curl "https://api.apify.com/v2/datasets/DATASET_ID/items?token=YOUR_APIFY_API_TOKEN&format=json"

How Industrial Safety Intelligence works

Step 1: Parallel data fetching

The actor queries up to three DOL API endpoints simultaneously using Promise.all:

  • OSHA accidents (/OSHA/accident) -- filtered by establishment name, state, NAICS code, date range, and fatality flag
  • OSHA inspections (/OSHA/inspection) -- filtered by establishment name, state, NAICS code, and date range
  • MSHA mines (/MSHA/mines) -- filtered by operator name and state, sorted by employee count

All filters are assembled into a JSON filter object passed as a query parameter. Each API call includes timeout handling (30 seconds), exponential backoff on rate limits (429 responses), and up to 4 retries.

Step 2: MSHA violation count

After mine data is fetched, the actor queries the MSHA violations endpoint for the first 10 mine IDs to get an aggregate violation count. This provides a quick measure of the operator's compliance history without fetching every individual violation record.

Step 3: Risk assessment

The risk score is computed by summing weighted factors:

  • Fatalities: 30 points per fatality (capped at 90)
  • Hospitalizations: 10 points per hospitalization (capped at 40)
  • Injuries: 3 points per injury (capped at 20)
  • Accident volume: 15 points for 10+ accidents, 8 points for 5-9
  • Inspection volume: 15 points for 20+ inspections, 8 points for 10-19
  • MSHA violations: 25 points for 100+, 15 for 20-99, 5 for 1-19
  • Mine count: 5 points for 5+ mines

The total is capped at 100 and mapped to a severity level.

Step 4: Output

All data is assembled into a single safety profile with aggregate statistics and the risk assessment, then pushed to the Apify dataset.

Risk score reference

Score RangeLevelInterpretation
0-24LOWMinimal safety incidents. Few or no accidents, inspections, or violations found.
25-49MODERATESome safety concerns. Multiple accidents or inspections, possible injuries.
50-74HIGHSignificant safety issues. Fatalities, many hospitalizations, or high inspection/violation counts.
75-100CRITICALSevere safety record. Multiple fatalities, extensive hospitalizations, and/or massive violation counts.

Limitations

  • DOL API key required -- You must register for a free API key at dataportal.dol.gov/registration. The actor cannot fetch real data without one.
  • Company name matching is approximate -- The DOL API uses LIKE matching on establishment/operator names. Broad searches may return unrelated companies with similar names.
  • MSHA violation count is approximate -- Only the first 10 mines (by employee count) are checked for violations. Companies with more than 10 mines may have a higher actual violation count.
  • No violation detail -- The actor reports total MSHA violation counts but does not fetch individual violation records with severity levels or penalty amounts.
  • Historical data only -- The DOL API provides historical records. There is no real-time incident reporting.
  • NAICS prefix matching -- The NAICS filter uses prefix matching. A 2-digit code like "21" matches all industries starting with 21 (all mining), which may be broader than intended.
  • Rate limits -- The DOL API has rate limits. The actor handles 429 responses with exponential backoff, but very large searches may encounter delays.
  • Single profile per run -- The actor produces one safety profile per run covering all matching records. It does not break out separate profiles per establishment or location.

Integrations

  • Zapier -- Trigger workflows when safety data is updated.
  • Make -- Build automated ESG monitoring or supply chain safety pipelines.
  • Google Sheets -- Export safety profiles to Google Sheets for team review.
  • Apify API -- Call the actor from due diligence platforms, ESG scoring tools, or compliance systems.
  • Webhooks -- Get notified when a safety profile is generated.

FAQ

Do I need to pay for the DOL API? No. The DOL Open Data Portal API is free. Register at dataportal.dol.gov/registration to get your API key.

What is NAICS and how do I find the right code? NAICS (North American Industry Classification System) is a standard for classifying businesses by industry. Common codes: 21 (Mining), 23 (Construction), 31-33 (Manufacturing), 3116 (Meat Processing), 2121 (Coal Mining). Search at naics.com or census.gov/naics.

What is the difference between OSHA and MSHA? OSHA (Occupational Safety and Health Administration) covers most U.S. workplaces. MSHA (Mine Safety and Health Administration) specifically covers mining operations. Companies in mining industries will have records in both datasets.

How is the risk score calculated? The score sums weighted factors: fatalities (30 pts each, max 90), hospitalizations (10 pts each, max 40), injuries (3 pts each, max 20), accident volume (8-15 pts), inspection volume (8-15 pts), MSHA violations (5-25 pts), and mine count (5 pts). The total is capped at 100.

Can I compare companies' safety records? Run the actor separately for each company and compare the risk scores, factor breakdowns, and aggregate statistics. The standardized scoring makes cross-company comparison straightforward.

How far back does the data go? The DOL API contains historical records going back many years. The exact range varies by dataset. Use the dateFrom filter to limit results to a specific time period.

What does dry run mode do? Dry run mode runs the actor without making any DOL API calls. It is useful for testing the input configuration and understanding the output format before registering for an API key.

Related actors

ActorHow to combine
Website Contact ScraperFind safety officer and compliance team contacts at companies with safety concerns
B2B Lead Gen SuiteBuild comprehensive profiles combining safety data with business intelligence
SEC 13F Holdings TrackerResearch institutional exposure to companies with poor safety records

Support

Found a bug or have a feature request? Open an issue in the Issues tab on this actor's page. For custom safety intelligence solutions, reach out through the Apify platform.

How it works

01

Configure

Set your parameters in the Apify Console or pass them via API.

02

Run

Click Start, trigger via API, webhook, or set up a schedule.

03

Get results

Download as JSON, CSV, or Excel. Integrate with 1,000+ apps.

Use cases

Sales Teams

Build targeted lead lists with verified contact data.

Marketing

Research competitors and identify outreach opportunities.

Data Teams

Automate data collection pipelines with scheduled runs.

Developers

Integrate via REST API or use as an MCP tool in AI workflows.

Ready to try Industrial Safety Intelligence?

Start for free on Apify. No credit card required.

Open on Apify Store