CPSC APIcpsc.gov ↗
Search U.S. CPSC product recalls by keyword and date range. Returns recall title, hazard, products, remedies, and more via a single REST endpoint.
What is the CPSC API?
The CPSC Recalls API provides access to U.S. Consumer Product Safety Commission recall records through 1 endpoint — search_recalls — returning up to 13 structured fields per record including recall title, date, hazard descriptions, affected products, remedies, and the official recall URL. Date range filtering and keyword search let you pull targeted subsets of the recall database, which is sorted newest-first by default.
curl -X GET 'https://api.parse.bot/scraper/54c983c7-9600-488b-b8dc-065c75a24c3b/search_recalls?skip=0&limit=10&date_to=2026-07-13&date_from=2026-06-13' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace cpsc-gov-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: CPSC Recalls SDK — search recalls with date range and pagination."""
from parse_apis.cpsc_gov_api import CPSC, NotFoundError
client = CPSC()
# Search recent recalls within a date range, capped to 5 results.
for recall in client.recalls.search(date_from="2026-06-01", date_to="2026-07-13", limit=5):
print(recall.title, recall.recall_date)
# Filter recalls by keyword in title.
result = client.recalls.search(query="Child", date_from="2026-01-01", date_to="2026-07-13", limit=1).first()
if result:
print(result.title, result.products, result.hazards)
# Handle typed error for an unlikely date range.
try:
for r in client.recalls.search(date_from="1900-01-01", date_to="1900-01-02", limit=3):
print(r.recall_id, r.title)
except NotFoundError as exc:
print(f"No recalls found: {exc}")
print("exercised: recalls.search (date range, keyword filter, error handling)")
Search CPSC product recalls within a date range. Results are sorted newest-first. The upstream API returns all matching recalls for the date window; skip and limit control which slice of results is returned. When query is provided, results are filtered to recalls whose title contains the query string.
| Param | Type | Description |
|---|---|---|
| skip | integer | Number of results to skip for pagination. Use with limit to page through results. |
| limit | integer | Maximum number of results to return per request (1-100). |
| query | string | Filter recalls by title keyword. Only recalls whose title contains this string are returned. |
| date_to | string | End date for recall date range filter in YYYY-MM-DD format. Defaults to today when omitted. |
| date_from | string | Start date for recall date range filter in YYYY-MM-DD format. Defaults to 30 days before today when omitted. |
{
"type": "object",
"fields": {
"skip": "integer — number of results skipped",
"limit": "integer — maximum results returned",
"total": "integer — total number of recalls matching the date range and query",
"results": "array of recall objects with recall_id, recall_number, recall_date, title, description, url, hazards, products, remedies, manufacturer_countries, images, last_publish_date"
},
"sample": {
"data": {
"skip": 0,
"limit": 3,
"total": 63,
"results": [
{
"url": "https://www.cpsc.gov/Recalls/2026/Best-Buy-Recalls-Insignia-Gas-Ranges-Due-to-Risk-of-Serious-Injury-from-a-Fire-Hazard",
"title": "Best Buy Recalls Insignia Gas Ranges Due to Risk of Serious Injury from a Fire Hazard",
"images": [
"https://www.cpsc.gov/s3fs-public/insig-1.png"
],
"hazards": [
"The recalled ranges' front-mounted knobs can be activated accidentally by humans or pets, posing a risk of serious injury from a fire hazard."
],
"products": [
"Insignia Front Control Gas Ranges"
],
"remedies": [
"Consumers should stop using the recalled oven immediately..."
],
"recall_id": 10854,
"description": "This recall involves Insignia gas ranges with model numbers NS-RGFGSS1 and NS-RGFCGS2.",
"recall_date": "2026-07-09T00:00:00",
"recall_number": "26606",
"last_publish_date": "2026-07-10T00:00:00",
"manufacturer_countries": [
"China"
]
}
]
},
"status": "success"
}
}About the CPSC API
What the API Returns
The search_recalls endpoint queries the CPSC recall database and returns an array of recall objects. Each object includes recall_id, recall_number, recall_date, title, description, url, hazards, products, remedies, and manufacturer information. The response envelope also surfaces total (the count of all matching records for the given filters), skip, and limit so you can page through large result sets.
Filtering and Pagination
Two date parameters — date_from and date_to — accept ISO 8601 strings (YYYY-MM-DD) and default to a 30-day window ending today when omitted. The optional query parameter filters results to recalls whose title contains the supplied keyword string; this is useful for narrowing to a product category or brand. Pagination is controlled by skip and limit (1–100 per request). To iterate through all recalls in a window, increment skip by limit until skip exceeds total.
Data Coverage
Records reflect official CPSC recall announcements as published at cpsc.gov/Recalls. Each recall can reference multiple products and multiple hazards, so products and hazards are arrays. The url field points directly to the CPSC recall detail page for that record, making it straightforward to link users to authoritative source material.
Sorting and Freshness
Results are always returned newest-first based on recall_date. There is no parameter to change sort order. The data covers recalls within whatever date window you specify; the CPSC publishes recalls on an ongoing basis, so querying with a narrow recent date_from/date_to window is the reliable way to detect newly issued recalls.
The CPSC API is a managed, monitored endpoint for cpsc.gov — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when cpsc.gov changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official cpsc.gov API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Monitor newly issued CPSC recalls daily by querying
search_recallswith a rollingdate_fromwindow - Build a product safety alert service that emails subscribers when a keyword matching their product category appears in recall
titlefields - Enrich e-commerce product listings with a recall status check using the
queryparameter against product names - Aggregate recall
hazardsdescriptions to identify which hazard types appear most frequently in a given time period - Generate compliance reports linking
recall_numberandrecall_datefor internal product safety teams - Power a public-facing recall lookup tool using
productsandremediesfields to give consumers actionable guidance
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does CPSC provide an official developer API?+
What does the `search_recalls` endpoint return for each recall?+
recall_id, recall_number, recall_date, title, description, url, hazards (array), products (array), remedies (array), and manufacturer information. The response envelope adds total, skip, and limit for pagination tracking.Does the `query` parameter search fields other than the recall title?+
query filters only on the recall title field. Fields like description, hazards, and products are not searched. You can fork this API on Parse and revise it to add full-text filtering across additional fields.Are recall images or embedded media returned by the API?+
How large can a single date range query get, and how should I handle it?+
total field in the response tells you how many records match your date_from/date_to window. Since limit caps at 100 per request, wide date ranges may require multiple paginated calls incrementing skip by limit until skip exceeds total. Narrowing the date window reduces the number of round trips needed.