Remulous LabsAPIs › LayoffLens

Labor · WARN Act

LayoffLens API

Normalized, source-linked U.S. WARN Act layoff and plant-closure notices from 29 states + DC. Track which employers are cutting jobs, where, and how many — with every record traceable back to its official state filing.

29 states + DC Daily ingest 2024–present (deeper archives for some states) Source-linked provenance

What you can build

One API instead of scraping 28 different state WARN portals, each with its own format and schedule — see the full comparison, or browse US layoffs by state.

Layoff monitoring & alerts

Watch a state or employer for new notices and trigger alerts when large layoffs are filed — newest-first, filterable by size.

Company & market research

Pull an employer's full WARN history across states, or aggregate notices by state and period to track labor-market stress.

M&A & investment due diligence

Screen acquisition targets and portfolio companies for workforce-stress signals before they reach press coverage — WARN notices typically lead headlines by weeks.

Workforce analytics platforms

Embed WARN data as a leading-indicator feed inside HR dashboards, headcount trackers, and labor-market intelligence tools — without building your own state scrapers.

Endpoints

Base URL https://layofflens-api.remulouslabs.com — proxied for you by RapidAPI. /v1/openapi.json and /healthz are open (no key).

GET/v1/notices

Filterable, paginated list of WARN notices (newest first).

GET/v1/notices/{id}

A single notice by its stable id (same shape as a list item).

GET/v1/companies/{name}/notices

All notices matching an employer name (normalized substring match) — one company across states and filings.

GET/v1/states/{state}/status

Per-state coverage and freshness — notice count, parse rate, latest notice date, last ingest run.

GET/v1/meta

Totals, counts by state, the covered-state list, and source attribution.

Parameters for /v1/notices

ParameterTypeDescription
statestring2-letter state code (e.g. TX).
employerstringSubstring match on the normalized employer name.
closure_typestringlayoff, closure, or unknown.
min_affectedintegerMinimum number of employees affected.
notice_from / notice_todateFilter by notice date (YYYY-MM-DD).
effective_from / effective_todateFilter by effective/layoff date.
limitintegerPage size (default 50; capped by plan).
offsetintegerPagination offset.

Try it

Your X-RapidAPI-Key comes from your RapidAPI subscription. Pick a language:

Request

curl -X GET "https://layofflens-warn-data-api.p.rapidapi.com/v1/notices?state=TX&min_affected=100&limit=2" \
  -H "X-RapidAPI-Key: YOUR_KEY_HERE" \
  -H "X-RapidAPI-Host: layofflens-warn-data-api.p.rapidapi.com"
const url =
  "https://layofflens-warn-data-api.p.rapidapi.com/v1/notices?state=TX&min_affected=100&limit=2";
const res = await fetch(url, {
  headers: {
    "X-RapidAPI-Key": "YOUR_KEY_HERE",
    "X-RapidAPI-Host": "layofflens-warn-data-api.p.rapidapi.com"
  }
});
const data = await res.json();
console.log(data.notices);
import requests

url = "https://layofflens-warn-data-api.p.rapidapi.com/v1/notices"
headers = {
    "X-RapidAPI-Key": "YOUR_KEY_HERE",
    "X-RapidAPI-Host": "layofflens-warn-data-api.p.rapidapi.com",
}
params = {"state": "TX", "min_affected": 100, "limit": 2}
data = requests.get(url, headers=headers, params=params).json()
print(data["notices"])

Response

{
  "count": 12,
  "limit": 2,
  "offset": 0,
  "filters": { "state": "TX", "min_affected": 100 },
  "notices": [
    {
      "id": "9f3a1c4b2e7d8a01",
      "employer": "Acme Logistics, Inc.",
      "employer_normalized": "acme logistics",
      "state": "TX",
      "city": "Houston",
      "county": "Harris",
      "num_affected": 230,
      "notice_date": "2026-06-08",
      "effective_date": "2026-08-08",
      "closure_type": "layoff",
      "temporary": false,
      "provenance": {
        "source": "TX-TWC",
        "source_url": "https://www.twc.texas.gov/.../warn-act-listings-2026-twc.xlsx",
        "parse_status": "parsed",
        "ingested_at": "2026-06-10T07:25:00+00:00",
        "filing_lag_days": 61,
        "date_anomaly": false
      }
    }
  ],
  "disclaimer": "Derived from official U.S. state WARN Act filings..."
}

