JobsPipe Layoffs API
US WARN Act layoff and closure notices, with the company each names.
US WARN Act layoff and closure notices, with the company each names.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/jobspipe:jobspipe-layoffs-api"
curl "https://apis.io/api/v1/apis?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: Jobspipe Layoffs API
version: 1.0.0
description: 'Operations tagged Layoffs across 2 of this provider''s published API definitions: jobspipe-dev-openapi.json, jobspipe-openapi.json. Each path carries the servers of the definition it was published in.'
servers:
- url: https://api.jobspipe.dev
tags:
- name: Layoffs
description: US WARN Act layoff and closure notices, with the company each names.
paths:
/v1/layoffs:
get:
operationId: searchLayoffs
summary: Search WARN Act layoff notices
tags:
- Layoffs
x-consequence: read-only
x-side-effects: consumes 1 credit per notice returned; a notice already paid for this calendar month is free, and an empty page costs nothing
security:
- apiKey: []
- oidc:
- jobs:read
description: US WARN Act notices of mass layoffs and closures, as state labor agencies publish them, newest first, each with the company it names when that company is matched with confidence. Filter by state, company (key or domain), notice date, employees affected and kind.
parameters:
- name: state
in: query
required: false
schema:
type: string
pattern: ^[A-Za-z]{2}(,[A-Za-z]{2})*$
example: CA,TX
description: US states by two-letter postal code, comma-separated.
- name: company
in: query
required: false
schema:
type: string
example: google.com
description: A company's key (digits) or its website domain. Only notices matched to that company are returned.
- name: notice_date_gte
in: query
required: false
schema:
type: string
format: date
description: Notices dated on or after this day.
- name: notice_date_lte
in: query
required: false
schema:
type: string
format: date
description: Notices dated on or before this day.
- name: min_employees
in: query
required: false
schema:
type: integer
minimum: 1
description: Only notices affecting at least this many employees; a notice without a count is left out.
- name: kind
in: query
required: false
schema:
type: string
enum:
- layoff
- closure
- unknown
description: layoff, closure, or unknown.
- name: limit
in: query
required: false
schema:
type: integer
minimum: 1
maximum: 100
default: 25
description: Notices per page.
- name: offset
in: query
required: false
schema:
type: integer
minimum: 0
maximum: 10000
default: 0
description: Notices to skip; pass the previous page's next_offset.
responses:
'200':
description: A page of notices.
content:
application/json:
schema:
$ref: '#/components/schemas/LayoffsResponse'
example:
data:
- id: '8813620347113906411'
state: CA
employer: Northwind Labs, Inc.
address: 500 Howard St
city: San Francisco
county: San Francisco
zip: '94105'
notice_date: '2026-10-14'
effective_date: '2026-12-13'
employees: 142
kind: layoff
company:
key: '3837186692681720328'
name: Northwind Labs
domain: northwindlabs.com
metadata:
total_results: 1
returned_results: 1
next_offset: null
credits_charged: 1
notices_already_paid: 0
'400':
description: Invalid filters. Consumes no credits.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'401':
description: Missing or invalid API key.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'402':
description: Monthly request quota exceeded.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'429':
description: Per-second rate limit exceeded.
content:
application/json:
schema:
$ref: '#/components/schemas/RateLimitErrorResponse'
'502':
description: The backend failed. Consumes no credits; safe to retry with backoff.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'504':
description: Timed out. Consumes no credits; retry later.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
servers:
- url: https://api.jobspipe.dev
components:
schemas:
LayoffNotice:
type: object
required:
- id
- state
- employer
- address
- city
- county
- zip
- notice_date
- effective_date
- employees
- kind
- company
properties:
id:
type: string
description: The notice's id; stable when the state amends the notice.
state:
type: string
description: Two-letter postal code of the state that published the notice.
employer:
type: string
description: The employer as named on the notice.
address:
type:
- string
- 'null'
city:
type:
- string
- 'null'
county:
type:
- string
- 'null'
zip:
type:
- string
- 'null'
notice_date:
type:
- string
- 'null'
format: date
description: The day the notice was given or received.
effective_date:
type:
- string
- 'null'
format: date
description: The day the layoff or closure takes effect, when stated.
employees:
type:
- integer
- 'null'
description: Employees affected, when stated.
kind:
type: string
enum:
- layoff
- closure
- unknown
description: 'closure: the site or plant closes. unknown: the notice does not say.'
company:
oneOf:
- type: object
properties:
key:
type: string
description: The company's key, for its company page or as company_key_or in job search.
name:
type: string
domain:
type:
- string
- 'null'
- type: 'null'
description: The company the notice names, when it is matched to the company with confidence; null otherwise.
ErrorResponse:
type: object
required:
- error
properties:
error:
type: string
description: 'Human-readable error message, e.g. "Invalid search filters: unknown filter: ''query''. Did you mean query -> job_title_or?". Not a stable machine-readable code; match on the HTTP status instead. A few stack-scan errors carry a short identifier such as missing_domain or invalid_domain.'
message:
type: string
description: Additional detail. Present on 402 quota responses; other errors carry only error.
LayoffsResponse:
type: object
required:
- data
- metadata
properties:
data:
type: array
items:
$ref: '#/components/schemas/LayoffNotice'
description: Newest notice first.
metadata:
type: object
properties:
total_results:
type: integer
description: Notices the filters match.
returned_results:
type: integer
next_offset:
type:
- integer
- 'null'
description: The offset of the next page; null on the last page.
credits_charged:
type: integer
notices_already_paid:
type: integer
description: Notices on this page already paid for this calendar month, so free.
credits_remaining:
type: integer
description: Credits the account can still spend after this call. Absent for callers that are not metered.
credits_allowance:
type: integer
description: 'What credits_remaining is measured against: the monthly allowance, or Free''s one-time grant.'
RateLimitErrorResponse:
type: object
required:
- error
description: 'Sent with HTTP 429 when the per-second rate limit is exceeded. The response also carries Retry-After: 1 and the RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset and RateLimit-Policy headers. A 429 costs no credit.'
properties:
error:
type: string
description: 'Human-readable message: "Rate limit exceeded".'
securitySchemes:
apiKey:
type: http
scheme: bearer
description: 'API key issued from the JobsPipe dashboard, prefixed jp_live_, sent as a bearer token in the Authorization header. Keys are read-only and scoped: jobs:read grants POST /v1/jobs/search, stack:read grants POST /v1/stack/scan. No scope grants write access to JobsPipe data.'
oidc:
type: openIdConnect
openIdConnectUrl: https://jobspipe.dev/.well-known/openid-configuration
description: 'OpenID Connect / OAuth 2.0 access via the JobsPipe authorization server. Supported scopes (also advertised in the protected-resource metadata at https://api.jobspipe.dev/.well-known/oauth-protected-resource): jobs:read - search normalized job postings; stack:read - run technology-stack scans.'
bearerAuth:
type: http
scheme: bearer
description: Your JobsPipe API key (starts with jp_live_).
x-refined-from:
- jobspipe-dev-openapi.json
- jobspipe-openapi.json
x-service-info:
categories:
- data
- jobs
- technographics
docs:
homepage: https://jobspipe.dev
apiReference: https://docs.jobspipe.dev
llms: https://jobspipe.dev/llms.txt