OSHA Inspections by Company + EPA Enforcement Report avatar

OSHA Inspections by Company + EPA Enforcement Report

Pricing

from $4.00 / 1,000 enforcement records

Go to Apify Store
OSHA Inspections by Company + EPA Enforcement Report

OSHA Inspections by Company + EPA Enforcement Report

Look up OSHA inspections, violations and penalties (DOL Data API) and EPA ECHO enforcement cases by company name, facility ID, state or ZIP. One normalized record per inspection or case, a per-company summary, name-match confidence, and new-record monitoring. Pay per record.

Pricing

from $4.00 / 1,000 enforcement records

Rating

0.0

(0)

Developer

Owlabee

Owlabee

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Security

Limited permissions

Share

Look up OSHA inspections by company: enter a company name, facility ID, state or ZIP and get every OSHA inspection with its violations and penalties (DOL Data API) and the company's EPA ECHO enforcement cases, one normalized JSON record each, plus a per-company summary and a name-match confidence. Schedule it to watch suppliers or contractors for new records.

What it does

SourceAgency dataHow it is queriedKey
oshaOSHA inspections, citations (violations) and penalties from the U.S. Department of Labor's enforcement dataDOL Data API v4 (apiprod.dol.gov), datasets OSHA/inspection and OSHA/violationYour own free DOL API key is required (see below)
epaEPA and state enforcement cases recorded in ECHO (Enforcement and Compliance History Online): case number and name, category, status, primary law (CAA, CWA, RCRA, …), filing and settlement dates, federal and state/local penalties, outcomeECHO web services (echodata.epa.gov): facility search, then the case lists of matched facilitiesNone

OSHA needs a DOL API key. The Department of Labor's Data API does not answer without one. Keys are free: sign in at dataportal.dol.gov, open your account's API keys page, and paste the key into the dolApiKey input (stored as an encrypted secret and only sent to apiprod.dol.gov). Without a key the Actor still runs EPA and writes one DOL_API_KEY_MISSING item for OSHA.

Typical uses: due diligence on a company or facility before a deal or loan, supplier and contractor vetting, insurance underwriting, and monitoring a list of companies for new inspections or cases on a schedule. Records describe what the agencies published; they are not a rating of any company.

Checking contractors too? License Verification API — TDLR, DBPR, DORA, WA DOH, NPI verifies their professional licenses.

Why this Actor

This ActorTypical Actor in this categoryDo it yourself
AgenciesOSHA and EPA in one run, one output shapeOne agency per ActorTwo APIs with different query models (DOL filter objects; ECHO query ids)
MatchingEvery record carries matchBasis and matchConfidence (high, medium, low); different firms are never mergedRaw name search resultsYour own fuzzy matching
PenaltiesOSHA citations summed per inspection (current and initial penalty, counts by violation type); EPA federal plus state/local penaltiesOften the inspection list onlyJoin the violation table yourself
Company viewOptional summary record per company: counts, penalties, most recent action, matched namesNoneSpreadsheet work
Monitoringmonitor mode writes only new or changed records since the last run, with a webhookRe-run and diff by handYour own state store
Pricing unitPer record, per company search and per extra agency page; nothing per minutePer resultServer time and upkeep
Keys and proxiesNo proxy; EPA needs no key; OSHA uses your free DOL keyVariesSame keys
  • One shape across agencies. actionDate, status, penaltyUsd and sourceUrl mean the same thing on an OSHA inspection and an EPA case, so a vetting or underwriting workflow has one rule set.
  • Honest matching. Agencies index establishments and facilities by name, not by a company id. The Actor tells you how each record matched instead of guessing.
  • Monitoring built in. Schedule a list of suppliers and receive only what is new.

How to use

  1. Enter one or more company names (and optionally a state or ZIP to narrow common names), or exact identifiers (osha:<inspection number>, frs:<12-digit EPA FRS id>).
  2. Choose the sources; for OSHA paste your free DOL API key. Optionally set a date range and the minimum match confidence.
  3. Click Start. Records appear in the dataset as each company finishes; download them as JSON, CSV or Excel, or read them through the API.

How name matching works

matchConfidencematchBasisMeaning
highname-exact, osha-activity-nr, epa-frs-idNames equal after removing case, punctuation and suffixes such as Inc, LLC, Corp; or an exact identifier lookup
mediumname-prefix, facility-nameYour name is a whole-word prefix of the agency's name ("Tesla" → "TESLA MOTORS INC")
lowname-tokens, name-substring, facility-nameYour words appear elsewhere in the name ("10045 TESLA ROAD") or only as part of a word; or an EPA case at a matched facility that is filed under another party's name (matchNote says so)

