# DDproperty Scraper — Thailand Property & Agent Leads (`logiover/ddproperty-scraper`) Actor

Scrape DDproperty, Thailand's largest property portal: price in THB, floor area in m² and land area in square wah, bedrooms, tenure, nearest BTS or MRT, plus the listing agent and agency with verification status. Sale and rent. Keyless.

- **URL**: https://apify.com/logiover/ddproperty-scraper.md
- **Developed by:** [Logiover](https://apify.com/logiover) (community)
- **Categories:** Real estate, Lead generation
- **Stats:** 30 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.25 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## DDproperty Scraper — Thailand Property & Agent Leads

Export listings from **DDproperty**, Thailand's largest property portal (PropertyGuru's Thai site) — price, floor and land area, bedrooms, tenure, nearest transit and the listing agent — to JSON, CSV or Excel. Keyless, no login.

### What does DDproperty Scraper do?

DDproperty embeds its search results in the page, so this Actor reads them without a browser and stays cheap at volume. Two details of the Thai market shape the output.

**Thailand quotes two areas at once.** A listing reads "86 sqm (floor), 17 sqw (land)" — floor area in square metres and land area in *square wah*, the local unit. Both are exported as separate numeric columns, and the land area is also converted to square metres, because a Thai buyer compares land in wah while a foreign buyer compares in m².

**Tenure matters more here than almost anywhere.** Foreigners cannot freely own land in Thailand, so freehold versus leasehold changes who can buy a property at all. Tenure is exported as its own column rather than left inside a feature blob.

The card's feature strip is a mixed array — icon chips for bedrooms, bathrooms and parking, then separate entries for area, unit type and tenure — and every element is optional. Each value is matched by the site's own test-hook identifier rather than by position, so a listing without parking never shifts its area into the wrong column.

Every row also carries the **listing agent and agency**: name, agent and agency IDs, profile URL, verification status and whether they publish a mobile number and a LINE ID — LINE being the messaging channel Thai property enquiries actually run on.

### Who is it for?

- **Property agencies** in Bangkok, Phuket or Pattaya tracking competitor stock.
- **Foreign investors** filtering condominiums by price per m² and tenure.
- **Proptech vendors** prospecting Thai agencies and verified agents.
- **Analysts** measuring supply and pricing by province and transit line.
- **Portal builders** who need a structured Thai feed.

### Use cases

- Pull every condominium for sale in Bangkok with price, floor area and tenure.
- Compare price per m² between Sukhumvit and Sathorn using the nearest-transit column.
- Filter to freehold stock only, which is what foreign buyers can purchase.
- Build a verified-agent contact list by province.
- Track new supply weekly in Phuket or Pattaya on a schedule.

### Why use this Actor?

- **Both Thai area units** — square wah and square metres, plus floor area.
- **Tenure as its own column**, the field that decides foreign eligibility.
- **Nearest BTS or MRT station**, which drives Bangkok pricing more than district does.
- **Agent and agency identity** with verification and contact-channel flags.
- **Sale and rent**, whole country or by province.
- **Keyless and browserless** — no login, no headless Chrome, low cost per row.

### What data can you extract?

Every row carries the listing ID, title and URL, transaction and property type, tenure, price with label and currency, price per area, bedrooms, bathrooms and parking slots, floor area in m², land area in square wah and m², full and short address, nearest transit, agent name, agent and agency IDs, agent profile URL, verification and contact-channel flags, listed-by text, verified, official, developer and new-project flags, posted-on and recency labels, cover image and image count.

### How to use it

1. Choose **sale** or **rent**.
2. Pick a **region** — Bangkok, Phuket, Pattaya, Chiang Mai, Hua Hin — or All Thailand.
3. Optionally narrow to condominiums or landed property and set a price band.
4. Set **Maximum results** and run, then export JSON, CSV or Excel.

### Input example

```json
{
  "transaction": "property-for-sale",
  "region": "in-bangkok-th10",
  "propertyTypeGroup": "C",
  "minPrice": 2000000,
  "maxPrice": 8000000,
  "minBedrooms": 2,
  "maxResults": 1000
}
```

### Notes and limits

