General WARN Act Data & Coverage API Usage Exports & Downloads Pricing & Billing Account Technical

General

What is WARN Firehose? +
WARN Firehose is the most comprehensive WARN Act data aggregation platform. We scrape, normalize, and serve WARN Act layoff notices from all 50 US states through a modern REST API, interactive charts, and bulk data exports. Our automated pipeline runs daily to keep data fresh.
Who uses WARN Firehose? +
Our users include:
  • Journalists tracking mass layoffs and economic trends
  • Researchers studying labor economics, workforce development, and regional economies
  • Investors monitoring company restructuring and market signals
  • HR professionals benchmarking workforce reduction trends
  • Data scientists building predictive models and economic indicators
  • Government agencies monitoring workforce transitions in their jurisdictions
  • Job seekers looking for affected companies and regions
How is WARN Firehose different from other WARN trackers? +
Key differentiators:
  • Coverage: We scrape all 50 states (48 that publish data). Most trackers cover only a handful.
  • Freshness: Automated daily scraping vs. manual updates.
  • API-first: Full REST API with filtering, pagination, and sorting. Not just a website.
  • Export formats: CSV, JSON, NDJSON, Parquet, JSON-LD. Built for data pipelines.
  • Historical depth: Some states go back 20+ years (TX since 1999, AL since 1998).
  • Pricing: More affordable than competitors with a generous free tier.
  • Engagement features: Saved filters, webhook notifications for matching records.

About the WARN Act

What is the WARN Act? +
The Worker Adjustment and Retraining Notification (WARN) Act is a US federal law enacted in 1988 that requires employers with 100 or more employees to provide at least 60 calendar days advance written notice before:
  • Plant closings: Permanent or temporary shutdown of a single employment site resulting in job loss for 50+ employees
  • Mass layoffs: Job loss at a single site for 500+ employees, or 50-499 employees if they make up at least 33% of the workforce
The notice must be provided to affected workers, their representatives (unions), the state dislocated worker unit, and the chief elected official of the local government.
Which employers must comply with the WARN Act? +
The WARN Act applies to businesses with 100 or more full-time employees (or 100+ employees who work a combined 4,000+ hours per week, excluding overtime). This includes both private and public employers, but not federal, state, or local government entities. Many states have their own "mini-WARN" laws with lower thresholds, which is why some notices appear for smaller layoffs.
Are there exceptions to the 60-day notice requirement? +
Yes, there are three exceptions that may allow less than 60 days' notice:
  • Faltering company: The employer was actively seeking capital or business to stay open and reasonably believed giving notice would prevent obtaining that financing.
  • Unforeseeable business circumstances: The closing/layoff was caused by circumstances that were not reasonably foreseeable at the time notice would have been required.
  • Natural disaster: The closing/layoff was a direct result of a natural disaster (flood, earthquake, drought, storm, etc.).
Even with these exceptions, employers must still give as much notice as practicable and explain why full notice wasn't provided.
What penalties exist for WARN Act violations? +
Employers who violate the WARN Act may be liable for:
  • Back pay and benefits: Up to 60 days of pay and benefits for each affected employee
  • Civil penalty: Up to $500 per day of violation to the local government, if proper notice wasn't also given to the local government
Employees or their representatives can file lawsuits in federal district court. Some state mini-WARN laws have additional penalties.
Do all states publish WARN notices? +
Almost all states publish WARN notices publicly, though the format and accessibility varies widely. Arkansas and Wyoming do not publish WARN data publicly online. The remaining 48 states publish data in various formats including HTML tables, PDFs, Excel spreadsheets, and some via searchable databases. WARN Firehose normalizes all of these into a consistent format. View state-by-state coverage on our Data page.

Data & Coverage

How many states do you cover? +
We have scrapers for all 50 US states. Currently 46 states have data in our system with 109,000+ records covering 12M+ people affected. Arkansas and Wyoming do not publish WARN notices online. Data is updated daily. Explore the data to see full state-by-state coverage details.
How often is data updated? +
Our automated scraping pipeline runs daily at 5:00 AM UTC (12:00 AM EST / 9:00 PM PST). Each run scrapes all state websites and updates our database. New WARN notices are typically available within 24 hours of being published by state agencies.
How far back does the historical data go? +
Historical depth varies by state. Our deepest coverage includes:
  • Ohio: 1996+
  • Alabama, Florida, Kentucky: 1998+
  • Texas, Kansas: 1999+
  • Michigan, Georgia, Pennsylvania: 2000-2001+
  • Minnesota: 2003+
  • New Jersey, New York: 2004-2006+
  • California: 2008+
  • All other states: 2007+ or later
