# Ricacorp Scraper – Hong Kong Listings for Sale & Rent (No API) (`claude_code_reviewer/ricacorp-scraper-en`) Actor

Scrape Ricacorp Properties Hong Kong without an API: 20K for-sale and 5.9K for-rent listings with price, saleable area, price per saleable sq ft, bedrooms, floor zone, estate, phase, block, school net and coordinates. JSON/CSV/Excel export for HK property research and agency comparison.

- **URL**: https://apify.com/claude\_code\_reviewer/ricacorp-scraper-en.md
- **Developed by:** [Chad](https://apify.com/claude_code_reviewer) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 listing searches

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?

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

## Ricacorp Properties Scraper (Hong Kong)

Scrape **Ricacorp Properties**' public Hong Kong listings: **20,211 for sale** and **5,924 for rent**. Public JSON API — no login, no API key, no browser.

Ricacorp is one of Hong Kong's three largest estate agencies (alongside Centaline and Midland). No other Actor on Apify Store covers this site.

### Output fields

| Field | Type | Description |
|---|---|---|
| `post_no` | string | Ricacorp listing number, e.g. `CU88487564` |
| `deal_type` | string | `buy` or `rent` |
| `title` | string|null | Full property name, in the language you selected |
| `title_en` / `title_zh` | string|null | English / Traditional Chinese names (both always returned, for cross-referencing) |
| `address` | string|null | Street address |
| `region` | string|null | Sub-region, e.g. Ho Man Tin / Kings Park / Kowloon Tong |
| `region_en` / `region_zh` | string|null | Sub-region in English / Chinese |
| `district` | string|null | District, e.g. Tin Shui Wai |
| `estate` | string|null | **Estate**, e.g. Yau Yat Chuen Garden |
| `phase` | string|null | Phase, e.g. Yau Yat Chuen Garden Phase 2 (`null` if the estate has no phases) |
| `building` | string|null | Block / tower, e.g. Block B4 |
| `usage` | string|null | Property usage, e.g. private residential |
| `price_hkd` | number|null | Asking price, or monthly rent for rentals |
| `market_price_hkd` | number|null | **Same source as `price_hkd`.** Before the September 2026 rework the API exposed both `price` (asking) and `marketPrice`; only the latter survives, so these two outputs are now always equal. The field is kept so existing integrations do not break, but **do not subtract one from the other as an "above/below market" signal** — that delta is now always 0 |
| `saleable_area_sqft` / `saleable_area_sqm` | number|null | Saleable area (sq ft / m²) |
| `unit_price_per_sqft` / `unit_price_per_sqm` | number|null | Price per saleable sq ft / m² |
| `monthly_mortgage_hkd` | number|null | Ricacorp's estimated monthly mortgage payment |
| `room` | number|null | Bedroom count |
| `floor_zone` | string|null | Floor band, e.g. Medium Floor Zone |
| `flat` | string|null | Flat, e.g. Flat A7 |
| `total_floors` / `units_per_floor` | number|null | Total floors / units per floor |
| `total_units` / `estate_total_units` | number|null | Units in this block / in the whole estate |
| `occupation_date` | string|null | Occupation date (ISO 8601) |
| `school_net` | string|null | Primary school net |
| `tags` | string\[]|null | Listing tags |
| `view_count` | number|null | View count |
| `agent_name` / `agent_name_zh` | string|null | Agent name |
| `latitude` / `longitude` | number|null | Coordinates |
| `location_id` | string|null | Ricacorp location ID |
| `gross_area_sqft` / `gross_area_sqm` | number|null | Gross area (sq ft / sq m) |
| `gross_unit_price_per_sqft` / `gross_unit_price_per_sqm` | number|null | Gross unit price per sq ft / sq m |
| `efficiency_ratio_pct` | number|null | Efficiency ratio (%), saleable ÷ gross area |
| `hall_count` | number|null | Number of halls (`0` is a real answer, not a missing value) |
| `carpark_count` | number|null | Number of car park spaces. `0` is a real answer, not a missing value — measured across 440 sampled listings, about **4%** carry a parking space (private residential and village houses); the rest genuinely report `0` |
| `developer` | string|null | Developer (Chinese name only — the API provides no English one) |
| `direction` | string|null | Facing direction, e.g. 東北 (north-east) |
| `price_changes` | object\[]|null | **Asking-price change history**: `price_old_hkd`, `price_new_hkd`, `price_changed_hkd`, `price_changed_pct`, `changed_at` (ISO 8601). `null` for listings whose price never moved |
| `thumbnail_url` / `photo_urls` | string|string\[]|null | Thumbnail / all photos |
| `listing_url` | string|null | Ricacorp listing page |
| `posted_at` / `updated_at` | string|null | Posted / updated time (ISO 8601) |
| `scraped_at` | string | Scrape time (ISO 8601) |

> Field names are always English snake\_case. **Missing values are always `null` — fields are never omitted.**

> **⚠️ Fields that are always `null` since September 2026.** Ricacorp reworked their site in September 2026 and the property-listing API response shrank from 160 fields to 61. The following fields are **no longer provided upstream**. They are kept in the output so the shape stays stable, but they are always `null`:
>
> `address`, `region_en`, `region_zh`, `latitude`, `longitude`, `total_floors`, `units_per_floor`, `estate_total_units`, `view_count`, `posted_at`
>
> **Language note.** Ricacorp's API now requires a fixed request header that pins the response locale, so `region`, `floor_zone`, `usage` and `tags` come back in Traditional Chinese even from this English Actor — the upstream payload carries no English variant for them. `title`, `flat`, `district`, `estate`, `phase` and `building` **are** returned in English. `developer` is Chinese-only for the same reason.
>
> The same change brought the `gross_area_*` … `price_changes` fields listed above. `price_changes` is the useful one for price monitoring — about a third of listings carry a recorded price cut. Combined with `updated_at` (now sourced from the upstream `overallDateModified`) it supports "has anything in this estate been reduced recently" monitoring.

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | enum | `search` | Listings only for now |
| `dealType` | enum | `buy` | `buy` or `rent` |
| `regions` | string\[] | all | HK Island / Kowloon / NT East / NT West; empty = all four |
| `bulkRegions` | string | — | One per line, merged with the field above |
| `rooms` | integer | — | Exactly N bedrooms |
| `language` | enum | `en-hk` | `en-hk` or `zh-hk` |
| `maxItems` | integer | 50 | Max rows for this run, max 500 |
| `proxyConfiguration` | object | datacenter | Keep the default |

### Input examples

**1. 100 Kowloon listings for sale**

```json
{ "mode": "search", "dealType": "buy", "regions": ["Kowloon"], "maxItems": 100 }
```

**2. Hong Kong Island rentals**

```json
{ "mode": "search", "dealType": "rent", "regions": ["Hong Kong Island"], "maxItems": 50 }
```

**3. Three-bedroom listings across the New Territories, Chinese names**

```json
{ "mode": "search", "dealType": "buy", "regions": ["New Territories"], "rooms": 3, "language": "zh-hk", "maxItems": 200 }
```

**4. Every region, for sale**

```json
{ "mode": "search", "dealType": "buy", "maxItems": 500 }
```

**5. Paste regions in bulk**

```json
{ "mode": "search", "dealType": "buy", "bulkRegions": "Hong Kong Island\nKowloon", "maxItems": 100 }
```

### Notes

- **Ricacorp splits Hong Kong into four regions**, not the usual three — the New Territories are split into East and West. Entering just "New Territories" expands to both.
- **The only filters that work are region and bedroom count.** Ricacorp's public API silently ignores price-range, area-range and keyword filters, so this Actor does not send them — you are never misled into thinking a filter applied. To filter by price or estate, filter the output yourself.
- `maxItems` is the total across all regions, not per region.
- Some fields use `0` in the source data to mean "not provided" (unpriced listings, missing floor counts). This Actor normalises those to `null`, so you never see a "HK$0" property.
- If new listings appear while scraping, pages shift and rows can repeat. This Actor de-duplicates across the whole run, so each row is output — and charged — only once.
- The site occasionally returns a truncated JSON response; the Actor retries that page automatically and only reports a gap (clearly, in the log) if the retries are exhausted.
- Public data only. No login, no authentication bypass.

### Pricing

A single event, `search-listing`, at **$0.002 per row output**. Only rows successfully written to the dataset are charged; duplicates and filtered-out rows are not.

### FAQ

**Q: Can I scrape a single estate?**
A: The API has no estate or keyword filter. Scrape the region and filter on the `estate` field — this Actor extracts the estate correctly from the location hierarchy, rather than mistaking the block name for it.

**Q: What's the difference between `estate`, `phase` and `building`?**
A: For "Yau Yat Chuen Garden Phase 2 Block B4": `estate` = Yau Yat Chuen Garden, `phase` = Yau Yat Chuen Garden Phase 2, `building` = Block B4. Estates without phases have `phase: null`.

**Q: Is `price_hkd` the monthly rent for rentals?**
A: Yes. With `dealType: rent`, `price_hkd` is the monthly rent and `unit_price_per_sqft` is rent per saleable square foot.

**Q: Can I merge this with Centaline or Midland data?**
A: Yes — that's a primary use case. All three output snake\_case fields, estate names and saleable area / price per sq ft, which suits agency-vs-agency inventory and pricing comparison. Estate naming differs slightly between sites, so fuzzy-match on district plus estate name.

**Q: I got fewer rows than `maxItems`.**
A: That filter combination is exhausted. Loosen the filters (drop `rooms`, say) or scrape another region.

**Q: Does it need a residential proxy?**
A: No. Ricacorp is datacenter-friendly, so the default Apify datacenter proxy is enough and costs very little.

### Disclaimer

This Actor is intended for lawful purposes only, such as personal research, academic analysis, market research and property trend studies. Please comply with Ricacorp Properties' (ricacorp.com) terms of service and applicable Hong Kong law. Do not scrape at excessive volume and do not resell raw data. The author accepts no liability for any damage arising from use of this tool.

***

Hong Kong property scraper Ricacorp scraper HK real estate data property listings for sale for rent saleable area price per square foot estate data Hong Kong estate agency property data export HK housing market research

***

### 📚 Related tutorials & tools

Hands-on guides and free tools built on this actor, at **[AI Social API](https://aisocialapi.com/?utm_source=apify\&utm_medium=readme\&utm_campaign=ricacorp-scraper-en)**:

- 📖 Tutorial: [Hong Kong's CCL Index is up 12% in 2026 — and Sha Tin First City still sold at a HK$1M loss](https://aisocialapi.com/learn/hk-ccl-index-granularity-gap/?utm_source=apify\&utm_medium=readme\&utm_campaign=ricacorp-scraper-en)
- 📊 Data: [Site coverage: modes, fields & pricing](https://aisocialapi.com/coverage/?utm_source=apify\&utm_medium=readme\&utm_campaign=ricacorp-scraper-en) — 40 sites, their modes, the exact output fields each returns, and per-item pricing — generated from the actors' own schemas
- 🛠 Free tools: [Hong Kong property lookup](https://aisocialapi.com/tools/hk-property/?utm_source=apify\&utm_medium=readme\&utm_campaign=ricacorp-scraper-en) · [Apify cost calculator](https://aisocialapi.com/tools/apify-cost/?utm_source=apify\&utm_medium=readme\&utm_campaign=ricacorp-scraper-en)
- 🤝 Rather not run it yourself? [I run it for you](https://aisocialapi.com/monitor/?utm_source=apify\&utm_medium=readme\&utm_campaign=ricacorp-scraper-en) — scheduled daily, delivered to your Google Sheet or Slack, from US$299/mo.

Maintained by an operator running 40+ live Apify actors.

# Actor input Schema

## `mode` (type: `string`):

Only the listings mode is available for now.

## `dealType` (type: `string`):

Scrape for-sale or for-rent listings.

## `regions` (type: `array`):

Which regions to scrape. Leave empty to cover all four. Accepts Hong Kong Island, Kowloon, New Territories East, New Territories West — entering just "New Territories" expands to both NT regions. Chinese names also work.

## `bulkRegions` (type: `string`):

Paste many at once: one region per line. Merged with the field above.

## `rooms` (type: `integer`):

Keep only properties with exactly N bedrooms. Leave empty for no filter.

## `language` (type: `string`):

Language for property, estate and district names. Field names are always English snake\_case.

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

Maximum rows to output for this run, across all regions combined. Default 50, max 500.

## `proxyConfiguration` (type: `object`):

Runs through the Apify datacenter proxy by default. Ricacorp is datacenter-friendly (measured: direct, datacenter and residential all return 200), so the more expensive residential proxy is not needed. Do not turn the proxy off entirely though — without one your run shares an egress IP with every other run on the platform, and that IP risks being rate-limited by the site.

## Actor input object example

```json
{
  "mode": "search",
  "dealType": "buy",
  "regions": [
    "Kowloon"
  ],
  "language": "en-hk",
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

# 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 = {
    "mode": "search",
    "dealType": "buy",
    "regions": [
        "Kowloon"
    ],
    "language": "en-hk",
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("claude_code_reviewer/ricacorp-scraper-en").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 = {
    "mode": "search",
    "dealType": "buy",
    "regions": ["Kowloon"],
    "language": "en-hk",
    "maxItems": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("claude_code_reviewer/ricacorp-scraper-en").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 '{
  "mode": "search",
  "dealType": "buy",
  "regions": [
    "Kowloon"
  ],
  "language": "en-hk",
  "maxItems": 50
}' |
apify call claude_code_reviewer/ricacorp-scraper-en --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,claude_code_reviewer/ricacorp-scraper-en"
        }
    }
}

```

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/2szAZ2P8afhdOFagC/builds/Er44gL3zOVIeMoacd/openapi.json