- Prices are asking prices in Thai baht; rentals are quoted monthly.
- Land area is only present on landed property — condominium listings quote floor area only, so that column is empty for them by design.
- Agent phone numbers sit behind a reveal-and-verify step on DDproperty and are deliberately not scraped. The Actor exports the agent's profile URL and flags whether a mobile number and LINE ID are published, so you know which agents are contactable.
- Agent names are often in Thai script, as published.
- This Actor exports search results, not full property pages — open the listing URL for the complete description and gallery.

### FAQ

**Do I need a DDproperty account?**
No. Search results are public and the Actor needs nothing from you.

**What is a square wah?**
The Thai unit of land area: 1 square wah is 4 square metres. Land is advertised in wah, so both units are exported.

**Why does tenure matter?**
Foreign buyers cannot freely own land in Thailand. Freehold versus leasehold determines who can buy, which makes it the single most important filter for international investors.

**Does it cover rentals?**
Yes — switch the transaction to "For rent".

**How am I charged?**
Pay per result — you pay for the listings delivered.

# Actor input Schema

## `transaction` (type: `string`):

Sale or rental listings.

## `region` (type: `string`):

Thai province or resort area. Choose All Thailand to search the whole country.

## `propertyTypeGroup` (type: `string`):

Narrow to condominiums or landed property. Leave as any to include everything.

## `minPrice` (type: `integer`):

Sale price, or monthly rent when renting. 0 disables the filter.

## `maxPrice` (type: `integer`):

Sale price, or monthly rent when renting. 0 disables the filter.

## `minBedrooms` (type: `integer`):

Only return properties with at least this many bedrooms. 0 disables the filter.

## `maxResults` (type: `integer`):

Stop after this many listings. DDproperty renders 20 per page and the Actor walks pages until the target is met.

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

DDproperty embeds its listings in the page; the default datacenter proxy is enough.

## Actor input object example

```json
{
  "transaction": "property-for-sale",
  "region": "in-bangkok-th10",
  "propertyTypeGroup": "",
  "minPrice": 0,
  "maxPrice": 0,
  "minBedrooms": 0,
  "maxResults": 500,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `listingId` (type: `string`):

No description

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

No description

## `listingUrl` (type: `string`):

No description

## `transactionType` (type: `string`):

No description

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

No description

## `tenure` (type: `string`):

No description

## `priceAmount` (type: `string`):

No description

## `priceLabel` (type: `string`):

No description

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

No description

## `pricePerAreaLabel` (type: `string`):

No description

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

No description

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

No description

## `parkingSlots` (type: `string`):

No description

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

No description

## `landAreaSqwah` (type: `string`):

No description

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

No description

## `fullAddress` (type: `string`):

No description

## `shortAddress` (type: `string`):

No description

## `nearestTransit` (type: `string`):

No description

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

No description

## `agentId` (type: `string`):

No description

## `agencyId` (type: `string`):

No description

## `agentProfileUrl` (type: `string`):

No description

## `isAgentVerified` (type: `string`):

No description

## `hasAgentMobile` (type: `string`):

No description

## `hasAgentLine` (type: `string`):

No description

## `listedByText` (type: `string`):

No description

## `isVerifiedListing` (type: `string`):

No description

## `isOfficialListing` (type: `string`):

No description

## `isDeveloperListing` (type: `string`):

No description

## `isNewProject` (type: `string`):

No description

## `postedOn` (type: `string`):

No description

## `recency` (type: `string`):

No description

## `imageUrl` (type: `string`):

No description

## `imageCount` (type: `string`):

No description

## `country` (type: `string`):

No description

## `source` (type: `string`):

No description

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

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "transaction": "property-for-sale",
    "region": "in-bangkok-th10",
    "propertyTypeGroup": "",
    "minPrice": 0,
    "maxPrice": 0,
    "minBedrooms": 0,
    "maxResults": 500,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("logiover/ddproperty-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 = {
    "transaction": "property-for-sale",
    "region": "in-bangkok-th10",
    "propertyTypeGroup": "",
    "minPrice": 0,
    "maxPrice": 0,
    "minBedrooms": 0,
    "maxResults": 500,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("logiover/ddproperty-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 '{
  "transaction": "property-for-sale",
  "region": "in-bangkok-th10",
  "propertyTypeGroup": "",
  "minPrice": 0,
  "maxPrice": 0,
  "minBedrooms": 0,
  "maxResults": 500,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call logiover/ddproperty-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,logiover/ddproperty-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/FeWcTaXk4w2saftbV/builds/gq4GfGqIKsO3vp1to/openapi.json
