FDA Recalls: Food, Drug & Device Scraper avatar

FDA Recalls: Food, Drug & Device Scraper

Pricing

from $3.99 / 1,000 fda recall results

Go to Apify Store
FDA Recalls: Food, Drug & Device Scraper

FDA Recalls: Food, Drug & Device Scraper

Search and export FDA food, drug, and medical-device recalls from official openFDA enforcement data. Filter by classification, state, date, status, brand or ingredient watchlists, and get normalized records with deduplication, quality checks, and transparent 0–100 priority scoring.

Pricing

from $3.99 / 1,000 fda recall results

Rating

0.0

(0)

Developer

Johnn Mottin

Johnn Mottin

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

10 days ago

Last modified

Share

#FDA Recalls: Food, Drug & Device Scraper

Search and export FDA food, drug, and medical-device recalls from official openFDA data — normalized into one consistent dataset.

Filter recalls by classification, date, state, status, brand or ingredient. Build watchlists, remove duplicates automatically, and prioritize results with a transparent 0–100 operational score.

✓ Food, drugs & medical devices ✓ Class I, II & III recalls ✓ Brand and ingredient watchlists ✓ Normalized structured output ✓ Automatic deduplication ✓ Priority and data-quality scoring ✓ API, schedules and integrations

Starting at $0.00399 per recall record — about $4 per 1,000 results.

Unofficial community Actor. Uses public openFDA enforcement data and is not affiliated with or endorsed by the FDA.

A Class I recall you missed is a product still on your shelves. Search, normalize, prioritize, and export FDA food, drug, and medical-device recalls from one Actor.

Unofficial community Actor. Not affiliated with or endorsed by the U.S. Food and Drug Administration (FDA).

What this Actor does

The Actor queries the official openFDA enforcement endpoints, converts their partly different records into one stable contract, removes duplicates, computes transparent operational signals, and writes exactly one dataset item for each valid recall. A separate STATS record contains run and quality metrics.

Who it is for

  • Track FDA food, drug and medical-device recalls — one Actor over the three official openFDA enforcement endpoints, for compliance teams, manufacturers, distributors and retailers.
  • Monitor FDA recalls for specific brands or ingredients — watchlist terms, with an option to keep only matching recalls, for pharmacies, hospitals and procurement teams.
  • Export structured FDA recall data with priority scoring — normalized records and a transparent 0–100 triage score, for insurers, regulatory consultancies and data teams that need structured public recall metadata.

Supported recall types

  • Food: https://api.fda.gov/food/enforcement.json
  • Drugs: https://api.fda.gov/drug/enforcement.json
  • Medical devices: https://api.fda.gov/device/enforcement.json

Input example

{
"productTypes": ["food", "drug", "device"],
"query": "undeclared allergen",
"classifications": ["Class I", "Class II"],
"states": ["NY", "NJ"],
"dateFrom": "2025-01-01",
"watchlistTerms": ["Example Brand", "peanut"],
"onlyWatchlistMatches": false,
"activeOnly": true,
"sortBy": "reportDateDesc",
"maxResults": 100,
"includeRawOpenFda": false
}

OPENFDA_API_KEY is supported as an optional environment variable. Never put an API key in public input. The Actor never logs the key or a URL containing it.

Output example

A real Class I food recall returned by the Actor (openFDA food enforcement endpoint, reported 2026-07-22; long fields shortened, the full record has every documented key):

{
"recordType": "fda-recall",
"sourceCategory": "food",
"recallNumber": "H-1166-2026",
"eventId": "99040",
"classification": "Class I",
"classificationRank": 3,
"status": "Ongoing",
"isOngoing": true,
"recallingFirm": "D'Dioses Fruit Pops, Inc.",
"city": "Paterson",
"state": "NJ",
"productDescription": "Ice Pop, D'Dioses Nuez, 1 Bar (81.7 g), with UPC 827912008548",
"reasonForRecall": "May contain undeclared milk, pecans, pistachios, yellow #5 and red #40.",
"distributionPattern": "Distributed in the following states: NJ, CT, NY, PA.",
"recallInitiationDate": "2026-05-04",
"reportDate": "2026-07-22",
"isNationwide": null,
"watchlistMatched": false,
"priorityScore": 80,
"priorityLevel": "critical",
"priorityReasons": ["Class I: +45", "Ongoing/Open: +20", "Reported in last 30 days: +15"],
"qualityScore": 100
}

Note isNationwide: null — the source did not state it, so the Actor reports null rather than guessing.

Output fields

