UK Food Hygiene Prospect Finder — FSA Ratings
Pricing
from $67.00 / 1,000 establishment records
UK Food Hygiene Prospect Finder — FSA Ratings
Prospecting lists of UK food businesses from the FSA's own public ratings API: rating, scores, address and authority contact per establishment.
Pricing
from $67.00 / 1,000 establishment records
Rating
0.0
(0)
Developer
NexGen Watch
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Share
UK Food Hygiene Prospect Finder
Build a prospecting list of UK food businesses from the Food Standards Agency's own public API — filtered by local authority, business type, name and hygiene rating — with a link to the FSA's page for every establishment.
Built for food-safety consultants, pest control, EHO training, equipment suppliers and anyone whose buyer is a business that needs to improve its rating.
The filter you came for does not work on the server. That is the point of this actor.
The FSA API accepts a ratingKey parameter. It is silently ignored. Measured 2026-07-31
against a control of 1,477 establishments in one authority:
| query | establishments returned |
|---|---|
| no rating filter (control) | 1,477 |
ratingKey=fhrs_5_en-gb (valid) | 1,477 |
ratingKey=fhrs_0_en-gb (valid) | 1,477 |
ratingKey=fhrs_9_en-gb (invented) | 1,477 |
ratingKey=banana (garbage) | 1,477 |
ratingKey= (empty) | 1,477 |
Every value returns the unfiltered set, and the API never says so. A tool that passed this through would answer "here are the 1-rated establishments in your area" with every establishment in the authority, five-star ones included — the exact opposite of a prospect list.
So this actor never sends it. Rating filtering runs here, over each record's own published
RatingValue, where it provably works.
Two more traps, both measured
An unfiltered query is refused — and the 403 is not a permission problem
GET /Establishments?pageSize=1&pageNumber=1-> 403 {"Message":"This is a CPU intensive query: please use one of thedocumented filters in your query (e.g. filter by LocalAuthority)."}
Passing that on would read as "the register is closed to you". It isn't — a filter is mandatory. The request is refused before it is sent, with the reason.
An unrecognised value returns zero, not an error
localAuthorityId=99999 -> HTTP 200, totalCount 0businessTypeId=99999 -> HTTP 200, totalCount 0
A typo therefore answers "there are no food businesses there". Every value is validated against the API's own enumerations first — 363 local authorities, 14 business types, 11 rating values — and an unknown one is refused, not guessed.
An ambiguous authority name is refused too. Cambridge is carried by three authorities —
Cambridge City, East Cambridgeshire and South Cambridgeshire. Matching on a prefix would
resolve silently to the city, and a buyer who meant the county would get a bill for the wrong
list with no way to see it happened. Names are matched as substrings and anything but a single
hit is refused, with the candidates named.
Scotland is different, and it is not fudged
Scottish establishments use FHIS, which publishes words — Pass, Improvement Required —
not numbers. ratingAtOrBelow cannot rank those, so it excludes them rather than guessing
a score, and every result reports how many were excluded that way.
Filters
| filter | what it does |
|---|---|
localAuthorityName / localAuthorityId | one of 363 authorities; ambiguous names refused |
businessTypeName / businessTypeId | one of 14 published types |
businessName | free text, matched by the FSA against establishment names |
ratingValues | keep only these ratings — applied here, not on the server |
ratingAtOrBelow | numeric ratings at or below N — the usual prospecting filter |
maxResults | how many establishments to return — also your cost ceiling |
Output
One record per establishment: name, business type, full address, postcode, rating and rating
date, the three component scores (hygiene, structural, management), local authority plus its
contact email and website, coordinates, and a link to the FSA's page. Plus a
search_summary naming every trap and a source_receipt.
Nothing is inferred
Every field is carried verbatim from the FSA. This actor assigns no score, ranks nobody, and states no view on any business's food safety beyond the rating the FSA itself published. A low rating is a snapshot from an inspection on a stated date, not a current condition.
Reading policy
api.ratings.food.gov.uk serves no robots.txt (404) and x-api-version: 2 is sent on every
call. The actor paces itself at 2 requests/second on an official public API. The rate is
not an input.
Pricing
| Event | Price |
|---|---|
Actor start (apify-actor-start) | $0.02, charged once per run by the platform |
Establishment record (establishment-result) | $0.10 each (FREE tier) |
Tiers per record: $0.10 / $0.09 / $0.08 / $0.067 / $0.067 / $0.067.
You are billed per record returned, so maxResults is your cost ceiling — 100 results is
$10.00 plus the $0.02 start.
A zero-result query costs nothing beyond the start fee, and says so.
Every refusal costs nothing: an unfiltered query, an unknown or ambiguous authority, an unknown business type, an unknown rating value. A source failure fails the run loudly and charges nothing — it never reports a broken response as "no results".