OpenRice Scraper – Hong Kong Restaurants, Ratings & Reviews
Pricing
from $2.00 / 1,000 restaurant results
OpenRice Scraper – Hong Kong Restaurants, Ratings & Reviews
Scrape OpenRice (Hong Kong's largest restaurant guide) without an API: name, district, cuisine, rating, review count, price range, address and phone. Bulk-paste keywords; export JSON/CSV/Excel. Great for site selection and F&B market research.
Pricing
from $2.00 / 1,000 restaurant results
Rating
0.0
(0)
Developer
Chad
Maintained by CommunityActor stats
1
Bookmarked
5
Total users
1
Monthly active users
8 hours ago
Last modified
Categories
Share
OpenRice Scraper | Hong Kong Restaurant Data, Reviews, Ratings & Cuisines (No API)
Scrape restaurant search listings from OpenRice Hong Kong (name, cuisine, district, rating, review count, address, phone, image URLs) and the full reviews of individual restaurants (rating, sentiment, text, recommended dishes, spend per head).
- Public JSON API — no login, no token, no browser required
- The only stable option: the sole competitor on Apify Store has been stuck under
UNDER_MAINTENANCEfor a long time, with 30/38 runs timing out - Bulk keyword search: run multiple keywords in one job, with optional district / cuisine ID filters
- Structured output: snake_case fields, missing values filled with
null, every row stamped with an ISO 8601 timestamp
Output fields
search mode
| Field | Type | Description | Version |
|---|---|---|---|
poi_id | string | OpenRice restaurant unique ID | v1.0 |
name | string | null | Restaurant name (Chinese) | v1.0 |
cuisine | string[] | null | Cuisine array (e.g. ["Japanese", "Sushi/Sashimi"]) | v1.0 |
district | string | null | District name (e.g. "Causeway Bay") | v1.0 |
price_range | string | null | Price range: $ / $$ / $$$ / $$$$ | v1.0 |
rating | number | null | OpenRice overall rating (e.g. 3.87) | v1.0 |
review_count | integer | null | Number of reviews | v1.0 |
bookmark_count | integer | null | Number of users who bookmarked the restaurant | v1.0 |
address | string | null | Restaurant address (Chinese) | v1.0 |
phone | string | null | Phone number (first one) | v1.0 |
opening_hours | string | null | Opening hours as a JSON string (v1.1 will switch to a human-readable format) | v1.0 |
image_urls | string[] | Array of restaurant image URLs ([] if none) | v1.0 |
restaurant_url | string | Full URL of the OpenRice restaurant page | v1.0 |
source_mode | string | Data source mode (currently "search") | v1.0 |
source_query | string | The search keyword that produced this row | v1.0 |
scraped_at | string | Scrape timestamp (ISO 8601, UTC) | v1.0 |
reviews mode
| Field | Type | Description |
|---|---|---|
review_id | integer | null | Review ID |
restaurant_id | string | Restaurant POI ID |
author | string | null | Reviewer nickname |
rating | number | null | Review rating (0–5, one decimal) |
sentiment | string | null | smile / ok / cry |
score_taste | number | null | Taste score (1–5) |
score_environment | number | null | Environment score (1–5) |
score_service | number | null | Service score (1–5) |
score_hygiene | number | null | Hygiene score (1–5) |
score_value | number | null | Value-for-money score (1–5) |
title | string | null | Review title |
content | string | null | Review text (BBCode stripped, line breaks kept) |
content_raw | string | null | Original text incl. OpenRice BBCode |
language | string | null | Language code (e.g. hk) |
price_per_head | number | null | Spend per head |
price_type | integer | null | Spend type code |
meal_date | string | null | Meal date |
dining_method | integer | null | Dining method code |
like_count | integer | null | Likes |
dislike_count | integer | null | Dislikes |
photo_count | integer | null | Number of photos |
comment_count | integer | null | Number of comments |
view_count | integer | null | Views |
recommended_dishes | string[] | Recommended dishes ([] if none) |
is_editor_choice | boolean | null | Editor's choice |
created_at | string | null | Review publish time |
review_url | string | Review short link (falls back to the restaurant's reviews page) |
source_mode | string | Always "reviews" |
source_query | string | The restaurant ID that produced this row |
scraped_at | string | Scrape timestamp (ISO 8601, UTC) |
Modes
| mode | Input | Output | Billing event |
|---|---|---|---|
search (v1.0, default) | keywords[] + optional district / cuisine filters | Search listing results | search-listing ($0.002 per row) |
reviews (v1.1) | restaurantIds[] or restaurantUrls[] | Restaurant reviews | review-item ($0.003 per review) |
Input parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
mode | string | — | search | search (find restaurants) or reviews (fetch reviews) |
keywords | string[] | search mode ✓ | — | Search keywords (restaurant name / cuisine), up to 50 |
bulkInput | string | — | — | One keyword per line (search) or one restaurant ID/URL per line (reviews), auto-merged |
restaurantIds | string[] | reviews mode ✓ (one of three) | — | Restaurant IDs — the digits after the trailing r in the URL (e.g. 808150) |
restaurantUrls | string[] | reviews mode ✓ (one of three) | — | Restaurant page URLs; the trailing r{digits} is extracted as the ID |
district | string | — | — | District ID (e.g. 1019 = Causeway Bay, see below; search mode only) |
cuisine | string | — | — | Cuisine ID (e.g. 2009 = Japanese, see below; search mode only) |
maxItems | integer | — | 50 | search: max results per keyword; reviews: max reviews per restaurant (1–2000) |
proxyConfiguration | object | — | Apify datacenter proxy | On by default; without it the run shares egress IPs and the reviews page may come back without data |
Common district IDs
| districtId | District |
|---|---|
| 1999 | Hong Kong Island (all) |
| 1019 | Causeway Bay |
| 1001 | Sheung Wan / Central |
| 2999 | Kowloon (all) |
| 2010 | Mong Kok |
| 2001 | Tsim Sha Tsui |
| 3999 | New Territories (all) |
For the full list, call GET https://www.openrice.com/api/v2/metadata/region/all?uiLang=zh&uiCity=hongkong.
Common cuisine IDs
| cuisineId | Cuisine |
|---|---|
| 1004 | Cantonese / HK-style |
| 2009 | Japanese |
| 4000 | Western |
| 1007 | Chinese |
| 2001 | Korean |
Input examples
1. Search for sushi (default settings)
{"keywords": ["sushi"],"maxItems": 20}
2. BBQ filtered to Central/Sheung Wan (districtId=1001)
{"keywords": ["bbq"],"district": "1001","maxItems": 20}
3. Multiple keywords in one run
{"keywords": ["japanese food", "korean bbq"],"maxItems": 50}
4. Japanese restaurants in Mong Kok (district + cuisine filter combined)
{"keywords": ["sushi"],"district": "2010","cuisine": "2009","maxItems": 30}
5. Bulk-paste multiple keywords
{"bulkInput": "sushi\nbbq\nhot pot\ncha chaan teng\ndim sum","maxItems": 30}
6. Reviews of one restaurant (reviews mode)
{"mode": "reviews","restaurantIds": ["808150"],"maxItems": 100}
Food & beverage market research
reviews mode returns individual reviews (rating, sentiment, taste/environment/service/hygiene/value sub-scores, recommended dishes, spend per head) — built for delivery platforms and restaurant chains doing dish-trend analysis, competitor rating monitoring and consumer research. Suggested flow: use search mode to find target restaurants by keyword or district, note their poi_id, then feed those IDs into restaurantIds and run reviews mode.
Notes
- Reliability is the selling point: the only competitor has been stuck
UNDER_MAINTENANCEfor a long time (30/38 runs timing out); this Actor uses a pure JSON API, no browser, and exponential-backoff retries — finishing the job is the whole point - Billing timing:
Actor.charge()is only called after data has been successfully pushed to the dataset; failures mid-run are never billed - Consecutive empty-page detection: the run auto-stops if 5 consecutive pages return no new data, avoiding wasted compute
detailmode (v1.1): OpenRice's POI detail API endpoint is not currently public — all probe requests return 404; will be added once found or reverse-engineered
FAQ
Q: Why are some fields null?
A: Some OpenRice restaurant listings have incomplete data (e.g. no phone number, no address filled in). This Actor always fills missing values with null instead of dropping the field, so every row keeps a consistent structure.
Q: What format is opening_hours in?
A: In v1.0 it's a JSON string containing per-day fields like dayOfWeek (1=Sunday, 2=Monday...7=Saturday), period1Start, period1End, is24hr, isClose, etc. v1.1 will switch to a human-readable format.
Q: Can I search a specific district only?
A: Yes — fill in district with a districtId (e.g. 1019 = Causeway Bay). The full districtId list is available from the metadata API.
Q: Is proxy supported? A: Yes, both Apify Proxy and a custom proxy are supported; disabled by default since direct connections already scrape reliably.
Q: Does image_urls include all photos?
A: It includes the restaurant's main photo (doorPhoto) plus the latest images returned in the search listing (usually 3-5). The full photo album requires detail mode (v1.1).
Q: Can I scrape review content?
A: Yes — set "mode": "reviews" with restaurantIds or restaurantUrls to fetch a restaurant's full reviews (rating, sentiment, text, recommended dishes and more).
Q: Where do I find a restaurant ID?
A: Open any OpenRice restaurant page — the URL ends with r{digits} (e.g. 808150 in .../r-milu-thai-tsim-sha-tsui-thai-r808150). Or run search mode first: the poi_id field is the restaurant ID. You can also paste full restaurant URLs into restaurantUrls and the Actor extracts the ID.
Deploy
npm installnpm run buildapify push
Local testing:
$apify run --input='{"keywords":["sushi"],"maxItems":5}'
Disclaimer
This tool is intended only for lawful research and analysis of publicly accessible data. Users must comply with OpenRice's Terms of Service, avoid mass scraping, avoid use for commercial competition, and avoid storing personal data. The author bears no responsibility for how users choose to use this tool.
OpenRice scraper, Hong Kong restaurants, HK dining data, restaurant ratings, cuisine search, OpenRice API, Hong Kong food data, OpenRice reviews, review scraper