UK Food Hygiene Ratings avatar

UK Food Hygiene Ratings

Pricing

from $0.60 / 1,000 establishments

Go to Apify Store
UK Food Hygiene Ratings

UK Food Hygiene Ratings

🏷️ From $0.60 / 1K | Official FSA food hygiene ratings for every UK food business. Search by council, postcode, business type or rating, and isolate businesses rated 2 or below.

Pricing

from $0.60 / 1,000 establishments

Rating

0.0

(0)

Developer

丂卩ㄖㄖҜㄚ

丂卩ㄖㄖҜㄚ

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Share

Food hygiene ratings for every food business in the UK, straight from the official Food Standards Agency register. Restaurants, cafes, takeaways, pubs, hotels, schools, care homes, shops and manufacturers. No API key needed.

🔍 What does UK Food Hygiene Ratings do?

It queries the FSA's own ratings API and returns every matching establishment as a clean row of data, ready for a spreadsheet, a CRM or your own product. Search by council, postcode, coordinates, business name, business type or rating.

The useful bit is actionableOnly. Set it and you get only businesses rated 2 or below, meaning the FSA has told them to improve. Those are the businesses actively looking to fix something right now.

That matters if you sell:

  • Food hygiene consultancy, audits or Level 2 and 3 training
  • Pest control
  • Commercial kitchen deep cleaning or equipment
  • HACCP software or temperature monitoring
  • EPOS and compliance systems

Every record includes the address, postcode, coordinates, and the council's own environmental health contact.

🏛️ What the official route gives you, and what this adds

The Food Standards Agency is the rare register with a genuinely good official API. api.ratings.food.gov.uk is free, needs no key, and its search endpoint filters by name, coordinates, business type, rating and local authority. If you want to write and maintain your own integration, it is a fine place to start.

What this Actor adds is everything around that call. The FSA API has sharp edges that fail silently: measured against the same Manchester postcode, an address search matches literal address text rather than proximity and returned 1 establishment where a geocoded coordinate search with the same radius returned 3,179, and the rating filter is quietly dropped when it is combined with an address search, so a query for rating 2 comes back rated 5 with no warning. This Actor geocodes postcodes properly, applies every filter and verifies it narrowed the result, adds the actionableOnly flag the API does not have, and delivers flat rows straight into CSV, Excel, Sheets or a webhook on a schedule. Same official data, none of the integration work.

📊 What data can I extract from the FSA?

One row per establishment:

FieldDescription
🆔 fhrsIdFHRS id of the establishment
🏢 businessNameEstablishment name
🏷️ businessTypeKind of business, such as Restaurant or Takeaway
🏷️ businessTypeIdFSA id of the business type
🏠 addressPostal address as published
📍 postcodeUK postcode
📞 phonePublished phone number, when any
📍 latitudeLatitude of the establishment
📍 longitudeLongitude of the establishment
ratingValueHygiene rating, 0 to 5, or a Scottish scheme value
ratingNumericRating as a number where the scheme allows, otherwise null
📅 ratingDateDate of the rating inspection
newRatingPendingWhether a new rating is pending publication
isActionableWhether the rating is 2 or below
🔢 hygieneScoreInspector score for food handling, lower is better
🔢 structuralScoreInspector score for premises condition, lower is better
🔢 managementConfidenceScoreInspector confidence in management, lower is better
🏷️ schemeTypeFHRS in England, Wales and Northern Ireland, FHIS in Scotland
🏢 localAuthorityLocal authority that inspected
📧 localAuthorityEmailContact email of the local authority
🔗 localAuthorityWebsiteWebsite of the local authority
🔗 fsaUrlEstablishment page on the FSA site
⏱️ retrievedAtWhen the row was collected, ISO 8601

Note that Scotland uses a different scheme with Pass and Improvement Required rather than 0 to 5, so ratingNumeric and isActionable are null and false for Scottish records.

💡 Why scrape food hygiene ratings?

Lead generation. Every business in an area rated 2 or below, with the address and the council's environmental health contact attached.

Market research. Rating distribution by area or business type, from the official register rather than a sample.

Property and franchise. Check a site's hygiene history before signing a lease or approving a franchisee.

Consumer apps. Enrich a restaurant listing with its official rating and a link back to the FSA record.

🧭 Use cases

A hygiene consultant building Monday's call list. actionableOnly within 5 miles of the office returns every business the FSA has just told to improve, with the address and phone number where published.

A commercial kitchen cleaning firm targeting one council at a time. localAuthorityId with actionableOnly gives every low rated premises in the borough in one run, with the council's environmental health contact on each row.

