Product Recall Scraper: CPSC and FDA avatar

Product Recall Scraper: CPSC and FDA

Pricing

from $8.00 / 1,000 one recall record beyond the free 25s

Go to Apify Store
Product Recall Scraper: CPSC and FDA

Product Recall Scraper: CPSC and FDA

US product recalls as normalized JSON from the CPSC recalls API and FDA openFDA enforcement reports (food, drugs, devices). Filter by date range, source and keyword. One record per recall: stable id, dates, product, firm, hazard, remedy, official URL. 25 records free per run, then pay per record.

Pricing

from $8.00 / 1,000 one recall record beyond the free 25s

Rating

0.0

(0)

Developer

RedRook AI

RedRook AI

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

One normalized JSON record per US product recall, pulled live from two official, keyless government APIs:

  • CPSC (Consumer Product Safety Commission) recalls API at saferproducts.gov: toys, furniture, appliances, electronics, sporting goods and other consumer products.
  • FDA openFDA enforcement reports for food, drugs and medical devices at api.fda.gov.

Every record has the same shape regardless of source, so an agent or a script can filter recalls by date, product, firm, hazard or FDA class without knowing which agency published them. Each record carries a stable id (<source>:<recall_number>), the official recall page or API URL, and a retrieved_at timestamp.

A run with no input returns the newest 25 recalls from all four sources for the last 30 days. The first 25 records of every run are free. Records 26 and up cost $0.003 each (see Pricing).

Not affiliated with, endorsed by or maintained by the CPSC or the FDA. This is an unofficial client for public data.

Three sample records (trimmed for length)

Fetched 2026-09-10 23:22 UTC by the runs recorded in TEST-LOG.md. Long strings are cut with ...; the shipped sample file is untrimmed.