minMatchConfidence (default medium) drops weaker matches before they are written or charged. "DBA" names are matched on each part. The summary record lists every distinct matched name with its own count, so two firms with similar names stay visibly separate.

Quick start input

{
"companies": ["Tesla"],
"state": "CA",
"sources": ["epa"]
}

This is the prefilled input: no key needed, about 5 seconds, three EPA cases and a summary record.

Ready-to-run inputs

Supplier vetting across both agencies for the last five years (needs your DOL key):

{
"companies": ["Acme Roofing", "Mistras Group"],
"state": "TX",
"dateFrom": "2021-01-01",
"sources": ["osha", "epa"],
"dolApiKey": "<your free DOL API key>",
"minMatchConfidence": "medium"
}

One facility and one inspection by identifier:

{
"identifiers": ["frs:110000482898", "osha:316113513"],
"dolApiKey": "<your free DOL API key>"
}

Weekly monitor of a supplier list with a webhook:

{
"companies": ["Tesla", "Rivian"],
"sources": ["epa"],
"monitor": true,
"stateStoreName": "supplier-enforcement-watch",
"webhookUrl": "https://example.com/hooks/enforcement"
}

Input

FieldTypeDefaultDescription
companiesarray of strings—Company or establishment names, one per line
identifiersarray of strings—osha:<inspection activity number> or frs:<12-digit EPA FRS registry id>
statestring—Two-letter state code for the site or facility
zipstring—Five-digit ZIP code
dateFrom, dateTodate—Action date window (OSHA: inspection opened; EPA: case filed, else settled)
sourcesarray["osha","epa"]Agencies to query
dolApiKeysecret string—Your free DOL Data API key; required for OSHA
minMatchConfidencehigh / medium / lowmediumWeakest name match to keep
includeSummarybooleantrueOne company-summary record per company
includeViolationsbooleantrueOSHA citations and penalties per inspection
epaAllFacilitiesbooleanfalseCheck every matched EPA facility, not only those ECHO flags with formal actions or penalties
maxRecordsPerCompanyinteger100Most recent records kept per company and agency (max 5,000)
maxFacilitiesPerCompanyinteger25EPA facilities checked per company (max 500)
maxResultsinteger1,000Items written across the run (max 50,000)
timeBudgetSecsinteger300Wall time per agency over the run (30–1,800)
monitorbooleanfalseWrite only new or changed records since the last run
stateStoreNamestringosha-epa-enforcement-report-stateKey-value store for monitor snapshots
webhookUrlstring—POST a JSON run summary and the items written

Output example

An EPA case (from the quick-start run on 2026-11-01; raw shortened):

{
"recordType": "enforcement-case",
"agency": "EPA",
"recordId": "epa:09-2019-0029",
"query": "Tesla",
"entityName": "Tesla Motors, Inc.",
"facilityName": "TESLA MOTORS INC",
"facilityRegistryId": "110000482898",
"address": "45500 FREMONT BLVD",
"city": "FREMONT",
"state": "CA",
"zip": "94538",
"naicsCode": "336111",
"actionDate": "2019-03-28",
"closedDate": null,
"actionType": "Administrative - Formal",
"status": "Final Order Issued",
"penaltyUsd": 31000,
"lawOrProgram": "RCRA",
"outcome": "Final Order With Penalty",
"sourceUrl": "https://echo.epa.gov/enforcement-case-report?id=09-2019-0029",
"matchBasis": "facility-name",
"matchConfidence": "medium",
"matchedName": "TESLA MOTORS INC",
"fetchedAt": "2026-11-01T13:01:08.211Z",
"raw": {
"case": { "CaseNumber": "09-2019-0029", "CourtDocketNumber": "RCRA(3008)-09-2019-0029", "SEPCost": "$55,000.00", "Lead": "EPA", "...": "..." },
"facility": { "RegistryID": "110000482898", "FacFormalActionCount": "1", "FacTotalPenalties": "$275,000", "...": "..." }
}
}

An OSHA inspection has the same top-level fields plus initialPenaltyUsd, violationCount and violationsByType (serious, willful, repeat, other, unclassified); status is open until OSHA records a closing date, actionType is the inspection type (Complaint, Planned, Accident, Referral, Fatality/catastrophe, …), sourceUrl points to the OSHA inspection detail page, and raw holds the inspection row and its violations.

