The recall API — four calls to production.

One normalized feed across openFDA, CPSC, NHTSA, and EU Safety Gate. Read recalls, filter by source and severity, and stream webhook deliveries — all with a single API key.


See it working

Sample data from real agency formats — normalized into a single feed.

Live recall feed
GET /recalls
DE LEBENSMITTELWARNUNG

Beerenmischung

hersteller: jütro tiefkühlkost gmbh & co. kg produktbezeichnung/ -beschreibung: bio beerenmischung „biobio“, tiefgefroren, 300 gramm · 2026-07-25

PE DIGEMID

ALERTA INTERNACIONAL JULIO – 2026

2026-07-24

RappelConso

travers de porc cuit bruni

prestige de la sarthe · 2026-07-24

RappelConso

tete roulee

prestige de la sarthe · 2026-07-24

RappelConso

langue de porc en gelee

prestige de la sarthe · 2026-07-24

RappelConso

tranches de poitrine de porc cuite fumee - congelees

prestige de la sarthe · 2026-07-24

Watchlist match → alert
SureFit AppliancesAll agencies · Brand watchlist
Active
Webhook payload
POST → your endpoint
"event": "watchlist.match",
"deliveryId": "del_01hxyz9k3m",
"match": {
  "watchlistId": "wl_brand_surefit",
  "kind": "brand",
  "value": "SureFit Appliances",
  "matchedOn": ["recallingFirm"]
},
"recall": {
  "id": "cpsc_2024_11_surefit",
  "sourceCode": "cpsc",
  "title": "SureFit SF-400 Space Heater — fire hazard",
  "hazard": "Fire and burn hazard",
  "classification": "High risk",
  "recallDate": "2024-11-14",
  "recallingFirm": "SureFit Appliances"
},
"timestamp": "2024-11-14T09:04:22Z"
API request / response
REST API
// Request
GET /recalls?source=cpsc HTTP/1.1
X-Api-Key: rr_live_xxxxxxxxxxxx

// Response 200 OK
{
  "data": [{
    "id": "cpsc_2024_11_surefit",
    "sourceCode": "cpsc",
    "title": "SureFit SF-400 Space Heater",
    "classification": "High risk"
  }],
  "meta": {
    "total": 847,
    "limit":  20,
    "offset": 0
  }
}

Endpoints

A small, predictable REST surface. Every request authenticates with your X-Api-Key header.

Method & pathDescriptionAuth
GET /recallsList recalls across all agencies. Offset paginated (meta.total / limit / offset). Filters: source, classification, since.openFDACPSCNHTSAEU Safety GateX-Api-Key
GET /recalls/:idFetch a single normalized recall (RecallView) by its RecallStream id.X-Api-Key
GET /recalls/filtersDiscover the available filter values — active sources and classification labels — so you can build UI without hardcoding.X-Api-Key
GET /eventsYour webhook deliveries and watchlist matches. Cursor paginated (opaque cursor) for stable streaming.X-Api-Key
GET /incidents/:idCross-source incident-linking — the same recall clustered across agencies and jurisdictions by shared GTIN, brand, firm, and date into one incident. Fetch an incident and its linked recalls. Pro+X-Api-Key

One envelope, one record type

List endpoints return a consistent envelope: a data array of records plus a meta object with pagination.

Envelope — GET /recalls
offset paginated
{
  "data": [ /* RecallView objects */ ],
  "meta": {
    "total":  1657,
    "limit":  20,
    "offset": 0
  }
}
RecallView fields
  • id — stable RecallStream id (always present)
  • sourceCode — agency, drives the source badge (always present)
  • title — headline (always present)
  • hazard? — free-text hazard, when known
  • classification? — e.g. "Class I" / risk level
  • recallDate? — ISO date, often absent
  • recallingFirm? — company, when provided
  • url? — link to the source notice

Fields marked ? are omitted entirely when absent — we never send null placeholders or "N/A". Code defensively for optional keys.


One key. Push or pull.

The public data API authenticates with an X-Api-Key header — create and rotate keys in your dashboard (the full key is shown once at creation). Per-minute rate limits (and a daily fair-use ceiling) scale with your plan; exceeding them returns 429 with a Retry-After header. Dashboard and account calls use a session bearer token instead.

Prefer push? Use webhooks.

Register an endpoint and RecallStream POSTs a watchlist.match event the moment a recall matches your brands, suppliers, or keywords. Verify the signature with your whsec_… secret.

Event payload
POST → your endpoint
{
  "event": "watchlist.match",
  "deliveryId": "del_01hxyz9k3m",
  "match": {
    "watchlistId": "wl_brand_surefit",
    "kind": "brand",
    "value": "SureFit Appliances",
    "matchedOn": ["recallingFirm"]
  },
  "recall": { /* RecallView summary */ },
  "timestamp": "2024-11-14T09:04:22Z"
}