Guide · 3 Verified sources

Monitor FDA recalls for food, drugs and medical devices

Get a field-level alert when FDA's weekly Enforcement Report lists a new food, drug or medical device recall, or changes the status or classification of one you already track.

Start with Food recall enforcement reportsREST API, CLI and MCP

The problem

FDA publishes a weekly Enforcement Report listing every recall it has classified, whether the firm started it or FDA required it. If you follow recalls for a product line, a supplier list or a newsroom, the work is noticing what is new each week and what changed on recalls you have already seen: a status moving from Ongoing to Terminated, a classification being set, a termination date appearing.

This guide sets up three monitors from Verified recipes that read openFDA's public enforcement endpoints: one each for food, drug and medical device recalls. Each recalled product becomes one record keyed by its FDA recall number, so every later run reports new recalls and field-level changes to existing ones.

What the source contains

Food recall enforcement reports · U.S. Food and Drug Administration

The 100 most recently reported FDA food recalls from the weekly Enforcement Report, one record per recalled product: recall number, classification, status, product, reason, codes, distribution and dates. Firm names and street addresses are left out.

19 typed fields · 100 records in SourceFinch's latest run on October 12, 2026 · publisher updates: weekly, when FDA publishes the Enforcement Report · full source page

FieldTypeDescriptionSample value
recall_numberkeystringFDA recall number for one recalled product (for example H-1395-2026), unique per record. The record key.H-1395-2026
event_idstring, nullableFDA recall event identifier; one event can cover several recalled products, so several records can share it.99874
statusstring, nullableRecall status as reported by FDA: Ongoing, Completed, Terminated or Pending.Ongoing
classificationstring, nullableFDA health hazard classification: Class I (most serious), Class II or Class III.Class I
product_typestring, nullableFDA product type (Food for this source).Food
product_descriptionstring, nullableDescription of the recalled product as written in the report, including brand, size and packaging.Fromagerie Coop de Mean Cabricharme and Belgium Cabricharme Shelf life: 30 days, all dates through and including 10/7/2026 Packaging: Plastic wrapped by slice Net Wt.: Various, cut from whole wheel and priced by weight with Whole Foods Market scale label PLUs: 54670, 57953
reason_for_recallstring, nullableReason for the recall as written in the report.Undeclared Egg Allergen
product_quantitystring, nullableQuantity of product in distribution as reported, in free text (for example 816 units).21 Wheels
code_infostring, nullableLot numbers, expiry dates, UDI or other codes identifying the recalled units.Shelf life: 30 days, all dates through and including 10/7/2026
distribution_patternstring, nullableWhere the product was distributed, in free text.CA, AZ, NJ, MA, RI, CT, NY
voluntary_mandatedstring, nullableWhether the recall was firm-initiated or FDA-mandated.Voluntary: Firm initiated
initial_firm_notificationstring, nullableHow the firm first notified its consignees (letter, e-mail, press release and so on).E-Mail
citystring, nullableCity of the recalling firm's reported location.Austin
statestring, nullableState or province of the recalling firm's reported location.TX
countrystring, nullableCountry of the recalling firm's reported location.United States
recall_initiation_datedate, nullableDate the firm first notified the public or its consignees of the recall (YYYY-MM-DD).2026-09-08
center_classification_datedate, nullableDate FDA classified the recall's health hazard (YYYY-MM-DD).2026-09-22
report_datedateDate the recall first appeared in FDA's weekly Enforcement Report (YYYY-MM-DD).2026-09-30
termination_datedate, nullableDate FDA terminated the recall, when it has; null while it is open (YYYY-MM-DD).—

Drug recall enforcement reports · U.S. Food and Drug Administration

The 100 most recently reported FDA drug recalls from the weekly Enforcement Report, one record per recalled product: recall number, classification, status, product, reason, codes, distribution and dates. Firm names and street addresses are left out.

19 typed fields · 100 records in SourceFinch's latest run on October 12, 2026 · publisher updates: weekly, when FDA publishes the Enforcement Report · full source page