The per-company summary record:

{
"recordType": "company-summary",
"query": "Tesla",
"sources": ["epa"],
"recordCount": 3,
"countsByAgency": { "EPA": 3 },
"penaltiesByAgencyUsd": { "EPA": 581000 },
"totalPenaltiesUsd": 581000,
"openCount": 0,
"countsByConfidence": { "high": 0, "medium": 3, "low": 0 },
"mostRecentAction": { "recordId": "epa:09-2022-3503", "agency": "EPA", "actionDate": "2022-02-17", "actionType": "Administrative - Formal", "entityName": "Tesla Motors CAFO" },
"earliestActionDate": "2010-01-11",
"matchedNames": [
{ "name": "TESLA MOTORS INC", "agency": "EPA", "confidence": "medium", "records": 2 },
{ "name": "TESLA MOTORS", "agency": "EPA", "confidence": "medium", "records": 1 }
],
"incomplete": false,
"errors": []
}

Error items look like { "recordType": "error", "query": "Acme", "source": "osha", "error": "DOL_API_KEY_REJECTED", "errorMessage": "…" }. Codes: DOL_API_KEY_MISSING, DOL_API_KEY_REJECTED, QUERY_TOO_BROAD (ECHO refuses a name matching too many facilities; add a state or ZIP), TIME_BUDGET, INVALID_IDENTIFIER, SOURCE_ERROR.

Alerts and delivery

  • Schedules. Create a schedule in the Apify Console (weekly is typical for vendor lists) with monitor: true; each run writes only records that are new or whose status, penalty or closing date changed (changeType: "new" or "changed", with changedFields and the previous values). The first run is a baseline that writes, and charges for, every current record.
  • The Actor's own webhookUrl. After every run the Actor POSTs one JSON document: actor, runId, counts (produced, records, summaries, errors, newOrChanged, searches, extraPages), per-source requests, mbReceived, seconds and abandoned, monitor, baseline, charges, limitReached, finishedAt, and items, up to 500 of the items written in this run without their raw fields. Delivery has a 10 s timeout and two retries; a failing endpoint never fails the run and is recorded as webhookDelivered: false in the SUMMARY record.
  • Apify integrations. The Actor's Integrations tab connects Slack, Make, Zapier, Google Sheets, email or a generic webhook on run events (ACTOR.RUN.SUCCEEDED, ACTOR.RUN.FAILED).
  • API. POST https://api.apify.com/v2/acts/owlabee~osha-epa-enforcement-report/run-sync-get-dataset-items?token=<APIFY_TOKEN> with the input as the body returns the items in one call; the run's SUMMARY record is at GET /v2/key-value-stores/{storeId}/records/SUMMARY.

Pricing

Pay per event. Set a maximum cost per run in the run options to cap spend.

EventPriceCharged for
Enforcement record$0.005Each inspection or case record written, each company summary record and each error item
Company search$0.01Each company name or identifier per agency queried, whatever it returns
Extra agency page$0.002Each further agency request for that search: next OSHA result pages, OSHA violation batches, ECHO facility pages, per-facility case lists and case batches
Actor start$0.00005Apify platform event

Example: 1,000 records ≈ $5.00, plus $0.01 per company and agency searched and $0.002 per extra page. The quick-start run (one company, EPA only: 1 search, 5 extra pages, 3 cases and a summary) costs $0.04. A company with 20 OSHA inspections and 5 EPA cases across both agencies costs about $0.16. A weekly monitor of 50 companies on both agencies with nothing new costs the searches and pages only, about $1.50 per run.

Store pricing discounts: Scale plan (Silver) users pay 10% less per event, Business plan (Gold) users 20% less.

Limits and fair use

  • Requests to each agency are spaced at least 0.5 s apart; each request has a 30 s deadline including two retries, and a Retry-After wait is capped at 10 s.
  • Each agency has a time budget for the run (timeBudgetSecs, default 300 s, max 1,800 s; at roughly 1–3 s per company per agency, raise it for lists over about 100 companies); one that returns nothing usable for 60 s in a row is abandoned for the rest of the run, and the companies still waiting for it get a charged TIME_BUDGET item. A rejected DOL key stops OSHA for the run with a single error item. Default run memory is 512 MB.
  • ECHO's company-name filter for cases is not usable, so EPA cases are found through facilities: by default only facilities that ECHO flags with formal enforcement actions or penalties are checked (epaAllFacilities checks all), up to maxFacilitiesPerCompany. Very broad names can exceed ECHO's query limit (QUERY_TOO_BROAD); add a state or ZIP.
  • OSHA inspections are returned newest first; the name filter matches anywhere in the establishment name and the Actor then grades each match, so a short or generic name scans more rows. Federal OSHA and State Plan inspections are both in the DOL data as published.
  • Agency data lag the agencies' internal systems; dates, statuses and penalties can change after an inspection or case is first published.

