Singapore Food Hygiene Grades & Food Shop Licences Scraper avatar

Singapore Food Hygiene Grades & Food Shop Licences Scraper

Pricing

from $6.15 / 1,000 results

Go to Apify Store
Singapore Food Hygiene Grades & Food Shop Licences Scraper

Singapore Food Hygiene Grades & Food Shop Licences Scraper

Scrape Singapore food shop licences and food hygiene grades (A, B, C, D) from the official SFA/NEA open data on data.gov.sg. No API key. Get licensee name, licence number, address, postal code, district, demerit points, suspension status, plus geocoded coordinates. Export JSON, CSV, Excel.

Pricing

from $6.15 / 1,000 results

Rating

0.0

(0)

Developer

Scrapers Lat

Scrapers Lat

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Share

Singapore Food Hygiene Grades & Food Shop Licences Scraper

Singapore Food Hygiene Grades & Food Shop Licences Scraper

Scrape Singapore food hygiene grades and food shop licences straight from the official government open data portal (data.gov.sg), published by the food-safety regulator (SFA, which took over food retail hygiene from NEA). Get the hygiene grade (A, B, C or D), licensee name, licence number, full premises address, postal code and district, demerit points and suspension status for every licensed eating establishment and supermarket in Singapore. No API key, no login, no scraping know-how needed. Export to JSON, CSV or Excel.

Here is one real result, with every field the actor returns:

{
"recordId": 29963,
"licenseeName": "MCDONALD'S RESTAURANTS PTE. LTD.",
"licenceNumber": "B86020L006",
"premisesAddress": "293 YISHUN STREET 22 #01-237 SINGAPORE 760293",
"postalCode": "760293",
"grade": "A",
"gradeDescription": "Highest standard of hygiene",
"demeritPoints": null,
"suspensionStartDate": null,
"suspensionEndDate": null,
"hasSuspensionRecord": false,
"licenceStatus": "Active",
"buildingName": null,
"blockHouseNumber": null,
"streetName": null,
"levelNumber": null,
"unitNumber": null,
"postalSector": "76",
"postalDistrict": "D27",
"districtName": "Yishun / Sembawang",
"latitude": 1.436114254092158,
"longitude": 103.8376052359577,
"formattedAddress": "293 YISHUN STREET 22 SINGAPORE 760293",
"licenceType": "eating",
"source": "Singapore SFA/NEA food establishment licences (data.gov.sg)",
"observedAt": "2026-09-05T01:02:02.222Z"
}

The most complete SFA food establishment data scraper on Apify. It returns every field the official Singapore food licence datasets expose, plus the hygiene-grade meaning, a derived licence status, postal district and area, and OneMap geocoding (latitude, longitude, formatted address), with filters to target exactly the establishments you need.

📥 Input · 📤 Output · 💰 Pricing · ▶️ Examples

Apify Coverage Output Billing

Table of contents

What it does

This actor reads the official Singapore food establishment licence datasets published on the government open-data portal (data.gov.sg), applies the filters you pass, paginates through matching licences, and writes one clean record per establishment. It covers two datasets you pick with licenceType:

  • Eating establishments (restaurants, hawker stalls, food courts, canteens) that carry a food hygiene grade of A, B, C or D, with demerit points and any suspension window.
  • Supermarkets (licensed supermarket premises, no hygiene grade), with fully split address components.

Each grade is expanded to a plain description, a licenceStatus (Active or Suspended) is derived, and every record is enriched with its postal sector, postal district, area name, and OneMap geocoding (latitude, longitude and a standardized address) when the premises can be resolved. There is no API key and no rate-limit account to manage on your side; the portal throttles anonymous access, so large pulls are paced automatically.

