SourceFinch Verified · Product recalls & safety

Drug recall enforcement reports

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.

Monitor this sourceAPI, CLI, SDK and MCP

At a glance

Jurisdiction
United States (federal)
Publisher updates
Weekly, when FDA publishes the Enforcement Report
SourceFinch checks
Daily by default
Records per run
100 in the latest run
Record key
recall_number
Acquired from
Publisher's public API: https://api.fda.gov/drug/enforcement.json?search=recall_number:%5B0+TO+z%5D&sort=report_date:desc&limit=100
Recipe
v1.0.1, approved October 12, 2026
Verified since
October 12, 2026
Last green run
October 12, 2026

What the data contains

FDA's weekly Enforcement Report lists every recall FDA has classified, whether the firm started it or FDA required it. openFDA publishes the report as a public JSON service that needs no key for light use. This source reads the 100 most recently reported drug recalls (sorted by report date) on each daily run and makes one record per recalled product keyed by its FDA recall number, so a monitor reports new recalls and later changes to a recall's status, classification or termination date. Records carry the product description, reason, codes, quantity, distribution pattern, hazard class and dates, plus the city, state and country of the recalling firm. The recalling firm's name, street address and postal code are deliberately not read: openFDA lists sole proprietors under their own names, so that field can name a private individual. Product descriptions are published text and usually name brands and distributors, which are companies. openFDA warns that its data is unvalidated and must not be relied on for medical decisions; this source carries the data as published and adds no safety advice. A recall leaving the 100-record window is not a withdrawal.

Fields and types

Every record has these fields. The key field recall_number identifies a record across runs, so changes are reported field by field.

FieldTypeDescription
recall_numberkeystringFDA recall number for one recalled product (for example D-0860-2026), unique per record. The record key.
event_idstring, nullableFDA recall event identifier; one event can cover several recalled products, so several records can share it.
statusstring, nullableRecall status as reported by FDA: Ongoing, Completed, Terminated or Pending.
classificationstring, nullableFDA health hazard classification: Class I (most serious), Class II or Class III.
product_typestring, nullableFDA product type (Drugs for this source).
product_descriptionstring, nullableDescription of the recalled product as written in the report, including brand, size and packaging.
reason_for_recallstring, nullableReason for the recall as written in the report.
product_quantitystring, nullableQuantity of product in distribution as reported, in free text (for example 816 units).
code_infostring, nullableLot numbers, expiry dates, UDI or other codes identifying the recalled units.
distribution_patternstring, nullableWhere the product was distributed, in free text.
voluntary_mandatedstring, nullableWhether the recall was firm-initiated or FDA-mandated.
initial_firm_notificationstring, nullableHow the firm first notified its consignees (letter, e-mail, press release and so on).
citystring, nullableCity of the recalling firm's reported location.
statestring, nullableState or province of the recalling firm's reported location.
countrystring, nullableCountry of the recalling firm's reported location.
recall_initiation_datedate, nullableDate the firm first notified the public or its consignees of the recall (YYYY-MM-DD).
center_classification_datedate, nullableDate FDA classified the recall's health hazard (YYYY-MM-DD).
report_datedateDate the recall first appeared in FDA's weekly Enforcement Report (YYYY-MM-DD).
termination_datedate, nullableDate FDA terminated the recall, when it has; null while it is open (YYYY-MM-DD).

Sample output

The first 5 of 100 records from SourceFinch's own run on October 12, 2026, exactly as delivered.

