APProjects/warn-act-notice-type-codes-crosswalk
WARN Act notice-type codes — the crosswalk Every US state publishes WARN Act layoff notices with a free-text column saying what kind of event it is. The statute recognises two: a plant closing and a mass layoff. Across 48 states that column contains 552 distinct exact strings (531 once you fold case). This dataset is the crosswalk: one row per raw string, how many notices carry it, which states emit it, and what it normalizes to. The finding that matters 520 of… See the full description on the dataset page: https://huggingface.co/datasets/APProjects/warn-act-notice-type-codes-crosswalk.
WARN Act notice-type codes — the crosswalk
Every US state publishes WARN Act layoff notices with a free-text column saying what kind of event it is. The statute recognises two: a plant closing and a mass layoff. Across 48 states that column contains 552 distinct exact strings (531 once you fold case).
This dataset is the crosswalk: one row per raw string, how many notices carry it, which states emit it, and what it normalizes to.
The finding that matters
520 of the 552 strings (94%) are used by exactly one state. Only 32 are shared across states at all.
There is no common vocabulary. CL means closure in Indiana and Wisconsin; Illinois fills the column with State; five states write WARN — the name of the statute — where the event type belongs. 372 strings appear on a single notice in the entire archive.
This is why "just parse the state files" does not converge: there is nothing to parse toward until someone reads all 48 vocabularies and keeps reading them as states change their exports.
Vocabulary by what it maps to
unknown is a real category, not a failure to try. It covers blanks, strings that name which statute applies rather than what happened (State, WARN, numeric record codes), and strings that name a cause (loss of contract, sale of company, COVID-19) rather than an event. Guessing these would manufacture thousands of false rows that no downstream user could detect.
The 12 most common strings
Files
- `data/notice_type_crosswalk.csv` — 552 rows:
raw_value,kind,permanence,reason,notices,n_states,states.
Covers all 61,374 notices in the archive as of 2026-09-21; rebuilt daily in the same pipeline run as the notices themselves, so the two can never disagree.
Limits — read before citing
- These are notices, not verified job losses. A WARN notice can be amended, rescinded, or never carried out.
- The mapping is conservative: anything that does not clearly say closing or layoff is left
unknownrather than guessed. permanenceis only populated where the state says so; most states do not.- Counts are of notices, not workers.
Related
- Daily US WARN notices (flagship) — the full normalized feed
- Plant closings vs mass layoffs — this mapping applied
- Site · Source and methodology
License CC-BY-4.0. Built from public state government records.
<!-- warn-feed:offer:start -->
A layoff record you can audit, not just download
This dataset is one cut of a single daily rebuild: 61,431 US WARN Act layoff notices from 48 state agencies, 1988 to today, one schema, no login, no delay, CC BY 4.0. Snapshot as of 2026-09-25; the files above are rebuilt every day, so the live count is the truth.
Several projects publish a current WARN scrape and two of them carry more rows than we do. None of them publish what the records used to say:
- 2,482 observed changes to already-published notices, logged daily since 2026-08-31.
data/revisions.csvrecords every field that differed between two consecutive daily builds — employee counts, effective dates, notice types, company names — with the old value, the new value and the date we saw it. We publish the observation and not the cause: a change is equally explained by the agency amending the notice or by our own parser improving, and we do not guess which (seedata/revisions.README.txt). A scrape that starts tomorrow cannot backfill any of it; it only exists if someone was watching. - 6,799 notices whose state agency page no longer lists them. Agencies take notices down. We keep them, flagged as archive-only, so a count you ran last year still reconciles.
- Point-in-time employer identity. The ticker crosswalk resolves a filer to the company as it existed at the time of the notice — Kmart, Sears Holdings, Symantec — not to whatever is on today's ticker file.
If you have to defend a number to an editor, a referee or a compliance reviewer, that provenance layer is the part you cannot rebuild yourself. How to cite this dataset →
Look something up right now — free, no signup, nothing to install. Check any employer or state against the last 180 days → It runs in your browser against these same files.
Building something with it? The same files are a free HTTP API — JSON and CSV, no key, no signup, access-control-allow-origin: * so fetch() works from a browser: endpoints, schema and curl examples →
Prefer a spreadsheet? One formula puts the last 90 days, the last 12 months or any single state into Google Sheets as a live range that refreshes itself — no signup, no add-on: the formulas, one per state → =IMPORTDATA("https://cdn.jsdelivr.net/gh/APVentureEngine/warn-act-notices@main/data/sheets/us-last-90-days.csv")
Backtesting, or citing a figure you published last month? Today's file has look-ahead and survivorship bias baked in: notices get amended after the fact and some rows are later deleted. The same table as it stood on any past day since 2026-08-30 — one immutable vintage per day, 25 so far, plus a first-appearance index giving the first and last day every notice id was in the file — is the point-in-time snapshot archive. Nobody can backfill it.
Need one industry only? The same filings, cut by an auditable employer-name rule (each row keeps the rule that fired): tech companies · hospitals & healthcare · retail store closings · restaurants & hotels · factory & plant closings · banks, insurance & finance · warehouses, trucking & logistics · all 20 sectors.
Or have it watch a list for you. Coming back to look is the part a CSV cannot do. WARN Watch — $49 for a year, one payment, nothing auto-renews, 14-day refund, no login: up to 500 employer names plus whole states, matched on every daily refresh, delivered to a private alert page + calendar (.ics) + RSS + an optional Slack / Discord / Teams webhook. Every alert carries that employer's whole filing history from the archive, which a keyword rule on an RSS feed cannot see. There is no built-in email — we do not claim one.
Not deciding today? Join the update list → — one email when a new dataset or tier is published; nothing promotional. A state added or a column renamed ships in the daily release instead, no address needed. The list is shared across APProjects datasets, holds an email address only, is run by Gumroad, and any message unsubscribes you. Rather give no address at all? Watch the repo's releases — GitHub notifies you on every daily republish, and a new state or changed field is in those notes the day it lands.
Reaching a human. WARN Feed is published by APProjects, an automated data publisher — that is stated plainly rather than dressed up. Corrections, coverage gaps, schema questions and refund requests all go here and are read: open an issue. Payments are handled by Gumroad as merchant of record, so an invoice can carry your company name.
Source, scrapers and methodology · the 48-state site <!-- warn-feed:offer:end -->
<!-- warn-feed:px:start --> <img src="https://cdn.jsdelivr.net/gh/APVentureEngine/warn-act-notices@main/assets/px/hf/warn-act-notice-type-codes-crosswalk.png" width="1" height="1" alt=""> <sub>Card views are counted anonymously: one 1×1 image on a public CDN, no cookies, no script, no personal data. The count is public: <a href="https://data.jsdelivr.com/v1/stats/packages/gh/APVentureEngine/warn-act-notices@main/files?period=month">jsDelivr stats</a>.</sub> <!-- warn-feed:px:end -->
