# Dot Property Scraper | TH PH MY VN Listings (`lentic_clockss/dot-property-th-scraper`) Actor

Scrape Dot Property Thailand, Philippines, Malaysia & Vietnam — condos, houses, land, offices for sale or rent. Extract prices, beds, area, features & images. Dot Property API alternative.

- **URL**: https://apify.com/lentic\_clockss/dot-property-th-scraper.md
- **Developed by:** [kane liu](https://apify.com/lentic_clockss) (community)
- **Categories:** Real estate, Lead generation, Automation
- **Stats:** 1 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.50 / 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/docs.md):

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

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.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/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

## Dot Property Scraper — Thailand, Philippines, Malaysia & Vietnam

**Scrape Dot Property sale and rent listings across Southeast Asia — then download structured real estate data as Excel, CSV, or JSON.**

This Actor is a practical **Dot Property API alternative** for market research, investor screening, rental comps, and lead lists. Choose a market (`TH` / `PH` / `MY` / `VN`), pick property types (condos, houses, land, offices, and more), or paste Dot Property search/listing URLs — and get listing rows with prices, beds, baths, area, features, images, and canonical URLs.

- Pull **homes for sale** and **properties for rent** from [Dot Property Thailand](https://www.dotproperty.co.th), [Philippines](https://www.dotproperty.com.ph), [Malaysia](https://www.dotproperty.com.my), and [Vietnam](https://www.dotproperty.com.vn)
- Cover **residential + commercial** categories (condos, houses, villas, land, offices, shophouse, warehouses, hotels, retail)
- Enrich search cards with **detail-page fields** when `scrapeDetails` is on
- Export to **Excel / CSV / JSON**, or connect Make, n8n, Zapier, Python, or MCP
- **Pay per event** — Actor start + each Dataset listing; no subscription

---

### What does the Dot Property Scraper do?

It turns a Dot Property city or category search into a clean Apify Dataset of property listings.

Under the hood, the Actor:

1. Builds Dot Property search URLs for your market, channel (`BUY` / `RENT`), location, and category — or uses your `startUrls`
2. Collects listing cards from the search results page (Next.js **RSC Flight** on Thailand; **DOM** cards on PH / MY / VN)
3. Optionally opens detail pages to enrich each row with description, features, and gallery images
4. Writes normalized records you can download or push into automations

Residential proxy is required (prefilled by market country). Fetching uses **curl_cffi** TLS impersonation — no full browser needed for these hosts.

---

### What data can you extract from Dot Property?

| Data point | Thailand (TH) | PH / MY / VN |
| --- | :---: | :---: |
| Listing ID & URL | ✅ | ✅ |
| Title / project | ✅ | ✅ |
| List price or rent | ✅ | ✅ |
| Currency (`THB` / `PHP` / `MYR` / `VND`) | ✅ | ✅ |
| Beds / baths / indoor area | ✅ | ✅ when shown |
| Property type & category | ✅ | ✅ |
| Location / address | ✅ | ✅ |
| GPS coordinates | ✅ (RSC) | — |
| Features & amenities | ✅ with details | ✅ with details |
| Photo gallery | ✅ | ✅ |
| Channel (`BUY` / `RENT`) | ✅ | ✅ |

Every Dataset row also includes `scrapedAt` and `source` = `dotproperty`. A `RUN_SUMMARY` / `OUTPUT` record in the key-value store reports counts and warnings.

---

### What you can do with it

#### 1. Scrape Bangkok condos for sale

Set `market` to `TH`, `channel` to `BUY`, `propertyType` to `condos`, and `location` to `bangkok`. Get structured rows with price, beds, area, project name, and a direct listing URL — ready for comps or investor shortlists.

#### 2. Scrape Metro Manila houses for rent

Set `market` to `PH`, `channel` to `RENT`, `propertyType` to `houses`, and `location` to `metro-manila`. Rows include rent amount, property type, and detail enrichment when `scrapeDetails` is enabled.

#### 3. Cover Malaysia and Vietnam markets

Use `market: "MY"` with `kuala-lumpur`, or `market: "VN"` with an empty location for national search. Match residential proxy country to `MY` or `VN`.

#### 4. Scrape offices and commercial inventory

Set `propertyType` to `offices`, `commercial-property`, `shophouse`, `warehouses`, `hotels`, or `retail-spaces` across active markets.

#### 5. Enrich known Dot Property listing URLs

Paste search or detail URLs into **Start URLs** to drive the run from specific pages instead of building the query from market/location fields.

#### 6. Feed real estate data into automations

Schedule the Actor and send the Dataset to Sheets, Slack, CRM, Make, n8n, Zapier, or an AI agent via Apify MCP / API.

---

### How to scrape Dot Property (no code required)

1. Click **Try for free**
2. Choose a **market** (`TH` / `PH` / `MY` / `VN`)
3. Set **channel** to For sale (`BUY`) or For rent (`RENT`)
4. Pick a **property type** (or paste **Start URLs**)
5. Optionally set location slug, max listings, and detail enrichment
6. Keep **Apify RESIDENTIAL** proxy enabled (country matched to market)
7. Click **Start** — open the **Dataset** tab when the run finishes

Start with `maxItems: 5–10` to verify the market, then scale up.

<details>
<summary>For developers: minimal input</summary>

```json
{
  "market": "TH",
  "location": "bangkok",
  "channel": "BUY",
  "propertyType": "condos",
  "maxItems": 10,
  "maxPages": 1,
  "scrapeDetails": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"],
    "apifyProxyCountry": "TH"
  }
}
````

</details>

#### Markets covered

| Code | Site | Parse | Typical proxy |
| --- | --- | --- | --- |
| `TH` | [dotproperty.co.th](https://www.dotproperty.co.th) | Next.js RSC Flight | RESIDENTIAL + TH |
| `PH` | [dotproperty.com.ph](https://www.dotproperty.com.ph) | DOM listing cards | RESIDENTIAL + PH |
| `MY` | [dotproperty.com.my](https://www.dotproperty.com.my) | DOM listing cards | RESIDENTIAL + MY |
| `VN` | [dotproperty.com.vn](https://www.dotproperty.com.vn) | DOM listing cards | RESIDENTIAL + VN |

Not scraped this release (suspended / blocked / unresolved): Singapore, Hong Kong, Laos, Indonesia, Cambodia, Myanmar country hosts.

#### Property categories

| Category slug | Sale | Rent |
| --- | :---: | :---: |
| `properties` (all types) | ✅ | ✅ |
| `condos` | ✅ | ✅ |
| `houses` | ✅ | ✅ |
| `apartments` | ✅ | ✅ |
| `townhouses` | ✅ | ✅ |
| `villas` | ✅ | ✅ |
| `land` | ✅ | — |
| `serviced-apartments` | — | ✅ |
| `commercial-property` | ✅ | ✅ |
| `offices` | ✅ | ✅ |
| `shophouse` | ✅ | ✅ |
| `warehouses` | ✅ | ✅ |
| `hotels` | ✅ | ✅ |
| `retail-spaces` | ✅ | ✅ |

- `propertyType` — single category
- `propertyTypes` — multi-select; overrides `propertyType` when non-empty
- `all` expands primary categories available for the selected channel

#### Supported URL patterns

- Thailand SRP: `/en/{category}-for-{sale|rent}/{location}` e.g. `/en/condos-for-sale/bangkok`
- Thailand LDP: `/en/ads/<slug>_<uuid>`
- PH / MY / VN SRP: `/{category}-for-{sale|rent}/{location?}`
- PH / MY / VN LDP: `/ads/<slug>_<id>` or `/<slug>_<numericId>`
- Pagination: `?page=2` on all markets

***

### Pricing — how much does it cost to scrape Dot Property?

**Pay per event. No subscription.**

| Event | Price | When charged |
| --- | ---: | --- |
| `apify-actor-start` | **$0.005** | When a normal run starts (scaled by allocated memory GB) |
| `apify-default-dataset-item` (`result`) | **$2.50 / 1,000** ($0.0025 each) | Each listing written to the default Dataset |

**User pays platform usage costs: Yes** — compute, residential proxy, and other platform usage are billed to the user in addition to event charges.

**Example product charges (events only):**

| Scenario | Approx. event charge |
| --- | ---: |
| Canary: 10 listings | $0.005 + 10 × $0.0025 = **$0.030** |
| City scan: 100 listings | $0.005 + $0.25 = **$0.255** |
| 1,000 listings | $0.005 + $2.50 = **$2.505** |

Platform usage (especially residential proxy) is separate and depends on run duration and memory.

You are only charged **result** events for rows successfully written to the Dataset. Failed runs that emit zero listings do not incur result charges (Actor Start may still apply).

**Standby / Live View:** readiness endpoints do not scrape Dot Property. Keeping Standby enabled may incur platform compute while the standby container is warm — separate from PPE event charges.

***

### Input

| Field | Description |
| --- | --- |
| `startUrls` | Dot Property TH / PH / MY / VN search or listing URLs |
| `market` / `markets` | `TH`, `PH`, `MY`, `VN`, or `all` |
| `location` | Place slug (optional; market default when empty) |
| `channel` | `BUY` or `RENT` |
| `propertyType` / `propertyTypes` | Category or multi-select (`all` expands primary cats) |
| `maxItems` / `maxPages` | Caps (fair-shared across markets/categories) |
| `scrapeDetails` | Enrich each card from the listing detail page |
| `useBrowserFallback` | On CF blocks, retry with enhanced HTTP (+ Camoufox if installed) |
| `locale` | TH path prefix `en` / `th` (optional) |
| `requestDelayMillis` | Delay between HTTP requests |
| `proxyConfiguration` | Apify RESIDENTIAL recommended; country matched to market |

Open the **Input** tab in Console for the full form and tooltips.

***

### Output example

You can download the Dataset as **JSON, CSV, Excel, or HTML**.

```json
{
  "id": 5782686,
  "uuid": "173a55538680-4930-8382-0b50-88be0089",
  "url": "https://www.dotproperty.co.th/en/ads/1-bedroom-condo-for-sale-in-modiz-sukhumvit-50-phra-khanong-bangkok_173a55538680-4930-8382-0b50-88be0089",
  "source": "dotproperty",
  "market": "TH",
  "category": "condos",
  "channel": "BUY",
  "title": "1 Bedroom Condo for sale at Modiz Sukhumvit 50",
  "price": "฿2,700,000",
  "priceAmount": 2700000,
  "currency": "THB",
  "numBedrooms": "1",
  "propertyType": "Condo",
  "indoorArea": "24 SqM",
  "sourceLayer": "rsc_srp+ldp",
  "scrapedAt": "2026-07-19T00:29:20.000000+00:00"
}
```

Core fields include `id`, `url`, `market`, `channel`, `category`, `title`, `price` / `priceAmount` / `currency`, size and rooms when shown, plus detail extras such as features, description, and image galleries when `scrapeDetails` is on.

***

### Live View endpoints

When Standby / Live View is enabled, the Actor exposes a small OpenAPI surface for readiness and discovery:

| Endpoint | Purpose |
| --- | --- |
| `GET /` | Readiness / service info |
| `GET /health` | Health check |
| `GET /input-example` | Low-cost example input |
| `GET /openapi.json` | Deployed OpenAPI document |

Scraping still runs through a **normal Actor run** — Live View does not scrape Dot Property by itself.

***

### Connect from code

Actor ID: `lentic_clockss/dot-property-th-scraper`

```python
from apify_client import ApifyClient

client = ApifyClient("<APIFY_TOKEN>")
run = client.actor("lentic_clockss/dot-property-th-scraper").call(
    run_input={
        "market": "TH",
        "location": "bangkok",
        "channel": "BUY",
        "propertyType": "condos",
        "maxItems": 10,
        "proxyConfiguration": {
            "useApifyProxy": True,
            "apifyProxyGroups": ["RESIDENTIAL"],
            "apifyProxyCountry": "TH",
        },
    }
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item.get("title"), item.get("priceAmount"), item.get("url"))
```

Use the same Actor ID in Make, n8n, Zapier, or Apify MCP for AI-agent workflows.

***

### FAQ

#### Is there a free Dot Property API?

Dot Property does not offer a simple public listing API for bulk export. This Actor gives you structured sale and rent data through Apify runs, Dataset exports, and integrations.

#### Can I scrape multiple Southeast Asia markets?

Yes. Set `market` to `all`, or pass `markets: ["TH", "PH", "MY", "VN"]`. Caps are fair-shared across markets and categories.

#### How do I scrape Dot Property Thailand condos for sale?

Set `market` to `TH`, `channel` to `BUY`, `propertyType` to `condos`, and `location` to `bangkok` (or another Thai city slug). Keep **RESIDENTIAL + TH** proxy enabled.

#### How do I scrape Philippines, Malaysia, or Vietnam?

Use `PH` + `metro-manila`, `MY` + `kuala-lumpur`, or `VN` with empty location for national search. Match `apifyProxyCountry` to the market.

#### Why is a residential proxy required?

Dot Property sits behind Cloudflare. Apify RESIDENTIAL with a country matched to the market is required for reliable runs. For multi-market runs, **omit** `apifyProxyCountry` so each market gets its own exit (TH/PH/MY/VN).

#### What is the Actor ID / slug?

The Apify Actor name remains `lentic_clockss/dot-property-th-scraper` for continuity (original Thailand release). The product scrapes **TH / PH / MY / VN**.

#### Can I schedule daily Dot Property scrapes?

Yes. Create an Apify schedule with the same input and send the Dataset to Sheets, Slack, a CRM, or your pipeline.

#### Is it legal to scrape Dot Property?

Use this Actor for legitimate research and analysis only. Respect Dot Property terms of use and applicable law in Thailand, Philippines, Malaysia, Vietnam, and your jurisdiction. Results may include publicly displayed listing information; do not use personal data without a lawful basis. Favorite / enquiry / phone controls are **not clicked**.

***

### Related Actors

- [Realtor.com Scraper](https://apify.com/lentic_clockss/realtor-com-scraper) — US homes for sale & rent
- [99.co Scraper](https://apify.com/lentic_clockss/ninetynine-co-sg-scraper) — Singapore / Indonesia property listings
- [PropertyGuru Scraper](https://apify.com/lentic_clockss/propertyguru-sg-scraper) — Singapore / Malaysia real estate
- [Daft.ie Scraper](https://apify.com/lentic_clockss/daft-property-scraper) — Ireland sale & rent listings

Browse all Actors: [apify.com/lentic\_clockss](https://apify.com/lentic_clockss)

# Actor input Schema

## `startUrls` (type: `array`):

Dot Property search (SRP) or listing detail (LDP) URLs for TH/PH/MY/VN. Search URLs override market/location/category when provided.

## `market` (type: `string`):

Primary country market. Use all for TH+PH+MY+VN. Ignored when markets is set.

## `markets` (type: `array`):

Optional multi-select of markets. Overrides market when non-empty.

## `location` (type: `string`):

Place slug (bangkok, metro-manila, kuala-lumpur). Leave empty to use each market default (VN defaults to national).

## `channel` (type: `string`):

BUY (for sale) or RENT (for rent).

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

Single category. Use all to expand primary residential + commercial types for the channel.

## `propertyTypes` (type: `array`):

Optional multi-select categories. Overrides propertyType when non-empty. all expands primary types.

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

Maximum property records to save (fair-split across markets/categories).

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

Maximum SRP pages per search URL (~25–30 listings per page).

## `scrapeDetails` (type: `boolean`):

Fetch each listing LDP (RSC unitDetail on TH; DOM on PH/MY/VN).

## `useBrowserFallback` (type: `boolean`):

On Cloudflare blocks, retry with enhanced HTTP and Camoufox if installed. Default off (curl\_cffi only).

## `locale` (type: `string`):

Optional URL locale (mainly TH: en/th). Leave empty for market default.

## `requestDelayMillis` (type: `integer`):

Politeness delay between HTTP requests.

## `maxConcurrency` (type: `integer`):

Max concurrent HTTP fetches for detail pages.

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

Apify Proxy recommended on cloud. Leave apifyProxyCountry empty so each market (TH/PH/MY/VN) uses its own residential exit. Setting a fixed country applies to all markets in the run.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.dotproperty.co.th/en/condos-for-sale/bangkok"
    }
  ],
  "market": "TH",
  "markets": [],
  "location": "bangkok",
  "channel": "BUY",
  "propertyType": "properties",
  "propertyTypes": [],
  "maxItems": 25,
  "maxPages": 1,
  "scrapeDetails": true,
  "useBrowserFallback": false,
  "locale": "",
  "requestDelayMillis": 800,
  "maxConcurrency": 2,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `listings` (type: `string`):

Normalized Dot Property listing records from SRP and optional LDP enrichment.

## `runSummary` (type: `string`):

Counts, engine, markets, and timestamps for the run.

# 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 = {
    "startUrls": [
        {
            "url": "https://www.dotproperty.co.th/en/condos-for-sale/bangkok"
        }
    ],
    "location": "bangkok"
};

// Run the Actor and wait for it to finish
const run = await client.actor("lentic_clockss/dot-property-th-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 = {
    "startUrls": [{ "url": "https://www.dotproperty.co.th/en/condos-for-sale/bangkok" }],
    "location": "bangkok",
}

# Run the Actor and wait for it to finish
run = client.actor("lentic_clockss/dot-property-th-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 '{
  "startUrls": [
    {
      "url": "https://www.dotproperty.co.th/en/condos-for-sale/bangkok"
    }
  ],
  "location": "bangkok"
}' |
apify call lentic_clockss/dot-property-th-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Dot Property Scraper | TH PH MY VN Listings",
        "description": "Scrape Dot Property Thailand, Philippines, Malaysia & Vietnam — condos, houses, land, offices for sale or rent. Extract prices, beds, area, features & images. Dot Property API alternative.",
        "version": "0.3",
        "x-build-id": "iZLP6szSElV16Z0B6"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/lentic_clockss~dot-property-th-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-lentic_clockss-dot-property-th-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/lentic_clockss~dot-property-th-scraper/runs": {
            "post": {
                "operationId": "runs-sync-lentic_clockss-dot-property-th-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/lentic_clockss~dot-property-th-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-lentic_clockss-dot-property-th-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": {
                    "startUrls": {
                        "title": "Start URLs",
                        "type": "array",
                        "description": "Dot Property search (SRP) or listing detail (LDP) URLs for TH/PH/MY/VN. Search URLs override market/location/category when provided.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "market": {
                        "title": "Market",
                        "enum": [
                            "TH",
                            "PH",
                            "MY",
                            "VN",
                            "all"
                        ],
                        "type": "string",
                        "description": "Primary country market. Use all for TH+PH+MY+VN. Ignored when markets is set.",
                        "default": "TH"
                    },
                    "markets": {
                        "title": "Markets",
                        "type": "array",
                        "description": "Optional multi-select of markets. Overrides market when non-empty.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "TH",
                                "PH",
                                "MY",
                                "VN"
                            ]
                        },
                        "default": []
                    },
                    "location": {
                        "title": "Location slug",
                        "type": "string",
                        "description": "Place slug (bangkok, metro-manila, kuala-lumpur). Leave empty to use each market default (VN defaults to national).",
                        "default": ""
                    },
                    "channel": {
                        "title": "Channel",
                        "enum": [
                            "BUY",
                            "RENT"
                        ],
                        "type": "string",
                        "description": "BUY (for sale) or RENT (for rent).",
                        "default": "BUY"
                    },
                    "propertyType": {
                        "title": "Property type",
                        "enum": [
                            "properties",
                            "all",
                            "condos",
                            "houses",
                            "apartments",
                            "townhouses",
                            "villas",
                            "land",
                            "serviced-apartments",
                            "commercial-property",
                            "offices",
                            "shophouse",
                            "warehouses",
                            "hotels",
                            "retail-spaces"
                        ],
                        "type": "string",
                        "description": "Single category. Use all to expand primary residential + commercial types for the channel.",
                        "default": "properties"
                    },
                    "propertyTypes": {
                        "title": "Property types",
                        "type": "array",
                        "description": "Optional multi-select categories. Overrides propertyType when non-empty. all expands primary types.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "all",
                                "properties",
                                "condos",
                                "houses",
                                "apartments",
                                "townhouses",
                                "villas",
                                "land",
                                "serviced-apartments",
                                "commercial-property",
                                "offices",
                                "shophouse",
                                "warehouses",
                                "hotels",
                                "retail-spaces"
                            ]
                        },
                        "default": []
                    },
                    "maxItems": {
                        "title": "Max listings",
                        "minimum": 1,
                        "maximum": 2000,
                        "type": "integer",
                        "description": "Maximum property records to save (fair-split across markets/categories).",
                        "default": 25
                    },
                    "maxPages": {
                        "title": "Max search pages",
                        "minimum": 1,
                        "maximum": 100,
                        "type": "integer",
                        "description": "Maximum SRP pages per search URL (~25–30 listings per page).",
                        "default": 1
                    },
                    "scrapeDetails": {
                        "title": "Scrape detail pages",
                        "type": "boolean",
                        "description": "Fetch each listing LDP (RSC unitDetail on TH; DOM on PH/MY/VN).",
                        "default": true
                    },
                    "useBrowserFallback": {
                        "title": "Browser / enhanced HTTP fallback",
                        "type": "boolean",
                        "description": "On Cloudflare blocks, retry with enhanced HTTP and Camoufox if installed. Default off (curl_cffi only).",
                        "default": false
                    },
                    "locale": {
                        "title": "Locale path prefix",
                        "enum": [
                            "",
                            "en",
                            "th"
                        ],
                        "type": "string",
                        "description": "Optional URL locale (mainly TH: en/th). Leave empty for market default.",
                        "default": ""
                    },
                    "requestDelayMillis": {
                        "title": "Delay between requests (ms)",
                        "minimum": 0,
                        "maximum": 15000,
                        "type": "integer",
                        "description": "Politeness delay between HTTP requests.",
                        "default": 800
                    },
                    "maxConcurrency": {
                        "title": "Request concurrency",
                        "minimum": 1,
                        "maximum": 8,
                        "type": "integer",
                        "description": "Max concurrent HTTP fetches for detail pages.",
                        "default": 2
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Apify Proxy recommended on cloud. Leave apifyProxyCountry empty so each market (TH/PH/MY/VN) uses its own residential exit. Setting a fixed country applies to all markets in the run.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ]
                        }
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