FieldRecord 1Record 2Record 3Record 4Record 5
recall_numberD-0860-2026D-0863-2026D-0871-2026D-0855-2026D-0862-2026
event_id9971299712999099971299712
statusOngoingOngoingOngoingOngoingOngoing
classificationClass IIClass IIClass IIClass IIClass II
product_typeDrugsDrugsDrugsDrugsDrugs
product_descriptionTRP 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.AvKare Carboxymethylcellulose Sodium Ophthalmic Solution 0.5%, Lubricant Eye Drops, Sterile, 0.5 FL OZ (15 mL) EACH, 1.0 FL OZ (30 mL) TOTAL, 2 count Twin Pack, Distributed by: AVKARE, Pulaski, TN, 38478, NDC 50268-068-02 (carton)Clear Eyes Redness Relief, Lubricant/Redness Reliever Eye Drops (glycerin 0.25%, naphazoline hydrochloride 0.012%) with Hang Tag, 0.5 fl oz (15mL) per dropper bottle, STERILE, Dist. by Medtech Products Inc., Tarrytown, NY 10591. NDC: 67172-797-15AvKare Carboxymethylcellulose Sodium Ophthalmic Solution 0.5%, Lubricant Eye Drops, Sterile, 0.5 FL OZ (15 mL) bottle, Distributed by: AVKARE, Pulaski, TN, 38478, NDC 50268-068-15Lubricant Eye Drops-Cameron Pharmaceuticals, Carboxymethylcellulose Sodium 0.5%, Eye Lubricant, 0.5 FL OZ (15 mL) bottles, Distributed by Cameron Pharmaceuticals, LLC, Louisville, KY, 40245, NDC 42494-448-05
reason_for_recallLack of Assurance of SterilityLack of Assurance of SterilityLack of Assurance of SterilityLack of Assurance of SterilityLack of Assurance of Sterility
product_quantity14538 bottles107,377 packs—12,864 packs19284 bottles
code_infoLot # 3279, Exp 6/30/2027; Lot # 3292, Exp 5/31/2027.Lot# 3161, Exp 8/2026, Lot# 3245, Expiry: 3/2027; Lot# 3260, Expiry: 5/2027; Lot# 3298, Lot# 3299, and Lot# 3300, Expiry: 6/2027; Lot# 3301, Lot# 3302, Lot# 3305 and Lot# 3306, Expiry: 7/2027Lot #: RL25G04, Exp. Date 07/2027; RL2H02, Exp. Date 08/2027.Lot# 3161, Exp 8/2026, Lot# 3245, Expiry: 3/2027; Lot# 3260, Expiry: 5/2027; Lot# 3298, Lot# 3299, and Lot# 3300, Expiry: 6/2027; Lot# 3301, Lot# 3302, Lot# 3305 and Lot# 3306, Expiry: 7/2027Lot # 3163, Expiry: 8/31/2026; Lot# 3164, Expiry: 9/30/2026.
distribution_patternUSA NationwideUSA NationwideNationwide in the USA.USA NationwideUSA Nationwide
voluntary_mandatedVoluntary: Firm initiatedVoluntary: Firm initiatedVoluntary: Firm initiatedVoluntary: Firm initiatedVoluntary: Firm initiated
initial_firm_notificationLetterLetterLetterLetterLetter
cityDupoDupoTarrytownDupoDupo
stateILILNYILIL
countryUnited StatesUnited StatesUnited StatesUnited StatesUnited States
recall_initiation_date2026-08-202026-08-202026-09-152026-08-202026-08-20
center_classification_date2026-09-212026-09-212026-09-232026-09-212026-09-21
report_date2026-09-302026-09-302026-09-302026-09-302026-09-30
termination_date—————
Sample as JSON
[
  {
    "city": "Dupo",
    "state": "IL",
    "status": "Ongoing",
    "country": "United States",
    "event_id": "99712",
    "code_info": "Lot # 3279, Exp 6/30/2027; Lot # 3292, Exp 5/31/2027.",
    "report_date": "2026-09-30",
    "product_type": "Drugs",
    "recall_number": "D-0860-2026",
    "classification": "Class II",
    "product_quantity": "14538 bottles",
    "termination_date": null,
    "reason_for_recall": "Lack of Assurance of Sterility",
    "voluntary_mandated": "Voluntary: Firm initiated",
    "product_description": "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.",
    "distribution_pattern": "USA Nationwide",
    "recall_initiation_date": "2026-08-20",
    "initial_firm_notification": "Letter",
    "center_classification_date": "2026-09-21"
  },
  {
    "city": "Dupo",
    "state": "IL",
    "status": "Ongoing",
    "country": "United States",
    "event_id": "99712",
    "code_info": "Lot# 3161, Exp 8/2026, Lot# 3245, Expiry: 3/2027; Lot# 3260, Expiry: 5/2027; Lot# 3298, Lot# 3299, and Lot# 3300, Expiry: 6/2027; Lot# 3301, Lot# 3302, Lot# 3305 and Lot# 3306, Expiry: 7/2027",
    "report_date": "2026-09-30",
    "product_type": "Drugs",
    "recall_number": "D-0863-2026",
    "classification": "Class II",
    "product_quantity": "107,377 packs",
    "termination_date": null,
    "reason_for_recall": "Lack of Assurance of Sterility",
    "voluntary_mandated": "Voluntary: Firm initiated",
    "product_description": "AvKare Carboxymethylcellulose Sodium Ophthalmic Solution 0.5%, Lubricant Eye Drops, Sterile, 0.5 FL OZ (15 mL) EACH, 1.0 FL OZ (30 mL) TOTAL, 2 count Twin Pack, Distributed by: AVKARE, Pulaski, TN, 38478, NDC 50268-068-02 (carton)",
    "distribution_pattern": "USA Nationwide",
    "recall_initiation_date": "2026-08-20",
    "initial_firm_notification": "Letter",
    "center_classification_date": "2026-09-21"
  },
  {
    "city": "Tarrytown",
    "state": "NY",
    "status": "Ongoing",
    "country": "United States",
    "event_id": "99909",
    "code_info": "Lot #: RL25G04, Exp. Date 07/2027; RL2H02, Exp. Date 08/2027.",
    "report_date": "2026-09-30",
    "product_type": "Drugs",
    "recall_number": "D-0871-2026",
    "classification": "Class II",
    "product_quantity": "",
    "termination_date": null,
    "reason_for_recall": "Lack of Assurance of Sterility",
    "voluntary_mandated": "Voluntary: Firm initiated",
    "product_description": "Clear Eyes Redness Relief, Lubricant/Redness Reliever Eye Drops (glycerin 0.25%, naphazoline hydrochloride 0.012%) with Hang Tag, 0.5 fl oz (15mL) per dropper bottle, STERILE, Dist. by Medtech Products Inc., Tarrytown, NY 10591.  NDC: 67172-797-15",
    "distribution_pattern": "Nationwide in the USA.",
    "recall_initiation_date": "2026-09-15",
    "initial_firm_notification": "Letter",
    "center_classification_date": "2026-09-23"
  },
  {
    "city": "Dupo",
    "state": "IL",
    "status": "Ongoing",
    "country": "United States",
    "event_id": "99712",
    "code_info": "Lot# 3161, Exp 8/2026, Lot# 3245, Expiry: 3/2027; Lot# 3260, Expiry: 5/2027; Lot# 3298, Lot# 3299, and Lot# 3300, Expiry: 6/2027; Lot# 3301, Lot# 3302, Lot# 3305 and Lot# 3306, Expiry: 7/2027",
    "report_date": "2026-09-30",
    "product_type": "Drugs",
    "recall_number": "D-0855-2026",
    "classification": "Class II",
    "product_quantity": "12,864 packs",
    "termination_date": null,
    "reason_for_recall": "Lack of Assurance of Sterility",
    "voluntary_mandated": "Voluntary: Firm initiated",
    "product_description": "AvKare Carboxymethylcellulose Sodium Ophthalmic Solution 0.5%, Lubricant Eye Drops, Sterile, 0.5 FL OZ (15 mL) bottle, Distributed by: AVKARE, Pulaski, TN, 38478, NDC 50268-068-15",
    "distribution_pattern": "USA Nationwide",
    "recall_initiation_date": "2026-08-20",
    "initial_firm_notification": "Letter",
    "center_classification_date": "2026-09-21"
  },
  {
    "city": "Dupo",
    "state": "IL",
    "status": "Ongoing",
    "country": "United States",
    "event_id": "99712",
    "code_info": "Lot # 3163, Expiry: 8/31/2026; Lot# 3164, Expiry: 9/30/2026.",
    "report_date": "2026-09-30",
    "product_type": "Drugs",
    "recall_number": "D-0862-2026",
    "classification": "Class II",
    "product_quantity": "19284 bottles",
    "termination_date": null,
    "reason_for_recall": "Lack of Assurance of Sterility",
    "voluntary_mandated": "Voluntary: Firm initiated",
    "product_description": "Lubricant Eye Drops-Cameron Pharmaceuticals, Carboxymethylcellulose Sodium 0.5%, Eye Lubricant, 0.5 FL OZ (15 mL) bottles, Distributed by Cameron Pharmaceuticals, LLC, Louisville, KY, 40245, NDC 42494-448-05",
    "distribution_pattern": "USA Nationwide",
    "recall_initiation_date": "2026-08-20",
    "initial_firm_notification": "Letter",
    "center_classification_date": "2026-09-21"
  }
]

