# US WARN Layoff Monitor 🇺🇸 (plant closings & mass layoffs) (`tagadanar/us-warn-layoffs`) Actor

Every new US WARN Act layoff and plant-closing notice from state workforce agencies, normalized to one clean schema: company, location, employees affected, notice and layoff dates. Filter by state, keyword and size; monitor mode alerts on only-new notices with a Slack digest.

- **URL**: https://apify.com/tagadanar/us-warn-layoffs.md
- **Developed by:** [Tagada Data](https://apify.com/tagadanar) (community)
- **Categories:** Lead generation, Automation, News
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.50 / 1,000 notice founds

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/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/docs.md):

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

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.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/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

## US WARN Layoff Monitor

Track US layoffs and plant closings the day the notice is filed. Under the WARN
Act, employers must give advance notice of mass layoffs and closures to their
state, and each state publishes those notices. This actor reads them straight
from the state workforce agencies and returns every notice as one clean row:
the company, where it is, how many jobs are affected, and the notice and layoff
dates. Every state uses different columns and file formats; this actor
normalizes them all to the same schema so you can work with one dataset instead
of fifty.

No API key. You only pay for notices you actually get back.

### Who uses this

- **Recruiters and staffing firms** reaching soon-to-be-available talent before
  anyone else does.
- **Outplacement and career-transition providers** finding affected employers
  the week the notice lands.
- **Investors and analysts** reading layoffs as a distress and macro signal,
  company by company.
- **B2B sales and RevOps** watching for accounts in change, and for new
  prospects in a region.
- **Journalists and researchers** who want the raw WARN record as tidy data.

### What you get

One record per WARN notice:

| Field | Description |
| --- | --- |
| `company` | Employer named on the notice |
| `state` / `stateCode` | Which state filed it |
| `city`, `county`, `address`, `zip` | Where the layoff happens, as detailed as the state publishes |
| `affectedEmployees` | Number of jobs affected |
| `noticeDate` | Date the notice was filed |
| `effectiveDate` | Date the layoff or closure takes effect |
| `layoffType` | Layoff, closure, temporary furlough etc., as the state classifies it |
| `industry` | Industry or NAICS, where the state provides it |
| `sourceUrl` | The state page the record came from |
| `isNew` | In monitor mode, whether the notice is new since the last run |

### Covered states

California, New Jersey, Maryland, Indiana, Alaska, South Dakota and the District
of Columbia, with more states being added. Leave the `states` input empty to
pull them all, or pick a subset.

### Input examples

Recent layoffs in California and New Jersey affecting 50+ people:

