# Realestate.com.kh Scraper — Cambodia Property Listings (`ocrad/realestate-kh-property-scraper`) Actor

Scrape realestate.com.kh, Cambodia's largest property portal, from any buy, rent, borey or new-development URL: price, type, beds, baths, areas, location, photos, agent and agency, plus description, features, amenities and coordinates. Export JSON/CSV/Excel.

- **URL**: https://apify.com/ocrad/realestate-kh-property-scraper.md
- **Developed by:** [Ocrad](https://apify.com/ocrad) (community)
- **Categories:** Real estate, Lead generation, Agents
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 records

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

### Realestate.com.kh Scraper

***

Cambodia Property Listings. Realestate.com.kh is Cambodia's largest property portal (about 9,000 listings for sale and 30,000 for rent, plus boreys and new developments). Give the actor any results page - `https://www.realestate.com.kh/buy/`, `/rent/`, a location and type such as `/buy/phnom-penh/condo/` or `/rent/bkk-1/apartment/`, or a `/boreys/` or `/new-developments/` page - and get structured records from the result cards: listing ID, headline, sale or rent, property type, area / district / city, bedrooms, bathrooms, floor and land area, floor level, facing, price and rent in USD, price per m², badges, photo count and cover photos, listing dates, and the agent and agency with their phone numbers. Turn on `detailedInfo` to also visit each listing page for the full description, property features, amenities, views, land title type, the agency's own reference, listing status, days listed, coordinates and every full-size photo.

Twenty listings per page; a search can run to 500 pages (10,000 listings) and the actor stops at the search's last page automatically.

***

#### **📋 Example Output**

Record from a run with `detailedInfo: true` on `https://www.realestate.com.kh/rent/phnom-penh/`. Without `detailedInfo` the detail-only fields (`daysListed`, `status`, `ribbonText`, `titleType`, `originalId`, `description`, `features`, `amenities`, `views`, `unitTypes`, `latitude`, `longitude`) are `null` and `images` holds the card photos only:

```json
{
  "id": "259178",
  "url": "https://www.realestate.com.kh/new-developments/time-square-306/2-bed-2-bath-condo-259178/",
  "title": "🌆 Modern 2-Bedroom Condo – BKK1 | Phnom Penh City | 26th Floor",
  "listingType": "rent",
  "isProject": false,
  "projectName": "Time Square 306",
  "propertyType": "Condo",
  "address": "BKK 1, Boeng Keng Kang, Phnom Penh",
  "area": "BKK 1",
  "district": "Boeng Keng Kang",
  "city": "Phnom Penh",
  "bedrooms": 2,
  "bathrooms": 2,
  "floorAreaSqm": 60,
  "landAreaSqm": 80,
  "floorLevel": "26",
  "facing": null,
  "price": null,
  "priceText": "POA",
  "rent": 1100,
  "rentText": "$1,100/mo",
  "currency": "USD",
  "pricePerSqmText": null,
  "isFeatured": true,
  "labels": [
    "Featured"
  ],
  "highlights": [
    "High Return Yield",
    "Brand Developer",
    "High Appreciation Value"
  ],
  "hasVideo": false,
  "hasVirtualTour": false,
  "imagesCount": 18,
  "images": [
    "https://images.realestate.com.kh/listings/original/2026-02/photo_2026-02-13_16-19-02.jpeg",
    "https://images.realestate.com.kh/listings/original/2026-02/photo_2026-02-03_15-53-01.jpeg",
    "… 18 photos in total"
  ],
  "createdAt": "2026-02-13",
  "modifiedAt": "2026-09-03",
  "listedDate": "8 months, 2 weeks ago",
  "daysListed": 259,
  "status": "current",
  "ribbonText": "Ready to Move In",
  "titleType": null,
  "originalId": "Allie-REAKH",
  "description": "📐 Unit Size: 80 sqm (Gross) | 60 sqm (Net) 🏢 Floor: 26th 🛏 Bedrooms: 2 🛁 Bathrooms: 2 📍 Location: BKK1, Phnom Penh ✨ Building Facilities: 🏊 Swimming Pool 💪 Gym / Fitness Center 🛗 Elevator Access 🚗 Par …",
  "features": [
    "Air Conditioning",
    "Balcony",
    "Fully Furnished",
    "Internet / Wifi"
  ],
  "amenities": [
    "Car Parking",
    "Commercial area",
    "Gym/Fitness Center",
    "Lift / Elevator",
    "Non-Flooding",
    "Swimming Pool"
  ],
  "views": [
    "City Views"
  ],
  "unitTypes": [
    "One Bedroom | 43 sqm | $93,000 |",
    "Two Bedroom | 80 sqm | $145,000 |"
  ],
  "latitude": 11.548195684654814,
  "longitude": 104.9241527755022,
  "agentName": "Megakim World Corp Ltd",
  "agentPhone": "+855 92 921 000",
  "agencyName": "Allie-REAKH",
  "agencyPhone": "+855 11 987 879",
  "agencyUrl": "https://www.realestate.com.kh/offices/allie-reakh-alliesanrealestatecomkh-2-7420/",
  "scrapedAt": "2026-10-30T20:29:36.181Z"
}
```

`listingType` is `sale`, `rent`, `sale-or-rent` (both prices published) or `project` for borey / development pages, which are kept as basic records even in detailed mode. Prices are in USD as published; `POA` (price on application) gives `null` numbers with the text kept in `priceText` / `rentText`. `projectName` is filled for units inside a borey or new development.

#### ⚙️ **Configuration**

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `url` | String | *(required)* | Any realestate.com.kh results page: `https://www.realestate.com.kh/buy/`, `/rent/`, narrowed by location and type (`/buy/phnom-penh/condo/`, `/rent/bkk-1/apartment/`, `/buy/siem-reap/land/`), or a `/boreys/` or `/new-developments/` page. Query-string filters (price, bedrooms, sort) are kept. |
| `maxPages` | Integer | `1` | Result pages to scrape, 20 listings each, up to 500. The run stops at the search's last page. |
| `detailedInfo` | Boolean | `false` | Visit each listing page for description, features, amenities, views, title type, reference, status, coordinates, days listed and all full-size photos. One extra request per listing. |
| `proxyConfiguration` | Object | Apify Proxy (auto) | Proxy settings; switch to RESIDENTIAL only if results are empty. |

##### Example Input

```json
{
  "url": "https://www.realestate.com.kh/buy/phnom-penh/condo/",
  "maxPages": 5,
  "detailedInfo": true
}
```

##### Getting your start URL

1. Open realestate.com.kh and choose Buy, Rent, Boreys or New Developments
2. Pick a location and property type and apply any filters (price, bedrooms, sort order)
3. Copy the full URL from your browser address bar and paste it as the `url` input

***

#### 💬 **Support and Feedback**

Reach out via Apify support channels or leave feedback on the Actor's page.

#### **Is it legal to scrape realestate.com.kh data?**

It is legal to scrape publicly available data such as listing titles, prices, locations, sizes and descriptions. Results contain personal data (agent names and phone numbers published on the listings); scrape personal data only with a legitimate reason and in line with the GDPR and other regulations - consult your legal advisor if unsure.

# Actor input Schema

## `url` (type: `string`):

Any realestate.com.kh results page: https://www.realestate.com.kh/buy/ or /rent/, narrowed by location and type such as https://www.realestate.com.kh/buy/phnom-penh/condo/ or /rent/bkk-1/apartment/, or a /boreys/ or /new-developments/ page. Filters in the query string (price, bedrooms, sort) are kept.

## `maxPages` (type: `integer`):

Result pages to scrape, 20 listings each (?page=N). The run stops at the search's last page; the site serves at most 500 pages per search.

## `detailedInfo` (type: `boolean`):

Visit each listing page for the full description, property features, amenities, views, title type, original reference, listing status, coordinates, all full-size photos and days listed. One extra request per listing; project pages are kept as basic records.

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

Proxy settings. Defaults to Apify Proxy (auto). Switch to a RESIDENTIAL group if you see blocks or empty results.

## Actor input object example

```json
{
  "url": "https://www.realestate.com.kh/buy/",
  "maxPages": 1,
  "detailedInfo": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `id` (type: `string`):

Listing ID

## `url` (type: `string`):

Listing page URL

## `title` (type: `string`):

Listing headline

## `listingType` (type: `string`):

sale, rent, sale-or-rent or project

## `isProject` (type: `string`):

true for project / borey pages rather than single listings

## `projectName` (type: `string`):

Project / borey name for units inside a development

## `propertyType` (type: `string`):

Property type (Condo, Villa, Land, Shophouse …)

## `address` (type: `string`):

Address as shown: area, district, city

## `area` (type: `string`):

Area / commune

## `district` (type: `string`):

District

## `city` (type: `string`):

City / province

## `bedrooms` (type: `string`):

Bedrooms

## `bathrooms` (type: `string`):

Bathrooms

## `floorAreaSqm` (type: `string`):

Floor area in square metres

## `landAreaSqm` (type: `string`):

Land area in square metres

## `floorLevel` (type: `string`):

Floor level

## `facing` (type: `string`):

Facing direction

## `price` (type: `string`):

Sale price as a number

## `priceText` (type: `string`):

Sale price as displayed (POA when hidden)

## `rent` (type: `string`):

Monthly rent as a number

## `rentText` (type: `string`):

Rent as displayed

## `currency` (type: `string`):

Currency code, USD

## `pricePerSqmText` (type: `string`):

Price per square metre as displayed

## `isFeatured` (type: `string`):

Featured (paid) listing

## `labels` (type: `string`):

Listing labels

## `highlights` (type: `string`):

Project highlights

## `hasVideo` (type: `string`):

Has video

## `hasVirtualTour` (type: `string`):

Has virtual tour

## `imagesCount` (type: `string`):

Number of photos

## `images` (type: `string`):

Photo URLs

## `createdAt` (type: `string`):

Created date

## `modifiedAt` (type: `string`):

Last modified date

## `listedDate` (type: `string`):

Listed, relative text

## `daysListed` (type: `string`):

Days since listing (detail pages)

## `status` (type: `string`):

Listing status (detail pages)

## `ribbonText` (type: `string`):

Ribbon such as Urgent Sale (detail pages)

## `titleType` (type: `string`):

Land title type, e.g. Hard Title (detail pages)

## `originalId` (type: `string`):

Agency's own reference (detail pages)

## `description` (type: `string`):

Full description (detail pages)

## `features` (type: `string`):

Property features (detail pages)

## `amenities` (type: `string`):

Amenities (detail pages)

## `views` (type: `string`):

Views (detail pages)

## `unitTypes` (type: `string`):

Project unit types summary (detail pages)

## `latitude` (type: `string`):

Latitude (detail pages)

## `longitude` (type: `string`):

Longitude (detail pages)

## `agentName` (type: `string`):

Agent name

## `agentPhone` (type: `string`):

Agent phone

## `agencyName` (type: `string`):

Agency name

## `agencyPhone` (type: `string`):

Agency phone

## `agencyUrl` (type: `string`):

Agency profile URL

## `scrapedAt` (type: `string`):

Scrape timestamp (ISO 8601)

# 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 = {
    "url": "https://www.realestate.com.kh/buy/",
    "maxPages": 1,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("ocrad/realestate-kh-property-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 = {
    "url": "https://www.realestate.com.kh/buy/",
    "maxPages": 1,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("ocrad/realestate-kh-property-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 '{
  "url": "https://www.realestate.com.kh/buy/",
  "maxPages": 1,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call ocrad/realestate-kh-property-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,ocrad/realestate-kh-property-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/4G0v5aO7SgoRvosSS/builds/IcpIJ40r1WsRCsBcp/openapi.json