[
{
"id": "cpsc:26764",
"source": "cpsc",
"agency": "CPSC",
"recall_number": "26764",
"recall_id": "10976",
"recall_date": "2026-09-10",
"last_updated": "2026-09-10",
"title": "FJTJBSI Recalls Six Drawer Dressers Due to Risk of Serious Injury or Death from Tip Over and Entrapment Hazards Violate Mandatory Standard for Clothin ...",
"summary": "This recall involves the FJTJBSI-branded wood dressers. The black or white dressers measure about 15.1 inches long, 27.6 inches wide and 42.2 inches h ...",
"hazard": "The recalled dressers are unstable if they are not anchored to the wall, posing tip-over and entrapment hazards that can result in risks of serious in ...",
"remedy": "Consumers should stop using the recalled dressers immediately if they are not anchored to the wall, place them in an area that children cannot access ...",
"remedy_options": [
"Refund"
],
"units": "About 9,000",
"products": [
{
"name": "FJTJBSI Six-drawer Dressers",
"type": "Desks, Dressers, Chests, Bureaus, or Buffets",
"units": "About 9,000"
}
],
"firms": [
{
"name": "Fujian Laobosi Cross-Border E-commerce Co., Ltd., dba FJTJBSI, of China",
"role": "retailer"
}
],
"sold_at": "Amazon.com from November 2024 through July 2026 for about $170.",
"manufacturer_countries": [
"China"
],
"injuries": "None reported.",
"image_urls": [
"https://www.cpsc.gov/s3fs-public/FJT1.png?VersionId=GGkzZKI9x_uU.i8CTbkN09b_5YpENVvh"
],
"source_url": "https://www.cpsc.gov/Recalls/2026/FJTJBSI-Recalls-Six-Drawer-Dressers-Due-to-Risk-of-Serious-Injury-or-Death-from-Tip-Over-and-Entrapment-Hazards-Viol ...",
"retrieved_at": "2026-09-10T23:22:25+00:00"
},
{
"id": "fda-food:H-1278-2026",
"source": "fda-food",
"agency": "FDA",
"recall_number": "H-1278-2026",
"recall_id": "99629",
"recall_date": "2026-09-02",
"recall_initiation_date": "2026-08-11",
"last_updated": "2026-08-26",
"title": "Byron White Formulas, Inc. recalls Byron White FORMULAS A-FNG Herbal Supplement 1.0 fl. oz./30 mL May Contain Nuts (Juglans nigra hull) Byron White Fo ...",
"summary": "Byron White FORMULAS A-FNG Herbal Supplement 1.0 fl. oz./30 mL May Contain Nuts (Juglans nigra hull) Byron White Formulas Inc. 3315 Chanate Rd. Suite ...",
"hazard": "Label does not declare walnuts in English",
"classification": "Class II",
"status": "Ongoing",
"voluntary_mandated": "Voluntary: Firm initiated",
"units": "10,403 units",
"products": [
{
"name": "Byron White FORMULAS A-FNG Herbal Supplement 1.0 fl. oz./30 mL May Contain Nuts (Juglans n ...",
"type": "Food",
"units": "10,403 units",
"code_info": "Lot Code Format = MMD,DYY: 022,224. 061,424. 092,324. 022,125. 071,825. 112,125. 040,826."
}
],
"firms": [
{
"name": "Byron White Formulas, Inc.",
"role": "recalling_firm"
}
],
"sold_at": "Domestic: AK, AL, AR, AZ, CA, CO, CT, DC, DE, FL, GA, HI, IA, ID, IL, IN, KS, KY, LA, MA, MD, ME, MI, MN, MO, MT, NC, NE, NH, NJ, NM, NV, NY, OH, OK, ...",
"city": "Santa Rosa",
"state": "CA",
"country": "United States",
"code_info": "Lot Code Format = MMD,DYY: 022,224. 061,424. 092,324. 022,125. 071,825. 112,125. 040,826.",
"source_url": "https://api.fda.gov/food/enforcement.json?search=recall_number:\"H-1278-2026\"",
"retrieved_at": "2026-09-10T23:22:27+00:00"
},
{
"id": "fda-drug:D-0831-2026",
"source": "fda-drug",
"agency": "FDA",
"recall_number": "D-0831-2026",
"recall_id": "99711",
"recall_date": "2026-09-02",
"recall_initiation_date": "2026-08-24",
"last_updated": "2026-09-03",
"title": "Hikma Pharmaceuticals USA INC. recalls Ramipril Capsules USP, 10 mg, packaged in a) 100 Capsules (NDC 76282-673-01) and b) 500 Capsules (NDC 76282-673 ...",
"summary": "Ramipril Capsules USP, 10 mg, packaged in a) 100 Capsules (NDC 76282-673-01) and b) 500 Capsules (NDC 76282-673-05) bottles, Rx only, Manufactured for ...",
"hazard": "Failed Impurities/Degradation Specifications: OOS result obtained for a process impurity, dicyclohexylurea (DCU).",
"classification": "Class II",
"status": "Ongoing",
"voluntary_mandated": "Voluntary: Firm initiated",
"units": "a) 25,970 bottles; b) 2,384 bottles",
"products": [
{
"name": "Ramipril Capsules USP, 10 mg, packaged in a) 100 Capsules (NDC 76282-673-01) and b) 500 Ca ...",
"type": "Drugs",
"units": "a) 25,970 bottles; b) 2,384 bottles",
"code_info": "a) Lot #: AC5470A, Exp. Date July 2027 b) Lot #: AC5470B, Exp. Date July 2027",
"brand_names": [
"RAMIPRIL"
],
"generic_names": [
"RAMIPRIL"
]
}
],
"firms": [
{
"name": "Hikma Pharmaceuticals USA INC.",
"role": "recalling_firm"
},
{
"name": "Exelan Pharmaceuticals, Inc.",
"role": "manufacturer"
}
],
"sold_at": "Nationwide within the United States",
"city": "Columbus",
"state": "OH",
"country": "United States",
"code_info": "a) Lot #: AC5470A, Exp. Date July 2027 b) Lot #: AC5470B, Exp. Date July 2027",
"source_url": "https://api.fda.gov/drug/enforcement.json?search=recall_number:\"D-0831-2026\"",
"retrieved_at": "2026-09-10T23:22:30+00:00"
}
]