Evidence behind every value

  • Each run keeps the publisher's exact response, hashed with SHA-256. This sample came from a response with hash 21f522c7218444f6935eebeb4ebf5aec06b18a64a009e5c29ffcb9f3f028acb8.
  • Every value records where it came from in that response: a JSON Pointer into the retained capture.
  • Each run gets a signed manifest (Ed25519) timestamped by an RFC 3161 authority: this run's manifest hash is 89e45b7acab1fe297338c566d1af61d4b113563bd303dc4050e0b2baa60555a5, timestamped October 12, 2026.
  • The compliance state at capture is recorded with the evidence: robots.txt hash and verdict, AI-preference signals, crawler identity and the usage rights below.
  • Download any run as an evidence bundle (WACZ) and check it offline, without trusting SourceFinch: sourcefinch verify-bundle run.wacz.

Terms posture and usage rights

Terms
Automated access permitted · publisher's terms
robots.txt
None published (HTTP 404); access allowed under RFC 9309
AI-preference signals
None observed at review
Public record
Yes. FDA Enforcement Report, published weekly under 21 CFR part 7 (recalls); U.S. government work, 17 U.S.C. 105, dedicated under CC0 1.0 by openFDA.
Reviewed
October 12, 2026; next review April 12, 2027
Licence basis
Open data licence (CC0-1.0)
Commercial use
Allowed
Redistribution
Allowed
Attribution
Not required

