FDA Change Feed avatar

FDA Change Feed

Pricing

$5.00 / 1,000 results

Go to Apify Store
FDA Change Feed

FDA Change Feed

openFDA records new or changed since a date, for regulatory, compliance and market-watch teams: FDA recalls, enforcement, 510(k), PMA, Drugs@FDA, Orange Book. Rows are new or updated, with a firm_key joining a firm across endpoints.

Pricing

$5.00 / 1,000 results

Rating

0.0

(0)

Developer

Jesse Hawkins

Jesse Hawkins

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

9 days ago

Last modified

Share

FDA records that are new or changed since a date, for regulatory, compliance and market-watch teams. One run returns the change set from eight openFDA endpoints: 510(k) decisions, PMA decisions, device recalls, drug, device and food enforcement reports, Drugs@FDA applications and Orange Book products. Each row says if the record is new or updated, and carries a firm_key that joins one firm across all eight endpoints.

Use it as an FDA recalls monitor (device recalls and drug, device and food enforcement reports), a 510(k) and PMA clearance watch, or a Drugs@FDA and Orange Book approvals feed. It reads the official openFDA API (api.fda.gov) directly, with no key.

Run it on a schedule, with since a few weeks before your last run, and keep the rows you do not hold yet (see Limits).

What you get

One row per openFDA record with a source date between since and today:

EndpointIn the change set whennew when
drug/drugsfdaa submission status date is in the windowits first original (ORIG) submission is in the window
drug/orangebookthe approval date or a patent submission date is in the windowthe approval date is in the window
drug/enforcementthe report date or the termination date is in the windowthe report date is in the window
device/510kthe decision date is in the windowalways
device/pmathe decision date is in the windowalways (a supplement is its own record)
device/recallthe posting date or the termination date is in the windowthe posting date is in the window
device/enforcementas drug/enforcementas drug/enforcement
food/enforcementas drug/enforcementas drug/enforcement

Every other row is updated: the record existed before since, and a later date on it falls in the window (a termination, a new submission, a new patent).

Input

{
"since": "2026-10-01",
"endpoints": ["device/510k", "device/recall"],
"firms": ["Medtronic"],
"maxItems": 500
}
  • since (required): a date, YYYY-MM-DD, or a number of days back, such as "30".
  • endpoints: any of the eight names above. Empty reads all eight.
  • firms: firm names. A row stays when its firm_key equals the key of a name you give, or starts with it as whole words. So Medtronic keeps MEDTRONIC and MEDTRONIC MINIMED, and not MEDTRONICS. Empty keeps every firm.
  • maxItems: stop after this many rows in all. Each endpoint gives its newest rows first. Default 1,000; the most is 100,000.

Output

{
"endpoint": "device/recall",
"change": "new",
"change_date": "2026-10-14",
"change_field": "event_date_posted",
"firm_name": "Ethicon, LLC",
"firm_key": "ETHICON",
"record_key": "Z-0153-2027",
"key_fields": "product_res_number",
"export_date": "2026-10-15",
"application_number": "",
"recall_number": "",
"k_number": "",
"pma_number": "",
"supplement_number": "",
"product_code": "GAQ",
"product_number": "",
"event_id": "99754",
"record": "{\"action\":\"On 9/8/2026, recall...",
"record_fields": 22,
"record_len": 4977,
"record_sha256": "a5073324...",
"dropped_fields": "additional_info_contact",
"source_url": "https://api.fda.gov/device/recall.json?search=...",
"retrieved_at": "2026-10-16T04:30:00Z",
"sha256": "2aed2c2c..."
}
  • record: the whole openFDA record as compact JSON with sorted keys, minus the fields that name a person (see below).
  • record_sha256: the SHA-256 of record. Store it, and you can see if a record changed between two runs.
  • export_date: the date openFDA last updated that endpoint.
  • source_url, retrieved_at, sha256: the exact API page, when it was read, and the SHA-256 of its body.
  • record_key, key_fields and the id columns match the 1mp FDA regulatory decisions library row for row, so you can join the two.

firm_key

openFDA writes one firm in many ways: BAXTER HLTHCARE CORP in Drugs@FDA, Baxter Healthcare Corporation in a recall. firm_key makes them one key, BAXTER HEALTHCARE. The rule, in order:

  1. Fold to ASCII and upper case.
  2. Delete apostrophes. Change & to AND and + to PLUS.
  3. Change every other character that is not a letter or a digit into a space.
  4. Join a spaced legal initialism into one word: L L C is LLC.
  5. Remove a leading THE.
  6. Remove legal-form words from the end until none is left: INC, CORP, CORPORATION, CO, COMPANY, LLC, LP, LTD, LIMITED, PLC, GMBH, AG, KG, SE, SA, SPA, SRL, BV, NV, AB, PTE, PTY, PVT, PRIVATE and others. A dangling AND goes too.
  7. Remove a last USA or US, then step 6 again.
  8. Spell out the short forms Drugs@FDA uses: PHARMS and PHARM are PHARMACEUTICALS, LABS is LABORATORIES, HLTHCARE is HEALTHCARE, INDS is INDUSTRIES.

Measured on 2026-10-16, on 200 rows (25 from each endpoint) of a 30-day window: 16 rows (8.0%) had the same firm under another key in that window. Known misses:

  • A descriptor word that one endpoint drops: QUAGEN and
    QUAGEN PHARMACEUTICALS
    , NEPHRON and NEPHRON PHARMACEUTICALS, ELEVAR and ELEVAR THERAPEUTICS. Drugs@FDA often cuts names short (PIRAMAL CRITICAL). Give the short name in firms, and the starts-with rule finds both.
  • Divisions and subsidiaries keep their own key: MEDTRONIC MINIMED is not MEDTRONIC, and GE HEALTHCARE is not
    GE MEDICAL SYSTEMS
    . The firms filter finds the divisions that start with the parent's name.
  • Entities of one name in two countries share a key: BIOTRONIK AG and Biotronik, Inc. are both BIOTRONIK. The key names a firm by its name, not a legal entity.
  • firms asks openFDA for every firm whose name starts with the first word you give (Baxter Healthcare is asked as BAXTER*), then keeps the rows whose firm_key matches. A short first word, such as GE, reads more pages, but you pay only for the rows kept.

Limits

  • openFDA updates each endpoint on its own schedule, about once a week for enforcement reports and 510(k). A record can appear days after its source date. So set since a few weeks before your last run, and drop rows whose record_key and record_sha256 you already hold.
  • device/classification is not in the feed: it has no date field, so it has no change set.
  • openFDA allows 240 requests a minute and 1,000 a day per IP without a key. One request returns up to 1,000 rows. The Actor waits 0.3 s between requests and retries a 429 or a 5xx.
  • The Actor reads api.fda.gov only. It uses no browser and no key.

What it will not do

  • No personal data. The adverse-event and MAUDE endpoints are not read. The 510(k) contact field and the recall additional_info_contact field name a person, so they are removed from every record. dropped_fields says which ones a record had.
  • No GMDN text: device/udi is not read.
  • No interpretation. A row is FDA's administrative record. It does not say what an approval, a recall or a classification means.

Source and licence

openFDA, U.S. Food and Drug Administration. openFDA content is in the public domain under CC0 1.0 (open.fda.gov/license). openFDA says: "Do not rely on openFDA to make decisions regarding medical care."

Price

$5.00 per 1,000 rows ($0.005 a row), billed per row returned, with no start fee.