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 wantOfficial feedThis API
Best-before and use-by datesFree text, e.g. "Best before 13 December 2025"; structured dates on only a small share of batchesParsed dates per batch, plus a status (current, past, all dates)
Batch codes and lot numbersInside the description textSeparate lists per product batch
SupermarketsNo fieldsupermarkets, matched from names and own-label ranges
Food typeCategory field is emptyfoods
HazardsPartly codedhazards for pathogens, physical, chemical and labelling problems
Updates to a recallSeparate records, not always linkedOne recall with a timeline of what changed
Scotland-only alertsNot 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 a 429 comes with Retry-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.