A franchise operations manager checking every branch's current rating each month. A scheduled run on the brand in name, diffed against last month's sheet, flags the branch that slipped from 5 to 3 before head office hears it from a customer.

A landlord or agent checking a restaurant tenant's hygiene history before renewing a lease. The premises postcode returns the current rating, the three component scores and whether a re-inspection result is pending.

A food delivery or listings product showing the official rating next to each restaurant. Call the Actor from the API with the restaurant's name and postcode and store ratingValue and fsaUrl against the listing.

A journalist ranking takeaway hygiene across a city for a local story. Every establishment of one businessTypeId in the council, with component scores, straight into a spreadsheet that cites the official register.

🚀 How do I use UK Food Hygiene Ratings?

  1. Click Try for free.
  2. Set at least one filter, most often postcodeOrAddress with a radiusMiles.
  3. Narrow it with name, businessTypeId or ratingValue.
  4. Turn on actionableOnly to keep only businesses rated 2 or below, and set maxResults to cap the run.
  5. Click Start, then download the results as JSON, CSV or Excel, or pull them from the API.

⬇️ Input

The FSA rejects unfiltered queries, so set at least one of localAuthorityId, name, postcodeOrAddress, latitude and longitude, businessTypeId or ratingValue.

{
"postcodeOrAddress": "M1 1AE",
"radiusMiles": 5,
"ratingValue": "2",
"actionableOnly": true,
"maxResults": 200
}
FieldTypeDefaultWhat it does
postcodeOrAddressstringM1 1AEFree text address or postcode
namestringBusiness name contains
businessTypeIdintegerNumeric business type id
ratingValuestringExact rating, 0 to 5
actionableOnlybooleanfalseKeep only businesses rated 2 or below
radiusMilesinteger1Radius around the postcode or coordinates
maxResultsinteger500Hard cap on billable results

Three further inputs are available. localAuthorityId takes one of 363 councils, listed at api.ratings.food.gov.uk/Authorities. latitude and longitude do a radius search from coordinates instead of a postcode. sortBy takes rating, alpha or distance. Business type ids are listed at api.ratings.food.gov.uk/BusinessTypes.

⬆️ Output

Table view

Results arrive as a Ratings table you can sort and filter in the Console, with the business, rating, address and council lined up for scanning. There is a second view, Inspection scores, which lines up the three component scores for comparing establishments against each other.

JSON

A typical row:

{
"businessName": "Abaseen",
"businessType": "Takeaway/sandwich shop",
"ratingValue": "2",
"ratingDate": "2025-04-18T00:00:00.000Z",
"address": "484 Cheetham Hill Road, Manchester",
"postcode": "M8 9JW",
"localAuthority": "Manchester City Council",
"fsaUrl": "https://ratings.food.gov.uk/business/1820175",
"fhrsId": 1820175
}

Download it from the run as JSON, CSV or Excel, or read it straight from the API.

Postcode formats

Type the postcode however you have it. All of these reach the same place:

M1 1AE m1 1ae M11AE m11ae
M1-1AE M1.1AE "M1 1AE" M1 1AE.

Case, spacing and surrounding punctuation are all normalised before the lookup runs. This matters more than it looks: the postcode is geocoded so that the radius is honoured, and a postcode that fails to resolve falls back to being matched as literal address text, which quietly returns a single business instead of the surrounding area.

GIR 0AA is handled as the special case it is. Anything that is not a postcode, such as a place name or a full address, is matched as address text instead.

Data source

Food Standards Agency, ratings.food.gov.uk, published under the Open Government Licence v3.0. Ratings are a snapshot of the last inspection and can change. Always link back to fsaUrl for the current position.

⏱️ How long does a run take?

Measured on real runs, so you know what normal looks like and can tell it apart from a run that has stalled.

Establishments returnedTypical run time
102 to 4 seconds
100about 10 seconds
20010 to 12 seconds
50025 to 41 seconds

The FSA's own API is fast and the Actor reads it 200 establishments to a page, so the run time is close to linear in the number of rows and a whole council or a five mile radius around a city centre postcode is done inside a minute. pageSize is the only setting that changes the shape of that, by trading more rows per request against fewer requests.

Two things add a second or two at the front. A postcode search is resolved to coordinates through postcodes.io before the radius search can run, which is one extra lookup, and a rating filter combined with an address makes the Actor take the coordinate route rather than the address route so the filter is actually applied. Neither is something you have to configure. The first few seconds of any run are the container starting rather than the work.

