Free UK food recall API and website widgets
Use UK food recall data in your app, research or website. It is free, needs no key or sign-up, and is built from official Food Standards Agency (FSA) and Food Standards Scotland (FSS) alerts.
What this adds to the official data
The FSA publishes its own food alerts API, and it is the authority: if you need only the official notice text, use it. This API gives you the same alerts after we have structured them, because the official feed holds much of the useful detail as free text:
| You want | Official feed | This API |
|---|---|---|
| Best-before and use-by dates | Free text, e.g. "Best before 13 December 2025"; structured dates on only a small share of batches | Parsed dates per batch, plus a status (current, past, all dates) |
| Batch codes and lot numbers | Inside the description text | Separate lists per product batch |
| Supermarkets | No field | supermarkets, matched from names and own-label ranges |
| Food type | Category field is empty | foods |
| Hazards | Partly coded | hazards for pathogens, physical, chemical and labelling problems |
| Updates to a recall | Separate records, not always linked | One recall with a timeline of what changed |
| Scotland-only alerts | Not included (FSS has no API) | Included, with copies of FSA alerts merged |
Accuracy. Allergens, hazards, supermarkets, food types and parsed dates are classified by FoodRecalls.co.uk from the official notice text and can contain mistakes. The official notice (source.url) is authoritative. Every record carries the official link. See the methodology, and tell us about mistakes on the corrections page.
We check for new alerts every 10 minutes, so the FSA is always first. For safety decisions, link people to the official notice.
Quick start
Milk allergy alerts that could still be at home:
curl "https://foodrecalls.co.uk/api/v1/recalls.json?allergen=milk&active=true&limit=5"
All Tesco recalls published since 1 January 2026:
curl "https://foodrecalls.co.uk/api/v1/recalls.json?supermarket=tesco&since=2026-01-01"
Anything new or changed since you last looked:
curl "https://foodrecalls.co.uk/api/v1/recalls.json?updated_since=2026-10-01T09:00:00Z"
Endpoints
GET https://foodrecalls.co.uk/api/v1/recalls.json: list and filter recalls, newest first.GET https://foodrecalls.co.uk/api/v1/recalls/{reference}.json: one recall by FSA or FSS reference, e.g.fsa-aa-43-2026. An update's reference returns the recall it belongs to.GET https://foodrecalls.co.uk/api/v1/topics.json: every allergen, hazard, supermarket, food type and brand the filters accept, with counts.
Parameters for recalls.json
Filters combine: every one you add narrows the results.
allergen- Allergen slug, e.g. milk, peanuts, gluten.
hazard- Hazard slug, e.g. listeria, salmonella, plastic.
supermarket- Supermarket slug, e.g. tesco, aldi.
brand- Brand or manufacturer slug.
food- Food type slug, e.g. dairy-and-cheese, chocolate-and-sweets.
country- england, wales, scotland or northern-ireland (where the alert applies).
type- AA (allergy alert), PRIN (product recall) or FAFA (food alert for action).
q- Search words across products, brands, supermarkets and batch codes. Every word must match.
active- true: only recalls that could still be at home: every batch has an affected date still to come, or all date codes are affected (published in the last year).
since- First published on or after this date, YYYY-MM-DD.
updated_since- New or changed at or after this date or ISO timestamp. Use it to poll for changes.
limit- Results per page, 1 to 100 (default 20).
offset- Results to skip. Follow meta.next instead of calculating it.
Example response
{
"meta": { "api": "v1", "total": 214, "count": 1, "limit": 1, "offset": 0, "next": "https://foodrecalls.co.uk/api/v1/recalls.json?allergen=milk&limit=1&offset=1", "attribution": "…" },
"data": [{
"id": "FSA-AA-43-2026",
"type": "AA",
"typeLabel": "Allergy alert",
"title": "…",
"reason": "Undeclared milk",
"audience": "allergy",
"published": "2026-10-01",
"updated": "2026-10-02T16:39:31.821Z",
"status": "current",
"allergens": [{ "slug": "milk", "name": "Milk", "codes": ["milk"] }],
"supermarkets": [{ "slug": "tesco", "name": "Tesco" }],
"products": [{
"name": "…", "packSize": "250g", "barcodes": [],
"batches": [{ "batchCodes": ["L2517"], "lotNumbers": [],
"bestBefore": { "text": "Best before 13 December 2026", "dates": ["2026-12-13"], "latest": "2026-12-13", "precision": "day" },
"useBy": null, "note": null }]
}],
"consumerAdvice": ["…"],
"timeline": [{ "notation": "FSA-AA-43-2026", "title": "…", "published": "2026-10-01", "url": "…", "changes": [] }],
"source": { "agency": "FSA", "reference": "FSA-AA-43-2026", "url": "https://www.food.gov.uk/…", "dataRecord": "https://data.food.gov.uk/…" },
"links": { "page": "https://foodrecalls.co.uk/recalls/…/", "api": "https://foodrecalls.co.uk/api/v1/recalls/fsa-aa-43-2026.json", "embed": "https://foodrecalls.co.uk/embed/recalls/fsa-aa-43-2026/" }
}]
} Shortened. audience says who needs to act: allergy (people with that allergy), everyone or business. In v1 we may add fields but will not rename or remove them. Dates are YYYY-MM-DD; updated is a UTC timestamp.
Limits, caching and CORS
- About 120 requests a minute per IP address. Responses carry
X-RateLimit-Remaining, and a429comes withRetry-After. - Responses are cached for about 10 minutes, so asking more often gains nothing. Poll with
updated_since. - Cross-origin requests from browsers are allowed (
Access-Control-Allow-Origin: *). - For the whole dataset in one go, use the CSV download instead of paging through the API. For notifications, use the RSS feeds.
- Errors are JSON:
{"error": {"code": "…", "message": "…"}}, with the usual 400, 404 and 429 status codes.
Licence and credit
The data is free to use, including commercially, under the Open Government Licence v3.0. Please credit it, for example:
Data from FoodRecalls.co.uk (https://foodrecalls.co.uk/), based on Food Standards Agency and Food Standards Scotland alerts. Contains public sector information licensed under the Open Government Licence v3.0.
A link back is appreciated: <a href="https://foodrecalls.co.uk/">Recall data from FoodRecalls.co.uk</a>.
If you build a service where people might rely on this data, say clearly that the official notice is authoritative and link to source.url. Please do not describe a product as "safe" because it is missing from a result.
Website widgets
Show live recalls on your own website without writing any code. Every recall page, allergen, supermarket, hazard, brand and food page, and the statistics page, has an "Embed this on your website" panel with a preview and a code to copy.
- Topic lists: the latest recalls for an allergen, supermarket, hazard, brand or food type, e.g. milk allergy alerts or your supermarket. Good for allergy, coeliac, parent and school sites.
- A single recall: a card with the product, batch codes and advice, for articles about one recall.
- The statistics chart: recalls per year, for articles and reports.
The code is a standard <iframe>, a one-line credit link to FoodRecalls.co.uk and a small script that resizes the frame. The widgets set no cookies and have no adverts. Widgets update by themselves when new recalls are published or recalls change. They are not shown in search results.
Topic widgets also work as plain URLs: https://foodrecalls.co.uk/embed/allergens/milk/?limit=8&theme=dark (limit 1 to 10; theme light or dark; the default follows the visitor's device).
Questions, mistakes and changes
Found a wrong classification? Use the corrections page. Planning something big, or want a field we don't have? Contact us through the about page. If the API ever has to change in a way that breaks existing users, it will be released as /api/v2/ and v1 will stay available alongside it.