# DOL Enforcement Rollup — Employer Wage-Theft Violator API (`malonestar/dol-enforcement-rollup`) Actor

Roll up US Department of Labor enforcement actions by employer. Aggregates WHD wage-theft cases (back wages, penalties, employees affected) with optional EBSA/ERISA into per-employer summaries and repeat-violator flags.

- **URL**: https://apify.com/malonestar/dol-enforcement-rollup.md
- **Developed by:** [Kyle Maloney](https://apify.com/malonestar) (community)
- **Categories:** Lead generation, Developer tools, Agents
- **Stats:** 2 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $8.00 / 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.

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

## 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

## DOL Enforcement Rollup — Employer Wage-Theft & Repeat-Violator API

Turn the U.S. Department of Labor's raw enforcement database into **per-employer
intelligence**. This actor pulls Wage and Hour Division (WHD) compliance actions
— every concluded case since FY 2005, with back wages, civil money penalties,
employees affected, and repeat/willful flags — and **rolls them up by employer**
so you instantly see who the repeat wage-theft offenders are, how much they owe,
and across which statutes.

Most tools give you a flat case dump. The value here is the **transform**:
normalized employer names, summed back wages and penalties across a company's
entire case history, finding date ranges, a derived "dominant statute" per case,
and a **repeat_violator** flag — plus optional ERISA/EBSA penalty cases merged
into the same employer view.

### Who it's for
- **Employment & plaintiff-side labor attorneys** — spot repeat FLSA/overtime
  violators and quantify exposure before intake or discovery.
- **Unions & worker centers** — target organizing and enforcement campaigns at
  chronic wage-theft employers by industry and state.
- **ESG / HR-risk & vendor-screening teams** — screen suppliers, contractors, and
  acquisition targets for labor-law enforcement history.
- **Insurers & underwriters (EPLI)** — price employment-practices risk using an
  employer's real DOL enforcement footprint.
- **Investigative journalists & researchers** — rank the biggest offenders by
  back wages, employees affected, or case count.

### Data source
- **WHD** (`enforcement`) — Wage and Hour Division compliance actions via the DOL
  Open Data API v4 (`apiprod.dol.gov`). Covers FLSA, Davis-Bacon, Service Contract
  Act, H-1B/H-2A/H-2B, FMLA, child labor, and more.
- **EBSA** (opt-in) — ERISA Form 5500 penalty cases (OCATS).
- **OFCCP** — scaffolded for a future release.

#### API key (free, required)
The DOL data endpoint requires a free key. Register at
**https://dataportal.dol.gov/registration** (instant), then paste it into the
`apiKey` input (or set the `DOL_API_KEY` environment variable). The dataset
catalog is public; the record data is not, so the key is mandatory.

### Example input
```json
{
  "apiKey": "YOUR_DOL_API_KEY",
  "mode": "rollup",
  "state": "CA",
  "naics": "722",
  "sinceDate": "2022-01-01",
  "repeatThreshold": 1,
  "maxResults": 5000
}
````

This returns per-employer rollups for California food-service employers (NAICS
722\*) with findings after 2022-01-01, flagging any employer with more than one
case as a repeat violator.

Switch `"mode": "cases"` to get one normalized row per individual enforcement
case instead of the employer aggregate.

### Output fields

**Per-employer rollup (`mode: "rollup"`):**
`employer_name`, `agency`, `agencies[]`, `naics`, `naics_description`, `city`,
`state`, `total_cases`, `total_back_wages`, `total_civil_penalties`,
`total_employees`, `total_violations`, `first_finding`, `last_finding`,
`repeat_violator`, `source_url`, `retrieved_at`.

**Per-case (`mode: "cases"`):**
`employer_name`, `agency`, `case_id`, `naics`, `naics_description`, `city`,
`state`, `zip`, `back_wages`, `civil_penalty`, `employees_affected`,
`violation_count`, `violation_type`, `repeat_violator_flag`,
`finding_start_date`, `finding_end_date`, `source_url`, `retrieved_at`.

### Use as an MCP tool

This actor is callable by AI agents (Claude, Cursor, etc.) via
[mcp.apify.com](https://mcp.apify.com). The clean, field-level output schema makes
it a chainable tool: an agent can ask for "repeat wage-theft violators in Texas
construction since 2023" and pipe the rolled-up employers straight into a
brief, a risk score, or a spreadsheet.

### FAQ

**How do I find repeat wage-theft violators?** Run in `rollup` mode; every row has
a `repeat_violator` flag and `total_cases` / `total_back_wages` so you can sort by
worst offender. Lower `repeatThreshold` to 0 to flag any employer with a case.

**Does it include civil money penalties, not just back wages?** Yes —
`civil_penalty` (per case) and `total_civil_penalties` (per employer) sum the CMP
columns across every statute (FLSA, MSPA, H-1B, child labor, OSHA-referred, etc.).

**Can I filter by industry?** Yes — pass a `naics` prefix (e.g. `"23"` for
construction, `"722"` for restaurants).

**How far back does the data go?** WHD compliance actions cover concluded cases
since fiscal year 2005.

**Is this official DOL data?** Yes — it comes directly from the DOL Open Data API.
Findings dates are not the same as case open/close dates (per DOL's data notes).

**Do I need to pay DOL?** No. The DOL API key is free; this actor bills only for
the result rows it returns to you.

# Actor input Schema

## `apiKey` (type: `string`):

Your free U.S. Department of Labor Open Data API key. Register at https://dataportal.dol.gov/registration (instant, free) and paste the key here. Can also be supplied via the DOL\_API\_KEY environment variable. Required — the DOL data endpoint rejects unauthenticated requests.

## `mode` (type: `string`):

"rollup" returns one aggregated row per employer (total back wages, total cases, employees affected, finding date range, agency list, repeat\_violator flag). "cases" returns one normalized row per individual enforcement case.

## `sources` (type: `array`):

Which DOL agencies to pull. Empty = WHD only (Wage and Hour Division — the shippable default). Add EBSA to include ERISA Form 5500 penalty cases (OCATS). OFCCP is scaffolded but not yet enabled.

## `employer` (type: `string`):

Optional. Case-insensitive substring matched against the employer trade name and legal name (e.g. "walmart", "tyson foods"). Leave blank to return all employers.

## `state` (type: `string`):

Optional. Filter to employers in a single US state by its 2-letter postal code (e.g. "CA", "TX", "NY").

## `naics` (type: `string`):

Optional. Filter by industry NAICS code prefix (e.g. "722" for food service, "23" for construction). Matches codes that start with this value.

## `sinceDate` (type: `string`):

Optional. Only include cases whose findings end date is after this date (e.g. "2023-01-01"). Use it to pull only recent enforcement activity.

## `repeatThreshold` (type: `integer`):

In rollup mode, an employer is flagged repeat\_violator when its total case count is greater than this value (default 1 = more than one case). Any case carrying a WHD repeat/willful flag also sets it true.

## `maxResults` (type: `integer`):

Cap on the number of raw enforcement cases fetched PER source before rollup. Lower it for quick tests; raise it for a full pull.

## Actor input object example

```json
{
  "mode": "rollup",
  "sources": [],
  "state": "CA",
  "sinceDate": "2023-01-01",
  "repeatThreshold": 1,
  "maxResults": 500
}
```

# Actor output Schema

## `results` (type: `string`):

The default dataset.

# 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 = {
    "state": "CA",
    "sinceDate": "2023-01-01",
    "maxResults": 500
};

// Run the Actor and wait for it to finish
const run = await client.actor("malonestar/dol-enforcement-rollup").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 = {
    "state": "CA",
    "sinceDate": "2023-01-01",
    "maxResults": 500,
}

# Run the Actor and wait for it to finish
run = client.actor("malonestar/dol-enforcement-rollup").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 '{
  "state": "CA",
  "sinceDate": "2023-01-01",
  "maxResults": 500
}' |
apify call malonestar/dol-enforcement-rollup --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "DOL Enforcement Rollup — Employer Wage-Theft Violator API",
        "description": "Roll up US Department of Labor enforcement actions by employer. Aggregates WHD wage-theft cases (back wages, penalties, employees affected) with optional EBSA/ERISA into per-employer summaries and repeat-violator flags.",
        "version": "1.0",
        "x-build-id": "4fuR6RM9QFTBy7KgX"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/malonestar~dol-enforcement-rollup/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-malonestar-dol-enforcement-rollup",
                "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/malonestar~dol-enforcement-rollup/runs": {
            "post": {
                "operationId": "runs-sync-malonestar-dol-enforcement-rollup",
                "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/malonestar~dol-enforcement-rollup/run-sync": {
            "post": {
                "operationId": "run-sync-malonestar-dol-enforcement-rollup",
                "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",
                "properties": {
                    "apiKey": {
                        "title": "DOL API key",
                        "type": "string",
                        "description": "Your free U.S. Department of Labor Open Data API key. Register at https://dataportal.dol.gov/registration (instant, free) and paste the key here. Can also be supplied via the DOL_API_KEY environment variable. Required — the DOL data endpoint rejects unauthenticated requests."
                    },
                    "mode": {
                        "title": "Output granularity",
                        "enum": [
                            "rollup",
                            "cases"
                        ],
                        "type": "string",
                        "description": "\"rollup\" returns one aggregated row per employer (total back wages, total cases, employees affected, finding date range, agency list, repeat_violator flag). \"cases\" returns one normalized row per individual enforcement case.",
                        "default": "rollup"
                    },
                    "sources": {
                        "title": "Enforcement sources",
                        "type": "array",
                        "description": "Which DOL agencies to pull. Empty = WHD only (Wage and Hour Division — the shippable default). Add EBSA to include ERISA Form 5500 penalty cases (OCATS). OFCCP is scaffolded but not yet enabled.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "WHD",
                                "EBSA"
                            ],
                            "enumTitles": [
                                "WHD — Wage & Hour Division",
                                "EBSA — ERISA Form 5500 penalties"
                            ]
                        },
                        "default": []
                    },
                    "employer": {
                        "title": "Employer name (contains)",
                        "type": "string",
                        "description": "Optional. Case-insensitive substring matched against the employer trade name and legal name (e.g. \"walmart\", \"tyson foods\"). Leave blank to return all employers."
                    },
                    "state": {
                        "title": "State (2-letter code)",
                        "type": "string",
                        "description": "Optional. Filter to employers in a single US state by its 2-letter postal code (e.g. \"CA\", \"TX\", \"NY\")."
                    },
                    "naics": {
                        "title": "NAICS code prefix",
                        "type": "string",
                        "description": "Optional. Filter by industry NAICS code prefix (e.g. \"722\" for food service, \"23\" for construction). Matches codes that start with this value."
                    },
                    "sinceDate": {
                        "title": "Findings since (YYYY-MM-DD)",
                        "type": "string",
                        "description": "Optional. Only include cases whose findings end date is after this date (e.g. \"2023-01-01\"). Use it to pull only recent enforcement activity."
                    },
                    "repeatThreshold": {
                        "title": "Repeat-violator threshold",
                        "minimum": 0,
                        "maximum": 100,
                        "type": "integer",
                        "description": "In rollup mode, an employer is flagged repeat_violator when its total case count is greater than this value (default 1 = more than one case). Any case carrying a WHD repeat/willful flag also sets it true.",
                        "default": 1
                    },
                    "maxResults": {
                        "title": "Max cases per source",
                        "minimum": 1,
                        "maximum": 500000,
                        "type": "integer",
                        "description": "Cap on the number of raw enforcement cases fetched PER source before rollup. Lower it for quick tests; raise it for a full pull.",
                        "default": 5000
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
