Centaline HK Property Listings Scraper
Pricing
$3.00 / 1,000 listings
Centaline HK Property Listings Scraper
Rent and buy listings from Centaline Property, Hong Kong's largest estate agency: price, rent, size, unit price, district, estate, bedrooms, MTR distance, coordinates.
Pricing
$3.00 / 1,000 listings
Rating
0.0
(0)
Developer
KF P
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Scrapes residential listings from Centaline Property, Hong Kong's largest estate agency (~10k rentals, ~33k sale listings). Public pages only, no login.
No login, no API key, no proxy needed. Pay-per-event: one listing event per listing saved; list requests that return nothing cost nothing.
Output (one record per listing)
| field | example |
|---|---|
refNo, id | GAJ917 |
mode | rent or buy |
url | detail page |
title, estate, phase, building, address | Grand Mayfair・Phase 1A…・Tower 5 |
region, district, area | New Territories West, Yuen Long District, Kam Tin |
buildingType, unitType, isHouse, bedrooms, buildingAge, direction | Apartment, Simplex, 2, 1, South West |
sizeSqft | saleable area, 384 |
price, rent | HKD asking price / monthly rent (either may be null) |
unitPriceSqft, unitRentSqft, monthlyPayment, yieldPct | derived numbers from the site |
hasKey, exclusive, petFriendly, foreclosure, hosFlat, tags | flags and feature tags |
mtr | [{ name: "Kam Sheung Road", walkMinutes: 7 }] |
lat, lng, publishDate, updateDate, thumbnail |
Input
Example: rentals in Taikoo Shing between HK$15k and HK$30k a month —
{ "mode": "rent", "locations": ["Taikoo Shing"], "minPrice": 15000, "maxPrice": 30000, "maxItems": 200 }
mode—rent(default) orbuy.language—en(default),zh-hkorzh-cn; controls every text field.locations— optional list of districts / estates / buildings / MTR stations, in any language (["Taikoo Shing", "沙田"]). Entries are OR-ed, but must all be the same kind (all districts, or all estates, or all phases / buildings / MTR stations) — the API AND-s different kinds and returns nothing, so the actor refuses such input. Each name is resolved through the site's own autocomplete (exact English/Chinese label match preferred, else the first district, then estate, building, MTR hit); raw site tokens likeHMA034(district),3-OVDUURFSRJ(estate),2-…(phase),1-…(building) ormtr-58are used as-is. An unknown name fails the run rather than silently scraping all of Hong Kong.minPrice/maxPrice— HKD; monthly rent inrentmode, sale price inbuymode.maxItems(default 100),startPage(default 1),maxPagesper URL (default 200).proxyConfiguration— optional; the site is served without bot challenges, datacenter proxies are enough for big runs.
Pricing
Pay-per-event: one listing event is charged per listing pushed to the dataset. Nothing else is charged. If a run's budget (maxTotalChargeUsd) is exhausted before maxItems, the actor stops cleanly with the listings it could pay for and reports it in the status message.
How it works
The list page is server-rendered only for the first 24 results; the site's SPA then paginates through POST hk-api.centanet.com/centanetapi/api/Post/Search (offset/size). The actor calls that endpoint directly, in the site's own ranking order, and de-duplicates by listing id (the ranking is not perfectly stable between calls). src/parse.js also contains a parser for the window.__NUXT__ SSR payload, evaluated in an empty, time-limited VM sandbox, used by the fixture tests and kept as a fallback.
Local development
npm installnpm test # parser tests against fixtures/apify run -i '{"mode":"rent","maxItems":30}'
Refresh fixtures with a browser user-agent: curl -A "Mozilla/5.0 …" https://hk.centanet.com/findproperty/en/list/rent > fixtures/rent-page1.html.
Limitations
- One run filters by one kind of location (districts, or estates, or buildings/phases/MTR stations); size, bedroom and school-net filters are not exposed yet.
- Transaction history and the detail-page fields (floor plan, agent) are client-side rendered and not scraped in v1.
- Field names on the site can change; if a run fails with "Listing array not found", the
__NUXT__layout moved.