We continue backfilling historical data from state archives and third-party sources.
What data fields are available for each record? +
Each WARN notice record includes:
  • id - Unique deterministic identifier
  • company_name - Company filing the notice
  • city - City of the affected site
  • county - County (when available)
  • state - Two-letter state code
  • employees_affected - Number of employees impacted
  • notice_date - Date the WARN notice was filed
  • effective_date - Date layoffs are scheduled to begin
  • layoff_type - Type: Layoff, Closure, or Both
  • naics_code - NAICS industry code (auto-classified)
  • industry - Industry sector name
  • latitude / longitude - Geocoded coordinates for mapping
  • source_url - Link to original state filing
  • scraped_at - When we last updated this record
Not all fields are available from every state. We normalize what each state provides and auto-enrich with industry classification and geocoding.
Is the data normalized across states? +
Yes. Each state publishes WARN data in a different format (HTML, PDF, Excel, etc.) with different column names and structures. Our scrapers normalize all data into a consistent schema with standardized field names, date formats (YYYY-MM-DD), and state abbreviations. This means you can query across all states with the same API call without worrying about format differences.
How are duplicate records handled? +
Each record gets a deterministic ID generated from the state, company name, notice date, and employee count. This means the same notice scraped multiple times will always produce the same ID, preventing duplicates. When a state updates a notice, the record is upserted (updated in place) rather than creating a duplicate.

API Usage

How do I get an API key? +
Free tier: Send a POST request with your email to get an instant API key:
curl -X POST "https://warnfirehose.com/api/keys" -H "Content-Type: application/json" -d '{"email":"you@example.com"}'
Paid tiers: Sign up through the Pricing page. You'll receive your API key immediately after checkout.

Important: Save your API key when it's first displayed — it won't be shown again for security reasons.
How do I authenticate API requests? +
Pass your API key in the X-API-Key header:
curl -H "X-API-Key: your-key-here" "https://warnfirehose.com/api/records?state=CA"
Unauthenticated requests use the free tier limits (100 requests/day, 50 records per request).
What are the main API endpoints? +
  • GET /api/records - Query records with filters (state, company, city, county, date range), pagination, and sorting
  • GET /api/stats - Aggregate statistics (total records, employees, states)
  • GET /api/states - List all states with record counts
  • GET /api/trends - Monthly trend data (optionally by state)
  • GET /api/top-companies - Largest layoff filers
  • GET /api/yearly - Year-over-year statistics
  • GET /api/company/{name} - Company detail with fuzzy matching
  • GET /api/state/{code} - State-level statistics and recent records
  • GET /api/export/{format} - Bulk exports (CSV, JSON, Parquet, JSON-LD)
  • POST /api/filters - Create saved search filters
  • POST /api/webhooks - Register webhook notifications
  • GET /api/reports/monthly - Monthly summary reports
Full interactive docs at /docs.
What filtering options are available? +
The /api/records endpoint supports these query parameters:
  • state - Filter by state code (e.g., CA, TX, NY)
  • company - Search company name (partial match)
  • city - Filter by city name
  • county - Filter by county name
  • date_from - Notice date from (YYYY-MM-DD)
  • date_to - Notice date to (YYYY-MM-DD)
  • sort - Sort field (notice_date, company_name, state, employees_affected)
  • order - Sort order (asc or desc)
  • limit - Records per page (1-10000)
  • offset - Pagination offset
Example:
GET /api/records?state=TX&date_from=2025-01-01&sort=employees_affected&order=desc&limit=100
What are the rate limits? +
Rate limits depend on your tier:
  • Free: 100 requests/day, 50 records/request
  • Starter ($19/mo): 5,000 requests/day, 1,000 records/request
  • Pro ($49/mo): 50,000 requests/day, 10,000 records/request
  • Enterprise ($99/mo): Unlimited requests, 10,000 records/request
Rate limit headers (X-RateLimit-Remaining, X-RateLimit-Reset) are included in API responses.
Can I use webhooks to get notified of new records? +
Yes! Pro and Enterprise tiers support webhook notifications. Here's how:
  1. Create a saved filter matching your criteria (e.g., state=CA, min_employees=100)
  2. Register a webhook URL linked to that filter
  3. When our daily scrape finds new records matching your filter, we POST them to your webhook URL
