WARN Layoff Notices Scraper - Layoffs & Closures, 22 US States
Pricing
$5.00 / 1,000 warn notices
WARN Layoff Notices Scraper - Layoffs & Closures, 22 US States
Collect official WARN Act layoff and plant-closure notices from 22 US state labor departments in one normalized dataset: company, location, employees affected, notice and layoff dates, closure or layoff, industry.
Pricing
$5.00 / 1,000 warn notices
Rating
0.0
(0)
Developer
Cobi Hilliard
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
WARN Notice Scraper: US layoff and plant closure notices from 22 states
Collect official WARN Act layoff and closure notices straight from 22 US state labor departments and get them back in one normalized dataset: company, city, county, employees affected, notice date, layoff date, closure or layoff, reason and industry. Every state publishes WARN data in a different format (Excel files, CSVs, Google Sheets, HTML tables, dashboards); this actor reads them all and gives you the same clean fields for each. No login and no API key.
Built for sales and account intelligence, recruiting, journalists, researchers and investors who want to know which companies are cutting jobs, where, and how many, usually 60 days before it happens.
What data you get
- State, company name as filed, and a normalized company name (legal suffixes, "Updated" markers and DBA parts removed) for matching and CRM enrichment
- Location: street address, city, county and ZIP where the state publishes them
- Employees affected as a number
- Notice date (when the employer notified the state), received date and the layoff / closure start date, all ISO 8601
- Closure, layoff, relocation or reduced hours, plus temporary or permanent when the state says so
- Reason, industry and NAICS code where given
- Link to the official source and, for some states, to the notice PDF
companyDomain: no state publishes the employer's website, so this isnullfor almost every notice. It is only filled when the company name itself contains a domain (e.g. "Noble.com, LLC"). It is never guessed and no paid lookup is used. Match oncompanyNameNormalizedinsteadraw: the original source row, so nothing the state publishes is lost (personal contact columns are removed)
Sample result
{"id": "093ca49209c67f23","state": "NY","companyName": "SYPartners, LLC","companyNameNormalized": "SYPartners","companyDomain": null,"address": "395 Hudson Street 8th Floor New York, NY, 10014","city": "New York","county": "New York","zip": "10014","employeesAffected": 31,"noticeDate": "2026-10-02","noticeDatePrecision": "day","receivedDate": "2026-10-06","effectiveDate": "2026-12-31","closureOrLayoff": "layoff","permanence": "permanent","noticeType": "Layoff Permanent","reason": "Economic","industry": null,"naicsCode": null,"sourceUrl": "https://dol.ny.gov/warn-dashboard","noticeDateIsFuture": false,"raw": { "Business Legal Name": "SYPartners, LLC", "Date of WARN Notice": "2026-10-02", "Number of Affected Workers": "31", "...": "..." },"scrapedAt": "2026-10-23T01:16:54.206Z"}
All output fields
| Field | Description |
|---|---|
id | Stable ID of the notice (hash of state, company, date, place and headcount) |
state | Two-letter state code |
companyName / companyNameNormalized | Name as filed / cleaned name for matching |
companyDomain | Domain only when it is literally part of the company name, so null on almost every notice. Never guessed |
address, city, county, zip | Location of the affected site, where published |
employeesAffected | Number of workers affected (number) |
noticeDate | Date of the notice (falls back to the date the state received or posted it) |
noticeDatePrecision | day, or month when the state only publishes the month (New Jersey, some Pennsylvania rows): the date is then the 1st of that month, and the notice is kept when that month overlaps your window, so its noticeDate can be earlier than noticeDateFrom |
noticeDateIsFuture | true when the state lists a notice date later than the day of the run (a typo or a post-dated filing). The row is kept exactly as published |
receivedDate | Date the state received or processed the notice, if different |
effectiveDate | First layoff or closure date. effectiveDateText keeps the original text when it is a range or phased schedule, and is null when the state gives one plain date |
closureOrLayoff | closure, layoff, relocation, reduced hours or null when the state does not say |
permanence | permanent, temporary or null |
noticeType | The state's own type text or code |
reason, industry, naicsCode | When the state publishes them |
sourceUrl, noticeUrl | Official source and, where available, the notice document |
raw | Original row from the source |
States covered
| State | Official source | Format | History available |
|---|---|---|---|
| California | EDD WARN | XLSX | Current fiscal year (from July 1) |
| Colorado | CDLE WARN list | Google Sheet (CSV) | Current year |
| Connecticut | CT DOL document library | JSON metadata | Latest 500 notices |
| Florida | FloridaCommerce WARN | HTML table, per year | Multiple years |
| Georgia | TCSG WARN public view | JSON + HTML entry pages | Since 2023 |
| Illinois | Illinois workNet | XLSX export | Full IEBS history |
| Indiana | DWD current WARN notices | HTML table | Since 2008 |
| Iowa | IWD WARN notices | XLSX event log | Since Oct 2021 |
| Maryland | Maryland Labor WARN | HTML table, per year | Multiple years |
| Massachusetts | MassHire WARN updates | CSV + XLSX | Current and previous fiscal year |
| Michigan | LEO WARN notices | JSON search feed | Latest 2,000 notices |
| New Jersey | NJ DOL WARN | XLSX, sheet per year | Multiple years (month-level dates) |
| New York | NY DOL WARN dashboard | CSV (Tableau Public) | Current year |
| North Carolina | NC Commerce WARN summary | HTML table | Current year |
| Ohio | ODJFS current notices | CSV | Current year |
| Oregon | HECC WARN | XLSX download | About ten years |
| Pennsylvania | PA L&I WARN notices | HTML | Since 2023 |
| Texas | TWC WARN notices | XLSX, per year | Multiple years |
| Utah | DWS WARN notices | HTML tables, per year | Multiple years |
| Virginia | Virginia Works WARN | CSV | Full list |
| Washington | ESD WARN | HTML table (paginated) | About 900 latest notices |
| Wisconsin | DWD WARN | Google Sheet (CSV) | Full list |
Coming soon: Alabama, Alaska, Arizona, Arkansas, Delaware, District of Columbia, Hawaii, Idaho, Kansas, Kentucky, Louisiana, Maine, Minnesota, Mississippi, Missouri, Montana, Nebraska, Nevada, New Hampshire, New Mexico, North Dakota, Oklahoma, Rhode Island, South Carolina, South Dakota, Tennessee, Vermont, West Virginia and Wyoming. Many of these publish only PDFs or scanned letters; they will be added as reliable sources are confirmed.
How to use
| Field | What it does |
|---|---|
states | States to include. Empty = all 22 supported states |
noticeDateFrom | Only notices on or after this date. YYYY-MM-DD or relative: 30 days, 6 months, 1 year. Default: last 30 days. Month-precision notices (NJ, some PA) are kept when their month overlaps the window |
companyNameContains | Keep only companies whose name contains this text, e.g. Amazon |
minEmployees | Keep only notices affecting at least this many workers |
maxItems | Stop after this many notices (newest first, default 100) |
proxyConfiguration | Datacenter proxy by default. State sites are public; if one state fails, try without proxy |
Example inputs:
{ "noticeDateFrom": "30 days", "maxItems": 500 }
{ "states": ["CA", "TX", "NY", "WA"], "noticeDateFrom": "90 days", "minEmployees": 100 }
{ "noticeDateFrom": "2026-01-01", "companyNameContains": "Starbucks", "maxItems": 50 }
Results are sorted newest first and deduplicated: when a state lists the same notice twice (for example in a
weekly file and a yearly archive, or once per repeated row), you get it once. Amended notices that change the
headcount or date are kept as separate rows. A per-state run report (rows parsed, rows in your window, failures) is
saved in the key-value store as STATE_SUMMARY. If one state's website is down, the run continues with the others.
Pricing
$5 per 1,000 notices, charged only for notices saved to your dataset. A typical "last 30 days, all states" run
returns 150 to 300 notices and costs about $0.75 to $1.50. Use maxItems to cap the cost.
Use cases
- Sales and account intelligence: spot companies restructuring, closing sites or relocating, and time outreach for outplacement, staffing, real estate, equipment or advisory services
- Recruiting: find pools of experienced workers in a city or industry before the layoff date
- Journalism and research: track layoffs by state, industry or employer over time
- Investors and analysts: an early signal of cost cutting and plant closures at public and private companies
- Clay, n8n, Make and Zapier workflows: run daily with
noticeDateFrom: "2 days"and push new notices into your CRM, a spreadsheet or Slack
FAQ
Is it legal? Yes. WARN notices are public records that states publish for anyone to read. The actor only reads those official public pages and files, without logging in, and drops personal contact details (names, phones, emails of employer contacts) from the output. You are responsible for how you use the data.
Why does the log say a state was skipped? Some state sites sometimes refuse requests from cloud servers (Ohio and Texas have done this). The actor then skips that state, finishes the rest, and lists the skipped states at the end of the log. You are only charged for notices actually saved. Run it again later to pick up the skipped state.
Why do some fields come back empty? Each state publishes different columns. Texas, for example, gives no layoff
type and Massachusetts no county. The actor never invents values: empty means the state did not publish it. The
original row is always in raw.
Why is a New Jersey date always the 1st of the month? New Jersey only publishes the month a notice was posted.
Those rows have noticeDatePrecision: "month" and are included whenever that month overlaps your date window. For
example, with noticeDateFrom 2026-09-23, a notice posted in September 2026 is included with noticeDate
2026-09-01. Filter on noticeDatePrecision if you only want exact days.
How fresh is the data? As fresh as the state's own page; most states update weekly or several times a week. Some
states post notices with a delay, and occasionally a state lists a notice with a future date exactly as filed. Those rows are kept and
flagged with noticeDateIsFuture: true.
Can I run it on a schedule? Yes. Use Apify Schedules for a daily or weekly run and connect the dataset to Google Sheets, Slack, a webhook, Clay or n8n through Apify integrations.
Integrations / API
1. Weekly layoff alert for your sales territory (n8n → Slack)
Get a Slack message every Monday listing companies in your states that filed WARN notices for 50+ workers.
- Schedule Trigger: every Monday at 08:00.
- Apify node: Run an Actor and get dataset items (or an HTTP Request node, see below). Actor
wakachobi~warn-layoff-notices, input:{ "states": ["CA", "WA", "OR"], "noticeDateFrom": "7 days", "maxItems": 500 } - Filter:
{{ $json.employeesAffected }}≥ 50. - Slack: message text
{{ $json.companyNameNormalized }} ({{ $json.city }}, {{ $json.state }}): {{ $json.employeesAffected }} workers, {{ $json.closureOrLayoff }} from {{ $json.effectiveDate }}. {{ $json.sourceUrl }}
Cost: a week of notices for 3 states is usually a few dozen results, i.e. cents per run.
2. Flag target accounts that are cutting jobs (Clay)
Use this to mark accounts in a Clay table that recently filed a WARN notice, for recruiting (talent becoming available) or for sales (a churn or vendor-change signal).
- In a new Clay table: Import → Pull Data from Apify Actor. Pick WARN Notice Scraper with input
{ "states": ["NY","NJ","MA"], "noticeDateFrom": "90 days" }. Set it to refresh weekly. - In your accounts table, add a Lookup column that matches your company name against the WARN table's
companyNameNormalized. That field drops legal suffixes ("Inc.", "LLC") and "Updated" markers, so "Acme Holdings, Inc." matches "Acme Holdings". - Bring back
employeesAffected,noticeDateandeffectiveDate, and filter the table to rows that matched.
3. Plain API call (any tool, script or spreadsheet)
curl -X POST "https://api.apify.com/v2/acts/wakachobi~warn-layoff-notices/run-sync-get-dataset-items?format=csv" \-H "Authorization: Bearer $APIFY_TOKEN" -H "Content-Type: application/json" \-d '{ "states": ["TX"], "noticeDateFrom": "30 days", "maxItems": 1000 }' -o texas-warn.csv
Credits
Source discovery for several states was informed by the open-source biglocalnews/warn-scraper project by Big Local News at Stanford. This actor is an independent implementation.