# Singapore Hawker Centres & Closure Calendar (`hipersoft/sg-hawker-scraper`) Actor

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 key.

- **URL**: https://apify.com/hipersoft/sg-hawker-scraper.md
- **Developed by:** [hiper soft](https://apify.com/hipersoft) (community)
- **Categories:** Travel, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.003 / centre returned

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/platform/actors/running/actors-in-store#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

## Singapore Hawker Centres & Closure Calendar

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**.

![Singapore Hawker Centres Scraper input — keyword and open/closed-today filters in the Apify Console](https://api.apify.com/v2/key-value-stores/SUfvnaFLd9z9eBCtV/records/sg-hawker-scraper-input.png?v=2)

### 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 quarterly `closures` list
- 🔎 **Filters** — keyword, only-open-today, only-closed-today
- 🧾 **Provenance** — stable `id`, `sourceUrl`, `collectedAt` on 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

```json
{ "openOnly": true }
```

### Output

![Singapore Hawker Centres Scraper output example — centres with closure calendar as structured JSON](https://api.apify.com/v2/key-value-stores/SUfvnaFLd9z9eBCtV/records/sg-hawker-scraper-output.png?v=5)

```json
{
  "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](https://apify.com/integrations). It works with [Make](https://apify.com/integrations/make), [Zapier](https://apify.com/integrations/zapier), [Slack](https://docs.apify.com/platform/integrations/slack), [Airbyte](https://docs.apify.com/platform/integrations/airbyte), [GitHub](https://docs.apify.com/platform/integrations/github), [Google Drive](https://docs.apify.com/platform/integrations/drive) and [many more](https://apify.com/integrations), plus the [Apify API](https://docs.apify.com/api/v2), JavaScript/Python clients and MCP. Or use [webhooks](https://docs.apify.com/platform/integrations/webhooks) to trigger an action whenever a run finishes.

### Related Actors

- [Singapore Childcare & Preschool Directory](https://apify.com/hipersoft/sg-childcare-scraper)
- [Google Maps Scraper](https://apify.com/hipersoft/google-maps-scraper)
- [OSM POI Scraper](https://apify.com/hipersoft/osm-poi-scraper)

### 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.

# Actor input Schema

## `nameQuery` (type: `string`):

Filter centres by keyword in name or address. Empty = all.

## `openOnly` (type: `boolean`):

Return only centres NOT closed for cleaning/works today.

## `closedTodayOnly` (type: `boolean`):

Return only centres closed today.

## `maxItems` (type: `integer`):

Maximum centres to return. 0 = all (~130).

## Actor input object example

```json
{
  "nameQuery": "",
  "openOnly": false,
  "closedTodayOnly": false,
  "maxItems": 0
}
```

# Actor output Schema

## `results` (type: `string`):

The scraped results as dataset items.

# 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("hipersoft/sg-hawker-scraper").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("hipersoft/sg-hawker-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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 hipersoft/sg-hawker-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=hipersoft/sg-hawker-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

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