A full 20-record sample (5 per source, fetched 2026-09-10 23:22 UTC, untrimmed) ships with the Actor source as samples/sample-dataset-2026-09-10.json and is the sample output shown on this listing.

Free tier

Every run returns up to 25 records at no per-record charge, whatever the input. That is enough to cover a daily "what was recalled this week" check, a keyword watch on a brand, or a single-source pull. Records 26 and beyond are metered. If your run's maximum total charge is reached, the Actor stops cleanly after the last paid record and says so in the run status message; nothing is charged for records that were not delivered.

Pricing

Pay per event. Two events exist:

EventPriceWhen
result$0.003 per recordCharged once for each record from record 26 onward in a run. Records 1 to 25 are never charged.
Actor startApify platform defaultApify's standard per-run start event, charged by the platform, not by this Actor.

Worked examples: 25 records cost nothing beyond the start event; 100 records cost 75 x $0.003 = $0.225; 1,000 records cost 975 x $0.003 = $2.93. Platform usage (compute) is included in the event price. There are no hidden per-dataset-item charges: the platform's default dataset item event is disabled for this Actor.

Input

All fields are optional. A {} input is valid.

FieldTypeDefaultMeaning
sourcesarray of all, cpsc, fda-food, fda-drug, fda-device["all"]Which agencies and FDA product types to query. fda is accepted as shorthand for the three FDA endpoints.
dateFromYYYY-MM-DDtoday minus 30 daysEarliest recall date (CPSC recall date; FDA report date).
dateToYYYY-MM-DDtoday (UTC)Latest recall date.
keywordstringnoneCase-insensitive substring match on title, summary, hazard, product names and firm names.
maxResultsinteger 1 to 500025Newest-first cap across all selected sources.
outputFormatfull or flatfullflat joins every array into a single `'
healthCheckbooleanfalseMonitoring mode, see below.

Example: all lithium battery recalls in the last 90 days, up to 200 records:

{ "keyword": "lithium", "dateFrom": "2026-06-12", "maxResults": 200 }

Example: only FDA Class I food recalls this month, flattened for a spreadsheet (filter classification after export):

{ "sources": ["fda-food"], "dateFrom": "2026-09-01", "outputFormat": "flat", "maxResults": 100 }

Output fields

FieldTypeNotes
idstringStable entity id <source>:<recall_number>, identical across runs for the same recall.
sourcestringcpsc, fda-food, fda-drug or fda-device.
agencystringCPSC or FDA.
recall_numberstringCPSC recall number or FDA recall number (H-, F-, D-, Z- prefixes).
recall_idstringCPSC RecallID or FDA event_id.
recall_datedateCPSC recall date; FDA report date (the date FDA published the enforcement report).
recall_initiation_datedate or nullFDA only: the date the firm started the recall, usually weeks before recall_date.
last_updateddate or nullCPSC last publish date; FDA center classification date.
titlestringCPSC headline; for FDA, recalling firm plus the product description.
summarystring or nullProduct description.
hazardstring or nullCPSC hazard text or FDA reason for recall.
remedystring or nullCPSC remedy instructions; FDA enforcement reports carry no remedy text.
remedy_optionsarrayCPSC: Refund, Replace, Repair and similar.
classificationstring or nullFDA Class I (most serious), II or III.
statusstring or nullFDA: Ongoing, Completed or Terminated.
voluntary_mandatedstring or nullFDA: firm-initiated or FDA-mandated.
unitsstring or nullUnits affected, as published (free text).
productsarray of objectsname, description, model, type, units; FDA adds code_info (lots, expiry, UDI), brand_names, generic_names.
firmsarray of objectsname and role (manufacturer, importer, distributor, retailer, recalling_firm). Organizations only.
sold_atstring or nullCPSC where-sold text or FDA distribution pattern.
manufacturer_countriesarrayCPSC country of manufacture.
city, state, countrystring or nullFDA recalling firm location (city level only).
injuriesstring or nullCPSC incidents and injuries text.
upcsarrayCPSC product UPCs.
code_infostring or nullFDA lot and batch information.
image_urlsarrayCPSC official recall photographs (URLs only, no copies).
source_urlstringcpsc.gov recall page, or the openFDA API URL that returns exactly this record.
retrieved_atdatetimeUTC timestamp of the fetch.

Personal data is stripped before output. CPSC's ConsumerContact field is dropped entirely, email addresses and phone numbers are redacted from every free-text field (they appear as [email redacted] and [phone redacted]), and FDA's street address fields (address_1, address_2, postal_code) are dropped. Firm names are organization names as published by the agencies; a sole proprietor's trade name can coincide with a person's name and the Actor does not attempt to detect that.

Health check mode

Set "healthCheck": true to run a monitoring probe: the Actor queries all four sources for the last 60 days, pushes 5 records, charges nothing, writes a HEALTH record to the key-value store with per-source status, and fails the run (non-zero exit, status message starting with HEALTH CHECK FAILED) if any source does not answer or fewer than 5 records come back. Schedule it daily to be told when an upstream API changes.

  • CPSC: recalls API at https://www.saferproducts.gov/RestWebServices/Recall (no key, no published rate limit). CPSC's privacy policy states that recall notices may be freely copied and distributed without permission and asks that CPSC be credited. Data credit: U.S. Consumer Product Safety Commission. The Actor emits image URLs, never copies of the photographs.
  • FDA openFDA: https://api.fda.gov/{food,drug,device}/enforcement.json. openFDA data is in the public domain under a Creative Commons CC0 1.0 Universal dedication; credit is requested but not required. Data credit: U.S. Food and Drug Administration, openFDA. The enforcement endpoints used here carry no GMDN device-nomenclature content, which openFDA licenses separately.
  • Both agencies are part of the United States Government; their recall records are US Government works with no copyright protection under 17 U.S.C. 105.
  • This Actor is unofficial. It is not affiliated with, sponsored by or endorsed by the CPSC, the FDA or any US agency. Recall records are published by the agencies and may be corrected or withdrawn; verify against source_url before acting on them.
  • Rate discipline: one request in flight at a time, a 1 second pause between paginated calls, up to 4 retries with growing backoff (2, 4, 6, 8 seconds) on connection errors and HTTP 5xx, and a descriptive User-Agent.

Limits and known gaps

  • openFDA allows 1,000 requests per day per IP without an API key. Each FDA source costs 1 request per 1,000 records, so ordinary runs use 1 to 3 requests. The Actor runs from shared Apify IPs, so an exhausted daily quota shows up as a failed FDA source in the run summary, not as an error in your data.
  • The CPSC API has no pagination: a wide date window loads the whole window in one call and is then truncated to maxResults newest-first. Windows of a few years still return in a few seconds.
  • recall_date for FDA is the report date, not the initiation date; use recall_initiation_date when you need the latter.
  • keyword is a plain substring match, not a full-text search. Search once per term.
  • The FDA's human-readable IRES recall page is not linked because that site blocks automated verification; source_url points to the openFDA record instead.
  • openFDA occasionally answers HTTP 500 for a few seconds at a time. The Actor retries up to 4 times over about 20 seconds; if one source still fails, the other sources are delivered, the failure is named in the run status message and in the RUN_SUMMARY key-value record, and the run only fails outright when every selected source failed.
  • NHTSA vehicle recalls are not included in this version.
  • Hard cap of 5,000 records per run.

FAQ

Can I run it for free? Yes. Every run returns up to 25 records free, and Apify's free plan covers the platform cost of running it.

Why did I get fewer records than maxResults? Either the date window and keyword matched fewer recalls, or your run's maximum total charge was reached; the run status message tells you which.

Is the id stable? Yes. id is <source>:<recall_number>; the same recall keeps the same id on every run, so you can deduplicate across scheduled runs.

Does it include CPSC "Sold At" retailers as firms? No. The CPSC feed mixes where-sold text into its retailer list; that text is moved to sold_at, and firms only holds named organizations.

Can I get CSV? Choose "outputFormat": "flat" and export the dataset as CSV or Excel from the run's Output tab or the API.