# Indiana WARN Notices Scraper (`automation-lab/indiana-warn-layoff-notices`) Actor

Export official Indiana DWD WARN layoff notices with employers, cities, affected workers, notice and layoff dates, industry and official document links.

- **URL**: https://apify.com/automation-lab/indiana-warn-layoff-notices.md
- **Developed by:** [Automation Lab](https://apify.com/automation-lab) (community)
- **Categories:** Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.16 / 1,000 item extracteds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

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

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Indiana WARN Notices Scraper

Export Indiana WARN notices from the Indiana Department of Workforce Development's public current WARN table. Each dataset row identifies an employer, affected city and worker count, notice and layoff/closure dates, industry, type code, and an official document link when the state provides one. Run it on a schedule to compare snapshots of Indiana employer layoff filings.

### Who is it for

Workforce planners can track where layoffs are announced; recruiters can prioritize affected regions; labor-market analysts can compare employers and industries across scheduled exports. This is a table export, not an email alert or a historical change feed.

### Why use it

The Actor fetches the official DWD table directly, returns typed dates and numeric affected-worker counts, and retains both the source page and each available notice PDF link. A single successful request retrieves the full table rather than issuing a separate request for every employer. If a direct connection is unavailable, a bounded Apify proxy fallback retries the page.

### Data fields

| Field | Meaning |
| --- | --- |
| `employer`, `city` | Company and affected Indiana location as listed by DWD. |
| `affectedWorkers` | Numeric worker count, or null when not numeric. |
| `noticeDate`, `layoffDate` | ISO calendar dates; the latter may be null. |
| `naics`, `industry` | Source NAICS code and description of work. |
| `noticeType` | Source code (for example LO or CL); preserve the state's terminology. |
| `noticeUrl`, `sourceUrl` | Optional official document and the current WARN table page. |

Missing source values become `null`. An empty optional document cell is not filled with an invented link.

### Getting started

1. Leave the default input to export up to 100 of the newest listed notices.
2. Increase `maxItems` to include older rows from the same current table, or set `fromDate` to restrict by notice date.
3. Run the Actor and open the **Dataset** tab. Download JSON, CSV, or Excel from Apify.
4. Schedule repeat runs and compare stable fields such as employer, notice date, city, and affected workers to detect changes in the public table.

### Input

```json
{"maxItems": 5, "fromDate": "2026-01-01", "employer": "Manufacturing"}
```

All fields are optional. `maxItems` defaults to 100 and accepts 1–10,000. `fromDate` uses inclusive `YYYY-MM-DD` notice date, not layoff date. `employer` is a case-insensitive substring with a maximum length of 100 characters. Filters run before the result limit. A filter with no matches returns an empty dataset successfully.

### Output example

A representative current source row (observed September 2026; the notice link may change upstream):

```json
{
  "employer": "PMG Indiana",
  "city": "Columbus",
  "affectedWorkers": 150,
  "noticeDate": "2026-09-02",
  "layoffDate": "2026-12-31",
  "naics": "336110",
  "industry": "Automobile and Light Duty Motor Vehicle Manufacturing",
  "noticeType": "CL",
  "noticeUrl": "https://www.in.gov/dwd/files/warnnotices/WARN%20notice-%20Packagin%20Corp%20of%20America.pdf?language_id=1",
  "sourceUrl": "https://www.in.gov/dwd/warn-notices/current-warn-notices/"
}
```

The source's first-row document filename does not match its displayed employer in the observed HTML. We preserve the state's link without claiming it belongs to the employer; verify the linked PDF before relying on it.

### How much does it cost to export Indiana WARN notices?

Pricing uses a one-time `start` charge of $0.005 and an `item` charge per exported row. BRONZE is $0.0036 per row; FREE $0.00414, SILVER $0.002808, and GOLD/PLATINUM/DIAMOND $0.00216. These are monthly Apify Store spend tiers, **not** quantity discounts per run. At BRONZE, 1/5/10/25/100 exported rows cost approximately $0.0086/$0.023/$0.041/$0.095/$0.365 including the start event. An empty filtered run still incurs the start charge. Platform usage and billing adjustments can vary. Estimated payouts are not guaranteed and may be reduced by refunds, fraud, disputes, taxes, corrections or clawbacks.

### Reading date and type fields

`noticeDate` is the date shown in the official Notice Date column. `layoffDate` is the LO/CL Date column, not a calculated date or an assertion that an event has already occurred. `noticeType` retains DWD's short code rather than guessing the full legal classification. Worker counts reflect the row, not a sum across locations or employers.

When comparing scheduled exports, keep the input consistent across runs. Filtering by a recent `fromDate` can hide older records revised by the state. To detect edits to older rows, use a broader window and compare both row identity and field values. The source does not supply a durable row ID, so two filings by the same employer/date/city may require manual verification. An occasional source-side PDF filename mismatch must not be treated as a parser correction.

### Integrations

Use Apify's dataset integrations to send rows into Google Sheets, a data warehouse, or an ETL job. Keep a snapshot per run for recurring analysis. Compare source fields across runs: this Actor does not store state or send notifications itself.

### API: cURL

```bash
curl -X POST 'https://api.apify.com/v2/acts/automation-lab~indiana-warn-layoff-notices/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN' \
  -H 'Content-Type: application/json' -d '{"maxItems":5}'
```

Avoid exposing your token in shared scripts or logs. For larger exports, start an asynchronous run and fetch its default dataset after success.

### API: JavaScript

```js
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/indiana-warn-layoff-notices').call({ maxItems: 5 });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### API: Python

```python
import os
from apify_client import ApifyClient
client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('automation-lab/indiana-warn-layoff-notices').call(run_input={'maxItems': 5})
items = client.dataset(run['defaultDatasetId']).list_items().items
print(items)
```

### MCP

Install the actor-specific tool in Claude Code:

```bash
claude mcp add --transport http apify 'https://mcp.apify.com?tools=automation-lab/indiana-warn-layoff-notices'
```

Claude Desktop, Cursor, and VS Code MCP clients can use this HTTP configuration (adjust the client-specific wrapper where necessary):

```json
{"mcpServers":{"apify":{"type":"http","url":"https://mcp.apify.com?tools=automation-lab/indiana-warn-layoff-notices"}}}
```

Example prompts using MCP: “Use the Apify MCP tool to run automation-lab/indiana-warn-layoff-notices with maxItems=5 and summarize employer, city, workers and dates.” “Use the Apify MCP tool to run the Actor with employer=Manufacturing and fromDate=2026-01-01.” Review citations against the original state links.

### Coverage and limits

The source is the state-maintained **Current WARNs** page, which currently includes older entries too; this is not a guarantee of complete historical archives or real-time publication. There is no arbitrary URL mode, no other states, no private filings, no PDF text extraction, and no guaranteed link on every row. Output follows what DWD publishes. The source may edit, remove, or mislabel entries; rows do not have stable official IDs.

### Failures and troubleshooting

If DWD changes table columns or returns no usable rows, the Actor fails instead of quietly returning false empty output. Retry after confirming that the official page loads and its column headings are intact. A valid no-match employer or date filter intentionally produces no rows; remove filters to test coverage. Malformed date or result limit inputs fail before the fetch. The HTTP implementation has a 30-second request timeout and bounded direct-then-proxy transport retries. The fallback may increase platform proxy usage cost.

### Legality and responsible use

These are publicly accessible government records. Respect state usage rules and privacy requirements; do not infer a person's employment status from a company-level WARN filing. Verify consequential decisions with DWD or the original notice document. No login or personal data collection is needed.

### FAQ

**Does the Actor email new filings?** No. Schedule runs and compare datasets or connect an Apify integration for your own alerts.

**Does the PDF link always match the employer?** No. The state table can contain mismatched or empty document cells. Links are reproduced as published, not verified by downloading each PDF.

**Why did I receive zero rows?** Check `fromDate` and `employer`; run with `{ "maxItems": 5 }` to confirm current source coverage.

### Support and retention

Results are stored in the run's Apify dataset according to your Apify account's storage and retention policy. No separate Actor cache, cookie pool or PDF archive is retained. A fallback request can route the public DWD URL through Apify's proxy. Consult the Actor's Apify Issues tab for technical support; include a run link and non-sensitive input when reporting a problem.

### Related automation

For broader regulatory monitoring, [Federal Register Rules & Notices](https://apify.com/automation-lab/federal-register-rules-notices) exports federal notices, not state WARN filings. Use it only when a federal regulatory feed is relevant to your workflow.

# Changelog

This Actor's version history is a separate document: https://apify.com/automation-lab/indiana-warn-layoff-notices/changelog.md

# Actor input Schema

## `maxItems` (type: `integer`):

Maximum number of matching notices to save; the source table is ordered newest first.

## `fromDate` (type: `string`):

Optional inclusive notice-date filter in YYYY-MM-DD format (not layoff date).

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

Optional case-insensitive substring of the employer name.

## Actor input object example

```json
{
  "maxItems": 5
}
```

# Actor output Schema

## `overview` (type: `string`):

Official table rows with employer, city, workers, dates, industry and available PDF links.

# 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 = {
    "maxItems": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/indiana-warn-layoff-notices").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 = { "maxItems": 5 }

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/indiana-warn-layoff-notices").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "maxItems": 5
}' |
apify call automation-lab/indiana-warn-layoff-notices --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,automation-lab/indiana-warn-layoff-notices"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/BVQrai1bwFszPO36n/builds/28DYZCv2te4RsBpqb/openapi.json
