FDA API: Search drug recalls
Finds FDA drug enforcement recalls by medicine or company name, newest first, with status, class, reason and quantity. Recent recalls may not yet appear.
Unofficial. Not affiliated with or endorsed by FDA.
Inputs
Values from the run on Oct 23, 2026, shown under Output.
- Query, required
query Medicine or company name, for example metformin or Pfizer.
metformin
- Status optional
status Recall status to include, for example ongoing.
any (default)
One of
any,ongoing,completed.- Since Date optional
since_date Include recalls started on or after this date (YYYY-MM-DD), for example 2024-01-01.
Not set
- Max Results optional
max_results Maximum number of recalls to return, for example 20.
20 (default)
Whole number from 1 to 100.
Input as JSON
{ "query": "metformin"}Output
{ "recalls": [ { "reason": "CGMP Deviations: An incorrect detergent was used and the required swab sampling was not performed on a production hopper that had previously been used for a different product.", "status": "Ongoing", "company": "Boehringer Ingelheim Pharmaceuticals, Inc.", "page_url": "https://api.fda.gov/drug/enforcement.json?search=recall_number%3A%22D-0657-2026%22&limit=1" , "seriousness": "Class II: may cause temporary or reversible health problems", "recall_number": "D-0657-2026", "distributed_in": "OH", "quantity_recalled": "560 bottles", "recall_start_date": "2026-06-12", "product_description": "Synjardy XR Tablets (empagliflozin and metformin hydrochloride extended-release tablets), 12.5/1000 mg, 60 Tablets per Bottle, Rx only, Distributed by: Boehringer Ingelheim Pharmaceuticals, Inc., Ridgefield, CT 06877 USA. NDC: 00597-0300-45" }, { "reason": "CGMP Deviations", "status": "Ongoing", "company": "Glenmark Pharmaceuticals Inc., USA", "page_url": "https://api.fda.gov/drug/enforcement.json?search=recall_number%3A%22D-0328-2025%22&limit=1" , "seriousness": "Class II: may cause temporary or reversible health problems", "recall_number": "D-0328-2025", "distributed_in": "U.S. Nationwide", "quantity_recalled": "N/A" , "recall_start_date": "2025-03-13", "product_description": "Metformin Hydrochloride Extended-Release Tablets 1000mg, 90-count bottle. Manufactured by: Glenmark Pharmaceuticals Limited, Pithampur, Madhya Pradesh 454775, India, Manufactured for: Glenmark Pharmaceuticals Inc. USA, Mahwah, NJ 07430. NDC 68462-521-90." }, { "reason": "Presence of Foreign Tablets/Capsules." , "status": "Ongoing", "company": "A-S Medication Solutions LLC", "page_url": "https://api.fda.gov/drug/enforcement.json?search=recall_number%3A%22D-0292-2025%22&limit=1" , "seriousness": "Class II: may cause temporary or reversible health problems", "recall_number": "D-0292-2025", "distributed_in": "Nationwide in U.S.", "quantity_recalled": "411 180-count bottles", "recall_start_date": "2025-02-25", "product_description": "METFORMIN HYDROCHLORIDE EXTENDED- RELEASE 500MG, 180 TABLETS, Packaged BY: A-S Medication Solutions, Libertyville, IL 60048 NDC 50090-1494-3." } ]}Code
curl https://api.fous.com/v1/runs \ -H "Authorization: Bearer $FOUS_API_KEY" \ -H "Content-Type: application/json" \ -d '{"method":"open.fda.gov/search_drug_recalls","input":{"query":"metformin"}}' # Save as fous.py, then run: python3 fous.pyimport json, os, timefrom urllib.error import HTTPErrorfrom urllib.request import Request, urlopenAPI = "https://api.fous.com/v1/runs" KEY = os.environ["FOUS_API_KEY"]HEADERS = { "Authorization": f"Bearer {KEY}", "Content-Type": "application/json" ,}def call(url, body=None): data = json.dumps(body).encode() if body else None request = Request(url, data, HEADERS) try: with urlopen(request, timeout=120) as r: return r.status, json.load(r) except HTTPError as error: message = json.load(error)["error"]["message"] raise RuntimeError(message) from errorstatus, run = call(API, { "method": "open.fda.gov/search_drug_recalls" , "input": { "query": "metformin" }})# 202: still going after 30 s. Ask again until it ends.while status == 202: time.sleep(2) status, run = call(f"{API}/{run['id']}")print(json.dumps(run["data"], indent=2))// Save as fous.mjs, then run: node fous.mjsconst api = "https://api.fous.com/v1/runs" ;const headers = { Authorization: `Bearer ${process.env.FOUS_API_KEY}`, "Content-Type": "application/json" ,};let response = await fetch(api, { method: "POST", headers, body: JSON.stringify({ "method": "open.fda.gov/search_drug_recalls" , "input": { "query": "metformin" } }), signal: AbortSignal.timeout(120_000),});let run = await response.json();// 202: still going after 30 s. Ask again until it ends.while (response.status === 202) { await new Promise((done) => setTimeout(done, 2_000)); response = await fetch(`${api}/${run.id}`, { headers }); run = await response.json();}if (!response.ok) throw new Error(run.error.message);console.log(run.data);# Connect your agent to Fous once, over MCP (Streamable HTTP):# https://api.fous.com/mcp# Set FOUS_API_KEY first: create a key at https://app.fous.com/keys.# Claude Codeclaude mcp add \ --scope user \ --transport http fous https://api.fous.com/mcp \ --header "Authorization: Bearer ${FOUS_API_KEY:?Set FOUS_API_KEY to your Fous API key}"# Codexcodex mcp add fous \ --url https://api.fous.com/mcp \ --bearer-token-env-var FOUS_API_KEY# Cursor, VS Code, Windsurf, Cline and morenpx -y add-mcp https://api.fous.com/mcp -g -n fous \ --header "Authorization: Bearer ${FOUS_API_KEY:?Set FOUS_API_KEY to your Fous API key}"# Then ask your agent:# "Use Fous to run open.fda.gov/search_drug_recalls# with {"query":"metformin"}"Over HTTP, the answer’s data holds the output. A run still going after 30 seconds answers 202 with its id: ask GET /v1/runs/{id} until it ends.
Schema
Input schema
{ "type": "object", "required": [ "query" ], "properties": { "query": { "type": "string", "minLength": 1, "description": "Medicine or company name, for example metformin or Pfizer." }, "status": { "enum": [ "any", "ongoing", "completed" ], "type": "string", "default": "any", "description": "Recall status to include, for example ongoing." }, "since_date": { "type": "string", "description": "Include recalls started on or after this date (YYYY-MM-DD), for example 2024-01-01." }, "max_results": { "type": "integer", "default": 20, "maximum": 100, "minimum": 1, "description": "Maximum number of recalls to return, for example 20." } }}Output schema
{ "type": "object", "required": [ "recalls" ], "properties": { "recalls": { "type": "array", "items": { "type": "object", "required": [ "product_description", "company", "recall_start_date", "reason", "seriousness", "status", "distributed_in", "quantity_recalled", "recall_number", "page_url" ], "properties": { "reason": { "type": [ "string", "null" ], "description": "Reason for the recall." }, "status": { "type": [ "string", "null" ], "description": "Current recall status in words." }, "company": { "type": [ "string", "null" ], "description": "Recalling company." }, "page_url": { "type": "string", "description": "Link to this FDA recall record." }, "seriousness": { "type": [ "string", "null" ], "description": "FDA recall class and what it means." }, "recall_number": { "type": [ "string", "null" ], "description": "FDA recall number." }, "distributed_in": { "type": [ "string", "null" ], "description": "Areas where the medicine was distributed." }, "quantity_recalled": { "type": [ "string", "null" ], "description": "Quantity recalled, including units." }, "recall_start_date": { "type": [ "string", "null" ], "description": "Date the recall began, YYYY-MM-DD." }, "product_description": { "type": [ "string", "null" ], "description": "Recalled medicine and packaging description." } }, "additionalProperties": false } } }, "additionalProperties": false}- Price
- 1 credit per completed run (1¢ with pay as you go); failed runs are free.
- Method
open.fda.gov/search_drug_recalls- Returns
- product description, company, start date, reason, class, status, distribution, quantity, recall number, FDA link
Use it from your agent
Give your agent this line. It reads SKILL.md, gets a Fous API key and connects the Fous MCP server. Its run then takes the method open.fda.gov/search_drug_recalls with the inputs above.
Ask your agent
- Show me ongoing FDA drug recalls for metformin started since 2024-01-01, newest first.
- Any Class I drug enforcement recalls tied to Pfizer lately? Give me the reason and quantity.
- List up to 10 completed drug recalls for ranitidine with recall numbers and distribution details.
- Which active medicine recalls from Teva have been reported on fda.gov in the last year?
- Find any drug recalls by Sun Pharmaceutical started on or after 2023-06-01, status any, limit 50.
See more
All FDA methodsFinds FDA medical device recalls whose product description or recalling company matches a phrase, newest first, with the recall class and its health-risk meaning from each FDA recall page. An optional start date limits recalls to those initiated on or after it.
fda.gov/search_device_recallsFinds FDA food recall enforcement reports by product, brand, or allergen, newest first. Reports are updated weekly and recall statuses may lag.
open.fda.gov/search_food_recallsFinds the latest FDA drug label for a brand or generic medicine and returns its uses, directions, warnings, ingredients and a DailyMed link.
open.fda.gov/get_drug_labelLists the most frequently reported reaction terms for a brand or generic medicine in FDA adverse-event reports, with counts and the share of all matching reports. Reports do not establish causation.
open.fda.gov/get_reported_side_effectsFinds U.S. consumer product recalls matching a product type or brand, newest first, with hazards, remedies, incidents, sale details and photos when published.
cpsc.gov/search_recallsLooks up a medicine by brand or generic name on Drugs.com and returns a plain-language overview: class, uses, availability, schedule, dosage forms, side effects, and pregnancy and breastfeeding notes.
drugs.com/get_drugLists ClinicalTrials.gov studies run or funded by a sponsor, newest start date first, with optional phase, status and condition filters.
clinicaltrials.gov/list_company_trialsChecks 2 to 10 medicine names together on the Drugs.com interaction checker and returns drug-to-drug interactions and food or lifestyle warnings, most severe first, plus the names it could not recognise.
drugs.com/check_drug_interactions