WARN layoff notices scraper - CA, TX, NY, PA + 16 more states
Pricing
$10.00 / 1,000 warn notice rows
WARN layoff notices scraper - CA, TX, NY, PA + 16 more states
WARN layoff and closure notices from 20 US states' own published lists (CA IL NY AK AL ID MA MT NC ND NE NJ OR PA SD TN TX UT VA WA), normalised to one schema: employer, city, county, employees, notice date, effective date, notice type, source file. $10 per 1,000 rows, no run fee.
Pricing
$10.00 / 1,000 warn notice rows
Rating
0.0
(0)
Developer
RetrainMap Team
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
13 days ago
Last modified
Categories
Share
WARN notices scraper - layoff notices from 20 US states
Returns: one row per WARN layoff/closure notice from the state lists of California, Illinois, New York, Texas, Washington, Virginia, New Jersey, Alabama, Utah, Tennessee, South Dakota, Alaska, Nebraska, Massachusetts, Montana, North Carolina, Oregon, Pennsylvania, Idaho and North Dakota — employer, city, county, employees, notice date, effective date, notice type, source file and its server date.
Input: { "states": ["CA", "TX", "WA"], "max_records": 5000 } — all optional; empty {} reads CA, IL and NY.
Price: $10.00 per 1,000 rows ($0.01 per notice row). No run fee. Pay per event; no subscription. A state that cannot be read costs nothing.
Worker Adjustment and Retraining Notification (WARN) layoff and closure notices from the
lists that 20 states publish, normalised to one row schema: state, employer, city,
county, employees, notice_date, effective_date, notice_type, source_url,
file_last_modified — plus the extra columns each state publishes (address, ZIP, reason,
industry, NAICS, layoff schedule, notes). One row per notice or per affected site, as the
state lists it.
Nothing here decides anyone's eligibility. Whether a worker is covered by WARN, owed notice pay, or eligible for unemployment insurance or retraining aid is decided locally by the state agency, the local workforce board and, for WARN itself, the courts. The rows are the states' published lists — the agencies say they do not capture all layoff activity.
Sources, cadence and status
California, Illinois, New York (the default)
| State | File read on every run | Cadence | Status |
|---|---|---|---|
| CA | California EDD — Detailed WARN Report sheet of https://edd.ca.gov/siteassets/files/jobs_and_training/warn/warn_report1.xlsx (page: https://edd.ca.gov/en/jobs_and_training/Layoff_Services_WARN/) | The workbook says it is "updated every Tuesday and Thursday"; it covers the current reporting period (e.g. "07/01/26 to 08/31/2026"), which the row field source_period repeats | Public record of a state agency, published for public use |
| IL | Illinois DCEO monthly WARN workbooks linked from https://www.illinoisworknet.com/LayoffRecovery/Pages/ArchivedWARNReports.aspx (page: https://dceo.illinois.gov/workforcedevelopment/warn.html). The newest il_months_back workbooks are read (xlsx from March 2020; older months are PDFs and are not read) | Monthly | Public record of a state agency, published for public use |
| NY | New York State DOL WARN Dashboard data export — https://public.tableau.com/views/WorkerAdjustmentRetrainingNotificationWARN/WARN.csv (page: https://dol.ny.gov/warn-dashboard; NYS DOL: "As of 4/1/2025, WARN notices will no longer be posted to the database and can be found in the new WARN Dashboard") | Continuous (dashboard); the export covers the current year's notices | Public record of a state agency, published for public use |
Seventeen more states (twelve added 2026-09-10, Pennsylvania and North Carolina 2026-09-12, Montana, Idaho and North Dakota 2026-09-13)
Each is read from the page named in source_page. Row counts are what a live read returned on the
date shown in that state's row — they change as states add notices — so you can estimate a run's cost.
Changed 2026-09-13, if you hold rows from an earlier run of these states. A notice used to be
dropped when its notice_id matched one already read, and notice_id hashes employer, dates,
employees and city-or-address. Where a state files one notice per site, two sites of one
employer in one city on one day are identical in every one of those fields — so a real notice was
being deleted, silently (Idaho's 2012 Hostess Brands closure has two such rows in Boise). Repeats
are now judged on everything the state published, and a genuinely different notice that collides
keeps its own row under a suffixed id, stable across runs. A notice a state prints twice is still
pushed, and billed, once.
| State | What is read | Rows, on the date shown | Notes |
|---|---|---|---|
| AK | the notice table on https://jobs.alaska.gov/RR/WARN_notices.htm | 66 | history back to 2006 |
| AL | the WARN list table on https://workforce.alabama.gov/warn-list/ | 1,061 | history back to 1998; 12 rows the page prints twice are pushed once |
| MA | the four newest weekly CSVs linked from the mass.gov WARN updates page | 18 | recent weeks only; the state's region goes to notes. mass.gov sometimes answers a cloud server with HTTP 403 (seen once on 2026-09-10, and the retry 4 minutes later read all 18 rows); when that happens MA is listed in RUN_SUMMARY.failed_states and costs nothing, so run it again |
| ID | the cumulative WARN PDF linked from https://www.labor.idaho.gov/businesses/layoff-assistance/ (the page itself carries no list) | 200 (2026-09-13) | every notice Idaho has published since 2009, in one file the state replaces when it refreshes, so the link is read off the page and never hardcoded. Idaho publishes no county and no closure/layoff type, so both are null; it does publish a street address and ZIP for every site, which most states do not. Where a notice covers several sites the state prints one city per line in one cell ("Boise / Eagle / Nampa"): no city is set for those and the printed text goes to notes, because picking one would name a site the notice does not single out. National employers' notices print both figures ("22000 (102 in ID)") and the in-state number is the one read, because Idaho labels it itself; "80-100" and "TBD" leave employees empty with the text in notes. One notice per site, so a multi-site closure is several rows (the 2012 Hostess Brands closure is 17) |
| MT | the WARN workbook linked from https://wsd.dli.mt.gov/wioa/related-links/warn-notice-page (the page itself carries no list) | 46 (2026-09-13) | every notice Montana has published since 2015, in one small sheet. The file name carries the month DLI last refreshed it (warn_notices_july_2026.xlsx), so the link is read off the page, never hardcoded. Montana publishes no city and no closure/layoff type, so both are null; it does publish the industry of every employer, which almost no other state does, and the year each notice was filed under is in source_period. Where the state's own sheet prints something that is not a date or not a number, nothing is asserted: a staged impact ("5/22/2025, 5/29/2025, 6/5/2025") keeps the first date with the printed string in effective_date_text, while a range, a season ("Sept-April") or a truncated year ("12/31/202", "11/17/225") leaves the field empty with the text in notes — 45 of the 46 notices are dated and 42 carry a number, the rest say "up to 300" or "Not noted" in notes |
| NC | the current year's summary-list table, reached from https://www.commerce.nc.gov/data-tools-reports/labor-market-data-tools/workforce-warn-reports | 56 (2026-09-12) | current calendar year only — NC publishes 2014-2025 as PDF summary reports, not pages, and those are not read. A row is a location, not a notice: the state's own header reads "Number affected at this location", and one WARN number can print several rows (one 2026-03-19 notice covers six towns), so every location is kept. The state's notice number, the date it received the notice and whether the cut is permanent are in notes; source_period is the year read |
| ND | the cumulative WARN PDF linked from https://www.jobsnd.com/documents (the page itself carries no list) | 54 (2026-09-13) | every notice North Dakota has published since 2015, in one file. ND publishes no county and no closure/layoff type. Half its date cells are prose, and nothing is guessed from them: a range asserts no date (the readable half of a range is usually its end), and where the state prints two dates in the "WARN Dated" column the second becomes effective_date only where ND prints a word saying so ("7/21/2025 beginning 9/26/2025") — the unlabelled pairs keep the whole cell in notes instead, so you see both dates and decide. A headcount is read only where it is a plain number: "approx. 22,00 nationwide (14 reported in ND)" and "25+" leave employees empty with the text in notes. A location that is not one town ("Multiple sites", "Statewide", "Ross & Watford City, ND") sets no city and is kept as printed; notices at out-of-state sites affecting ND residents are kept as the state lists them. www.jobsnd.com refuses an unnamed client, so this state's requests identify the Actor by name in the User-Agent as well as the From: address |
| NE | the notice table on https://dol.nebraska.gov/ReemploymentServices/LayoffServices/LayoffsAndDownsizingWARN | 47 | |
| NJ | the three newest year sheets of https://www.nj.gov/labor/assets/PDFs/WARN/WARN_Notice_Archive.xlsx | 314 | NJ prints only the month a notice was posted: notice_date is null and the month is in source_period (e.g. "posted January 2026") — no day is invented |
| OR | the notice table on https://ccwd.hecc.oregon.gov/Layoff/WARN | 20 | the list includes employers whose address is outside Oregon, as printed |
| PA | the nested accordions on the pa.gov Department of Labor and Industry WARN page (no table, no data file) | 310 (2026-09-12) | notices from 2023 on. PA files each notice under a month and never prints the day it was received: notice_date is null, the filing month is in source_period ("posted September 2026") and effective_date is the date the state prints — the same rule as NJ. An effective date printed as a range keeps the first date, with the printed string in effective_date_text. Both date styles L&I uses are read — 2023's words ("March 31, 2023") and later years' 6/30/2024 — and effective_date is filled on 303 of the 310 notices. The 7 without one are notices where the state printed no full date (days with no year, "Beginning February/March 2024"), never a date we dropped; their text is in effective_date_text. A location block that is not one address (a multi-site notice, "Various remote locations throughout the Commonwealth") sets no city and is kept verbatim in notes |
| SD | the notice table on https://dlr.sd.gov/workforce_services/businesses/warn_notices.aspx | 80 | history back to 2007 |
| TN | the posting table on the tn.gov workforce reports page | 98 | county, not city |
| TX | the two newest yearly warn-act-listings workbooks linked from https://www.twc.texas.gov/data-reports/warn-notice | 388 | |
| UT | the notice table on https://jobs.utah.gov/employer/business/warnnotices.html | 282 | history back to 2009 |
| VA | the warn_notices CSV linked from https://virginiaworks.gov/im-an-employer/retain-and-grow/warn-notices/ | 1,123 | history back to 2010; the CSV's contact column is never read |
| WA | the WARN search grid at https://fortress.wa.gov/esd/file/WARN/Public/SearchWARN.aspx, paged newest first | 390 | notices from the last four years (about 26 result pages); source_url is the notice PDF |
notice_type is Closure or Layoff only where the state prints a type (AL, OR, PA, VA, WA);
otherwise it is null, and any other wording stays in notice_type_raw.
Copyright: the federal WARN Act materials are works of the United States Government and
not subject to copyright (17 U.S.C. §105). The state files are public records released by
state agencies for public use; the rows reproduce the facts they publish (employer, dates,
counts), and facts are not copyrightable. Please cite the page named in source_page.
Politeness: the plain Python-urllib User-Agent, the operator's contact address in the
standard From: header, at most one request per second (default). The default run is five
requests (CA file; IL archive page + two workbooks; NY export); all 13 added states together
are about 44 requests, most of them Washington's result pages. No browser impersonation:
states whose servers refuse this plain identity are not offered.
Layout guard
CA, IL and NY files are checked against the exact column layout measured on 2026-09-03 (the nine CA columns, the twenty IL columns, the twelve NY columns). If one of them changes its layout, the run fails with the expected and the found header — it never guesses a mapping.
The thirteen added states are matched by their header wording (Pennsylvania by its accordion markup,
which is described in src/more_states.py). A state whose source yields no
notice rows is treated as a changed layout, never as "no notices": it is listed in
RUN_SUMMARY.failed_states with the reason, pushes nothing and costs nothing, and the run
continues with the other states. The run fails only if no row at all was pushed.
Input
| Field | Type | Meaning |
|---|---|---|
states | array of CA IL NY AK AL ID MA MT NC ND NE NJ OR PA SD TN TX UT VA WA | Default CA, IL, NY; read in the order given |
max_records | integer | Default 5000. When it is reached the run stops, so states later in the list are not read |
il_months_back | integer 1–12 | Default 2: newest monthly Illinois workbooks to read |
request_interval_ms | integer | Default 1000 (floor 500) |
contact_email | string | Sent in the From: header |
Output (dataset row)
Common: state, employer, city, county, zip, address, employees, notice_date,
effective_date (ISO date when the file gives a date; otherwise null with the verbatim text in
effective_date_text, e.g. Illinois' "10/25/2026 or w/in 14 days after"), notice_type
(Closure Permanent, Layoff Temporary, ...; the raw wording in notice_type_raw), reason,
industry, source_url, source_page, source_period, file_last_modified (the server's
Last-Modified header when one is sent, otherwise null), fetched_at, notice_id (stable hash
of state, employer, dates, place and count — use it to de-duplicate across runs). Rows from the
thirteen added states also carry notes (Alaska notes, Tennessee notice type, Washington's type of
layoff, Massachusetts region).
notice_kind is initial for every CA and NY row and for the month's notices in Illinois;
Illinois workbooks also carry a second table, supplemental notices (amendments to earlier
notices: extra workers, changed dates), which come out as rows with notice_kind: "supplemental",
notice_type: "Supplemental", the agency's wording in supplemental_info, the original filing in
initial_notice_date, and employees = the additional workers affected. Both Illinois tables
have their own exact header guard, and the parser reconciles the month's rows with the sheet's own
"Total Layoff Events" / "Total Impacted" figures (recorded in RUN_SUMMARY). The added states do
not say whether a notice is initial or supplemental, so their notice_kind is null.
Per state: CA processed_or_posted_date; IL dba, ending_layoff_date, layoff_schedule,
naics, union, local_workforce_area, region, ceja_related, supplemental_info,
initial_notice_date; NY processed_or_posted_date, site_index.
Contact people, phone numbers and e-mail addresses are never read from any source, even where a state prints them.
A run summary (per-state counts, notice-date range, duplicates dropped, workbook labels, failed
states with the reason, request count) is stored as RUN_SUMMARY in the run's key-value store.
Pricing (pay per event)
| Event | Price |
|---|---|
warn-record — per row written | $0.01 |
The default run (about 190 CA rows, 100–150 IL rows for two months, 190 NY rows) costs about $5.
All thirteen added states together were 4,197 rows (3,887 on 2026-09-10 plus Pennsylvania 310 on
2026-09-12), about $42; pick states or set
max_records to spend less. Rows stop when your run's maximum charge is reached; the run
summary says so.
Operator
Steelyard Ventures LLC (RetrainMap) — info@steelyardclinical.com. The Actor writes only to its own dataset and key-value store; it stores no credentials and sends nothing else.