Fields and a sample record
FieldTypeDescriptionSample value
recall_numberkeystringFDA recall number for one recalled product (for example D-0860-2026), unique per record. The record key.D-0860-2026
event_idstring, nullableFDA recall event identifier; one event can cover several recalled products, so several records can share it.99712
statusstring, nullableRecall status as reported by FDA: Ongoing, Completed, Terminated or Pending.Ongoing
classificationstring, nullableFDA health hazard classification: Class I (most serious), Class II or Class III.Class II
product_typestring, nullableFDA product type (Drugs for this source).Drugs
product_descriptionstring, nullableDescription of the recalled product as written in the report, including brand, size and packaging.TRP The Relief Products* Gentle Eyes Lubricant Eye Drops, Carboxymethylcellulose sodium 0.5%, Sterile Eye Drops, 0.5 FL OZ (15 mL) bottles, Manufactured exclusively for TRP Company, Inc. 1575 Delucci Ln, Reno, NV 89502, NDC 17312-430-15.
reason_for_recallstring, nullableReason for the recall as written in the report.Lack of Assurance of Sterility
product_quantitystring, nullableQuantity of product in distribution as reported, in free text (for example 816 units).14538 bottles
code_infostring, nullableLot numbers, expiry dates, UDI or other codes identifying the recalled units.Lot # 3279, Exp 6/30/2027; Lot # 3292, Exp 5/31/2027.
distribution_patternstring, nullableWhere the product was distributed, in free text.USA Nationwide
voluntary_mandatedstring, nullableWhether the recall was firm-initiated or FDA-mandated.Voluntary: Firm initiated
initial_firm_notificationstring, nullableHow the firm first notified its consignees (letter, e-mail, press release and so on).Letter
citystring, nullableCity of the recalling firm's reported location.Dupo
statestring, nullableState or province of the recalling firm's reported location.IL
countrystring, nullableCountry of the recalling firm's reported location.United States
recall_initiation_datedate, nullableDate the firm first notified the public or its consignees of the recall (YYYY-MM-DD).2026-08-20
center_classification_datedate, nullableDate FDA classified the recall's health hazard (YYYY-MM-DD).2026-09-21
report_datedateDate the recall first appeared in FDA's weekly Enforcement Report (YYYY-MM-DD).2026-09-30
termination_datedate, nullableDate FDA terminated the recall, when it has; null while it is open (YYYY-MM-DD).—

Medical device recall enforcement reports · U.S. Food and Drug Administration

The 100 most recently reported FDA medical device recalls from the weekly Enforcement Report, one record per recalled product: recall number, classification, status, product, reason, codes, distribution and dates. Firm names and street addresses are left out.

19 typed fields · 100 records in SourceFinch's latest run on October 12, 2026 · publisher updates: weekly, when FDA publishes the Enforcement Report · full source page

Fields and a sample record
FieldTypeDescriptionSample value
recall_numberkeystringFDA recall number for one recalled product (for example Z-3247-2026), unique per record. The record key.Z-3247-2026
event_idstring, nullableFDA recall event identifier; one event can cover several recalled products, so several records can share it.99609
statusstring, nullableRecall status as reported by FDA: Ongoing, Completed, Terminated or Pending.Ongoing
classificationstring, nullableFDA health hazard classification: Class I (most serious), Class II or Class III.Class II
product_typestring, nullableFDA product type (Devices for this source).Devices
product_descriptionstring, nullableDescription of the recalled product as written in the report, including brand, size and packaging.Olympus BiCOAG Hemostasis Probe 7Fr Fixed Pin Connector. Model/Catalog Number: CD-B622LA.
reason_for_recallstring, nullableReason for the recall as written in the report.Potential for detachment of ceramic tip due to manufacturing without the designated amount of adhesive.
product_quantitystring, nullableQuantity of product in distribution as reported, in free text (for example 816 units).816 units
code_infostring, nullableLot numbers, expiry dates, UDI or other codes identifying the recalled units.Lot Code: Model: CD-B622LA. UDI-DI: 00821925039452. Lot Numbers: All unexpired lots
distribution_patternstring, nullableWhere the product was distributed, in free text.Worldwide distribution - US Nationwide and the countries of Canada, Latin America, Singapore, Hong Kong, and EU.
voluntary_mandatedstring, nullableWhether the recall was firm-initiated or FDA-mandated.Voluntary: Firm initiated
initial_firm_notificationstring, nullableHow the firm first notified its consignees (letter, e-mail, press release and so on).Letter
citystring, nullableCity of the recalling firm's reported location.Center Valley
statestring, nullableState or province of the recalling firm's reported location.PA
countrystring, nullableCountry of the recalling firm's reported location.United States
recall_initiation_datedate, nullableDate the firm first notified the public or its consignees of the recall (YYYY-MM-DD).2026-08-19
center_classification_datedate, nullableDate FDA classified the recall's health hazard (YYYY-MM-DD).2026-09-18
report_datedateDate the recall first appeared in FDA's weekly Enforcement Report (YYYY-MM-DD).2026-09-30
termination_datedate, nullableDate FDA terminated the recall, when it has; null while it is open (YYYY-MM-DD).—

