OrbTop

WARN Layoffs Scraper - Multi-State Layoff & Closure Notices

BUSINESSLEAD GENERATIONJOBS

WARN Layoffs Aggregator — Multi-State WARN Act Notice Scraper

Aggregate WARN Act layoff and closure notices across US state labor agencies into a single normalized dataset. Currently federates California EDD, New York DOL, and Maryland DLLR — three different formats (XLSX, multi-page HTML, single-page HTML) collapsed into one schema with employer, location, dates, affected worker counts, and layoff type.


WARN Layoffs Aggregator Features

  • Pulls WARN notices from CA, NY, and MD in one run
  • Normalizes three different source formats — XLSX from California, HTML tables from New York, a single HTML page from Maryland — into one consistent schema
  • Filters by notice date range, minimum affected workers, and plant-closures-only
  • Classifies each notice as layoff, closure, furlough, or other while keeping the raw source string for reference
  • Stable notice_id per (state, employer, notice_date, effective_date) so dedupe across runs is trivial
  • Pure HTTP scraping — no browser, no proxies needed
  • Pay-per-event pricing at roughly $0.001 per notice

Who Uses WARN Layoff Data?

  • Recruiters and outplacement firms — surface mass layoffs early to source candidates and pitch services
  • Financial analysts and short sellers — track distress signals across portfolio companies and industries
  • Labor researchers and policy teams — build longitudinal datasets on plant closures by state, county, or sector
  • Journalists — monitor new filings for reporting leads on closures, furloughs, and large reductions in force
  • Economic development offices — track employer activity in their jurisdiction without re-implementing three different parsers

How WARN Layoffs Aggregator Works

  1. You pick states. Pass ["CA", "NY", "MD"] for everything supported, or a subset. Leave the field empty and it pulls all of them.
  2. The aggregator dispatches to the right parser per state — California publishes XLSX files, New York publishes one HTML page per fiscal year, Maryland keeps everything on a single table — and pulls the raw notices.
  3. Each notice gets normalized into the shared schema, run through your filters (date range, minimum workers, closure-only), and saved. Output is identical regardless of which state it came from.

Input

Default — all three states, recent notices

{
  "states": ["CA", "NY", "MD"],
  "noticeDateFrom": "2024-01-01",
  "maxItems": 100
}

Filter to large layoffs only

{
  "states": ["CA"],
  "minAffectedWorkers": 250,
  "maxItems": 50
}

Plant closures only, single state

{
  "states": ["NY"],
  "onlyClosures": true,
  "noticeDateFrom": "2023-01-01",
  "maxItems": 200
}

Input Parameters

Field Type Default Description
states string[] ["CA","NY","MD"] Two-letter state codes. Leave empty to pull all supported states. Supported in v1.0: CA, NY, MD.
noticeDateFrom string "2024-01-01" YYYY-MM-DD lower bound on notice date. Empty for no lower bound.
noticeDateTo string "" YYYY-MM-DD upper bound on notice date. Empty for no upper bound.
minAffectedWorkers integer 0 Drop notices below this worker count. 0 disables the filter.
onlyClosures boolean false Restrict output to plant closures (excludes mass layoffs and reductions in force).
maxItems integer 100 Maximum notices to return across all states combined.
proxyConfiguration object {useApifyProxy: false} WARN portals don't require proxies. Leave disabled unless you see geo-block errors on a particular state.

WARN Layoffs Aggregator Output Fields

{
  "notice_id": "9c8f238123cbc6fe",
  "source_state": "CA",
  "source_url": "https://edd.ca.gov/siteassets/files/jobs_and_training/warn/warn_report1.xlsx",
  "employer_name": "Republic National Distributing Company",
  "employer_address": "30825 Wiegman Road",
  "city": "Hayward",
  "county": "Alameda County",
  "state": "CA",
  "zip": "94544",
  "notice_date": "2025-07-01",
  "effective_date": "2025-09-02",
  "affected_workers": 104,
  "layoff_type": "closure",
  "layoff_type_raw": "Closure Permanent",
  "closure_permanent": true,
  "region": "",
  "scraped_at": "2026-04-25T23:08:41.544Z"
}
Field Type Description
notice_id string Stable hash of (state, employer, notice_date, effective_date). Use it as a primary key for dedupe across runs.
source_state string Two-letter state code identifying which agency the notice came from.
source_url string URL of the listing page or source document the notice was parsed from.
employer_name string Filing employer's legal or DBA name as printed on the notice.
employer_address string Street address of the layoff or closure site, when reported.
city string City of the layoff or closure site.
county string County or region, when the source provides it.
state string Two-letter state code of the layoff site.
zip string ZIP/postal code, when reported.
notice_date string Date the WARN notice was issued or posted (YYYY-MM-DD).
effective_date string Date the layoff or closure takes effect (YYYY-MM-DD).
affected_workers number Number of workers affected.
layoff_type string Normalized type: layoff, closure, furlough, or other.
layoff_type_raw string Raw type/classification string as printed by the source — useful when the normalized value loses nuance.
closure_permanent boolean True when the notice indicates a permanent closure or non-recall layoff.
region string Sub-state region (e.g. NY Hudson Valley, Long Island) when the source supplies one.
scraped_at string ISO-8601 UTC timestamp of when this record was scraped.

FAQ

How do I scrape WARN Act notices across multiple states?

WARN Layoffs Aggregator handles this. Pass the state codes you care about (or leave them empty for all supported states) and it returns one normalized dataset. No state-specific parsing on your end.

How much does WARN Layoffs Aggregator cost to run?

WARN Layoffs Aggregator uses pay-per-event pricing: $0.10 per actor start plus $0.001 per record. A run that pulls 500 notices across CA, NY, and MD costs about $0.60.

Which states are supported?

WARN Layoffs Aggregator covers California, New York, and Maryland in v1.0. Adding a new state is a one-file change in the source registry — file an issue if you need a specific jurisdiction and we'll prioritize it.

Does WARN Layoffs Aggregator need proxies?

No. State labor agency portals are public and don't require residential proxies. The default proxy configuration is disabled. Enable it only if a particular state's portal starts geo-blocking.

Can I filter by layoff type or company size?

Yes. Set minAffectedWorkers to drop small layoffs and onlyClosures to filter to permanent plant closures only. Combine both for a clean signal on large permanent shutdowns.

How fresh is the data?

WARN Layoffs Aggregator pulls live from each agency's portal on every run. California publishes weekly, New York and Maryland update on rolling cadences. Run nightly if you want continuous coverage.


Need More Features?

Need a state we don't yet support, additional fields, or custom filters? File an issue or get in touch.

Why Use WARN Layoffs Aggregator?

  • One schema, three states — California's XLSX, New York's HTML tables, and Maryland's single page collapse into one normalized output, so you don't write three parsers.
  • Affordable — Roughly $0.001 per notice, which is cheaper than the time you'd spend reconciling source-specific date formats and column names.
  • Stable record IDs — Every notice gets a deterministic notice_id, so re-running the actor lets you upsert into a database without dedup logic.