```json
{
  "states": ["CA", "NJ"],
  "sinceDays": 30,
  "minAffected": 50
}
````

Everything filed in the last week, all states:

```json
{
  "sinceDays": 7
}
```

Scheduled monitor that posts new manufacturing layoffs to Slack:

```json
{
  "keywords": ["manufacturing"],
  "sinceDays": 3,
  "monitorMode": true,
  "webhookUrl": "https://hooks.slack.com/services/XXX/YYY/ZZZ"
}
```

### How monitor mode works

Turn on `monitorMode` and schedule the actor (daily is typical). The first run
records what is already published as a baseline. Every run after that returns,
and charges for, only notices that are new since the previous run, and posts
them to your webhook if you set one. A daily run costs you a handful of new
notices, not the whole archive each time.

### Pricing

Pay per event, no subscription. Users on higher Apify plans get automatic discounts.

| Event | Price | When |
|---|---|---|
| Run started | **$0.005** | Flat, once per run |
| Notice found | **$0.005** | Per new/matched WARN notice returned with its data |
| Digest sent | **$0.03** | Monitor mode only, per Slack/webhook digest actually posted |

A thousand notices costs $5, platform usage included. In monitor mode the persistent seen-set means you are never billed twice for the same notice, so a quiet scheduled run only pays the small run fee.

### FAQ

**Where does the data come from?** Each state's own workforce-agency WARN page.
These are public records the states are required to publish.

**Why only these states?** Every state publishes in a different format, from
clean spreadsheets to hand-maintained web pages, so each one is added
deliberately once its feed is normalized reliably. The list grows over time.

**How complete is each notice?** As complete as the state publishes. Some
states give a full address and industry code; others give only company, count
and date. Missing fields are left empty rather than guessed.

**Do I need an API key or account?** No. Nothing to set up.

**How far back can I go?** Set `sinceDays` to a large number, or to `0` for each
state's full published history. A daily monitor only needs a few days.

***

WARN Act notices, layoff data, mass layoff monitor, plant closing notices, WARN
notice scraper, layoff tracker, state WARN database, workforce reduction alerts,
layoff leads, distressed company signal.

# Actor input Schema

## `states` (type: `array`):

Which states to collect WARN notices from. Leave empty for all supported states.

## `keywords` (type: `array`):

Only return notices matching these words (company name, city, county or industry). Leave empty to get every notice. Example: <code>Amazon</code>, <code>manufacturing</code>, or a county name.

## `sinceDays` (type: `integer`):

Only notices dated within this many days are returned. A daily scheduled run needs just 1-7 days; a first sweep can look back further. Set 0 to return the full published history of each state.

## `minAffected` (type: `integer`):

Only return notices affecting at least this many employees. Leave empty for all. Notices with no published count are always kept.

## `maxNotices` (type: `integer`):

Stop after this many notices across the whole run.

## `monitorMode` (type: `boolean`):

Remember notices already reported across runs and return only newly published ones. Built for a scheduled run: the first run sets the baseline, later runs report and charge for new notices only.

## `webhookUrl` (type: `string`):

When monitor mode finds new notices, post a text digest here (Slack incoming webhook or any endpoint accepting <code>{"text": "..."}</code> JSON).

## Actor input object example

```json
{
  "states": [
    "CA",
    "NJ",
    "MD"
  ],
  "keywords": [],
  "sinceDays": 90,
  "maxNotices": 1000,
  "monitorMode": false
}
```

# Actor output Schema

## `notices` (type: `string`):

One item per WARN notice in 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 = {
    "states": [
        "CA",
        "NJ",
        "MD"
    ],
    "sinceDays": 90,
    "maxNotices": 1000
};

// Run the Actor and wait for it to finish
const run = await client.actor("tagadanar/us-warn-layoffs").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 = {
    "states": [
        "CA",
        "NJ",
        "MD",
    ],
    "sinceDays": 90,
    "maxNotices": 1000,
}

# Run the Actor and wait for it to finish
run = client.actor("tagadanar/us-warn-layoffs").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 '{
  "states": [
    "CA",
    "NJ",
    "MD"
  ],
  "sinceDays": 90,
  "maxNotices": 1000
}' |
apify call tagadanar/us-warn-layoffs --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=tagadanar/us-warn-layoffs",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "US WARN Layoff Monitor 🇺🇸 (plant closings & mass layoffs)",
        "description": "Every new US WARN Act layoff and plant-closing notice from state workforce agencies, normalized to one clean schema: company, location, employees affected, notice and layoff dates. Filter by state, keyword and size; monitor mode alerts on only-new notices with a Slack digest.",
        "version": "0.1",
        "x-build-id": "PLcZ3uoqu22h8fB8e"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/tagadanar~us-warn-layoffs/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-tagadanar-us-warn-layoffs",
                "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/tagadanar~us-warn-layoffs/runs": {
            "post": {
                "operationId": "runs-sync-tagadanar-us-warn-layoffs",
                "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/tagadanar~us-warn-layoffs/run-sync": {
            "post": {
                "operationId": "run-sync-tagadanar-us-warn-layoffs",
                "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": {
                    "states": {
                        "title": "States",
                        "type": "array",
                        "description": "Which states to collect WARN notices from. Leave empty for all supported states.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "CA",
                                "NJ",
                                "MD",
                                "IN",
                                "AK",
                                "SD",
                                "DC"
                            ],
                            "enumTitles": [
                                "California",
                                "New Jersey",
                                "Maryland",
                                "Indiana",
                                "Alaska",
                                "South Dakota",
                                "District of Columbia"
                            ]
                        }
                    },
                    "keywords": {
                        "title": "Keyword watchlist (optional)",
                        "type": "array",
                        "description": "Only return notices matching these words (company name, city, county or industry). Leave empty to get every notice. Example: <code>Amazon</code>, <code>manufacturing</code>, or a county name.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "sinceDays": {
                        "title": "Look-back window (days)",
                        "minimum": 0,
                        "maximum": 3650,
                        "type": "integer",
                        "description": "Only notices dated within this many days are returned. A daily scheduled run needs just 1-7 days; a first sweep can look back further. Set 0 to return the full published history of each state.",
                        "default": 90
                    },
                    "minAffected": {
                        "title": "Minimum employees affected",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Only return notices affecting at least this many employees. Leave empty for all. Notices with no published count are always kept."
                    },
                    "maxNotices": {
                        "title": "Max notices",
                        "minimum": 1,
                        "maximum": 20000,
                        "type": "integer",
                        "description": "Stop after this many notices across the whole run.",
                        "default": 1000
                    },
                    "monitorMode": {
                        "title": "Monitor mode (alert on new notices only)",
                        "type": "boolean",
                        "description": "Remember notices already reported across runs and return only newly published ones. Built for a scheduled run: the first run sets the baseline, later runs report and charge for new notices only.",
                        "default": false
                    },
                    "webhookUrl": {
                        "title": "Webhook URL (Slack-compatible)",
                        "type": "string",
                        "description": "When monitor mode finds new notices, post a text digest here (Slack incoming webhook or any endpoint accepting <code>{\"text\": \"...\"}</code> JSON)."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