What a change means

  • A new recall_number: a recalled product that was not in the previous run, usually one newly listed in the weekly report.
  • A change to status, classification or termination_date on a recall number you already have.
  • Several records sharing one event_id: a single recall event can cover several recalled products.

Set it up in the console

  1. Open the Verified recipe. Open the Food recall enforcement reports recipe in the console. It keeps the reviewed URL, fields and record key (recall_number), and shows the latest captured sample. Open in the console
  2. Create the monitor. Name the monitor, keep the daily schedule or pick another (the console shows the monthly run cost), confirm that you have the right to monitor the source, and choose Create monitor.
  3. Run the baseline. The first run is the baseline: every record is new. From the second run on, the monitor reports what was added, changed or removed, field by field, with the evidence behind each value.
  4. Choose how you hear about changes. In Alerts, choose immediate change emails or a daily or weekly digest; each monitor can override that on its own page. For your own systems, add a signed webhook in Destinations. Alerts and team
  5. Repeat for drugs and medical devices. Open the drug and the medical device recipes the same way. Each is its own monitor with its own history, so food, drug and device recalls can go to different people.

The other recipes: Drug recall enforcement reports, Medical device recall enforcement reports.

The same through the REST API, CLI or MCP

Every surface creates the same monitor from the same Verified recipe. You confirm you have the right to collect the source (rights: true).

Food recall enforcement reports

REST API

Create an API key under Console → API & access. Reference: /docs/api.

# the Verified entry (fields, recipe, sample, terms) as JSON
curl https://sourcefinch.com/v1/catalog/openfda-food-enforcement-reports -H "Authorization: Bearer $SOURCEFINCH_API_KEY"

# create the monitor from source.json (below)
curl -X POST https://sourcefinch.com/v1/sources \
  -H "Authorization: Bearer $SOURCEFINCH_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d @source.json

# then run it now (later runs follow the schedule)
curl -X POST https://sourcefinch.com/v1/sources/$SOURCE_ID/runs \
  -H "Authorization: Bearer $SOURCEFINCH_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)"

CLI

The sourcefinch CLI is not on npm yet; see /docs/cli.

sourcefinch login
sourcefinch catalog get openfda-food-enforcement-reports --source-json > source.json
sourcefinch sources create --file source.json
sourcefinch runs create $SOURCE_ID --wait
sourcefinch records $SOURCE_ID

MCP

Remote MCP server with OAuth; see /docs/mcp.

claude mcp add --transport http sourcefinch https://sourcefinch.com/mcp

# then ask your agent:
"Use SourceFinch to monitor Food recall enforcement reports: get_catalog_source openfda-food-enforcement-reports,
then create_source with its create_source_args (dry run first), then run_source."

source.json

The request body the API and CLI examples send.

