FDA API: Search food recalls
Finds FDA food recall enforcement reports by product, brand, or allergen, newest first. Reports are updated weekly and recall statuses may lag.
Unofficial. Not affiliated with or endorsed by FDA.
Inputs
Values from the run on Oct 23, 2026, shown under Output.
- Query, required
query Product, brand, or allergen to search for, for example peanut or ice cream.
peanut
- State optional
state State name or two-letter code where the recall was distributed, for example California or CA.
Not set
- Since Date optional
since_date Earliest recall start date in YYYY-MM-DD, for example 2025-01-01.
Not set
- Max Results optional
max_results Most recalls to return, for example 20 (maximum 100).
20 (default)
Whole number from 1 to 100.
Input as JSON
{ "query": "peanut"}Output
{ "recalls": [ { "reason": "Peanuts & Eggs. The firm list peanuts in the ingredient statement but omitted them from the contain statement. They also have eggs listed in the contain statement but there are no eggs in the product.", "status": "Ongoing", "company": "Best Friends Bakery, LLC", "page_url": "https://api.fda.gov/food/enforcement.json?search=recall_number%3A%22H-1386-2026%22" , "seriousness": "Class II: may cause temporary or reversible health problems", "recall_number": "H-1386-2026", "distributed_in": "Product was shipped to the following states: AL, FL, GA, IN, KY, MI, OH, TN, VA & WV.", "recall_start_date": "2026-08-17", "product_description": "PUMPKIN SPICE NO BAKE COOKIE NET WT 3.5 oz. INGREDIENTS: WHOLE GRAIN OATS, MILK, MARGARINE***WATER, SALT, CONTAINS LESS THAN 2% OF THE FOLLOWING: SOY LECITHIN, VEGETABLE MONO & DIGLYCERIDES, POTASSIUM SORBATE***, CITRIC ACID, NATURAL & ARTIFICIAL FLAVOR, BETA CAROTENE, VITAMIN A PALMITATE ADDED, PEA…" }, { "reason": "Undeclared Peanut. High Valley Orchard Chocolate Covered Raisins contains unintended undeclared peanut due to mis-packaging.", "status": "Terminated", "company": "Lehi Valley Trading Company, Inc", "page_url": "https://api.fda.gov/food/enforcement.json?search=recall_number%3A%22H-1150-2026%22" , "seriousness": "Class I: could cause serious health problems or death", "recall_number": "H-1150-2026", "distributed_in": "Nationwide, Arizona, Nevada, New Mexico, Texas", "recall_start_date": "2026-06-24", "product_description": "High Valley Orchard Chocolate Covered Raisins, net wt. 15oz. per package, each case contains 12/15oz. bags. Product is packaged in clear plastic container. UPC on retail container: 0 952348 80170 0. Lehi Valley Trading Company Mesa, AZ 85215 The label of affected product declares: INGREDIENTS: M…" }, { "reason": "Undeclared Tree Nut Allergen", "status": "Ongoing", "company": "Wilco Peanut Co", "page_url": "https://api.fda.gov/food/enforcement.json?search=recall_number%3A%22H-0906-2026%22" , "seriousness": "Class I: could cause serious health problems or death", "recall_number": "H-0906-2026", "distributed_in": "Texas, California, Illinois, and New York. Two vessels in route to Korea.", "recall_start_date": "2026-05-18", "product_description": "Raw Shelled Peanuts (Runner Type) 2,200 lb. Poly Tote Bags and 50kg Poly Bags" } ]}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_food_recalls","input":{"query":"peanut"}}' # 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_food_recalls" , "input": { "query": "peanut" }})# 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_food_recalls" , "input": { "query": "peanut" } }), 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_food_recalls# with {"query":"peanut"}"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": "Product, brand, or allergen to search for, for example peanut or ice cream." }, "state": { "type": "string", "description": "State name or two-letter code where the recall was distributed, for example California or CA." }, "since_date": { "type": "string", "description": "Earliest recall start date in YYYY-MM-DD, for example 2025-01-01." }, "max_results": { "type": "integer", "default": 20, "maximum": 100, "minimum": 1, "description": "Most recalls to return, for example 20 (maximum 100)." } }}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", "page_url", "recall_number" ], "properties": { "reason": { "type": [ "string", "null" ], "description": "Reason for the recall." }, "status": { "type": [ "string", "null" ], "description": "Recall status in words." }, "company": { "type": [ "string", "null" ], "description": "Recalling company." }, "page_url": { "type": [ "string", "null" ], "description": "Link to this recall record." }, "seriousness": { "type": [ "string", "null" ], "description": "Health risk classification explained in words." }, "recall_number": { "type": [ "string", "null" ], "description": "FDA recall number." }, "distributed_in": { "type": [ "string", "null" ], "description": "Where the recalled product was distributed." }, "recall_start_date": { "type": [ "string", "null" ], "format": "date", "description": "Date the recall began." }, "product_description": { "type": [ "string", "null" ], "description": "Recalled product." } }, "additionalProperties": false }, "description": "Matching food recalls, newest first." } }, "additionalProperties": false}- Price
- 1 credit per completed run (1¢ with pay as you go); failed runs are free.
- Method
open.fda.gov/search_food_recalls- Returns
- product, company, start date, reason, seriousness, status, distribution, record 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_food_recalls with the inputs above.
Ask your agent
- Show me recent food recalls involving undeclared milk in products distributed in Texas since 2025-03-01
- Any FDA recalls for frozen pizza from the last few months? Limit to 10 results.
- Find food recall notices tied to salmonella contamination shipped to New York, newest first.
- I need recalls on products containing sesame allergen, since 2024-11-15, up to 50 entries.
- Look up recent recalls for baby formula brands distributed in CA, including recall status and reason.
See more
All FDA methodsFinds FDA drug enforcement recalls by medicine or company name, newest first, with status, class, reason and quantity. Recent recalls may not yet appear.
open.fda.gov/search_drug_recallsFinds 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_recallsLists 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 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_labelFinds 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_recallsSearches USDA FoodData Central foods and branded products by food or brand name, ranked by relevance. Calories and serving sizes are null when not supplied.
fdc.nal.usda.gov/search_foodsSearches Open Food Facts packaged foods by name, optionally filtered by diet, country where sold and brand, ordered by popularity (most scanned first).
openfoodfacts.org/search_productsFinds food businesses by name and town, street or postcode and returns their official food hygiene rating, inspection date and score descriptions. Scottish ratings usually have no component scores.
ratings.food.gov.uk/get_hygiene_rating