# DDProperty Scraper (`shahidirfan/ddproperty-scraper`) Actor

Scrape property listings from DD websites with precision. Extracts prices, locations, descriptions & more. Residential proxy compulsory for reliable data collection. Perfect for real estate analytics, market research & investment tracking. High-speed, accurate property data extraction.

- **URL**: https://apify.com/shahidirfan/ddproperty-scraper.md
- **Developed by:** [Shahid Irfan](https://apify.com/shahidirfan) (community)
- **Categories:** Real estate, Automation, Developer tools
- **Stats:** 15 total users, 6 monthly users, 98.3% runs succeeded, 0 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

## 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

## DDProperty Listings Scraper

Extract DDProperty property listings for sale or rent and collect clean, analysis-ready real estate data at scale. Gather pricing, property details, location context, agent information, and listing quality signals for research, monitoring, and lead generation workflows.

### Features

- **Comprehensive listing coverage** — Collect pricing, property specs, address details, project names, agent metadata, and listing status signals
- **Duplicate-safe collection** — Save unique listings only, even across multiple result pages
- **Adaptive continuity** — Keeps collection stable when one access pattern stops returning usable listing data
- **Rich location context** — Capture district, region, nearby MRT references, and feature summaries
- **Clean output records** — Automatically removes empty values so exported data stays ready for analysis

### Use Cases

#### Market Monitoring
Track sale and rent inventory over time to understand pricing shifts, listing freshness, and supply changes in target areas.

#### Lead Research
Build structured property datasets with agent and project context for outreach, qualification, and portfolio review.

#### Competitive Analysis
Compare property types, pricing, and listing visibility signals across districts, projects, and commercial versus residential segments.

#### Investment Screening
Review floor area, price-per-area, building context, and recency indicators to shortlist attractive property opportunities faster.

### Input Parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `startUrl` | String | No | `https://www.ddproperty.com/en/property-for-sale?listingType=sale&isCommercial=false` | DDProperty search URL to start from |
| `listingType` | String | No | `sale` | Listing mode: `sale` or `rent` |
| `isCommercial` | Boolean | No | `false` | Toggle commercial search context |
| `results_wanted` | Integer | No | `20` | Maximum number of listings to save |
| `max_pages` | Integer | No | `5` | Maximum number of pages to inspect |
| `proxyConfiguration` | Object | No | residential proxy preset | Proxy settings for more reliable runs |

---

### Output Data

Each item in the dataset contains:

| Field | Type | Description |
|-------|------|-------------|
| `id` | String | Listing ID |
| `externalId` | String | External listing ID |
| `title` | String | Listing title |
| `url` | String | Listing URL |
| `listingType` | String | Sale or rent label |
| `propertyType` | String | Property type |
| `statusCode` | String | Listing status code |
| `price` | Number | Numeric listing price |
| `priceText` | String | Formatted listing price |
| `pricePerArea` | String | Price per area text |
| `currency` | String | Currency code |
| `bedrooms` | Number | Bedroom count |
| `bathrooms` | Number | Bathroom count |
| `floorAreaSqm` | Number | Floor area in square meters |
| `landAreaSqm` | Number | Land area in square meters |
| `address` | String | Full address |
| `district` | String | District name |
| `region` | String | Region name |
| `projectName` | String | Project or development name |
| `developerName` | String | Developer name when available |
| `agentName` | String | Agent name |
| `agentId` | Number | Agent ID |
| `agentVerified` | Boolean | Agent verification flag |
| `imageUrl` | String | Main listing image URL |
| `availabilityText` | String | Availability label |
| `listedByText` | String | Listing source label |
| `badgeText` | String | Listing badge text |
| `viewedLabel` | String | Viewer activity label |
| `mrtNames` | Array | Nearby MRT names |
| `featureTexts` | Array | Feature summary text values |
| `isVerified` | Boolean | Listing verification flag |
| `isOfficialListing` | Boolean | Official listing flag |
| `isDeveloperListing` | Boolean | Developer listing flag |
| `isDeveloperUnitListing` | Boolean | Developer unit listing flag |
| `isPrioritized` | Boolean | Prioritized listing flag |
| `isPhoneOtpEnabled` | Boolean | Phone verification flag |
| `accountTypeCode` | String | Listing account type |
| `recencyText` | String | Recency text |
| `postedOnText` | String | Display posting date |
| `postedOnUnix` | Number | Posting timestamp |
| `sourceUrl` | String | Search page URL used for collection |
| `page` | Number | Search result page number |
| `scrapedAt` | String | ISO timestamp when the record was collected |

---

### Usage Examples

#### Basic Sale Listings

Collect the default sale search results:

```json
{
  "startUrl": "https://www.ddproperty.com/en/property-for-sale?listingType=sale&isCommercial=false",
  "listingType": "sale",
  "isCommercial": false,
  "results_wanted": 20,
  "max_pages": 3
}
````

#### Rent Listings

Switch to rent inventory:

```json
{
  "startUrl": "https://www.ddproperty.com/en/property-for-rent?listingType=rent&isCommercial=false",
  "listingType": "rent",
  "isCommercial": false,
  "results_wanted": 30,
  "max_pages": 4
}
```

#### Commercial Search

Collect commercial property listings with residential proxies:

```json
{
  "startUrl": "https://www.ddproperty.com/en/property-for-sale?listingType=sale&isCommercial=true",
  "listingType": "sale",
  "isCommercial": true,
  "results_wanted": 20,
  "max_pages": 5,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"]
  }
}
```

***

### Sample Output

```json
{
  "id": "12345678",
  "externalId": "12345678",
  "title": "3 Bedroom Condo for sale at Example Residence",
  "url": "https://www.ddproperty.com/en/property/example-residence-for-sale-12345678",
  "listingType": "For Sale",
  "propertyType": "Condo",
  "statusCode": "ACT",
  "price": 8500000,
  "priceText": "฿8,500,000",
  "pricePerArea": "฿94,444 / sqm",
  "currency": "THB",
  "bedrooms": 3,
  "bathrooms": 2,
  "floorAreaSqm": 95,
  "address": "Bang Na, Bang Na, Bangkok",
  "district": "Bang Na",
  "region": "Bangkok",
  "projectName": "Example Residence",
  "developerName": "Example Developer",
  "agentName": "Example Agent",
  "agentId": 81234,
  "agentVerified": true,
  "availabilityText": "Available now",
  "listedByText": "Listed by agent",
  "badgeText": "Verified",
  "viewedLabel": "Viewed 120 times",
  "mrtNames": ["Bang Na"],
  "featureTexts": ["3 Beds", "2 Baths", "95 sqm"],
  "isVerified": true,
  "isOfficialListing": false,
  "isDeveloperListing": false,
  "isPrioritized": true,
  "accountTypeCode": "agent",
  "recencyText": "2 days ago",
  "postedOnText": "2 days ago",
  "postedOnUnix": 1772755200,
  "sourceUrl": "https://www.ddproperty.com/en/property-for-sale?listingType=sale&isCommercial=false",
  "page": 1,
  "scrapedAt": "2026-06-15T12:00:00.000Z"
}
```

***

### Tips for Best Results

#### Start Small

- Use `results_wanted: 20` for faster validation runs
- Increase `max_pages` gradually for larger collection jobs

#### Choose Stable Search URLs

- Use working DDProperty search URLs with the correct `listingType`
- Keep `isCommercial` aligned with the chosen search page

#### Improve Continuity

- Use residential proxies for larger or repeated runs
- Rerun with a lower page limit first if the site returns fewer records than expected

***

### Integrations

Connect your data with:

- **Google Sheets** — Review property inventory in a spreadsheet workflow
- **Airtable** — Build searchable listing databases
- **Webhooks** — Send fresh listing data to downstream systems
- **Make** — Automate lead and monitoring workflows
- **Zapier** — Trigger alerts and reporting steps

#### Export Formats

- **JSON** — For APIs and custom applications
- **CSV** — For spreadsheet analysis
- **Excel** — For business reporting
- **XML** — For system integrations

***

### Frequently Asked Questions

#### How many listings can I collect?

You can collect as many listings as the selected search results expose, subject to your `results_wanted` and `max_pages` settings.

#### Can I collect both sale and rent listings?

Yes. Set `listingType` to `sale` or `rent` and use a matching DDProperty search URL.

#### Why do some fields appear empty?

Some listings do not expose every data point. Empty values are omitted automatically so the dataset stays clean.

#### Why should I use proxies?

Residential proxies generally provide better continuity for repeated or larger collection runs.

#### What happens if no listings are found?

The run stops with a clear error instead of returning a fake success record, so it is easier to diagnose and correct.

***

### Support

For issues or feature requests, contact support through the Apify Console.

#### Resources

- [Apify Documentation](https://docs.apify.com/)
- [Apify API Reference](https://docs.apify.com/api/v2)
- [Scheduling Runs](https://docs.apify.com/platform/schedules)

***

### Legal Notice

Use this actor responsibly and in compliance with DDProperty terms, robots policies, and applicable laws. You are responsible for lawful use of collected data.

# Actor input Schema

## `startUrl` (type: `string`):

DDProperty search URL. If empty, a default sale search URL is used.

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

Search listing type.

## `isCommercial` (type: `boolean`):

Set true for commercial search pages.

## `results_wanted` (type: `integer`):

Maximum number of listings to save.

## `max_pages` (type: `integer`):

Safety cap on number of pages to visit.

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

Residential proxy is strongly recommended for DDProperty.

## Actor input object example

```json
{
  "startUrl": "https://www.ddproperty.com/en/property-for-sale?listingType=sale&isCommercial=false",
  "listingType": "sale",
  "isCommercial": false,
  "results_wanted": 20,
  "max_pages": 5,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `overview` (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 = {
    "startUrl": "https://www.ddproperty.com/en/property-for-sale?listingType=sale&isCommercial=false",
    "listingType": "sale",
    "results_wanted": 20,
    "max_pages": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("shahidirfan/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 = {
    "startUrl": "https://www.ddproperty.com/en/property-for-sale?listingType=sale&isCommercial=false",
    "listingType": "sale",
    "results_wanted": 20,
    "max_pages": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("shahidirfan/ddproperty-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 '{
  "startUrl": "https://www.ddproperty.com/en/property-for-sale?listingType=sale&isCommercial=false",
  "listingType": "sale",
  "results_wanted": 20,
  "max_pages": 5
}' |
apify call shahidirfan/ddproperty-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "DDProperty Scraper",
        "description": "Scrape property listings from DD websites with precision. Extracts prices, locations, descriptions & more. Residential proxy compulsory for reliable data collection. Perfect for real estate analytics, market research & investment tracking. High-speed, accurate property data extraction.",
        "version": "1.0",
        "x-build-id": "NqSCIsNafbfEFLY8K"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/shahidirfan~ddproperty-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-shahidirfan-ddproperty-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/shahidirfan~ddproperty-scraper/runs": {
            "post": {
                "operationId": "runs-sync-shahidirfan-ddproperty-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/shahidirfan~ddproperty-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-shahidirfan-ddproperty-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": {
                    "startUrl": {
                        "title": "Start URL",
                        "type": "string",
                        "description": "DDProperty search URL. If empty, a default sale search URL is used."
                    },
                    "listingType": {
                        "title": "Listing type",
                        "enum": [
                            "sale",
                            "rent"
                        ],
                        "type": "string",
                        "description": "Search listing type.",
                        "default": "sale"
                    },
                    "isCommercial": {
                        "title": "Commercial listings",
                        "type": "boolean",
                        "description": "Set true for commercial search pages.",
                        "default": false
                    },
                    "results_wanted": {
                        "title": "Maximum number of results",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum number of listings to save.",
                        "default": 20
                    },
                    "max_pages": {
                        "title": "Maximum number of pages",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Safety cap on number of pages to visit.",
                        "default": 5
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Residential proxy is strongly recommended for DDProperty.",
                        "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
