API
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.
Sample data
See it working
Sample data from real agency formats — normalized into a single feed.
rillettes fraiches de saumon bio* et truite bio*
le petit fume dromois · 2026-09-09
citron lime colis 4,5k 54 fruits catégorie 1 origine bresil
flamingo co · 2026-09-09
jambon persillé
la ferme du bercail · 2026-09-08
Product safety recall – Isuzu RG19 motor vehicles
2026-09-08
Rappel : Lënsenzalot de la marque BIOG
2026-09-08
merguez traditionnelles
2026-09-08
SureFit SF-400 Space Heater — fire and burn hazard
"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"// 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
}
}Reference
Endpoints
A small, predictable REST surface. Every request authenticates with your X-Api-Key header.
| Method & path | Description | Auth |
|---|---|---|
| GET /recalls | List recalls across all agencies. Offset paginated (meta.total / limit / offset). Filters: source, classification, since.openFDACPSCNHTSAEU Safety Gate | X-Api-Key |
| GET /recalls/:id | Fetch a single normalized recall (RecallView) by its RecallStream id. | X-Api-Key |
| GET /recalls/filters | Discover the available filter values — active sources and classification labels — so you can build UI without hardcoding. | X-Api-Key |
| GET /events | Your webhook deliveries and watchlist matches. Cursor paginated (opaque cursor) for stable streaming. | X-Api-Key |
| GET /incidents/:id | Cross-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 |
Response shape
One envelope, one record type
List endpoints return a consistent envelope: a data array of records plus a meta object with pagination.
{
"data": [ /* RecallView objects */ ],
"meta": {
"total": 1657,
"limit": 20,
"offset": 0
}
}id— stable RecallStream id (always present)sourceCode— agency, drives the source badge (always present)title— headline (always present)hazard?— free-text hazard, when knownclassification?— e.g. "Class I" / risk levelrecallDate?— ISO date, often absentrecallingFirm?— company, when providedurl?— 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.
Authentication & limits
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": "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"
}