CoolFace
Datasetpublic

APProjects/us-layoffs-by-metro-area-msa-warn-act

US layoffs by metro area: 54,170 WARN notices mapped to 765 metro and micro areas Rebuilt 2026-09-23. 765 of the 935 US core-based statistical areas carry at least one layoff notice on record — 361 metropolitan and 404 micropolitan. Nobody hires, sells or reports by county. A recruiter covers Austin; an account team books the Phoenix metro; a reporter writes Bay Area layoffs. State agencies publish neither — they publish the site of a layoff as free text in 48 different… See the full description on the dataset page: https://huggingface.co/datasets/APProjects/us-layoffs-by-metro-area-msa-warn-act.

sourceHugging Facecc-by-4.0updated 2h agoView on Hugging Face
0likes652downloads
Dataset Card

US layoffs by metro area: 54,170 WARN notices mapped to 765 metro and micro areas

Rebuilt 2026-09-23. 765 of the 935 US core-based statistical areas carry at least one layoff notice on record — 361 metropolitan and 404 micropolitan.

Nobody hires, sells or reports by county. A recruiter covers Austin; an account team books the Phoenix metro; a reporter writes Bay Area layoffs. State agencies publish neither — they publish the site of a layoff as free text in 48 different conventions (Los Angeles County, San Jose, Santa Clara, Chicago, 560 W. Grand Ave., Reynoldsburg/Franklin). This dataset does the two joins that turn those strings into the geography people actually work in: text to a 5-digit county FIPS, then county to a CBSA code from the OMB / Census July-2023 delineation.

54,170notices placed in a metro or micro area (97.2% of the 55,713 that resolve to a county)
765 / 935CBSAs with at least one notice on record
5,862most-hit metro: New York-Newark-Jersey City, NY-NJ — 631,813 workers, 4,628 employers
86.91highest rate per 100k residents: San Jose-Sunnyvale-Santa Clara, CA (1,691 notices, pop 1,945,767)
1,543notices in counties inside no CBSA at all — rural layoffs, reported not dropped

[image]

Top 12 CBSAs by notices on record, 2026-09-23. Counts are notices, not workers.

[image]

Notices per 100,000 residents, CBSAs over 250,000 population only — a small metro with two notices would otherwise top any per-capita table. Population is the Census 2023 estimate summed over the CBSA's delineation member counties.

What is in it

data/metro_summary.csv — one row per CBSA (765 rows):

cbsa_code, cbsa_title, cbsa_type (metro / micro), states, notices, workers_reported, notices_with_workers, employers, counties_with_notices, counties_in_cbsa, population_2023, notices_per_100k, workers_per_100k, first_notice, last_notice.

data/warn_notices_by_metro.csv — one row per notice (54,170 rows), carrying both geographies and both resolution methods so you can audit every assignment: id, state, cbsa_code, cbsa_title, cbsa_type, csa_code, csa_title, county_fips, county_name, metro_method, county_resolution_method, company_canonical, notice_date, effective_date, employees_affected, location_raw.

data/metro_per_capita.csv — the rate table, CBSAs over 250,000 population.

metro_resolve.py and county_resolve.py — the actual resolvers, shipped inside the dataset so the method can never 404. Standard library only, no API keys, no paid reference data.

How a row is assigned, and what we refuse to guess

`metro_method`noticesmeaning
cbsa_county53,342the notice's county is a member of that CBSA in the July-2023 delineation - exact
ct_legacy_county828Connecticut only: legacy county FIPS mapped to the CBSA covering most of its territory (CT replaced counties with planning regions in 2022) - approximate at the edges, flagged on every row
outside_cbsa1,543the county belongs to no CBSA: a genuinely rural layoff, reported and not dropped
no_county5,666the notice text never names a place ("Statewide", "Remote", blank), so no county and no metro is possible

Every assignment is auditable from the row itself: location_raw is the agency's original text, county_resolution_method records how it became a county, metro_method how that county became a metro. Drop anything you distrust with one filter.

The honest limits, stated before you find them.

  • Connecticut. CT abolished county government; federal statistics now use nine planning regions (FIPS 09110-09190). Our notices carry legacy CT county FIPS because that is what the CT agency's text resolves to, so 828 CT notices are mapped through a documented legacy-county table and flagged ct_legacy_county. Waterbury was carved out of New Haven County and Windham County is split between two regions, so those edges are approximate. Filter the flag to exclude them.
  • 5,666 notices can never be placed — they say only "Statewide", "Remote", "Various" or nothing at all. They are counted in the totals and excluded from every geography.
  • A notice is an employer filing, not a headcount. employees_affected is blank on some notices; notices_with_workers tells you how many rows in a CBSA carried a number.
  • Delineation vintage is July 2023. CBSA boundaries change; a notice from 1988 is assigned to today's metro definition, which is the right behaviour for "what is happening in my market" and the wrong one for a historical-boundary study.
  • Per-capita rates use a 250,000 population floor. Below that, one notice swings the rate by tens of points.

Where it comes from and how often it moves

Built from 61,379 WARN Act notices from 48 state workforce agencies, rebuilt daily — the free archive is at https://github.com/APVentureEngine/warn-act-notices and the site is https://approjects-warn-act-notices.static.hf.space. Companion cuts: county FIPS · per-notice feed · employer layoff history.

WARN (Worker Adjustment and Retraining Notification Act) requires employers to file advance notice of mass layoffs and plant closings. Each state publishes its own file in its own format, and most publish no history at all — which is why the archive, not the current quarter, is the asset here.

Licence and citation

CC BY 4.0. Use it commercially, redistribute it, build products on it. Attribution:

US layoffs by metro area (WARN Act notices), APProjects, 2026-09-23. https://huggingface.co/datasets/APProjects/us-layoffs-by-metro-area-msa-warn-act

Reference geography is US Census Bureau / OMB, public domain.

If you want this watched for you

The data is free and always will be. If you would rather not run the join yourself, WARN Watch (https://approj.gumroad.com/l/warn-watch, $49/year, 14-day refund) matches your list of up to 500 employers against every new filing in 48 states and tells you the day it lands — including a reminder 14 days before separation. There is a no-card 30-day trial: https://approj.gumroad.com/l/warn-free-watch.

Found a bad metro assignment? Open an issue on the repo with the id — corrections ship the same day and the fix is permanent for everyone.

<!-- warn-feed:offer:start -->

A layoff record you can audit, not just download

This dataset is one cut of a single daily rebuild: 61,379 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-23; 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:

  • 702 observed changes to already-published notices, logged daily since 2026-08-31. data/revisions.csv records 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 (see data/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, 23 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/us-layoffs-by-metro-area-msa-warn-act.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 -->