A run is never silently stuck. Each page of results is logged as it is read, and establishments are written to the dataset as they are parsed rather than held back to the end, so a run that hits its time limit still leaves everything it had already collected. A search that matches nothing is a successful run with an empty dataset and a status message telling you to widen the radius, not an error.

Set the run timeout to suit the size of the ask. This Actor's default is 3600 seconds, which is comfortably more than the largest run in the table above (500 premises takes about 1 minute). You are charged per delivered result rather than per minute, so a generous timeout costs you nothing and a tight one risks losing the run's work. Lower it only if you want a hard ceiling on how long a scheduled run may sit.

💰 How much does it cost?

You pay per establishment returned. Set maxResults to cap what a run can cost, and use actionableOnly or ratingValue to avoid paying for records you were only going to filter out afterwards.

Runs that return nothing cost nothing. Paid Apify plans get a lower rate per establishment.

🔌 Integrations

Send results straight to Google Sheets, Slack, Airtable, Zapier, Make or your own webhook using Apify integrations. You can also trigger a run whenever something happens in another tool, which is the usual way to drop new low rated businesses into a CRM as leads.

UK Food Hygiene Ratings is also callable by AI agents through the Apify MCP server. An agent connected to the server can discover the Actor, read its input schema and call it as a tool under the identifier spookyweb/uk-food-hygiene-ratings, then read the dataset back in the same session. That lets an assistant asked about a restaurant's hygiene rating answer from the FSA register rather than from training data. Setup is covered in the Apify MCP documentation.

🔗 Using UK Food Hygiene Ratings with the Apify API

curl -X POST "https://api.apify.com/v2/acts/spookyweb~uk-food-hygiene-ratings/run-sync-get-dataset-items?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"postcodeOrAddress": "M1 1AE", "radiusMiles": 5, "ratingValue": "2", "actionableOnly": true, "maxResults": 200}'

Or with the Apify client:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const run = await client.actor('spookyweb/uk-food-hygiene-ratings').call({
postcodeOrAddress: 'M1 1AE',
radiusMiles: 5,
ratingValue: '2',
actionableOnly: true,
maxResults: 200,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();

Full detail is in the Apify API reference, and every run is also callable from the Python and JavaScript clients.

❓ FAQ

What does a rating of 2 or below mean?

That the FSA has told the business to improve. A 5 is very good and a 0 means urgent improvement is necessary, so anything at 2 or lower is a business with an open problem and a reason to buy help. Set actionableOnly to true and you get only those, and the isActionable field flags them on every row.

Does it cover Scotland?

Yes, but Scotland runs a different scheme. FHIS publishes Pass or Improvement Required instead of a 0 to 5 number, so ratingValue carries that text, and ratingNumeric is null and isActionable is false for Scottish records. The schemeType field tells you which scheme a row came from.

How current are the ratings?

A rating is a snapshot of the last inspection, and the register is updated as councils publish new inspections. ratingDate tells you when the current rating was given, and newRatingPending flags an establishment whose re-inspection result is due. Always link back to fsaUrl for the current position.

Can I search a whole council area?

Yes, set localAuthorityId to the council you want. The full list of 363 councils is at api.ratings.food.gov.uk/Authorities. Pair it with actionableOnly to get every low rated business in that council in one run.

What are the three component scores?

hygieneScore covers food handling, structuralScore covers the condition of the premises, and managementConfidenceScore covers how much the inspector trusts management to keep standards up. Lower is better on all three, and together they produce the headline rating. They are useful for telling apart two businesses that both scored a 2 for different reasons.

Do I need an FSA API key?

No. The FSA publishes this as open data with no key and no registration. The only rule to know is that it rejects an unfiltered query, so you must set at least one of the filters listed in the Input section.

The Food Standards Agency publishes hygiene ratings as open data so the public can check where they eat. This is business information about premises, not personal data, and it comes from the FSA's own API.

Data is published under the Open Government Licence v3.0, so commercial use is permitted with attribution. Apify's ethical scraping guide covers the wider picture.

👍 Your feedback

Found a bug, or want a field that is not here yet? Open an issue on the Actor's Issues tab. Requests that make the data more useful get built, and problems get fixed quickly.

🔎 You might also like

ActorWhat it does
UK Planning ApplicationsPlanning applications from every UK council, tagged by the type of work proposed
UK Insolvency Register SearchIndividual Insolvency Register search for bankruptcies, IVAs and debt relief orders
Website Contact ScraperCompany websites in, one contact record per domain out, with emails and social links