Webhooks include an HMAC-SHA256 signature for payload verification. You can test webhooks before going live with POST /api/webhooks/test.

Exports & Downloads

What export formats are available? +
  • CSV - Opens in Excel, Google Sheets, and any spreadsheet tool. (Starter+)
  • JSON - Standard JSON array or NDJSON (newline-delimited). (Starter+)
  • Parquet - Columnar format for data warehouses and ML pipelines. (Pro+)
  • JSON-LD - Linked data with schema.org markup for semantic web and AI applications. (Pro+)
All exports support filtering by state, company, and date range. Up to 100,000 records per export.
How do I download data for a specific state? +
Use the export endpoint with a state filter:
curl -H "X-API-Key: YOUR_KEY" "https://warnfirehose.com/api/export/csv?state=CA" -o ca_warn.csv
Or for a date range:
curl -H "X-API-Key: YOUR_KEY" "https://warnfirehose.com/api/export/json?state=TX&date_from=2025-01-01&date_to=2025-12-31" -o tx_2025.json
You can also download from the Data page using the export buttons (requires Starter tier or above).
Is there a limit on export file size? +
Each export request can return up to 100,000 records. For larger datasets, use pagination: make multiple export requests with different date ranges or state filters. The limit parameter controls the number of records per request.

Pricing & Billing

Is there a free tier? +
Yes! The free tier includes:
  • 100 API requests per day
  • 50 records per request
  • Full access to all data fields
  • Dashboard and charts access
No credit card required. Just generate a free key and start querying.
Can I cancel my subscription anytime? +
Yes, absolutely. No contracts, no commitments. Cancel anytime through your billing portal. Your access continues until the end of your current billing period. You can also downgrade to the free tier at any time.
What payment methods do you accept? +
We accept all major credit and debit cards (Visa, Mastercard, American Express) through our payment processor Stripe. Enterprise customers can also arrange invoice billing — contact us for details.
Do you offer discounts for annual billing? +
Annual billing with a discount is coming soon. Contact us if you're interested in prepaying annually for a reduced rate. We also offer special pricing for academic institutions, non-profits, and newsrooms.
Do you offer special pricing for non-profits or academia? +
Yes! We offer discounted or free access for:
  • Academic research institutions
  • Non-profit organizations
  • Newsrooms and journalists
  • Government workforce agencies
Contact us with your organization details and intended use case.

Account

How do I upgrade or downgrade? +
You can upgrade or downgrade at any time through the Stripe customer portal. Changes take effect immediately, and you'll be pro-rated for any price differences.
Do you offer refunds? +
We offer pro-rated refunds for annual plans if you cancel within the first 30 days. Monthly plans are non-refundable, but you can cancel at any time to prevent future charges.

Technical

What is the API response format? +
All API endpoints return JSON. The /api/records response includes pagination metadata:
{
  "records": [...],
  "total": 109707,
  "limit": 50,
  "offset": 0,
  "tier": "pro"
}
Is CORS enabled? +
Yes. CORS is enabled for warnfirehose.com and localhost origins, so you can make API calls from browser-based applications during development and from our dashboard. For production use from other domains, call the API server-side or contact us to whitelist your domain.
What happens when I hit my rate limit? +
You'll receive a 429 Too Many Requests response with headers indicating when your limit resets:
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1707300000
Retry-After: 3600
Rate limits reset at midnight UTC. Consider upgrading your plan if you consistently hit limits.
Is the API available via HTTPS? +
Yes. All API traffic is served over HTTPS with TLS 1.2+. HTTP requests are automatically redirected to HTTPS. The SSL certificate is provided by Let's Encrypt and auto-renews.
Do you have SDKs or client libraries? +
Not yet, but the REST API works with any HTTP client in any language. Here are quick examples:
# Python
import requests
r = requests.get("https://warnfirehose.com/api/records",
    headers={"X-API-Key": "YOUR_KEY"},
    params={"state": "CA", "limit": 100})
data = r.json()

# JavaScript
const resp = await fetch("https://warnfirehose.com/api/records?state=CA&limit=100", {
    headers: { "X-API-Key": "YOUR_KEY" }
});
const data = await resp.json();
Full interactive documentation is available at /docs.

Still have questions?

Our team is here to help. Reach out and we'll get back to you within 1-2 business days.

Contact Us