# Propertyguru Property Search Scraper (`stealth_mode/propertyguru-property-search-scraper`) Actor

Scrape property listings from PropertyGuru Singapore, PropertyGuru Malaysia, and DDProperty Thailand. Extract comprehensive real estate data including prices, location details, agent information, and property features for market analysis, price comparison, and investment research.

- **URL**: https://apify.com/stealth\_mode/propertyguru-property-search-scraper.md
- **Developed by:** [Stealth mode](https://apify.com/stealth_mode) (community)
- **Categories:** Automation, Developer tools, Real estate
- **Stats:** 3 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

$20.00/month + usage

To use this Actor, you pay a monthly rental fee to the developer. The rent is subtracted from your prepaid usage every month after the free trial period.
You also pay for the Apify platform usage, which gets cheaper the higher Apify subscription plan you have.

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

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

## PropertyGuru & DDProperty Scraper: Extract Real Estate Data Across Southeast Asia

### Why PropertyGuru and DDProperty Data Matters

PropertyGuru operates the leading real estate platforms across Southeast Asia, including PropertyGuru.com.sg (Singapore), PropertyGuru.com.my (Malaysia), and DDProperty.com (Thailand). These platforms collectively list hundreds of thousands of properties, representing the most comprehensive view of real estate markets in these rapidly growing economies.

The data available on these platforms provides critical insights for property investors, real estate agencies, market researchers, and proptech companies. From luxury condominiums in Singapore's central districts to affordable housing in Malaysia's suburbs and vacation properties in Thailand's tourist destinations, these platforms capture the full spectrum of Southeast Asian real estate. However, manually tracking prices, analyzing market trends, or comparing properties across thousands of listings is impractical without automation.

This scraper transforms these platforms into structured datasets, enabling data-driven decisions in markets where property prices can vary dramatically by location, amenities, and timing.

### What This Scraper Extracts

The PropertyGuru & DDProperty Scraper captures detailed information from property search result pages across all three platforms. It handles different property types (sale and rental), various listing formats, and platform-specific features while maintaining data consistency across regions.

The scraper is valuable for real estate agencies building lead databases, investors conducting market analysis, property developers monitoring competition, and data analysts tracking pricing trends. It captures not just basic listing information but also agent details, media assets, location intelligence, and platform-specific indicators like verification status and developer promotions.

### Input Configuration Explained

The scraper accepts search result URLs from any of the three supported platforms. These are the pages showing multiple property listings, not individual property detail pages. Search URLs typically include filters like property type (sale/rent), location, price range, and property features.

**Input Structure:**

```json
{
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"],
    "apifyProxyCountry": "US"
  },
  "max_items_per_url": 20,
  "ignore_url_failures": true,
  "urls": [
    "https://www.ddproperty.com/en/property-for-rent?gad_source=1",
    "https://www.propertyguru.com.sg/property-for-sale/2?_freetextDisplay=Sanctuary+Green",
    "https://www.propertyguru.com.my/property-for-sale/2"
  ]
}
````

#### Example Screenshot:

![](https://i.ibb.co/KxsD4nJc/Screenshot-from-2025-12-11-11-10-53.png)

**Key Parameters:**

- **max\_items\_per\_url**: Controls how many listings to extract per search URL (default: 20). Increase for comprehensive data collection or decrease for quick sampling.
- **ignore\_url\_failures**: When true, the scraper continues if individual URLs fail, useful when processing large URL lists where some might be expired or invalid.
- **Proxy configuration**: Residential proxies recommended to avoid detection. Country selection can match target market (SG for Singapore, MY for Malaysia, TH for Thailand) for better performance.

You can include multiple search URLs to scrape different property types, locations, or price ranges in a single run. The scraper processes each URL and extracts up to the specified number of items per page.

### Output Data Fields and Their Applications

The scraper returns comprehensive property data in JSON format. Each listing contains 40+ fields organized into logical categories:

**Core Identification:**

- **ID**: Unique property listing identifier for tracking and deduplication
- **External ID**: Property reference number from the listing source
- **URL**: Direct link to the full property listing
- **Type Code** & **Type Text**: Property category (condo, landed, HDB, etc.)

**Listing Metadata:**

- **Status Code**: Current listing status (active, sold, rented)
- **Is Verified**: Platform verification status, indicating data quality
- **Is Official Listing**: Whether posted by authorized agents
- **Is Developer Listing**: Direct listings from property developers
- **Posted On** & **Recency**: Timing information for freshness analysis

**Property Details:**

- **Localized Title**: Property name and description
- **Full Address**: Complete location information
- **Area**: Geographic zone or district
- **Bedrooms** & **Bathrooms**: Unit configuration
- **Floor Area**: Property size in square meters/feet
- **Property**: Detailed property specifications object

**Pricing Information:**

- **Price**: Listing price with currency
- **Price Per Area**: Cost per square foot/meter for comparison
- **Price per Square Foot Text**: Formatted pricing metric

**Location Intelligence:**

- **MRT**: Nearby mass transit stations (particularly relevant in Singapore)
- Geographic proximity data for accessibility analysis

**Agent & Agency:**

- **Agent**: Contact details of listing agent
- **Agency**: Representing real estate firm
- **Account Type Code**: Agent classification (professional, individual, developer)
- **Listed By Text**: Formatted agent attribution
- **Contact Agent Text**: CTA text for contact functionality

**Visual Assets:**

- **Media Items**: Array of property photos
- **Media Controls** & **Media Carousel**: Image gallery metadata
- **Thumbnail**: Primary listing image
- **Developer**: Developer branding and information

**Marketing Features:**

- **Badge Text** & **Badges**: Premium placement indicators
- **Availability Info**: Current availability status
- **Listing Features**: Highlighted property features
- **Products**: Platform products associated with listing (featured, premium, etc.)
- **Developer Promoted Text**: Special developer promotions

**Engagement Metrics:**

- **Viewed Label**: View count indicators
- **Tracking**: Analytics and tracking identifiers
- **FDL CTA Placement Experiment Enabled**: A/B testing flags

**Cross-Platform:**

- **Cross Listing Type**: Indicator if property is listed on multiple platforms

**Example Output:**

```json
[
  {
  "id": 60011614,
  "status_code": "ACT",
  "type_code": "RENT",
  "is_verified": false,
  "viewed_label": "Viewed",
  "agent": {
    "id": 2079713,
    "name": "Smartlivingbankok",
    "is_agent_verified": true,
    "profile_url": "/en/agent/smartlivingbankok-2079713",
    "avatar": {
      "src": "https://th1-cdn.pgimgs.com/agent/2079713/APHO.112954646.V120B.jpg",
      "type": "circle"
    },
    "description": "For Rent Diplomat 39, Condo near BTS Phrom Phong, Fully Furnished",
    "verified_badge": {
      "icon": "badge-f",
      "text": "Verified",
      "color": "#008549",
      "modal_title": "Verified Agent",
      "modal_size": "sm",
      "explanation": {
        "title": "Who's Verified?",
        "description": "Real estate agents and negotiators whose credentials are verified by PropertyGuru.",
        "sub_title": "What's verified?",
        "details": [
          {
            "description": "<span class=\"pg-font-label-s\">myKAD</span> verified",
            "icon_name": "postcard-o"
          },
          {
            "description": "<span class=\"pg-font-label-s\">REN/REA/PEA</span> is active on LPPEH",
            "icon_name": "document-with-lines-o"
          },
          {
            "description": "<span class=\"pg-font-label-s\">Mobile number</span> registered with LPPEH is OTP-verified (REN only)",
            "icon_name": "call-o"
          }
        ]
      },
      "note": "Note: If you believe that you have been scammed by a verified agent/negotiator please <a href=\"https://forms.gle/7rMbvfRiTN6tXqDB9\" target=\"_blank\">report it here</a>",
      "popover": {
        "description": "Credentials are verified by PropertyGuru",
        "button_label": "Learn more",
        "button_url": "#"
      },
      "tracking_data": {
        "segment_data": {
          "agent_id": 2079713,
          "listing_id": 60011614
        }
      }
    }
  },
  "agency": null,
  "badge_text": "Verified",
  "availability_info": "",
  "psf_text": "฿978.26 / sqm",
  "listing_features": [
    [
      {
        "icon_name": "bed-o",
        "text": "2",
        "data_automation_id": "listing-card-v2-bedrooms"
      },
      {
        "icon_name": "bath-o",
        "text": "2",
        "data_automation_id": "listing-card-v2-bathrooms"
      }
    ],
    {
      "text": "92 sqm",
      "data_automation_id": "listing-card-v2-area"
    },
    {
      "text": "Condo",
      "data_automation_id": "listing-card-v2-unit-type"
    },
    {
      "text": "Built: 2019",
      "data_automation_id": "listing-card-v2-build-year"
    }
  ],
  "property": {
    "new_project": false,
    "type_code": "RENT",
    "type_text": "For Rent",
    "type_group": "N",
    "is_premium_project_listing": false,
    "id": 4946
  },
  "full_address": "18 Soi Sukhumvit 39, Sukhumvit Road, Khlong Tan Nua, Watthana, Bangkok",
  "localized_title": "The Diplomat 39, Bangkok",
  "media_items": [
    {
      "icon": "images",
      "icon_name": "images-1-o",
      "text": "35",
      "media_type": "images",
      "tooltip_text": "35 Photos"
    }
  ],
  "mrt": {
    "nearby_text": "4 min (300 m) from E5 Phrom Phong BTS",
    "colors": [
      "#77CC00"
    ]
  },
  "media_controls": {
    "hide_button_title": "Hide Property",
    "shortlist_button_title": "Shortlist Property"
  },
  "media_carousel": {
    "next_button_title": "Next",
    "previous_button_title": "Previous",
    "preview_media": {
      "images": {
        "icon": "images",
        "items": [
          {
            "caption": "For Rent - The Diplomat 39, Bangkok",
            "src": "https://th1-cdn.pgimgs.com/listing/60011614/UPHO.131277150.V800/The-Diplomat-39-Watthana-Thailand.jpg"
          },
          {
            "caption": "For Rent - The Diplomat 39, Bangkok",
            "src": "https://th1-cdn.pgimgs.com/listing/60011614/UPHO.131276743.V800/The-Diplomat-39-Watthana-Thailand.jpg"
          },
          {
            "caption": "For Rent - The Diplomat 39, Bangkok",
            "src": "https://th1-cdn.pgimgs.com/listing/60011614/UPHO.131276742.V800/The-Diplomat-39-Watthana-Thailand.jpg"
          },
          {
            "caption": "For Rent - The Diplomat 39, Bangkok",
            "src": "https://th1-cdn.pgimgs.com/listing/60011614/UPHO.131276759.V800/The-Diplomat-39-Watthana-Thailand.jpg"
          },
          {
            "caption": "For Rent - The Diplomat 39, Bangkok",
            "src": "https://th1-cdn.pgimgs.com/listing/60011614/UPHO.131276746.V800/The-Diplomat-39-Watthana-Thailand.jpg"
          },
          {
            "caption": "For Rent - The Diplomat 39, Bangkok",
            "src": "https://th1-cdn.pgimgs.com/listing/60011614/UPHO.131276744.V800/The-Diplomat-39-Watthana-Thailand.jpg"
          },
          {
            "caption": "For Rent - The Diplomat 39, Bangkok",
            "src": "https://th1-cdn.pgimgs.com/listing/60011614/UPHO.131276741.V800/The-Diplomat-39-Watthana-Thailand.jpg"
          },
          {
            "caption": "For Rent - The Diplomat 39, Bangkok",
            "src": "https://th1-cdn.pgimgs.com/listing/60011614/UPHO.131276780.V800/The-Diplomat-39-Watthana-Thailand.jpg"
          },
          {
            "caption": "For Rent - The Diplomat 39, Bangkok",
            "src": "https://th1-cdn.pgimgs.com/listing/60011614/UPHO.131276745.V800/The-Diplomat-39-Watthana-Thailand.jpg"
          },
          {
            "caption": "For Rent - The Diplomat 39, Bangkok",
            "src": "https://th1-cdn.pgimgs.com/listing/60011614/UPHO.131276758.V800/The-Diplomat-39-Watthana-Thailand.jpg"
          },
          {
            "caption": "For Rent - The Diplomat 39, Bangkok",
            "src": "https://th1-cdn.pgimgs.com/listing/60011614/UPHO.131276767.V800/The-Diplomat-39-Watthana-Thailand.jpg"
          },
          {
            "caption": "For Rent - The Diplomat 39, Bangkok",
            "src": "https://th1-cdn.pgimgs.com/listing/60011614/UPHO.131276756.V800/The-Diplomat-39-Watthana-Thailand.jpg"
          },
          {
            "caption": "For Rent - The Diplomat 39, Bangkok",
            "src": "https://th1-cdn.pgimgs.com/listing/60011614/UPHO.131276738.V800/The-Diplomat-39-Watthana-Thailand.jpg"
          },
          {
            "caption": "For Rent - The Diplomat 39, Bangkok",
            "src": "https://sg1-cdn.pgimgs.com/projectnet-project/59969/ZPPHO.102018707.V800/The-Diplomat-39-Watthana-Thailand.jpg"
          },
          {
            "caption": "For Rent - The Diplomat 39, Bangkok",
            "src": "https://sg1-cdn.pgimgs.com/projectnet-project/59969/ZPPHO.102018708.V800/The-Diplomat-39-Watthana-Thailand.jpg"
          },
          {
            "caption": "For Rent - The Diplomat 39, Bangkok",
            "src": "https://sg1-cdn.pgimgs.com/projectnet-project/59969/ZPPHO.102018709.V800/The-Diplomat-39-Watthana-Thailand.jpg"
          },
          {
            "caption": "For Rent - The Diplomat 39, Bangkok",
            "src": "https://sg1-cdn.pgimgs.com/projectnet-project/59969/ZPPHO.102018710.V800/The-Diplomat-39-Watthana-Thailand.jpg"
          },
          {
            "caption": "For Rent - The Diplomat 39, Bangkok",
            "src": "https://sg1-cdn.pgimgs.com/projectnet-project/59969/ZPPHO.102018711.V800/The-Diplomat-39-Watthana-Thailand.jpg"
          },
          {
            "caption": "For Rent - The Diplomat 39, Bangkok",
            "src": "https://sg1-cdn.pgimgs.com/projectnet-project/59969/ZPPHO.102018713.V800/The-Diplomat-39-Watthana-Thailand.jpg"
          },
          {
            "caption": "For Rent - The Diplomat 39, Bangkok",
            "src": "https://sg1-cdn.pgimgs.com/projectnet-project/59969/ZPPHO.102018714.V800/The-Diplomat-39-Watthana-Thailand.jpg"
          },
          {
            "caption": "For Rent - The Diplomat 39, Bangkok",
            "src": "https://sg1-cdn.pgimgs.com/projectnet-project/59969/ZPPHO.102018715.V800/The-Diplomat-39-Watthana-Thailand.jpg"
          },
          {
            "caption": "For Rent - The Diplomat 39, Bangkok",
            "src": "https://sg1-cdn.pgimgs.com/projectnet-project/59969/ZPPHO.103739073.V800/The-Diplomat-39-Watthana-Thailand.jpg"
          },
          {
            "caption": "For Rent - The Diplomat 39, Bangkok",
            "src": "https://sg1-cdn.pgimgs.com/projectnet-project/59969/ZPPHO.103739074.V800/The-Diplomat-39-Watthana-Thailand.jpg"
          },
          {
            "caption": "For Rent - The Diplomat 39, Bangkok",
            "src": "https://sg1-cdn.pgimgs.com/projectnet-project/59969/ZPPHO.103739076.V800/The-Diplomat-39-Watthana-Thailand.jpg"
          },
          {
            "caption": "For Rent - The Diplomat 39, Bangkok",
            "src": "https://sg1-cdn.pgimgs.com/projectnet-project/59969/ZPPHO.103739078.V800/The-Diplomat-39-Watthana-Thailand.jpg"
          },
          {
            "caption": "For Rent - The Diplomat 39, Bangkok",
            "src": "https://sg1-cdn.pgimgs.com/projectnet-project/59969/ZPPHO.103739079.V800/The-Diplomat-39-Watthana-Thailand.jpg"
          },
          {
            "caption": "For Rent - The Diplomat 39, Bangkok",
            "src": "https://sg1-cdn.pgimgs.com/projectnet-project/59969/ZPPHO.103739080.V800/The-Diplomat-39-Watthana-Thailand.jpg"
          },
          {
            "caption": "For Rent - The Diplomat 39, Bangkok",
            "src": "https://sg1-cdn.pgimgs.com/projectnet-project/59969/ZPPHO.103739081.V800/The-Diplomat-39-Watthana-Thailand.jpg"
          },
          {
            "caption": "For Rent - The Diplomat 39, Bangkok",
            "src": "https://sg1-cdn.pgimgs.com/projectnet-project/59969/ZPPHO.103739082.V800/The-Diplomat-39-Watthana-Thailand.jpg"
          },
          {
            "caption": "For Rent - The Diplomat 39, Bangkok",
            "src": "https://sg1-cdn.pgimgs.com/projectnet-project/59969/ZPPHO.103739083.V800/The-Diplomat-39-Watthana-Thailand.jpg"
          },
          {
            "caption": "For Rent - The Diplomat 39, Bangkok",
            "src": "https://sg1-cdn.pgimgs.com/projectnet-project/59969/ZPPHO.103739085.V800/The-Diplomat-39-Watthana-Thailand.jpg"
          },
          {
            "caption": "For Rent - The Diplomat 39, Bangkok",
            "src": "https://sg1-cdn.pgimgs.com/projectnet-project/59969/ZPPHO.103739087.V800/The-Diplomat-39-Watthana-Thailand.jpg"
          },
          {
            "caption": "For Rent - The Diplomat 39, Bangkok",
            "src": "https://sg1-cdn.pgimgs.com/projectnet-project/59969/ZPPHO.103739088.V800/The-Diplomat-39-Watthana-Thailand.jpg"
          },
          {
            "caption": "For Rent - The Diplomat 39, Bangkok",
            "src": "https://sg1-cdn.pgimgs.com/projectnet-project/59969/ZPPHO.103739089.V800/The-Diplomat-39-Watthana-Thailand.jpg"
          },
          {
            "caption": "For Rent - The Diplomat 39, Bangkok",
            "src": "https://sg1-cdn.pgimgs.com/projectnet-project/59969/ZPPHO.103739091.V800/The-Diplomat-39-Watthana-Thailand.jpg"
          }
        ],
        "name": {
          "singular": "Photo",
          "plural": "Photos"
        }
      },
      "floor_plans": {
        "icon": "pgicon-floorplan",
        "items": [],
        "name": {
          "singular": "Floor Plan",
          "plural": "Floor Plans"
        }
      },
      "site_plans": {
        "icon": "",
        "items": [],
        "name": {
          "singular": "",
          "plural": ""
        }
      },
      "videos": {
        "icon": "video-camera-o",
        "items": [],
        "name": {
          "singular": "Live Tour",
          "plural": "Live Tours"
        }
      },
      "virtual_tours": {
        "icon": "video-clip-o",
        "items": [],
        "name": {
          "singular": "Virtual Tour",
          "plural": "Virtual Tours"
        }
      },
      "hero_videos": {
        "icon": "",
        "items": [],
        "name": {
          "singular": "",
          "plural": ""
        }
      }
    }
  },
  "price": {
    "value": 90000,
    "pretty": "฿90,000 /mo",
    "currency": "THB",
    "locale_string_value": "90000"
  },
  "badges": [
    {
      "name": "launch",
      "variant": "secondary",
      "bg": "neutral",
      "type": "small",
      "text": "Built: 2019",
      "should_show_icon": false
    },
    {
      "name": "unit_type",
      "variant": "secondary",
      "bg": "neutral",
      "type": "small",
      "text": "Condo",
      "should_show_icon": false
    }
  ],
  "url": "https://www.ddproperty.com/en/property/the-diplomat-39-for-rent-60011614",
  "recency": {
    "icon": "clock-o",
    "icon_name": "clock-circle-o",
    "text": "Listed on Dec 04, 2025 (6d ago)"
  },
  "thumbnail": "https://th1-cdn.pgimgs.com/listing/60011614/UPHO.131277150.V550/The-Diplomat-39-Watthana-Thailand.jpg",
  "type_text": "For Rent",
  "listed_by_text": "Listed by",
  "contact_agent_text": "Contact Agent",
  "is_official_listing": true,
  "is_fdl_cta_placement_experiment_enabled": false,
  "is_prioritized": true,
  "view_profile_text": "View Agent Profile",
  "tracking": {
    "ref_type": "generic-specialist"
  },
  "developer": "Smartlivingbankok",
  "posted_on": {
    "text": "4 Dec 2025",
    "unix": 1764834454
  },
  "area": {
    "locale_string_value": "92 sqm"
  },
  "price_per_area": {
    "locale_string_value": "฿978.26 / sqm"
  },
  "developer_promoted_text": "",
  "is_developer_listing": false,
  "products": {
    "is_ranked_spotlight": false,
    "is_auto_repost": false,
    "is_boosted": false,
    "is_downgraded": false,
    "is_featured_listing": false,
    "is_gallery_featured": false,
    "is_main_featured": false,
    "is_non_paid": false,
    "is_premium": false,
    "is_premium_plus": false,
    "is_premium_project_listing": false,
    "is_promoted_listing": false,
    "is_property_specialist_listing": true,
    "is_showcase": false,
    "is_spotlight": false,
    "is_turbo": true,
    "is_turbo_pro": false,
    "is_standard": false,
    "is_primary_basic": false,
    "is_primary_gold": false,
    "is_primary_platinum": false,
    "tier": 0,
    "featured_by": [
      "Generic-Specialist"
    ],
    "request_type": "agent-top_2",
    "tracking": {
      "ref_type": "generic-specialist"
    }
  },
  "account_type_code": "CORPORATE",
  "bedrooms": 2,
  "bathrooms": 2,
  "floor_area": 92,
  "additional_data": {
    "tenure": "F",
    "area_text": "Khlong Tan Nua",
    "area_code": "TH103902",
    "district_code": "TH1039",
    "district_text": "Watthana",
    "region_text": "Bangkok",
    "region_code": "TH10"
  },
  "external_id": null,
  "cross_listing_type": "ORIGINAL",
  "from_url": "https://www.ddproperty.com/en/property-for-rent?gad_source=1&gad_campaignid=21223871023&gbraid=0AAAAADwXfX9OLqKV6DL0dwGDqrGCDaH3R&gclid=CjwKCAiA0eTJBhBaEiwA-Pa-hWpBpVIz3hWUni9L8I02tx0kNp6VSRLkX1B7GemXB52k6GrFNwsEWhoCYhwQAvD_BwE"
}
]
```

### Usage Guide

**Setup:**

1. Create an Apify account
2. Access the PropertyGuru & DDProperty Scraper
3. Configure proxy settings (residential proxies recommended)

**Preparing URLs:**

- Navigate to PropertyGuru or DDProperty
- Use search filters to find target properties
- Copy the search result page URLs (not individual property pages)
- Each URL can contain filters for location, price range, property type, etc.

**Configuration Best Practices:**

- Set `max_items_per_url` based on needs: 20 for quick sampling, 100+ for comprehensive data
- Use `ignore_url_failures: true` when processing many URLs
- Batch similar searches together (e.g., all rental properties, all sale listings)

**Running the Scraper:**

- Input your URLs and parameters
- Start the scraper and monitor progress
- Typical processing: 50-100 listings in 5-10 minutes
- Review data quality in the dataset preview

**Data Export:**

- Download as JSON for programmatic use
- Export to CSV for Excel analysis
- Set up scheduled runs for regular market monitoring

**Error Handling:**

- Check activity log for failed URLs
- Verify URLs are search pages, not individual listings
- Ensure URLs are from supported domains (.sg, .my, .com for DDProperty)

### Business Applications

**Real Estate Agencies:**
Generate leads by tracking new listings and price changes. Build databases of properties matching client criteria. Monitor competitor pricing strategies and listing volumes.

**Property Investors:**
Identify undervalued properties by comparing price-per-square-foot across similar areas. Track market trends through historical price data. Analyze rental yields by comparing sale prices with rental listings.

**Market Research:**
Study supply patterns by property type and location. Analyze pricing trends across different districts. Understand developer activity and new project launches. Track how quickly properties sell or rent based on recency data.

**Proptech Companies:**
Build property recommendation engines using comprehensive listing data. Create price prediction models with historical datasets. Develop market analytics dashboards showing real-time trends.

**Property Developers:**
Monitor competing developments and pricing. Analyze market demand by tracking listing volumes and view counts. Research optimal pricing strategies based on comparable properties.

### Data Strategy Tips

**Regular Collection:**
Schedule daily or weekly scrapes to build time-series data. Track individual properties over time using ID fields to observe price changes and status updates.

**Geographic Analysis:**
Use MRT and area data to analyze location premiums. Calculate price-per-square-foot variations across districts. Map property density and pricing heat maps.

**Quality Filtering:**
Prioritize verified and official listings for accurate market data. Flag developer listings separately for new project analysis. Use badges and features to identify premium properties.

**Cross-Platform Insights:**
Compare Singapore, Malaysia, and Thailand markets. Analyze cross-border investment opportunities. Understand regional pricing and yield differences.

**Data Enrichment:**
Combine with external data sources (demographics, infrastructure projects, economic indicators). Validate agent information against regulatory databases. Geocode addresses for precise mapping.

### Conclusion

The PropertyGuru & DDProperty Scraper provides essential market intelligence across Southeast Asia's most dynamic property markets. Whether analyzing investment opportunities, monitoring competition, or building proptech solutions, this tool delivers the structured data needed for informed real estate decisions across Singapore, Malaysia, and Thailand.

# Actor input Schema

## `urls` (type: `array`):

Add the URLs of the property list urls you want to scrape. You can paste URLs one by one, or use the Bulk edit section to add a prepared list.

## `ignore_url_failures` (type: `boolean`):

If true, the scraper will continue running even if some URLs fail to be scraped.

## `max_items_per_url` (type: `integer`):

The maximum number of items to scrape per URL.

## `proxy` (type: `object`):

Select proxies to be used by your scraper.

## Actor input object example

```json
{
  "urls": [
    "https://www.propertyguru.com.sg/property-for-sale/2?_freetextDisplay=Sanctuary+Green&propertyId=105"
  ],
  "ignore_url_failures": true,
  "max_items_per_url": 20,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "SG"
  }
}
```

# 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 = {
    "urls": [
        "https://www.propertyguru.com.sg/property-for-sale/2?_freetextDisplay=Sanctuary+Green&propertyId=105"
    ],
    "ignore_url_failures": true,
    "max_items_per_url": 20,
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "SG"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("stealth_mode/propertyguru-property-search-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 = {
    "urls": ["https://www.propertyguru.com.sg/property-for-sale/2?_freetextDisplay=Sanctuary+Green&propertyId=105"],
    "ignore_url_failures": True,
    "max_items_per_url": 20,
    "proxy": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "SG",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("stealth_mode/propertyguru-property-search-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 '{
  "urls": [
    "https://www.propertyguru.com.sg/property-for-sale/2?_freetextDisplay=Sanctuary+Green&propertyId=105"
  ],
  "ignore_url_failures": true,
  "max_items_per_url": 20,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "SG"
  }
}' |
apify call stealth_mode/propertyguru-property-search-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Propertyguru Property Search Scraper",
        "description": "Scrape property listings from PropertyGuru Singapore, PropertyGuru Malaysia, and DDProperty Thailand. Extract comprehensive real estate data including prices, location details, agent information, and property features for market analysis, price comparison, and investment research.",
        "version": "0.0",
        "x-build-id": "Fg9MWWMQggcbe3ZD7"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/stealth_mode~propertyguru-property-search-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-stealth_mode-propertyguru-property-search-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/stealth_mode~propertyguru-property-search-scraper/runs": {
            "post": {
                "operationId": "runs-sync-stealth_mode-propertyguru-property-search-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/stealth_mode~propertyguru-property-search-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-stealth_mode-propertyguru-property-search-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": {
                    "urls": {
                        "title": "URLs of the property list urls to scrape",
                        "type": "array",
                        "description": "Add the URLs of the property list urls you want to scrape. You can paste URLs one by one, or use the Bulk edit section to add a prepared list.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "ignore_url_failures": {
                        "title": "Continue running even if some URLs fail to be scraped",
                        "type": "boolean",
                        "description": "If true, the scraper will continue running even if some URLs fail to be scraped."
                    },
                    "max_items_per_url": {
                        "title": "Max items per URL",
                        "type": "integer",
                        "description": "The maximum number of items to scrape per URL."
                    },
                    "proxy": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Select proxies to be used by your scraper."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