openFDA's terms of service state that, unless otherwise noted, the content and data on openFDA are public domain and dedicated under Creative Commons CC0 1.0 Universal, usable for any purpose including commercial use without permission. Attribution is requested, not required. FDA may limit access to manage load; without an API key openFDA allows 240 requests a minute and 1,000 a day per address, and this source makes one request a day. api.fda.gov serves no robots.txt (HTTP 404), which RFC 9309 treats as allowing access. The Enforcement Report data is not marked as third-party copyrighted.

Usage rights travel with every record SourceFinch delivers (API, exports, webhooks and evidence bundles). They are our documented understanding of the publisher's stated terms, not legal advice.

Reliability

Runs, last 30 days
2
Green
50%
Failed
0
Median run time
1.5 s
Latest run
success, October 12, 2026

Measured on completed runs of this recipe version across SourceFinch, anonymized, within a rolling 30-day window. First successful observation: October 12, 2026. A new recipe has only the history collected since that date; this is not a 30-day uptime guarantee.

Use it

Every surface creates the same monitor from this Verified recipe. Monitors keep record history, report field-level changes and deliver by webhook, export or email. You confirm you have the right to collect the source (rights: true).

Console

Open this recipe in the console: it preserves the reviewed URL, fields and record key. Review the latest captured sample, confirm source rights, and choose a schedule before creating your monitor.

Portable recipe

Copy into the console's Import or share a recipe panel to customize fields, types and schedules. This configuration contains no captured records or workspace IDs.

{
  "schema": "sourcefinch/source@1",
  "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": {
      "center_classification_date": "date",
      "recall_initiation_date": "date",
      "report_date": "date",
      "termination_date": "date"
    }
  },
  "schedule": "daily",
  "key_field": "recall_number"
}

source.json

The request body used by the API, CLI and SDK examples.

{
  "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"
  }
}

REST API

Create an API key under Console → API keys. 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

TypeScript SDK

The SDK is not on npm yet; see /docs/sdk.

import { SourceFinch } from "@sourcefinch/sdk";

const sf = new SourceFinch({ apiKey: process.env.SOURCEFINCH_API_KEY });
const entry = await sf.catalog.get("openfda-drug-enforcement-reports");
const source = await sf.sources.create({
  catalog: { slug: entry.slug, version_id: entry.recipe.version_id },
  name: entry.name.slice(0, 100),
  url: entry.acquisition_path.endpoint,
  recipe: entry.recipe.definition,
  key_field: entry.recipe.key_field,
  schedule: entry.recipe.schedule,
  rights: true, // you confirm you have the right to collect this source
});
const run = await sf.runs.wait((await sf.runs.create(source.id)).id);
console.log(run.status);

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."

Pricing

Each check is one run, whatever the number of records, and failed runs are free. On its default daily schedule this source uses about 30 runs a month, which fits the Free plan's 300 runs. It uses HTTP acquisition, so no browser runs are needed. See plans.

Guides using this source

All guides

More from U.S. Food and Drug Administration and in product recalls & safety.

SourceFinch is independent and is not affiliated with or endorsed by U.S. Food and Drug Administration. This page describes drug recall enforcement reports as SourceFinch acquires it.