# OpenRice Scraper — Hong Kong Restaurant Data (`hkdatafeeds/hong-kong-restaurants-scraper`) Actor

Scrape OpenRice Hong Kong: ~28,800 open restaurants with review scores, HKD price bands, opening hours, cuisines, bilingual addresses, phones and GPS. Business listings only.

- **URL**: https://apify.com/hkdatafeeds/hong-kong-restaurants-scraper.md
- **Developed by:** [Feeds HK Data](https://apify.com/hkdatafeeds) (community)
- **Categories:** Travel, Lead generation, Open source
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 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?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

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

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## OpenRice Scraper — Hong Kong Restaurant Data

**Scrape OpenRice Hong Kong restaurants with ratings, prices, opening hours and GPS coordinates, ready for analysis.**
Search `dim sum`, filter by district or cuisine, press Start, and get structured listings with
**review scores**, **HKD price bands as numbers**, **weekly opening hours**, **bilingual addresses** and
**map coordinates** as JSON, CSV or Excel.

Business listings only. No reviewer names, no review text, no user accounts, no login required.

### What this Actor does

OpenRice, Hong Kong's largest restaurant directory, lists about **28,900 open restaurants**, but the site only
lets you browse them a page at a time and stops paging after 10,000 results. This Actor turns the
directory into a dataset you can filter, sort, map and join against your own data, including a
whole-city run.

- 🍜 **~28,900 open restaurants.** Search by keyword, district or cuisine, or take the whole city
- ⭐ **Review score and volume.** Overall score, the source's own review total and bookmark count
- 💵 **Price bands as numbers.** `$101-200` also comes as `price_min_hkd: 101`, `price_max_hkd: 200`
- 🕐 **Weekly opening hours.** Per day, split into lunch and dinner sessions, closed days marked
- 📍 **GPS coordinates** on every venue, ready to map
- 🀄 **English and Chinese.** Chinese address on 99% of venues, alternate-language name where one exists
- 🍱 **Cuisine and dish tags.** 66 cuisines and 55 dish or venue types
- 🏙️ **85 districts plus 10 named neighbourhoods** (Soho, Lan Kwai Fong, Kennedy Town, ...)
- 🚚 **Only venues that are open.** Moved and renovating venues are left out by default, so one
  restaurant is never billed twice

Because it runs on Apify, you also get scheduling, run monitoring, a REST API, webhooks, and
integrations with Make, Zapier, Google Sheets, Slack and Airbyte, without hosting anything.

### How to use it (3 steps)

1. Click **Try for free** and sign in to Apify Console.
2. Enter a keyword (e.g. `ramen`), or a **District ID** / **Cuisine ID** from the tables below.
3. Click **Start**, then open the **Dataset** tab and export as JSON, CSV, Excel, HTML or XML.

Leave every filter empty and set **Maximum restaurants** to 30000 to take the whole city.

#### District IDs

Counts are open venues on the source when this page was written.

| Region (ID) | Districts: name `ID` (open venues) |
|---|---|
| **Hong Kong Island** `1999` (7,633) | Central `1003` (1,343), Wan Chai `1022` (1,071), Causeway Bay `1019` (1,056), Western District `1008` (701), North Point `1004` (484), Sheung Wan `1001` (469), Chai Wan `1013` (278), Quarry Bay `1014` (235), Wong Chuk Hang `1027` (226), Aberdeen `1012` (217), Tai Koo `1023` (217), Shau Kei Wan `1018` (197), Admiralty `1011` (179), Sai Wan Ho `1009` (175), Tin Hau `1026` (173), Happy Valley `1017` (122), Ap Lei Chau `1020` (117), Pok Fu Lam `1021` (67), Tai Hang `1025` (65), Mid-Levels `1005` (59), Stanley `1010` (44), The Peak `1002` (37), Heng Fa Chuen `1024` (35), Shek O `1007` (26), Repulse Bay `1015` (26), Deep Water Bay `1016` (13) |
| **Kowloon** `2999` (10,857) | Tsim Sha Tsui `2008` (1,791), Kwun Tong `2026` (1,138), Mong Kok `2010` (1,135), Sham Shui Po `2019` (761), Hung Hom `2015` (582), Kowloon City `2001` (543), Kowloon Bay `2003` (523), Jordan `2028` (476), Tai Kok Tsui `2005` (405), To Kwa Wan `2004` (394), Cheung Sha Wan `2013` (391), Prince Edward `2029` (365), Lai Chi Kok `2016` (324), San Po Kong `2022` (313), Yau Ma Tei `2011` (269), Wong Tai Sin `2020` (204), Lam Tin `2024` (153), Ngau Tau Kok `2006` (139), Kowloon Tong `2002` (129), Yau Tong `2012` (121), Shek Kip Mei `2007` (103), Ho Man Tin `2009` (102), Mei Foo `2031` (102), Diamond Hill `2027` (101), Tsz Wan Shan `2021` (89), Lok Fu `2030` (89), Choi Hung `2032` (74), Lei Yue Mun `2025` (41) |
| **New Territories** `3999` (9,397) | Yuen Long `3003` (1,292), Tsuen Wan `3018` (1,272), Tuen Mun `3005` (1,254), Sha Tin `3007` (821), Tseung Kwan O `3020` (770), Tai Po `3002` (612), Kwai Chung `3019` (526), Tin Shui Wai `3004` (374), Fanling `3008` (363), Ma On Shan `3009` (325), Tai Wai `3012` (323), Kwai Fong `3015` (306), Sheung Shui `3001` (302), Sai Kung `3006` (273), Tsing Yi `3017` (247), Fo Tan `3013` (152), Tai Wo `3014` (54), Ma Wan `3022` (43), Sham Tseng `3010` (40), Lau Fau shan `3016` (34), Lok Ma Chau `3021` (10), Lo Wu `3011` (4) |
| **Outlying Islands** `4999` (917) | Tung Chung `4009` (211), Cheung Chau `4004` (183), Chek Lap Kok `4002` (176), Lantau Island `4001` (121), Lamma Island `4005` (71), Tai O `4010` (69), Discovery Bay `4006` (44), Peng Chau `4003` (34), Po Toi Island `4011` (8) |

**Neighbourhoods** (these overlap the districts above): Sai Ying Pun `-35244` (321), Kai Tak `-35318` (239),
Kennedy Town `-35242` (208), Soho `-9006` (186), Po Lam `-35260` (181), Hang Hau `-35259` (172),
Shek Tong Tsui `-35243` (163), Lan Kwai Fong `-9007` (114), Knutsford Terrace `-9008` (54), Cyberport `-9151` (27).

#### Cuisine IDs

The 20 largest of 66 cuisines:

| ID | Cuisine | Open venues | ID | Cuisine | Open venues |
|---|---|---|---|---|---|
| `1004` | Hong Kong Style | 10,671 | `2001` | Korean | 503 |
| `4000` | Western | 4,445 | `1001` | Chiu Chow | 481 |
| `1002` | Guangdong | 3,438 | `1003` | Yunnan | 419 |
| `2009` | Japanese | 3,252 | `2002` | Vietnamese | 328 |
| `6000` | International | 1,780 | `1011` | Shanghai | 320 |
| `1009` | Taiwan | 1,216 | `3010` | French | 255 |
| `2004` | Thai | 802 | `2005` | Singaporean | 195 |
| `1008` | Sichuan | 738 | `2006` | Indian | 193 |
| `3006` | Italian | 688 | `1013` | Hunan | 143 |
| `4001` | American | 657 | `2024` | Malaysian | 135 |

Filters combine: `districtId: "1003"` with `cuisineId: "2009"` returns the 184 Japanese restaurants in Central.

### Input example

```json
{
  "keywords": "",
  "districtId": "3003",
  "cuisineId": "",
  "maxItems": 2000,
  "includeInactive": false,
  "requestDelaySeconds": 1
}
```

All fields are optional.

### Output example

A real row, straight out of the Actor:

```json
{
  "poi_id": 836747,
  "name": "Granjero",
  "name_other_lang": "簡.聚",
  "address": "Shop A, G/F, On Ning Building, 172-190 Yuen Long On Ning Road",
  "address_other_lang": "元朗安寧路172-190號安寧樓地下A號舖",
  "district": "Yuen Long",
  "district_id": 3003,
  "latitude": 22.445913757688682,
  "longitude": 114.0219846367836,
  "price_band": "$101-200",
  "price_min_hkd": 101,
  "price_max_hkd": 200,
  "score_overall": 4.68,
  "smiles": 245,
  "cries": 3,
  "review_count": 260,
  "bookmark_count": 5208,
  "cuisines": ["International"],
  "dish_types": ["Bar", "Oyster Bar"],
  "phones": ["52171332"],
  "opening_hours": {
    "mon": [],
    "tue": ["11:30-15:30", "17:30-22:00"],
    "wed": ["11:30-15:30", "17:30-22:00"],
    "thu": ["11:30-15:30", "17:30-22:00"],
    "fri": ["11:30-15:30", "17:30-22:00"],
    "sat": ["11:30-15:30", "17:30-22:00"],
    "sun": ["11:30-15:30", "17:30-22:00"]
  },
  "open_since": "2023-12-01T00:00:00+08:00",
  "status": "open",
  "moved_to_poi_id": null,
  "url": "https://s.openrice.com/QrKS0Yy8600",
  "scraped_at": "2026-09-23T08:49:37+00:00"
}
```

`mon: []` means closed on Mondays. A day that is missing was not stated by the venue.
Venues that publish holiday hours also get `public_holiday` and `public_holiday_eve` keys.

#### How complete is the data?

Measured on a whole-city run on 23 September 2026: all **28,804** open restaurants it returned.

| Field | Filled |
|---|---|
| Name, address, district, GPS, price band, cuisines, review count, bookmarks, link | 100% |
| Chinese address (`address_other_lang`) | 99% |
| Phone number | 83% |
| Opening hours | 82% |
| Opening date | 79% |
| Review score | 69% (venues with few or no reviews are not scored yet: `null`, never `0`) |
| Dish or venue type | 60% |
| Alternate-language name | 53% (many Chinese-only names have no English version) |

#### What the data shows

Share of open restaurants by price per head, from the same whole-city run:

| Price per head | Whole city | Central | Tsim Sha Tsui | Yuen Long |
|---|---|---|---|---|
| $100 or less | 72% | 43% | 43% | 80% |
| $101-200 | 17% | 24% | 25% | 15% |
| Over $200 | 11% | 33% | 32% | 5% |

Four in five Yuen Long restaurants charge $100 or less a head; in Central it is fewer than half.
A third of Central's restaurants charge over $200, against one in twenty in Yuen Long.
Central's top cuisines are Western (396), Japanese (184) and Hong Kong Style (177); Yuen Long's are
Hong Kong Style (619), Guangdong (194) and Western (133).

### Use cases

- **Site selection.** Find under-served cuisines or price points in a district before signing a lease
- **Competitive analysis.** Track ratings, review volume and pricing of nearby venues over time
- **Sales prospecting for restaurant suppliers.** Filter by district, cuisine and opening hours
- **Food delivery and reservation apps.** Seed a venue database with categories, hours and coordinates
- **Market research.** Cuisine mix and price distribution by district
- **Geospatial analysis.** Join venue coordinates with foot traffic, rent or demographic data
- **Travel and lifestyle content.** "Best of" lists backed by scores and review counts

### How much does it cost to scrape Hong Kong restaurants?

**$1.00 per 1,000 restaurants**, plus $0.005 per run. You pay for rows you receive, not for compute.

| Run | Restaurants | Cost |
|---|---|---|
| Try it | 100 | $0.11 |
| One cuisine in one district (Japanese in Central) | 184 | $0.19 |
| Biggest district (Tsim Sha Tsui) | 1,791 | $1.80 |
| Whole city | ~28,800 | ~$28.80 |

A district takes one to three minutes. A whole-city run takes about 40 minutes.

The Actor never goes past your **Maximum cost per run**: it stops at the number of restaurants that
budget pays for and says so on the run page. Raise it to about $30 for a whole-city run.

### FAQ

**Is this legal?**
The Actor collects publicly visible business listings: venue name, address, cuisine, price band,
opening hours and aggregate ratings. It does not collect reviewer identities, review text, user
accounts or any personal data. You remain responsible for how you use the output.

**Why about 28,900 restaurants, when the site mentions more?**
The directory also lists venues that have moved or are closed for renovation, about 13% of its
entries. A moved venue appears again at its new address, so counting it would bill you twice for
one restaurant. They are excluded by default. Turn on **Include moved and renovating venues** to get
them too, with `status` and `moved_to_poi_id` to link each move to the new listing.

**Does a whole-city run really get everything?**
The source stops paging at 10,000 results, so above that the Actor searches district by district.
That reaches every restaurant filed under a district: 99.6% of open venues. About 100 venues have
no district on the source, and a district-by-district walk cannot reach them.

**What if the source blocks the run?**
OpenRice uses bot protection. The Actor sends one request at a time with a pause between them,
and when the source refuses, it waits and retries for up to about 20 minutes, noting each
long wait in the run log. If the source still refuses, the run stops and fails with a message saying how many restaurants it collected. Those
rows stay in the dataset, and you are charged only for them plus the start fee. The run is marked
as failed so that a scheduled pipeline never mistakes a partial dataset for the whole city.

**Why do some restaurants have no score?**
The source does not score venues with few reviews yet: 31% of open restaurants, half of which have
no reviews at all. They come back as `null` rather than `0`, so they never drag an average down.
Weight scores with `review_count`: a 4.8 from 12 reviews is not a 4.8 from 800.

**Is there an official OpenRice API?**
OpenRice has no public API for developers. This Actor gives you its public restaurant listings
through Apify's REST API: start a run from your code, then read the dataset as JSON, CSV or Excel.

**What do `smiles` and `cries` mean?**
The source's positive and negative review counters. `review_count` is the source's own total,
which also includes neutral reviews, so it is usually larger than `smiles + cries`.

**What is `url`?**
The source's own short link to the restaurant page. It redirects to the full page.

**Can I get review text?**
No. This Actor stays on business-level data so that it holds no personal data at all.

**Can I get historical data?**
Each run is a snapshot of the directory at that moment. Schedule a weekly run and your datasets
become a history of openings, closures, price and rating changes.

**Can I use this via API?**
Yes. Every Apify Actor has a REST API, so you can trigger runs and pull results from your own code,
or use the Make / Zapier / Google Sheets integrations.

### 中文簡介

OpenRice 香港餐廳資料爬蟲。一次匯出全港約 28,800 間營業中餐廳：評分、食評數、人均消費（港幣）、每週營業時間、
中英文地址、電話、菜式和 GPS 座標，可下載 JSON、CSV 或 Excel。毋須寫程式，毋須登入，可按地區、菜式或關鍵字篩選，
亦可設定每日或每週自動更新。

適合：開店選址、競爭對手分析、餐飲供應商開發客戶、市場調查、外賣及訂座平台建立餐廳資料庫。

收費：每 1,000 間 US$1，另加每次 US$0.005 啟動費；全港一次約 US$28.8。只收集商戶公開資料，不包括食評內容或任何個人資料。

### Related Actors

| Actor | What it does |
|---|---|
| [JobsDB Scraper — Hong Kong Jobs & Salary Data](https://apify.com/hkdatafeeds/hong-kong-jobs-scraper) | Live HK job listings with parsed HKD salary bands and normalised districts |

### Support

Report problems on the **Issues** tab. Requests for extra fields or another Hong Kong data source
are welcome.

# Actor input Schema

## `keywords` (type: `string`):

Free-text search, e.g. 'dim sum', 'ramen', a restaurant name or a street. Leave empty to scrape everything.

## `districtId` (type: `string`):

Optional district filter (open venues in brackets). Regions: 1999 = Hong Kong Island (7,633), 2999 = Kowloon (10,857), 3999 = New Territories (9,397), 4999 = Outlying Islands (917). Districts: 2008 = Tsim Sha Tsui (1,791), 1003 = Central (1,343), 3003 = Yuen Long (1,292), 3018 = Tsuen Wan (1,272), 3005 = Tuen Mun (1,254), 2026 = Kwun Tong (1,138), 2010 = Mong Kok (1,135), 1022 = Wan Chai (1,071), 1019 = Causeway Bay (1,056), 3007 = Sha Tin (821), 3020 = Tseung Kwan O (770), 2019 = Sham Shui Po (761). Neighbourhoods (overlap the districts): -9006 = Soho, -9007 = Lan Kwai Fong, -35242 = Kennedy Town, -35244 = Sai Ying Pun. The README lists all 85 districts.

## `cuisineId` (type: `string`):

Optional cuisine filter (open venues in brackets). 1004 = Hong Kong Style (10,671), 4000 = Western (4,445), 1002 = Guangdong (3,438), 2009 = Japanese (3,252), 6000 = International (1,780), 1009 = Taiwan (1,216), 2004 = Thai (802), 1008 = Sichuan (738), 3006 = Italian (688), 4001 = American (657), 2001 = Korean (503), 1001 = Chiu Chow (481), 2002 = Vietnamese (328).

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

Hard cap on how many restaurants to return. The whole city is about 28,900 open venues and takes about 40 minutes; above 10,000 the Actor splits the search by district to get past the source's paging limit. The run also stops at the number of restaurants your Maximum cost per run pays for.

## `includeInactive` (type: `boolean`):

Off by default: only currently open venues are returned. Turn on to also get venues marked moved (listed again at their new address, see moved\_to\_poi\_id) or under renovation, e.g. to study churn.

## `requestDelaySeconds` (type: `integer`):

Politeness delay. Keep at 1 or higher to stay well-behaved.

## Actor input object example

```json
{
  "keywords": "dim sum",
  "districtId": "2008",
  "cuisineId": "2009",
  "maxItems": 100,
  "includeInactive": false,
  "requestDelaySeconds": 1
}
```

# Actor output Schema

## `restaurants` (type: `string`):

All scraped restaurants as JSON: name, name\_other\_lang, address, address\_other\_lang, district, latitude, longitude, price\_band, price\_min\_hkd, price\_max\_hkd, score\_overall, review\_count, bookmark\_count, cuisines, dish\_types, phones, opening\_hours, open\_since, status and url.

# 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 = {
    "keywords": "dim sum",
    "maxItems": 100,
    "requestDelaySeconds": 1
};

// Run the Actor and wait for it to finish
const run = await client.actor("hkdatafeeds/hong-kong-restaurants-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 = {
    "keywords": "dim sum",
    "maxItems": 100,
    "requestDelaySeconds": 1,
}

# Run the Actor and wait for it to finish
run = client.actor("hkdatafeeds/hong-kong-restaurants-scraper").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 '{
  "keywords": "dim sum",
  "maxItems": 100,
  "requestDelaySeconds": 1
}' |
apify call hkdatafeeds/hong-kong-restaurants-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,hkdatafeeds/hong-kong-restaurants-scraper"
        }
    }
}
```

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/6CJkKEoGn1auZOm8F/builds/aidZprFHtaRsVlWvQ/openapi.json