{
  "name": "Food recall enforcement reports",
  "url": "https://api.fda.gov/food/enforcement.json?search=recall_number:%5B0+TO+z%5D&sort=report_date:desc&limit=100",
  "recipe": {
    "mode": "http",
    "format": "json",
    "items": "results[*]",
    "fields": {
      "city": "city",
      "state": "state",
      "status": "status",
      "country": "country",
      "event_id": "event_id",
      "code_info": "code_info",
      "report_date": "report_date",
      "product_type": "product_type",
      "recall_number": "recall_number",
      "classification": "classification",
      "product_quantity": "product_quantity",
      "termination_date": "termination_date",
      "reason_for_recall": "reason_for_recall",
      "voluntary_mandated": "voluntary_mandated",
      "product_description": "product_description",
      "distribution_pattern": "distribution_pattern",
      "recall_initiation_date": "recall_initiation_date",
      "initial_firm_notification": "initial_firm_notification",
      "center_classification_date": "center_classification_date"
    },
    "required": [
      "recall_number",
      "report_date"
    ],
    "types": {
      "report_date": "date",
      "termination_date": "date",
      "recall_initiation_date": "date",
      "center_classification_date": "date"
    }
  },
  "key_field": "recall_number",
  "schedule": "daily",
  "rights": true,
  "catalog": {
    "slug": "openfda-food-enforcement-reports",
    "version_id": "50155324-f06c-4dff-b6ef-6ab19d6664cf"
  }
}
Drug recall enforcement reports

REST API

Create an API key under Console → API & access. Reference: /docs/api.

# the Verified entry (fields, recipe, sample, terms) as JSON
curl https://sourcefinch.com/v1/catalog/openfda-drug-enforcement-reports -H "Authorization: Bearer $SOURCEFINCH_API_KEY"

# create the monitor from source.json (below)
curl -X POST https://sourcefinch.com/v1/sources \
  -H "Authorization: Bearer $SOURCEFINCH_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d @source.json

# then run it now (later runs follow the schedule)
curl -X POST https://sourcefinch.com/v1/sources/$SOURCE_ID/runs \
  -H "Authorization: Bearer $SOURCEFINCH_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)"

CLI

The sourcefinch CLI is not on npm yet; see /docs/cli.

sourcefinch login
sourcefinch catalog get openfda-drug-enforcement-reports --source-json > source.json
sourcefinch sources create --file source.json
sourcefinch runs create $SOURCE_ID --wait
sourcefinch records $SOURCE_ID

MCP

Remote MCP server with OAuth; see /docs/mcp.

claude mcp add --transport http sourcefinch https://sourcefinch.com/mcp

# then ask your agent:
"Use SourceFinch to monitor Drug recall enforcement reports: get_catalog_source openfda-drug-enforcement-reports,
then create_source with its create_source_args (dry run first), then run_source."

source.json

The request body the API and CLI examples send.

{
  "name": "Drug recall enforcement reports",
  "url": "https://api.fda.gov/drug/enforcement.json?search=recall_number:%5B0+TO+z%5D&sort=report_date:desc&limit=100",
  "recipe": {
    "mode": "http",
    "format": "json",
    "items": "results[*]",
    "fields": {
      "city": "city",
      "state": "state",
      "status": "status",
      "country": "country",
      "event_id": "event_id",
      "code_info": "code_info",
      "report_date": "report_date",
      "product_type": "product_type",
      "recall_number": "recall_number",
      "classification": "classification",
      "product_quantity": "product_quantity",
      "termination_date": "termination_date",
      "reason_for_recall": "reason_for_recall",
      "voluntary_mandated": "voluntary_mandated",
      "product_description": "product_description",
      "distribution_pattern": "distribution_pattern",
      "recall_initiation_date": "recall_initiation_date",
      "initial_firm_notification": "initial_firm_notification",
      "center_classification_date": "center_classification_date"
    },
    "required": [
      "recall_number",
      "report_date"
    ],
    "types": {
      "report_date": "date",
      "termination_date": "date",
      "recall_initiation_date": "date",
      "center_classification_date": "date"
    }
  },
  "key_field": "recall_number",
  "schedule": "daily",
  "rights": true,
  "catalog": {
    "slug": "openfda-drug-enforcement-reports",
    "version_id": "726cb862-228f-4397-98b9-799b1e50071d"
  }
}
Medical device recall enforcement reports