Other pay-per-event Actors from the same account, all limited-permission and agent-friendly:

Use from AI agents (MCP)

Pin this Actor in the Apify MCP server with https://mcp.apify.com?tools=owlabee/osha-epa-enforcement-report, or let the agent find it with search-actors. It is pay-per-event with limited permissions. Prompts that map onto the input:

  1. "List every EPA enforcement case for Tesla facilities in California with penalties and dates."
  2. "Pull OSHA inspections, violations and penalties for Mistras Group in North Carolina since 2015 and summarize them."
  3. "Every Monday, check my 50 suppliers for new OSHA inspections or EPA cases and POST only the new ones to my webhook."
{
"tool": "call-actor",
"arguments": {
"actor": "owlabee/osha-epa-enforcement-report",
"input": { "companies": ["Tesla"], "state": "CA", "sources": ["epa"] }
}
}

FAQ

Does this need proxies or an API key? No proxies. EPA ECHO needs no key. OSHA data comes from the DOL Data API, which requires a free key from dataportal.dol.gov in dolApiKey; nothing else is needed.

How is cost controlled? Set maxRecordsPerCompany, maxFacilitiesPerCompany, maxResults and the run's maximum total charge. Every item is charged when it is saved, and the run stops cleanly at any limit. minMatchConfidence drops weak matches before they are charged.

Why did I get records for a different company? Agencies record establishment and facility names, not company ids. Check matchConfidence, matchBasis and matchNote; raise minMatchConfidence to high, add a state or ZIP, or look up exact identifiers. The Actor never merges two names into one company; the summary lists each matched name separately.

Does it cover state OSHA plans and state environmental agencies? OSHA data includes State Plan inspections that DOL publishes. EPA ECHO includes state-led and locally-led cases that states report to EPA (raw.case.Lead); state agencies' own systems are not queried.

How does monitor mode work? Each company's records are fingerprinted (status, penalty, closing date) in the named key-value store. Later runs write only new or changed records and charge the same searches and pages as a normal run. A source that fails during a run keeps its earlier snapshot, so nothing is reported twice when it recovers.

Can I try it for free? Yes. The Apify free plan includes monthly platform credit, and the quick-start input costs about four cents.

Changelog

  • 2026-11-01 — First release: OSHA inspections, violations and penalties (DOL Data API, user key) and EPA ECHO enforcement cases, name and identifier lookups, match confidence, per-company summary, monitor mode with webhook.

This Actor reads public enforcement records from two official United States government APIs: the Department of Labor's Data API (OSHA inspections and violations, using the DOL API key you supply under DOL's terms of use) and the EPA's Enforcement and Compliance History Online (ECHO) web services. It does not log in, bypass access controls or use proxies, and it sends your company list only to those two agencies. Use the data in compliance with each agency's terms and applicable law.

The output reproduces agency records as published. An inspection, citation or enforcement case is not a finding that a company broke the law or operates unsafely: OSHA citations can be contested, reduced or withdrawn, EPA cases are often settled without an admission, and both agencies publish corrections and disclaimers about the completeness and timeliness of their data. The Actor makes no claim about any company's legality, safety or compliance; it does not score or rank companies.

Records are matched to the names and identifiers you enter by fuzzy name matching, and every record carries a match-confidence flag. Establishments with similar names, franchisees, subsidiaries and unrelated companies can share a name, so verify the match (address, state, EPA registry ID, OSHA establishment ID) before relying on a record.

Establishment names in OSHA data can be the names of individuals (sole proprietors and small contractors). This Actor is not a consumer reporting agency and its output is not a consumer report: do not use it, in whole or in part, to decide an individual's eligibility for employment, credit, insurance, housing or any other purpose covered by the Fair Credit Reporting Act or similar laws. Commercial due diligence on companies, such as underwriting a business policy or vetting a vendor, is your responsibility to conduct in line with the law that applies to you.