# US WARN Notices — 9 Largest States (`extensive_necklace_zmp/us-warn-notices`) Actor

WARN Act layoff & closure notices from the 9 largest publishing states (CA TX NY FL IL OH PA MI WA), each record with a link back to the official state source.

- **URL**: https://apify.com/extensive\_necklace\_zmp/us-warn-notices.md
- **Developed by:** [Glass Operations](https://apify.com/extensive_necklace_zmp) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$5.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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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 Notices — 9 Largest States

Get every current **WARN Act layoff and closure notice** from the nine
largest publishing states — **California, Texas, New York, Florida,
Illinois, Ohio, Pennsylvania, Michigan, Washington** — in one clean,
normalized dataset, pulled straight from each state's **official government
publication**, with a source link on every record.

WARN notices are the earliest public layoff signal there is: US employers
must file them with the state **60+ days before** a mass layoff or closure,
weeks before anything hits the news. Recruiters use them to reach affected
workers at filing time; B2B sales teams use them as churn/budget-change
signals; researchers get a clean multi-state layoff series with full
provenance.

### Why this actor

- **The 9 biggest WARN states in one run** — including the states other
  actors skip because their sources are genuinely hard: Florida's paged
  tables, Pennsylvania's accordion page, Michigan's search API, Washington's
  postback-paged grid, Ohio's constantly-moving CSV. Most WARN actors on the
  store cover 2–6 states, usually only the easy ones.
- **Official sources only.** Every record links back to the state
  publication it was parsed from (`source_url`), and to the underlying
  notice document where the state publishes one (`record_url` — FL/OH/MI
  attachments). Verify any row in one click. No third-party aggregators,
  no news scraping, no login, no personal data.
- **A format change never becomes silent garbage.** Every state's parser
  opens with a signature check on the source's own structure (exact CSV/
  table headers, required JSON keys). If a state agency redesigns its page,
  that one state **fails loudly and alone** — reported in `SOURCE_STATUS` —
  while the other states still return data. You will never quietly get
  wrong columns.
- **Honest metadata.** Pennsylvania publishes only the month a notice was
  received, so PA records carry `notice_date_precision: "month"` instead of
  a fabricated day. Employee counts are the states' own published figures;
  where a state left the field blank, it is `null`, not guessed.

### Input

| Field | Type | Default | Notes |
|---|---|---|---|
| `states` | array | all 9 | Any of `CA TX NY FL IL OH PA MI WA` |
| `sinceDays` | integer | 365 | Only notices dated within this window. `0` = everything each state currently publishes |
| `minEmployees` | integer | — | Keep notices affecting at least this many workers (notices with no published count are always kept) |
| `companySearch` | string | — | Case-insensitive substring match on employer name |
| `maxRecords` | integer | 10000 | Stop after this many records |

```json
{
  "states": ["TX", "OH", "MI"],
  "sinceDays": 90,
  "minEmployees": 100
}
```

### Output

One dataset item per notice:

```json
{
  "state": "CA",
  "state_agency": "California Employment Development Department (EDD)",
  "company": "Foundation for California Community Colleges",
  "location": "1102 Q Street, Suite 4800 Sacramento CA 95811; Sacramento County",
  "notice_date": "2026-09-02",
  "notice_date_precision": "day",
  "effective_date": "2026-10-30",
  "effective_date_raw": "",
  "employees_affected": 178,
  "action": "Layoff Permanent",
  "record_url": "",
  "source_url": "https://edd.ca.gov/en/jobs_and_training/Layoff_Services_WARN/",
  "fetched_at": "2026-09-05T17:26:31Z"
}
```

- `notice_date` — date the state received/posted the notice (`YYYY-MM-DD`).
- `notice_date_precision` — `day`, or `month` for PA (its listing groups by
  month received; such records carry the 1st of the month).
- `effective_date` — first layoff/closure date when it parses to a single
  clean day; `effective_date_raw` preserves the state's verbatim text when
  it doesn't (e.g. `"02-06-26 thru 03-13-26"`).
