# Cambodia Property Scraper (`mai_amm/cambodia-property-scraper`) Actor

Scrape public Cambodia property listings from Realestate.com.kh and Khmer24 Property with prices, locations, agent contacts, images, and normalized lead fields.

- **URL**: https://apify.com/mai\_amm/cambodia-property-scraper.md
- **Developed by:** [wiseld\_squid](https://apify.com/mai_amm) (community)
- **Categories:** Real estate, Travel, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

## Cambodia Property Scraper

Scrapes public Cambodia property listings from:

- Realestate.com.kh
- Khmer24 Property

The Actor saves one dataset item per listing. If the Actor is monetized with the Apify default dataset item event, every saved listing can be charged as one result.

### Input

- `sources`: `realestate`, `khmer24`
- `transactionType`: `sale`, `rent`, `all`
- `propertyType`: `condo`, `house`, `land`, `commercial`, `all`
- `locations`: location slugs such as `phnom-penh`, `siem-reap`, `sihanoukville`
- `maxItems`: maximum saved listings
- `includeDetails`: open detail pages for more fields
- `includeContacts`: extract public phone and email fields
- `browserRendering`: render pages in Chrome before parsing
- `revealContacts`: try public show-phone/contact buttons before extracting contacts
- `includeImages`: extract listing images

### Output

Each saved listing can include:

- source and URL
- title
- transaction type and property type
- price and currency
- location and address
- bedroom, bathroom, and area fields
- agent/contact fields
- image URLs
- duplicate key and data quality score

### Notes

Public marketplace HTML can change. For larger runs, use Apify Proxy and keep concurrency moderate.

# Actor input Schema

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

Use recommended Cambodia marketplace searches, or crawl only URLs you provide.
## `sources` (type: `array`):

Cambodia property marketplaces to crawl in auto mode.
## `transactionType` (type: `string`):

Sale, rent, or both.
## `propertyType` (type: `string`):

The primary property type to crawl.
## `locations` (type: `array`):

Location slugs or names to search. Examples: phnom-penh, siem-reap, sihanoukville, battambang, kampot.
## `startUrls` (type: `array`):

Optional listing or detail URLs. Use this when you want to crawl a specific search page instead of the recommended auto search.
## `maxItems` (type: `integer`):

Maximum property listing records to save.
## `maxPagesPerSource` (type: `integer`):

Maximum listing pages to crawl per source/start URL. Use 0 to continue until max items or no next page.
## `includeDetails` (type: `boolean`):

Open listing detail pages to enrich records with description, images, public contacts, and agency fields.
## `includeContacts` (type: `boolean`):

Extract public phone and email fields when found in page text or embedded data.
## `browserRendering` (type: `boolean`):

Render pages in a browser before parsing. Slower, but improves JavaScript-rendered listings and details.
## `revealContacts` (type: `boolean`):

When browser rendering is enabled, try to click public contact/show-phone buttons before extracting phone and email fields.
## `includeImages` (type: `boolean`):

Include public listing images found in cards, meta tags, and embedded page data.
## `deduplicate` (type: `boolean`):

Skip duplicate listing URLs during the same run and generate duplicate keys for downstream matching.
## `maxConcurrency` (type: `integer`):

Concurrent HTTP requests. Keep low for public marketplace pages.
## `requestDelayMs` (type: `integer`):

Polite delay before each request.
## `proxyConfiguration` (type: `object`):

Apify proxy configuration. Start without proxy for these sources; enable Apify Proxy or residential proxy only if your run is blocked.

## Actor input object example

```json
{
  "mode": "auto",
  "sources": [
    "realestate",
    "khmer24"
  ],
  "transactionType": "all",
  "propertyType": "all",
  "locations": [
    "phnom-penh"
  ],
  "startUrls": [
    {
      "url": "https://www.realestate.com.kh/buy/"
    },
    {
      "url": "https://www.realestate.com.kh/rent/"
    },
    {
      "url": "https://www.khmer24.com/en/property.html"
    },
    {
      "url": "https://www.khmer24.com/en/c-house-for-sale"
    }
  ],
  "maxItems": 100,
  "maxPagesPerSource": 3,
  "includeDetails": true,
  "includeContacts": true,
  "browserRendering": true,
  "revealContacts": true,
  "includeImages": true,
  "deduplicate": true,
  "maxConcurrency": 4,
  "requestDelayMs": 300,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
````

# Actor output Schema

## `results` (type: `string`):

Main dataset with normalized property listings, prices, locations, contacts, and images.

## `leads` (type: `string`):

Dataset view focused on listings with public contact fields.

## `summary` (type: `string`):

Run-level summary with saved counts and source coverage.

## `runOutput` (type: `string`):

Compact machine-readable output object with dataset ID and summary.

# 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": "auto",
    "sources": [
        "realestate",
        "khmer24"
    ],
    "locations": [
        "phnom-penh"
    ],
    "startUrls": [
        {
            "url": "https://www.realestate.com.kh/buy/"
        },
        {
            "url": "https://www.realestate.com.kh/rent/"
        },
        {
            "url": "https://www.khmer24.com/en/property.html"
        },
        {
            "url": "https://www.khmer24.com/en/c-house-for-sale"
        }
    ],
    "maxItems": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("mai_amm/cambodia-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 = {
    "mode": "auto",
    "sources": [
        "realestate",
        "khmer24",
    ],
    "locations": ["phnom-penh"],
    "startUrls": [
        { "url": "https://www.realestate.com.kh/buy/" },
        { "url": "https://www.realestate.com.kh/rent/" },
        { "url": "https://www.khmer24.com/en/property.html" },
        { "url": "https://www.khmer24.com/en/c-house-for-sale" },
    ],
    "maxItems": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("mai_amm/cambodia-property-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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": "auto",
  "sources": [
    "realestate",
    "khmer24"
  ],
  "locations": [
    "phnom-penh"
  ],
  "startUrls": [
    {
      "url": "https://www.realestate.com.kh/buy/"
    },
    {
      "url": "https://www.realestate.com.kh/rent/"
    },
    {
      "url": "https://www.khmer24.com/en/property.html"
    },
    {
      "url": "https://www.khmer24.com/en/c-house-for-sale"
    }
  ],
  "maxItems": 100
}' |
apify call mai_amm/cambodia-property-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=mai_amm/cambodia-property-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Cambodia Property Scraper",
        "description": "Scrape public Cambodia property listings from Realestate.com.kh and Khmer24 Property with prices, locations, agent contacts, images, and normalized lead fields.",
        "version": "1.0",
        "x-build-id": "4TpMb3hXg998lGsEa"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/mai_amm~cambodia-property-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-mai_amm-cambodia-property-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/mai_amm~cambodia-property-scraper/runs": {
            "post": {
                "operationId": "runs-sync-mai_amm-cambodia-property-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/mai_amm~cambodia-property-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-mai_amm-cambodia-property-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "mode": {
                        "title": "Mode",
                        "enum": [
                            "auto",
                            "urls"
                        ],
                        "type": "string",
                        "description": "Use recommended Cambodia marketplace searches, or crawl only URLs you provide.",
                        "default": "auto"
                    },
                    "sources": {
                        "title": "Sources",
                        "type": "array",
                        "description": "Cambodia property marketplaces to crawl in auto mode.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "realestate",
                                "khmer24"
                            ],
                            "enumTitles": [
                                "Realestate.com.kh",
                                "Khmer24 Property"
                            ]
                        },
                        "default": [
                            "realestate",
                            "khmer24"
                        ]
                    },
                    "transactionType": {
                        "title": "Transaction type",
                        "enum": [
                            "sale",
                            "rent",
                            "all"
                        ],
                        "type": "string",
                        "description": "Sale, rent, or both.",
                        "default": "all"
                    },
                    "propertyType": {
                        "title": "Property type",
                        "enum": [
                            "condo",
                            "house",
                            "land",
                            "commercial",
                            "all"
                        ],
                        "type": "string",
                        "description": "The primary property type to crawl.",
                        "default": "all"
                    },
                    "locations": {
                        "title": "Locations",
                        "type": "array",
                        "description": "Location slugs or names to search. Examples: phnom-penh, siem-reap, sihanoukville, battambang, kampot.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "startUrls": {
                        "title": "Start URLs",
                        "type": "array",
                        "description": "Optional listing or detail URLs. Use this when you want to crawl a specific search page instead of the recommended auto search.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "maxItems": {
                        "title": "Max items",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum property listing records to save.",
                        "default": 100
                    },
                    "maxPagesPerSource": {
                        "title": "Max pages per source",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum listing pages to crawl per source/start URL. Use 0 to continue until max items or no next page.",
                        "default": 3
                    },
                    "includeDetails": {
                        "title": "Include detail pages",
                        "type": "boolean",
                        "description": "Open listing detail pages to enrich records with description, images, public contacts, and agency fields.",
                        "default": true
                    },
                    "includeContacts": {
                        "title": "Include public contacts",
                        "type": "boolean",
                        "description": "Extract public phone and email fields when found in page text or embedded data.",
                        "default": true
                    },
                    "browserRendering": {
                        "title": "Browser rendering",
                        "type": "boolean",
                        "description": "Render pages in a browser before parsing. Slower, but improves JavaScript-rendered listings and details.",
                        "default": true
                    },
                    "revealContacts": {
                        "title": "Reveal contacts",
                        "type": "boolean",
                        "description": "When browser rendering is enabled, try to click public contact/show-phone buttons before extracting phone and email fields.",
                        "default": true
                    },
                    "includeImages": {
                        "title": "Include images",
                        "type": "boolean",
                        "description": "Include public listing images found in cards, meta tags, and embedded page data.",
                        "default": true
                    },
                    "deduplicate": {
                        "title": "Deduplicate",
                        "type": "boolean",
                        "description": "Skip duplicate listing URLs during the same run and generate duplicate keys for downstream matching.",
                        "default": true
                    },
                    "maxConcurrency": {
                        "title": "Max concurrency",
                        "minimum": 1,
                        "maximum": 20,
                        "type": "integer",
                        "description": "Concurrent HTTP requests. Keep low for public marketplace pages.",
                        "default": 4
                    },
                    "requestDelayMs": {
                        "title": "Request delay milliseconds",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Polite delay before each request.",
                        "default": 300
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Apify proxy configuration. Start without proxy for these sources; enable Apify Proxy or residential proxy only if your run is blocked.",
                        "default": {
                            "useApifyProxy": false
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
