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
| Field | Type | Description | Sample value |
|---|---|---|---|
recall_numberkey | string | FDA recall number for one recalled product (for example H-1395-2026), unique per record. The record key. | H-1395-2026 |
event_id | string, nullable | FDA recall event identifier; one event can cover several recalled products, so several records can share it. | 99874 |
status | string, nullable | Recall status as reported by FDA: Ongoing, Completed, Terminated or Pending. | Ongoing |
classification | string, nullable | FDA health hazard classification: Class I (most serious), Class II or Class III. | Class I |
product_type | string, nullable | FDA product type (Food for this source). | Food |
product_description | string, nullable | Description 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_recall | string, nullable | Reason for the recall as written in the report. | Undeclared Egg Allergen |
product_quantity | string, nullable | Quantity of product in distribution as reported, in free text (for example 816 units). | 21 Wheels |
code_info | string, nullable | Lot numbers, expiry dates, UDI or other codes identifying the recalled units. | Shelf life: 30 days, all dates through and including 10/7/2026 |
distribution_pattern | string, nullable | Where the product was distributed, in free text. | CA, AZ, NJ, MA, RI, CT, NY |
voluntary_mandated | string, nullable | Whether the recall was firm-initiated or FDA-mandated. | Voluntary: Firm initiated |
initial_firm_notification | string, nullable | How the firm first notified its consignees (letter, e-mail, press release and so on). | |
city | string, nullable | City of the recalling firm's reported location. | Austin |
state | string, nullable | State or province of the recalling firm's reported location. | TX |
country | string, nullable | Country of the recalling firm's reported location. | United States |
recall_initiation_date | date, nullable | Date the firm first notified the public or its consignees of the recall (YYYY-MM-DD). | 2026-09-08 |
center_classification_date | date, nullable | Date FDA classified the recall's health hazard (YYYY-MM-DD). | 2026-09-22 |
report_date | date | Date the recall first appeared in FDA's weekly Enforcement Report (YYYY-MM-DD). | 2026-09-30 |
termination_date | date, nullable | Date 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
| Field | Type | Description | Sample value |
|---|---|---|---|
recall_numberkey | string | FDA recall number for one recalled product (for example D-0860-2026), unique per record. The record key. | D-0860-2026 |
event_id | string, nullable | FDA recall event identifier; one event can cover several recalled products, so several records can share it. | 99712 |
status | string, nullable | Recall status as reported by FDA: Ongoing, Completed, Terminated or Pending. | Ongoing |
classification | string, nullable | FDA health hazard classification: Class I (most serious), Class II or Class III. | Class II |
product_type | string, nullable | FDA product type (Drugs for this source). | Drugs |
product_description | string, nullable | Description 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_recall | string, nullable | Reason for the recall as written in the report. | Lack of Assurance of Sterility |
product_quantity | string, nullable | Quantity of product in distribution as reported, in free text (for example 816 units). | 14538 bottles |
code_info | string, nullable | Lot numbers, expiry dates, UDI or other codes identifying the recalled units. | Lot # 3279, Exp 6/30/2027; Lot # 3292, Exp 5/31/2027. |
distribution_pattern | string, nullable | Where the product was distributed, in free text. | USA Nationwide |
voluntary_mandated | string, nullable | Whether the recall was firm-initiated or FDA-mandated. | Voluntary: Firm initiated |
initial_firm_notification | string, nullable | How the firm first notified its consignees (letter, e-mail, press release and so on). | Letter |
city | string, nullable | City of the recalling firm's reported location. | Dupo |
state | string, nullable | State or province of the recalling firm's reported location. | IL |
country | string, nullable | Country of the recalling firm's reported location. | United States |
recall_initiation_date | date, nullable | Date the firm first notified the public or its consignees of the recall (YYYY-MM-DD). | 2026-08-20 |
center_classification_date | date, nullable | Date FDA classified the recall's health hazard (YYYY-MM-DD). | 2026-09-21 |
report_date | date | Date the recall first appeared in FDA's weekly Enforcement Report (YYYY-MM-DD). | 2026-09-30 |
termination_date | date, nullable | Date 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
| Field | Type | Description | Sample value |
|---|---|---|---|
recall_numberkey | string | FDA recall number for one recalled product (for example Z-3247-2026), unique per record. The record key. | Z-3247-2026 |
event_id | string, nullable | FDA recall event identifier; one event can cover several recalled products, so several records can share it. | 99609 |
status | string, nullable | Recall status as reported by FDA: Ongoing, Completed, Terminated or Pending. | Ongoing |
classification | string, nullable | FDA health hazard classification: Class I (most serious), Class II or Class III. | Class II |
product_type | string, nullable | FDA product type (Devices for this source). | Devices |
product_description | string, nullable | Description 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_recall | string, nullable | Reason for the recall as written in the report. | Potential for detachment of ceramic tip due to manufacturing without the designated amount of adhesive. |
product_quantity | string, nullable | Quantity of product in distribution as reported, in free text (for example 816 units). | 816 units |
code_info | string, nullable | Lot 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_pattern | string, nullable | Where the product was distributed, in free text. | Worldwide distribution - US Nationwide and the countries of Canada, Latin America, Singapore, Hong Kong, and EU. |
voluntary_mandated | string, nullable | Whether the recall was firm-initiated or FDA-mandated. | Voluntary: Firm initiated |
initial_firm_notification | string, nullable | How the firm first notified its consignees (letter, e-mail, press release and so on). | Letter |
city | string, nullable | City of the recalling firm's reported location. | Center Valley |
state | string, nullable | State or province of the recalling firm's reported location. | PA |
country | string, nullable | Country of the recalling firm's reported location. | United States |
recall_initiation_date | date, nullable | Date the firm first notified the public or its consignees of the recall (YYYY-MM-DD). | 2026-08-19 |
center_classification_date | date, nullable | Date FDA classified the recall's health hazard (YYYY-MM-DD). | 2026-09-18 |
report_date | date | Date the recall first appeared in FDA's weekly Enforcement Report (YYYY-MM-DD). | 2026-09-30 |
termination_date | date, nullable | Date 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,classificationortermination_dateon 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
- 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
- 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.
- 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.
- 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
- 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_IDMCP
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_IDMCP
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_IDMCP
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.