REST API

Create an API key under Console → API & access. Reference: /docs/api.

# the Verified entry (fields, recipe, sample, terms) as JSON
curl https://sourcefinch.com/v1/catalog/openfda-device-enforcement-reports -H "Authorization: Bearer $SOURCEFINCH_API_KEY"

# create the monitor from source.json (below)
curl -X POST https://sourcefinch.com/v1/sources \
  -H "Authorization: Bearer $SOURCEFINCH_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d @source.json

# then run it now (later runs follow the schedule)
curl -X POST https://sourcefinch.com/v1/sources/$SOURCE_ID/runs \
  -H "Authorization: Bearer $SOURCEFINCH_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)"

CLI

The sourcefinch CLI is not on npm yet; see /docs/cli.

sourcefinch login
sourcefinch catalog get openfda-device-enforcement-reports --source-json > source.json
sourcefinch sources create --file source.json
sourcefinch runs create $SOURCE_ID --wait
sourcefinch records $SOURCE_ID

MCP

Remote MCP server with OAuth; see /docs/mcp.

claude mcp add --transport http sourcefinch https://sourcefinch.com/mcp

# then ask your agent:
"Use SourceFinch to monitor Medical device recall enforcement reports: get_catalog_source openfda-device-enforcement-reports,
then create_source with its create_source_args (dry run first), then run_source."

source.json

The request body the API and CLI examples send.

{
  "name": "Medical device recall enforcement reports",
  "url": "https://api.fda.gov/device/enforcement.json?search=recall_number:%5B0+TO+z%5D&sort=report_date:desc&limit=100",
  "recipe": {
    "mode": "http",
    "format": "json",
    "items": "results[*]",
    "fields": {
      "city": "city",
      "state": "state",
      "status": "status",
      "country": "country",
      "event_id": "event_id",
      "code_info": "code_info",
      "report_date": "report_date",
      "product_type": "product_type",
      "recall_number": "recall_number",
      "classification": "classification",
      "product_quantity": "product_quantity",
      "termination_date": "termination_date",
      "reason_for_recall": "reason_for_recall",
      "voluntary_mandated": "voluntary_mandated",
      "product_description": "product_description",
      "distribution_pattern": "distribution_pattern",
      "recall_initiation_date": "recall_initiation_date",
      "initial_firm_notification": "initial_firm_notification",
      "center_classification_date": "center_classification_date"
    },
    "required": [
      "recall_number",
      "report_date"
    ],
    "types": {
      "report_date": "date",
      "termination_date": "date",
      "recall_initiation_date": "date",
      "center_classification_date": "date"
    }
  },
  "key_field": "recall_number",
  "schedule": "daily",
  "rights": true,
  "catalog": {
    "slug": "openfda-device-enforcement-reports",
    "version_id": "f255ff8e-2e87-4f1f-91cf-b3d6e099ebae"
  }
}

Alerts and evidence

FDA publishes the report weekly, so a daily or weekly email digest is usually enough. Choose one in Alerts, or override it on a single monitor's page.

Every run keeps the publisher's exact response with its SHA-256 hash and a signed manifest, and every value points back to where it was read. How that works is in the docs:

Limitations

  • Each run reads the 100 most recently reported recalls of that type. A recall leaving that window is not a withdrawal; newer recalls were reported.
  • openFDA warns that its data is unvalidated and must not be relied on for medical decisions. SourceFinch carries the data as published and adds no safety advice.
  • The recalling firm's name, street address and postal code are deliberately not read, because openFDA lists sole proprietors under their own names. Records keep the firm's city, state and country, and product descriptions usually name brands and distributors.
  • The report is weekly, so most daily runs find nothing new. Unchanged runs still count as runs.

Usage rights, terms posture and reliability for each source are on its source page. They are our documented understanding of each publisher's stated terms, not legal advice.

Related

SourceFinch is independent and is not affiliated with or endorsed by U.S. Food and Drug Administration. This guide describes their public data as SourceFinch acquires it. It is not legal, medical or financial advice.