# UK Food Hygiene Ratings (FHRS) Leads (`dessy66/uk-food-hygiene-ratings-leads`) Actor

Exporta establecimientos alimentarios del esquema oficial de higiene del Reino Unido (FHRS) como leads normalizados (sin clave, open data).

- **URL**: https://apify.com/dessy66/uk-food-hygiene-ratings-leads.md
- **Developed by:** [Joshua Hernández Márquez](https://apify.com/dessy66) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.50 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## UK Food Hygiene Ratings (FHRS) Leads

Export UK food businesses from the official Food Standards Agency database as a
clean, ready-to-use list of leads — no API key, no login, no anti-bot headaches.

### What this gives you

One run can pull from **many local authorities at once** and hand you a single,
deduplicated dataset (one row per business) with the fields that actually matter
for follow-up:

```
Legal_Name, DBA_Name, License_ID, Full_Address, City, State, Zip_Code,
Phone_Clean, License_Status, Source, Source_URL, Scraped_At,
Business_Type, Rating_Value, Rating_Date, Rating_Key, New_Rating_Pending,
Hygiene_Score, Structural_Score, Confidence_In_Management, Scheme_Type,
Latitude, Longitude
```

Most scrapers for this dataset only let you target one council at a time. This
one takes a **list** of authorities, so you can cover a region — or the whole
country — in a single run without stitching results together.

### Why it's different (honestly)

- **Official government open data.** Sourced from the UK Food Standards Agency
  FHRS database itself. No scraping HTML, no captchas, no proxies, no IP bans.
  It's a public API that expects reasonable rate limiting, and that's all we do.
- **Keys are your real identifiers.** `License_ID` is the actual `FHRSID`
  published by the source — not a hash we made up. Nothing is invented.
- **Honest fields.** `Rating_Value`/hygiene scores come straight from the
  source. `License_Status` is left empty on purpose: a hygiene rating is *not*
  a licence status, and we don't pretend it is.
- **You control cost and coverage.** Pick your authorities, pick how many pages
  per authority. More authorities = more rows per run.

### Case uses

- **Local-services prospecting** — fresh, rated food businesses you can contact
  and score by hygiene.
- **Delivery/marketplace onboarding** — find takeaway and restaurant candidates
  per area, with address, phone and coordinates.
- **Compliance/data background** — a dependable, source-stable feed for
  dashboards and due-diligence checks.

### Input

| Field | Type | Default | What it does |
|---|---|---|---|
| `localAuthorityIds` | string list | `[]` | The authorities to process in **one run**. Full list: `https://api.ratings.food.gov.uk/Authorities/basic` |
| `localAuthorityId` | integer | `35` | Legacy shortcut for a single authority |
| `maxPagesPerAuthority` | integer | `5` | Pages per authority (`pageSize` is fixed at 100 by the source) |

### Output

A dataset of JSON rows (one per establishment). In Apify you can download it as
JSON, CSV or Excel directly from the run's dataset.

### Limits (the source's rules)

- The FHRS API requires an authority filter — a call with no filter returns a
  clear 403. We respect that documented contract.
- `pageSize` stays at 100 (source-set); we page through it up to your
  `maxPagesPerAuthority`.
- Polite rate limiting between pages, with retry + backoff. No flooding.

***

Built by **Joshua Hernández Márquez**. If you need a specific set of authorities
or a recurring refresh, open an issue or reach out.

# Actor input Schema

## `localAuthorityIds` (type: `array`):

Authorities to process in one run (official open data). Each adds up to ~5,000 establishments. Full list: https://api.ratings.food.gov.uk/Authorities/basic. Leave empty to fall back to 'localAuthorityId'.

## `localAuthorityId` (type: `integer`):

Alternative to 'localAuthorityIds' for one authority. Default 35 = Babergh.

## `maxPagesPerAuthority` (type: `integer`):

Pages to crawl per authority (pageSize fixed at 100 by the source). Default 5.

## Actor input object example

```json
{
  "localAuthorityIds": [],
  "localAuthorityId": 35,
  "maxPagesPerAuthority": 5
}
```

# Actor output Schema

## `dataset` (type: `string`):

Dataset con todos los establecimientos obtenidos (una fila por establecimiento).

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {};

// Run the Actor and wait for it to finish
const run = await client.actor("dessy66/uk-food-hygiene-ratings-leads").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {}

# Run the Actor and wait for it to finish
run = client.actor("dessy66/uk-food-hygiene-ratings-leads").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{}' |
apify call dessy66/uk-food-hygiene-ratings-leads --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,dessy66/uk-food-hygiene-ratings-leads"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/KEXVplcEKSxywv2VU/builds/mmH3VkIBSv9kVrnDO/openapi.json