GroupFields
IdentityrecordType, sourceCategory, recallNumber, eventId
Classificationclassification, classificationRank, status, isOngoing, voluntaryMandated, initialFirmNotification
Firm & locationrecallingFirm, address1, address2, city, state, postalCode, country
ProductproductType, productDescription, productQuantity, productCode, codeInfo, moreCodeInfo
Reason & distributionreasonForRecall, distributionPattern, isNationwide
DatesrecallInitiationDate, centerClassificationDate, reportDate, terminationDate, daysSinceInitiation, daysSinceReport
Names & codesbrandNames, genericNames, manufacturerNames, productNdcs, upcs, deviceNames, deviceClass, medicalSpecialty
Watchlist & prioritywatchlistMatched, watchlistMatches, priorityScore, priorityLevel, priorityReasons
Meta & qualitysourceEndpoint, datasetLastUpdated, scrapedAt, qualityScore, missingFields, warnings, rawOpenFda

Missing values are null (or [] for lists); the Actor never invents data. rawOpenFda is included only when includeRawOpenFda is true.

Priority score explanation

The deterministic 0–100 score adds: Class I +45, Class II +25, Class III +10, Not Yet Classified +15, Ongoing/Open +20, nationwide distribution +15, reports from the last 30 days +15, 31–90 days +10, 91–365 days +5, and a watchlist match +20. Scores are capped at 100. Levels are critical (80–100), high (60–79), medium (35–59), and low (0–34).

Priority scores are operational triage signals based on public recall metadata, not medical advice or an FDA risk classification.

Watchlist example

{
"watchlistTerms": ["Example Brand", "lot abc"],
"onlyWatchlistMatches": true
}

Matching is case-insensitive, Unicode-normalized, punctuation-insensitive, and performed only against the recalling firm, product description, recall reason, brand names, and code information. Terms are treated as text, never as regular expressions.

The published enforcement status is source metadata and must not be treated as a real-time recall lifecycle tracker. Do not use this Actor as a public safety alert service. Verify critical decisions with authoritative FDA recall and safety-alert sources.

Recalls are a daily/weekly compliance feed — a saved input with a date filter stays useful run after run. Use Apify's own Schedules, not a local scheduler — configure it once and it runs in the cloud whether or not your machine is on.

  1. Save your input as a Task (Console → this Actor → Create task), e.g. your product types and watchlist terms.
  2. Console → Schedules → Create schedule, add the Task, set the cron (e.g. daily 6am → 0 6 * * *).
  3. Route the dataset to Slack, Sheets, your CRM or webhook via Apify integrations.

Each run writes a fresh dataset and its summary to the default key-value store as STATS. openFDA enforcement endpoints are updated periodically, usually weekly; this Actor does not claim real-time updates.

API example

curl -X POST "https://api.apify.com/v2/acts/YOUR_USERNAME~fda-recall-intelligence-scraper/runs?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"productTypes":["food"],"maxResults":100}'

Limits

Each openFDA request uses at most 1,000 records, skip never exceeds 25,000, request timeout is 15 seconds, retries are limited to two selective attempts, and at most two categories are queried concurrently. maxResults is the global final output cap. To preserve correct filtering, deduplication, and global sorting, each selected category may retrieve up to that limit before the combined result is filtered, deduplicated, sorted, and sliced. A fixed API quota may apply with or without an openFDA key.

Exact company and closed-list filters use openFDA exact fields. Watchlist queries use category-compatible harmonized fields.

Pricing

This Actor uses Pay Per Event pricing: $0.00399 per recall record — about $4 per 1,000 results — plus a negligible per-run start fee. One valid, unique dataset record corresponds to one billable event. Failed requests, invalid input, duplicates, empty responses, and rejected records are not billable. Check the Pricing tab on this page for the current rates.

Use maxResults to cap the output (and therefore the cost) of each run.

FAQ

Do I need an openFDA API key? No. An optional OPENFDA_API_KEY environment variable raises the openFDA quota, but the Actor works without it.

Is this real-time? No. openFDA enforcement endpoints are updated periodically, usually weekly. Do not use this Actor as a public safety alert service.

What counts as a billable result? One valid, unique recall record written to the dataset. Duplicates, failures, and rejected records are not billed.

Can I monitor specific brands or ingredients? Yes — put the terms in watchlistTerms. Set onlyWatchlistMatches: true to keep only matching recalls.

Can I schedule it? Yes. Create a daily or weekly Apify Schedule with a saved input; each run writes a fresh dataset and a STATS summary.

Data source

Uses public openFDA data from the official food, drug, and device enforcement APIs. The FDA may revise previously published records.

Medical disclaimer

Does not provide medical advice. Recall classifications and the Actor's operational score must be interpreted using authoritative FDA information and appropriate professional judgment.

Privacy statement

No browser, proxy, login, cookies, or scraping of private data. The Actor processes public recall metadata and optional user-supplied filter terms. Do not include secrets or personal patient information in input.

Part of the JM Forge suite

Also from the same developer:

Support

Report issues in the Issues tab of this actor — I respond within 24h. Feature requests welcome.