Scrapers / Developer & File Tools

Singapore Hawker Centres & Closure Calendar
hipersoft/sg-hawker-scraper
All Singapore hawker centres (official NEA data) with location, stall counts, status, photo — joined with the official cleaning-closure calendar: is it closed today, when it next closes and reopens. No setup.
Total users
1Monthly users
1Total runs
96Per centre returned
$0.003Last rebuilt
Oct 28, 2026Overview
Every Singapore hawker centre with its location, stall counts, status and photo — joined with the official cleaning-closure calendar so each record tells you whether it's closed today, when it next closes, and when it reopens. Clean JSON, CSV or Excel. Built from Singapore's official NEA open data, licensed for commercial reuse. No key, no login.
Great for food & tourism apps, maps, delivery/logistics, and "is it open today?" features.

What you get
- 🍜 ~130 hawker centres — name, address, postal code, coordinates, status, cooked-food & market stall counts, photo
- 📅 Live closure calendar —
isClosedToday,currentClosureEnd,nextClosureStart,nextClosureEnd,nextClosureReason, plus the full quarterlyclosureslist - 🔎 Filters — keyword, only-open-today, only-closed-today
- 🧾 Provenance — stable
id,sourceUrl,collectedAton every row - ⚖️ Official & reusable — Singapore Open Data Licence
Why it's more than a file dump
This Actor joins two official datasets (hawker-centre locations + quarterly cleaning dates) and computes actionable calendar fields against today's date — so you don't have to parse four cleaning quarters yourself.
Example input
{ "openOnly": true }
Output

{
"id": "sghc-12",
"name": "Adam Road Food Centre",
"address": "2, Adam Road",
"postalCode": "289876",
"latitude": 1.3241,
"longitude": 103.8142,
"status": "Existing",
"cookedFoodStalls": 32,
"marketStalls": 0,
"isClosedToday": false,
"currentClosureEnd": null,
"nextClosureStart": "2026-09-07",
"nextClosureEnd": "2026-09-07",
"nextClosureReason": null,
"closures": [
{ "type": "Q3", "start": "2026-09-07", "end": "2026-09-07", "remarks": null }
],
"sourceUrl": "https://data.gov.sg/datasets/d_4a086da0a5553be1d89383cd90d07ecd/view",
"collectedAt": "2026-07-30T06:55:00.000Z"
}
Output schema
| Field | Type | Description |
|---|---|---|
id |
string | Stable unique identifier for the hawker centre. |
name |
string | Name of the hawker centre. |
address |
string | Street address. |
postalCode |
string | Singapore postal code. |
latitude |
number | Latitude of the centre. |
longitude |
number | Longitude of the centre. |
status |
string | Operational status (e.g. Existing, Under Construction). |
cookedFoodStalls |
integer | Number of cooked-food stalls. |
marketStalls |
integer | Number of market stalls. |
photoUrl |
string (URL) | Link to a photo of the centre. |
sourceUrl |
string (URL) | Link to the source open dataset. |
isClosedToday |
boolean | Whether the centre is closed today for cleaning. |
currentClosureEnd |
string | End date of the current closure, if any. |
nextClosureStart |
string | Start date of the next scheduled closure. |
nextClosureEnd |
string | End date of the next scheduled closure. |
nextClosureReason |
string | Reason for the next closure, when given. |
closures |
array | Full list of scheduled quarterly cleaning closures. |
collectedAt |
string (ISO date) | When this Actor collected the record. |
Input fields
| Field | Description |
|---|---|
nameQuery |
Keyword in name/address. |
openOnly |
Only centres open today. |
closedTodayOnly |
Only centres closed today. |
maxItems |
Max centres (0 = all). |
FAQ
Where does the data come from? Singapore's official NEA hawker-centre and cleaning-closure datasets on data.gov.sg, reused under the Singapore Open Data Licence.
How are the closure fields computed?
The Actor joins the closure dataset by centre name and compares each quarterly cleaning period to today's date to derive isClosedToday and the next closure window.
How does billing work? A tiny per-run dataset charge plus pay per centre returned.
Can I integrate this with other tools? The Singapore Hawker Centres Scraper can be connected with almost any cloud service or web app thanks to integrations on the Apify platform. It works with Make, Zapier, Slack, Airbyte, GitHub, Google Drive and many more, plus the Apify API, JavaScript/Python clients and MCP. Or use webhooks to trigger an action whenever a run finishes.
Notes
Original clean-room implementation using Singapore's official NEA open data (data.gov.sg), reused under the Singapore Open Data Licence. Not affiliated with or endorsed by NEA or the Singapore Government.
Input
| Field | Type | Description |
|---|---|---|
nameQueryName / address keyword | string | Filter centres by keyword in name or address. Empty = all. |
openOnlyOnly open today | boolean | Return only centres NOT closed for cleaning/works today. Default: false |
closedTodayOnlyOnly closed today | boolean | Return only centres closed today. Default: false |
maxItemsMax centres | integer | Maximum centres to return. 0 = all (~130). Default: 0 |
API
curl -X POST "https://api.apify.com/v2/acts/hipersoft~sg-hawker-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{}'from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("hipersoft/sg-hawker-scraper").call(run_input={})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('hipersoft/sg-hawker-scraper').call({});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);Pricing
| Event | Price | Paid plans from |
|---|---|---|
| Centre returned One hawker centre returned with calendar. | $0.003 | $0.0015 |
| Dataset fetch One fetch+join of the official NEA datasets. | $0.008 | $0.008 |
You pay only for what the run returns. Set a maximum cost per run and it stops cleanly at that limit.
Related scrapers
Bulk Image Downloader
Download thousands of images from a list of URLs and store each in the key-value store with a public link. Returns content type, size, dimensions and SHA-256 per image. Bulk-ready. Great for datasets, backups and media pipelines.
8,102 runs · 103 users · $0.056 / url processedText to Speech
Convert any text to natural-sounding speech as an MP3 download. 300+ premium neural voices across 70+ languages, adjustable rate, pitch and volume. Great for voiceovers, videos, accessibility and audio content. No setup.
278 runs · 22 users · $0.01 / audio generatedGoogle Maps Email Extractor
Search Google Maps for businesses, then crawl each business website to extract emails, social profiles and extra phone numbers. Turns any Maps search into a ready lead list. No setup.
159 runs · 8 users · $0.006 / business lead scrapedWebsite Screenshot
Capture full-page or viewport screenshots of any URL as PNG or JPEG, at any device size. For monitoring, previews, thumbnails and automation workflows.
156 runs · 3 users · $0.004 / screenshot capturedBulk URL Status Checker
Check thousands of URLs over plain HTTP: status codes, broken links (404/410/5xx), full redirect chains, response time, content type, page title and SSL certificate expiry.
154 runs · 13 users · $0.002 / url checkedGoogle Search Scraper
Scrape Google Search results (organic listings) for any query: title, URL, displayed URL, snippet and position. Multi-query, per-country/language, pagination. Uses Google SERP proxy — reliable, no captcha, no setup.
121 runs · 8 users · $0.001 / result scrapedSend the site and the fields. We build it and you get it first.