Food Standards Agency API: Find food hygiene ratings
Finds 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.
Unofficial. Not affiliated with or endorsed by Food Standards Agency.
Inputs
Values from the run on Oct 23, 2026, shown under Output.
- Business, required
business Name of the restaurant, cafe, takeaway, or shop, for example Pret A Manger.
Pret A Manger
- Location, required
location Town, street, or postcode, for example Leeds or LS1 4DT.
Leeds
- Max Results optional
max_results Maximum number of matching businesses to return, for example 10.
10 (default)
Whole number from 1 to 50.
Input as JSON
{ "business": "Pret A Manger", "location": "Leeds"}Output
{ "businesses": [ { "rating": "5", "fhrs_id": 877764, "hygiene": "Very good", "postcode": "LS1 4DT", "structure": "Good", "full_address": "New Station Street, Leeds, LS1 4DT", "business_name": "Pret A Manger", "business_type": "Other catering premises", "rating_meaning": "5 - Very good", "local_authority": "Leeds", "rating_page_url": "https://ratings.food.gov.uk/business/877764" , "last_inspection_date": "2021-07-14", "confidence_in_management": "Good" }, { "rating": "5", "fhrs_id": 937212, "hygiene": "Very good", "postcode": "LS2 7AR", "structure": "Good", "full_address": "Unit 20 Victoria Gate, Harewood Street, Leeds, LS2 7AR", "business_name": "Pret A Manger", "business_type": "Restaurant/Cafe/Canteen" , "rating_meaning": "5 - Very good", "local_authority": "Leeds", "rating_page_url": "https://ratings.food.gov.uk/business/937212" , "last_inspection_date": "2026-07-22", "confidence_in_management": "Very good" }, { "rating": "5", "fhrs_id": 1685030, "hygiene": "Good", "postcode": "LS1 6AW", "structure": "Good", "full_address": "6 Lands Lane, Leeds, LS1 6AW", "business_name": "Pret A Manger Lands Lane", "business_type": "Restaurant/Cafe/Canteen" , "rating_meaning": "5 - Very good", "local_authority": "Leeds", "rating_page_url": "https://ratings.food.gov.uk/business/1685030" , "last_inspection_date": "2026-08-26", "confidence_in_management": "Very good" } ]}Code
curl https://api.fous.com/v1/runs \ -H "Authorization: Bearer $FOUS_API_KEY" \ -H "Content-Type: application/json" \ -d '{"method":"ratings.food.gov.uk/get_hygiene_rating","input":{"business":"Pret A Manger","location":"Leeds"}}' # 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": "ratings.food.gov.uk/get_hygiene_rating" , "input": { "business": "Pret A Manger", "location": "Leeds" }})# 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": "ratings.food.gov.uk/get_hygiene_rating" , "input": { "business": "Pret A Manger", "location": "Leeds" } }), 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 ratings.food.gov.uk/get_hygiene_rating# with {"business":"Pret A Manger","location":"Leeds"}"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": [ "business", "location" ], "properties": { "business": { "type": "string", "minLength": 1, "description": "Name of the restaurant, cafe, takeaway, or shop, for example Pret A Manger." }, "location": { "type": "string", "minLength": 1, "description": "Town, street, or postcode, for example Leeds or LS1 4DT." }, "max_results": { "type": "integer", "default": 10, "maximum": 50, "minimum": 1, "description": "Maximum number of matching businesses to return, for example 10." } }}Output schema
{ "type": "object", "required": [ "businesses" ], "properties": { "businesses": { "type": "array", "items": { "type": "object", "required": [ "business_name", "business_type", "full_address", "postcode", "rating", "rating_meaning", "last_inspection_date", "hygiene", "structure", "confidence_in_management", "local_authority", "rating_page_url", "fhrs_id" ], "properties": { "rating": { "type": [ "string", "null" ], "description": "Food hygiene rating, or Scottish inspection outcome." }, "fhrs_id": { "type": "integer", "description": "Official FHRS establishment identifier." }, "hygiene": { "type": [ "string", "null" ], "description": "Food handling standard in words." }, "postcode": { "type": [ "string", "null" ], "description": "Business postcode." }, "structure": { "type": [ "string", "null" ], "description": "Premises and facilities standard in words." }, "full_address": { "type": "string", "description": "Full street address including postcode." }, "business_name": { "type": "string", "description": "Name of the business." }, "business_type": { "type": [ "string", "null" ], "description": "Type of food business." }, "rating_meaning": { "type": [ "string", "null" ], "description": "Rating and its meaning in words." }, "local_authority": { "type": [ "string", "null" ], "description": "Authority that inspected the business." }, "rating_page_url": { "type": "string", "format": "uri", "description": "Official business rating page." }, "last_inspection_date": { "type": [ "string", "null" ], "format": "date", "description": "Date of the latest published inspection." }, "confidence_in_management": { "type": [ "string", "null" ], "description": "Food safety management standard in words." } }, "additionalProperties": false }, "description": "Matching food businesses, best match first." } }, "additionalProperties": false}- Price
- 1 credit per completed run (1¢ with pay as you go); failed runs are free.
- Method
ratings.food.gov.uk/get_hygiene_rating- Returns
- business name, type, address, postcode, rating, last inspection date, hygiene, structure and management scores, local authority, rating page URL
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 ratings.food.gov.uk/get_hygiene_rating with the inputs above.
Ask your agent
- What hygiene rating does the Pret A Manger on Oxford Street in London have?
- Look up the food hygiene score for a takeaway called Dragon Palace in Leeds LS1 4DT.
- Can you find the latest inspection date and rating for the cafe Costa Coffee in Manchester?
- Check food safety ratings for any bakeries on High Street, Bristol, with their hygiene and structure scores.
- Show me the official food hygiene rating and local authority for Nando's in Edinburgh on food.gov.uk.
See more
Find restaurants delivering to an address in Uber Eats guest browsing order. Fees can be conditional for new users; displayed rating counts may be rounded.
ubereats.com/search_restaurantsFinds 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_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_foodsLists Tripadvisor's ranked restaurants in a city from the first results page, optionally filtered by cuisine and price category. Sponsored listings are left out; up to 30 restaurants with rating, review count, cuisines, price range and address.
tripadvisor.com/list_top_restaurantsSearches 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 DoorDash restaurants delivering to a street address or ZIP code, optionally for a cuisine or dish, in DoorDash's search order. Fees and times reflect guest offers; the numeric fee is null when DoorDash shows no amount.
doordash.com/search_restaurantsFinds BBC Good Food recipes for a dish or ingredients in search order, with ratings, time, difficulty, photos and links. Excludes app-only recipes.
bbcgoodfood.com/search_recipesReturns current UK government (FCDO) travel warnings, entry requirements for British passport holders, safety, health and emergency information for a country. Summaries are shortened; follow the link for full details.
gov.uk/get_travel_advice