- `employees_affected` — the state's own figure; `null` where the state
  published none.
- `record_url` — per-notice document link where the state publishes one
  (FL/OH attachments, MI PDFs), else empty.

The run also writes **`SOURCE_STATUS`** to the key-value store: per-state
status (`ok`/`failed`), record/parse counts, timing, and a floor warning if
an unfiltered run returned suspiciously few records from a source.

### Per-state coverage (what each state actually publishes)

| State | Source | Window published | Notes |
|---|---|---|---|
| CA | EDD WARN report workbook | current CA fiscal year (Jul 1 onward) | file replaced in place as notices arrive |
| TX | TWC dataset on data.texas.gov | multi-year history | official state open-data API |
| NY | NYSDOL WARN dashboard export | what the dashboard exports | one row per impacted site |
| FL | FloridaCommerce REACT | current + prior calendar year | per-notice attachment links |
| IL | DCEO / Illinois workNet | trailing 12 months, active notices | completed layoffs age out of the state's own query |
| OH | ODJFS notices CSV | current + prior year | CSV URL changes on update; re-discovered every run |
| PA | L\&I WARN notices page | current + prior year | month precision (see above) |
| MI | LEO WARN notices | what the state's search returns | per-notice PDFs on older records |
| WA | ESD WARN search | multi-year grid, newest first | paged server-side; the actor walks the pages |

**Georgia is excluded, not missing by accident:** GA currently publishes no
machine-readable WARN listing at all (its legacy search app is retired and
the new site has no WARN page — checked directly). We don't guess.

### Honest limitations

- Coverage is these 9 states — the largest WARN publishers, not all 50.
  More states are added based on demand; ask in Issues.
- FL's listing has no location column (the location is inside the linked
  notice PDF) — FL `location` is empty and `record_url` carries the PDF.
- IL replicates the state app's own default query (active notices);
  completed layoffs age out. State-tracked layoffs *without* a WARN notice
  are deliberately excluded.
- Each state publishes a different history window (table above). `sinceDays`
  can only narrow what a state publishes, never extend it.
- A full unfiltered 9-state run takes ~2–4 minutes (Florida paginates
  server-side); a filtered or few-state run takes seconds.

### Typical usages

- **Weekly layoff feed:** schedule the actor weekly with
  `{"sinceDays": 8}` and pipe the dataset to your CRM/sheet — a clean feed
  of every new notice across all 9 states.
- **Recruiting in one state:** `{"states": ["OH"], "sinceDays": 90}`.
- **Account monitoring:** `{"companySearch": "amazon", "sinceDays": 730}`.

### Legality

WARN notices are public records that US states are required to publish
under the federal WARN Act. This actor reads only official government
publications: no logins, no paywalls, no personal data — records are at the
employer/site level.

# Actor input Schema

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

Which states to collect WARN notices from. Leave empty to collect all 9 supported states: California, Texas, New York, Florida, Illinois, Ohio, Pennsylvania, Michigan, Washington.

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

Only notices dated within this many days are returned. Set 0 to return everything each state currently publishes (states publish roughly 12–24 months; per-state windows are documented in the README).

## `minEmployees` (type: `integer`):

Only return notices affecting at least this many employees. Notices where the state published no count are always kept (dropping them would silently hide real layoffs).

## `companySearch` (type: `string`):

Case-insensitive substring match on the employer name. Leave empty for all companies.

## `maxRecords` (type: `integer`):

Stop after this many records across the whole run.

## Actor input object example

```json
{
  "states": [],
  "sinceDays": 365,
  "maxRecords": 10000
}
```

# Actor output Schema

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

No description

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("extensive_necklace_zmp/us-warn-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("extensive_necklace_zmp/us-warn-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 '{}' |
apify call extensive_necklace_zmp/us-warn-notices --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,extensive_necklace_zmp/us-warn-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/0DAvEoWPQXGmGDcK6/builds/QfDu9tftqCQXZEkVt/openapi.json