Use cases

  • Food-safety and compliance monitoring: track which establishments hold grade A vs C/D, watch demerit points, and flag suspended licences.
  • Local-business and F&B lead generation: build lists of licensed operators by area, postal district, grade or brand for sales, delivery, insurance, pest-control or supplier outreach.
  • Market and location research: map every licensed food outlet or supermarket in a district with geocoded coordinates.
  • Franchise and chain analysis: pull all outlets for a licensee (for example every McDonald's or supermarket chain) with one keyword.
  • Enrichment: match Singapore restaurants to their official licence number, hygiene grade and postal district.

Quickstart

Open the actor, paste this into the input, and press Run. It returns 10 eating establishments across all hygiene grades, newest first.

{
"maxLicences": 10,
"licenceType": "eating",
"grade": "",
"sortByNewest": true
}

Every input field is optional. With an empty input the actor returns the most recent eating establishments (default maxLicences is 10).

Input reference

FieldTypeRequiredDefaultDescription
maxLicencesintegerno10Maximum number of licence records to collect. Large pulls are paced automatically to respect the source rate limit.
licenceTypeenumnoeatingeating = licensed food shops (restaurants, hawker stalls, food courts) that carry a hygiene grade A, B, C or D. supermarket = licensed supermarket premises (no hygiene grade).
gradeenumno(any)Keep only eating establishments with this hygiene grade. A is best, D is the lowest passing standard. Eating dataset only. Leave empty to include every grade.
searchQuerystringno(empty)Filter by any keyword across the record: licensee name or premises address, for example MCDONALD, ORCHARD ROAD, a mall name. Leave empty to pull the full list.
postalCodestringno(empty)Keep only establishments at this exact Singapore 6-digit postal code, for example 768677.
areastringno(empty)Keep only establishments in a postal district or area. Accepts a 2-digit sector (42), a district code (D15 or 15), or an area keyword (Orchard, Tampines, Jurong).
activeOnlybooleannofalseExclude eating establishments currently under a licence suspension.
sortByNewestbooleannotrueReturn the most recently added licences first. Turn off to read in the source order.

Filters combine with logical AND. grade and searchQuery run at the source (fast); postalCode, area and activeOnly are applied while scanning, so pulls with only those filters may scan more pages.

Output reference

One dataset item per licensed establishment. Fields marked "eating only" or "supermarket only" apply to that licenceType. Types: string, number, boolean, or null when the source value is absent.

FieldTypeDescription
recordIdnumberStable source row id in the dataset.
licenseeNamestringName of the licence holder.
licenceNumberstringOfficial licence number (unique per licence).
premisesAddressstringAddress of the licensed premises.
postalCodestringSingapore 6-digit postal code, from the source or resolved via geocoding. null if not resolvable.
gradestringFood hygiene grade A, B, C or D (eating only). null for supermarkets.
gradeDescriptionstringPlain meaning of the grade, for example Highest standard of hygiene (eating only).
demeritPointsnumberCurrent demerit points on the licence (eating only), or null.
suspensionStartDatestringStart date of any licence suspension (eating only), or null.
suspensionEndDatestringEnd date of any licence suspension (eating only), or null.
hasSuspensionRecordbooleantrue when a suspension start date is present.
licenceStatusstringSuspended when a suspension is currently in effect, otherwise Active.
buildingNamestringBuilding name (supermarket only).
blockHouseNumberstringBlock or house number (supermarket only).
streetNamestringStreet name (supermarket only).
levelNumberstringLevel number (supermarket only).
unitNumberstringUnit number (supermarket only).
postalSectorstringFirst 2 digits of the postal code (Singapore postal sector), or null.
postalDistrictstringSingapore postal district code D01-D28, derived from the postal code.
districtNamestringDescriptive area name for the district, for example Katong / Joo Chiat / Amber Road.
latitudenumberLatitude from OneMap geocoding, or null if the premises could not be resolved.
longitudenumberLongitude from OneMap geocoding, or null.
formattedAddressstringStandardized address returned by OneMap, or null.
licenceTypestringeating or supermarket, matching the dataset you selected.
sourcestringData source label. Always the official Singapore food establishment licences via data.gov.sg.
observedAtstringISO 8601 timestamp of when the record was collected.
errorstringPresent only on a failed run: a single item with a populated error field is written instead of results, and is not billed.

Why this scraper

There is no other Apify actor that returns official Singapore food hygiene grades and food shop licences. The closest alternatives cover a different thing entirely:

CapabilityThis actorFoodpanda / Oddle / Burpple / Chope scrapersUK food hygiene scrapers
CoverageSingapore SFA/NEA licensed food establishments and supermarketsDelivery/discovery listings for a single platformUnited Kingdom (FSA), not Singapore
Official hygiene grade A/B/C/DYesNoDifferent scheme, different country
Official licence number and licensee nameYesNoUK only
Demerit points and suspension statusYesNoNo
Postal code, postal district and areaYesPartialUK only
Geocoded latitude/longitudeYes (OneMap)VariesUK only
Filter by grade, area, postal code, active-onlyYesNoLimited
No API key requiredYesVariesVaries

If you need the official regulator record for a Singapore food business (its hygiene grade, licence number and status), this is the actor. Restaurant-discovery scrapers return menus and reviews but never the licence or the grade.

Run via API and CLI

Start a run and read the dataset. Replace <TOKEN> with your Apify API token.

Run synchronously and get dataset items in one call:

curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~singapore-food-hygiene-grades-scraper/run-sync-get-dataset-items?token=<TOKEN>" \
-H "Content-Type: application/json" \
-d '{"licenceType":"eating","grade":"A","area":"Orchard","maxLicences":50}'

Start a run asynchronously:

curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~singapore-food-hygiene-grades-scraper/runs?token=<TOKEN>" \
-H "Content-Type: application/json" \
-d '{"licenceType":"supermarket","maxLicences":200}'

Apify CLI:

apify call scrapers_lat/singapore-food-hygiene-grades-scraper \
--input '{"licenceType":"eating","searchQuery":"MCDONALD"}'

Fetch results

Every run writes to a dataset. Fetch items as JSON, CSV, or Excel by changing format:

# JSON
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=json"
# CSV
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=csv"
# Paginate large datasets
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&offset=1000&limit=1000"

<DATASET_ID> is returned as defaultDatasetId in the run object. clean=true drops empty and internal fields.

Billing and limits

  • Pay per result. You are charged per record returned (result event). See the pricing tab for the current per-result price.
  • No charge on failure. If a run errors, the actor writes a single item with a populated error field and does not charge for it. Empty runs cost nothing.
  • Spend cap respected. Set maxTotalChargeUsd on the run; once reached, the actor stops emitting and charging further billable results.
  • Free Apify plans are capped at 10 records per run. Upgrade for higher maxLicences.
  • Source rate limit. The data.gov.sg portal throttles anonymous access, so large pulls are paced automatically (about one page every 10 seconds).

FAQ and troubleshooting

Do I need an API key or SFA/NEA account? No. The actor reads only data that is publicly available through the official government open-data portal (data.gov.sg) and OneMap. There is nothing to register.

How do I get only the cleanest restaurants in one area? Set licenceType to eating, grade to A, and area to a district or keyword such as Orchard or D09.

How do I list every outlet of a chain? Put the brand in searchQuery, for example MCDONALD or COLD STORAGE, and raise maxLicences.

What is the difference between hasSuspensionRecord and licenceStatus? hasSuspensionRecord is true if the licence has any suspension start date on file. licenceStatus is Suspended only when that suspension is currently in effect, otherwise Active.

A run returned 0 records. Why? The filters matched nothing. Loosen searchQuery, remove grade/area/postalCode, or check the licenceType. Zero-result runs are not charged.

Why is latitude or postalCode null? Some premises addresses (for example a hawker stall with no postal code) cannot be resolved by the OneMap geocoder. Missing values are returned as null, never invented.

Do supermarket records have a hygiene grade? No. The supermarket dataset does not carry a hygiene grade, so grade and gradeDescription are null for licenceType supermarket.

Is this an official SFA or NEA tool? No. This actor is independent and has no affiliation with the Singapore Food Agency (SFA) or the National Environment Agency (NEA). It reads only publicly available data from data.gov.sg and OneMap.

More scrapers at scrapers.lat

Built and maintained by scrapers.lat, where we publish scrapers for public platforms: company registries, government data, finance, e-commerce and more. Browse the catalog or request a custom scraper at scrapers.lat.


Independent tool, not affiliated with the Singapore Food Agency (SFA) or the National Environment Agency (NEA). Accesses only publicly available data from the official government open-data portal (data.gov.sg) and OneMap.