Response fields

FieldNotes
idStable, deterministic identifier (dedupes re-ingested filings).
employer / employer_normalizedRaw and normalized company name.
parent_company / tickerReserved for entity resolution (usually null today).
state / city / county / addressLocation, where the source provides it.
num_affectedEmployees affected.
notice_dateDate the notice was given/received.
effective_dateLayoff/closure effective date (start of range, if a range is given).
closure_typelayoff, closure, or unknown.
temporary / uniontrue/false/null where stated.
reason / industryWhere the source provides them.
provenancesource, source_url, parse_status, parser, ingested_at, filing_lag_days, and date_anomaly.

Field availability varies by state — every state publishes a different subset. Use /v1/states/{state}/status and /v1/meta for the live, authoritative coverage map.

Coverage & freshness

29 states + DC

CA, TX, FL, IL, PA, OH, NJ, NC, WA, OR, CO, IN, AZ, MD, IA, SC, NM, UT, NE, AL, RI, SD, ME, DE, VT, ID, KS + Washington, DC — many of the largest U.S. labor markets, and expanding.

Daily ingest

Ingestion checks run daily, with per-state freshness exposed through /v1/states/{state}/status (latest notice date + last run).

Date range

2024–present is reliable on every covered state; most publish a rolling current + prior-year window, while a few (AL, SD) carry deeper archives back as far as 1998.

Source methodology

Each record is parsed from the official state WARN filing and normalized into one schema. The original file is linked as source_url — always verify against it before relying on a record.

Errors & usage

StatusMeaning
200Success.
400Invalid parameter (e.g. malformed date, bad closure_type).
404No notice / employer found.

Data & usage notes

  • Derived from official state WARN filings and provided as is — filings may contain errors, amendments, late filings, or duplicates. Verify against source_url.
  • Informational / transparency use only — not legal or investment advice.
  • Prohibited: FCRA-regulated decisioning and individual-level eligibility decisions (credit, insurance, employment, tenant screening), and bulk resale as a competing dataset. See Terms of Use.

Frequently asked questions

Common questions about WARN data, coverage, and the API.

What is a WARN notice?

The Worker Adjustment and Retraining Notification (WARN) Act requires US employers with 100 or more employees to provide at least 60 days' advance notice before a mass layoff or plant closure. Each notice is filed with the relevant state agency, which publishes it publicly. LayoffLens ingests, normalizes, and exposes these notices through a REST API.

Which states does LayoffLens cover?

29 states plus Washington DC. Coverage is limited to jurisdictions whose agencies publish machine-readable WARN data. The full list of covered states is returned by GET /v1/meta.

How current is the data?

Notices are ingested daily. Most records appear within one to three business days of a state agency publishing them. Each record includes an ingested_at timestamp so you can verify freshness.

What fields does the API return?

Each notice includes employer, state, city, county, num_affected, notice_date, effective_date, closure_type (layoff or plant closure), and a provenance block containing source, source_url, and ingested_at linking back to the official state filing.

How do I filter notices by state or employer?

Pass state (two-letter code) or employer (partial string) as query parameters on GET /v1/notices. You can also filter by closure_type, min_affected, and date ranges using notice_from, notice_to, effective_from, and effective_to.

Does LayoffLens have a free tier?

Yes. The free tier on RapidAPI requires no credit card and includes a fixed number of monthly requests. Paid plans increase the monthly call limit; all plans return the same full dataset and fields.

Start querying WARN data

Free tier on RapidAPI — no credit card to start. Every plan returns the same full data; plans differ only by monthly call volume.