DDproperty Thailand Scraper - Properties, Prices & Agents
Pricing
from $1.00 / 1,000 results
DDproperty Thailand Scraper - Properties, Prices & Agents
Scrape DDproperty.com Thailand listings at scale. Extract prices, property features, images, agent contacts, GPS coordinates, nearby BTS/MRT transit and more. Built for Thai real estate analytics, market research and investment analysis.
Pricing
from $1.00 / 1,000 results
Rating
0.0
(0)
Developer
Abot API
Maintained by CommunityActor stats
1
Bookmarked
37
Total users
6
Monthly active users
7 days ago
Last modified
Categories
Share
DDproperty Scraper: Thailand Property Listings, Prices & Transit Data
DDproperty is Thailand's largest real estate listing site, and this scraper turns it into structured data. Get for sale and for rent listings across every Thai region with price, bedrooms, bathrooms, floor area, tenure, agent and developer details, exact coordinates, and nearest BTS or MRT station. Build filtered searches by region, property type, price and bedrooms, or paste your own DDproperty search URLs, then export to JSON, CSV or Excel, or pull results straight into your app through the API.
Why This Scraper?
- Two ways to search. Build a search from filters (region, property type, price, bedrooms) or paste one or more DDproperty search URLs when you need a more refined query than the filters allow.
- Detail-page enrichment on demand. Turn on detail pages to add exact latitude and longitude, a full description, facilities, floor plans and project attributes to every listing, not just what the search results page shows.
- Agent and developer data. Every listing carries the agent name and ID, the agency ID, and the developer name when the listing belongs to a project.
- Nationwide region coverage. Search by region, district or area code, from Bangkok down to a single sub-district, or leave it open for every listing on a listing type.
- Built for schedules. Incremental mode remembers a recurring search itself and returns only new, updated and reappeared listings on later runs (plus expired ones if you turn on Emit expired), with unchanged ones suppressed by default.
- Resume without re-billing. Point Resume at a previous run or dataset ID and the actor skips every listing it already collected there.
- Nearest transit. Distance and station ID for the closest BTS or MRT stop whenever the listing shows one, useful for Bangkok's transit-driven property market.
Use Cases
- Property investment research: compare prices per square meter, tenure and developer across regions to spot value.
- Rental market monitoring: track rent listings in a district over time with incremental mode to catch new units as they list.
- Real estate lead generation: collect agent names, agent IDs and agency IDs from listings matching your target criteria.
- Proptech and map products: feed exact coordinates and nearest-transit data into a map or search product.
- Market research and reporting: build a dataset of listing counts, price bands and property types by region for analysis.
Data You Get
Sample shape: values are illustrative placeholders, not from a live record.
| Field | Example |
|---|---|
id | 12345678 |
title | "Condo for Sale in Watthana, Bangkok" |
address | "Sukhumvit Soi 24, Khlong Tan, Watthana, Bangkok" |
listing_type | "sale" (or "rent") |
property_type | "CONDO" |
price / price_formatted | 8500000 / "฿8,500,000" |
price_per_sqm | "฿141,667 / sqm" |
bedrooms / bathrooms | 2 / 2 |
floor_area | 60 |
tenure | "Freehold" (or "Leasehold") |
developer / is_developer_listing | "Sample Developer Co." / true |
agent_name / agent_id / agency_id | "Agent Name" / 445566 / 778899 |
region / region_code | "Bangkok" / "TH10" |
district / area | "Watthana" / "Khlong Tan" |
latitude / longitude | 13.7305 / 100.5697 (when detail pages are on) |
nearby_mrt / nearby_station_id | "7 min (560 m) from E5 Asok BTS" / "E5" |
badges | ["New Project: 2026", "Freehold"] |
posted_date / posted_unix | "07 Jul 2026" / 1783382400 |
images / image_count | ["https://.../image1.jpg"] / 1 |
url | full DDproperty link to the listing |
status | "ACT" |
description | full listing description (when detail pages are on) |
facilities | ["Swimming Pool", "Fitness Centre"] (when detail pages are on) |
How to Use
- Pick a Search mode:
search(build a URL from the filters below) orurl(paste DDproperty search URLs directly). - In search mode, set listing type, property type, region or free text location, price and bedroom filters. In URL mode, paste your DDproperty search links.
- Set Max properties to control run size and cost, and toggle Fetch detail pages for coordinates, description and facilities.
- Click Start, then download the dataset as JSON, CSV or Excel, or read it through the API.
Search for condos for sale in Bangkok:
{"mode": "search","listing_type": "sale","property_type": "CONDO","region": "TH10","max_properties": 20}
Rent search by free text location with price and bedroom filters:
{"mode": "search","listing_type": "rent","search": "Sukhumvit","min_price": 15000,"max_price": 50000,"bedrooms": 1,"max_properties": 50}
Paste DDproperty search URLs:
{"mode": "url","urls": ["https://www.ddproperty.com/en/property-for-sale/in-bangkok-th10","https://www.ddproperty.com/en/property-for-rent/in-phuket-th83"],"max_properties": 50}
Recurring monitoring of a Phuket sale search:
{"mode": "search","listing_type": "sale","region": "TH83","incrementalMode": true,"max_properties": 0}
Run it from your code
Python:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("abotapi/ddproperty-scraper").call(run_input={"mode": "search", "listing_type": "sale", "region": "TH10"})for listing in client.dataset(run["defaultDatasetId"]).iterate_items():print(listing["title"], listing["price_formatted"])
JavaScript:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('abotapi/ddproperty-scraper').call({ mode: 'search', listing_type: 'sale', region: 'TH10' });const { items } = await client.dataset(run.defaultDatasetId).listItems();
Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.
How max_properties shapes a run
The actor collects listings page by page in the order the site returns them, pushing each page as it goes, and stops once max_properties is reached or the search runs out of pages. Set it to 0 to collect every listing the search returns. Fetching detail pages for coordinates, description and facilities adds one extra request per listing, so a run with Fetch detail pages on takes longer than one with it off; Detail page concurrency controls how many of those detail fetches run in parallel (all of them share one connection, so values above 3 risk being rate-limited).
Resume and recurring updates
- Resume (
resumeFromRunId) continues one interrupted run: paste its run or dataset ID and the actor skips every listing id it already collected there, so you don't pay twice. - Incremental mode (
incrementalMode) is for recurring runs over the same search. Each listing is classifiedNEW,UPDATED(withchangedFields),UNCHANGED(suppressed and not billed unlessemitUnchangedis on),REAPPEARED, orEXPIRED(only after a run that scanned its search to a genuine natural end, nomax_propertiescap hit and no Resume, and only withemitExpiredon).stateKeynames or shares the stored state; leave it blank and the actor derives the tracked scope from your search filters, so two different searches never share a baseline by accident. With incremental mode off, output is exactly as before.
Send results into your apps (MCP connectors)
Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step after the scrape: the Apify dataset is never changed.
What gets written to the connector: a condensed, human-readable summary of each listing, not the full JSON. Each item becomes one entry with a title and its key fields flattened to plain text. The complete record always stays in the Apify dataset.
- Authorize a connector once under Apify → Settings → Integrations (Notion, Linear, Airtable, or Apify).
- Select it in the "Pipe results into your apps" input field. (If the picker is empty, you haven't authorized a connector yet.)
- For Notion, also set
notionParentPageUrlto the page where items should be created.
The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.
Input Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
mode | string | (prefill: search) | search (build a URL from the filters below) or url (paste DDproperty search URLs). |
listing_type | string | sale | sale or rent. Applies in search mode only. |
property_type | string | (none) | CONDO, BUNG, SEMI, VIL, TOWN, LAND, APT, RET, OFF, WAR, BIZ, SHOP. Search mode only. |
search | string | (none) | Free text location (e.g. "Sukhumvit"). Takes priority over region if both are set. Search mode only. |
region | string | (none) | Region, district or area code (e.g. TH10 = Bangkok, TH83 = Phuket, TH1033 = Watthana). Search mode only. |
min_price | integer | (none) | Minimum price in Thai Baht. Search mode only. |
max_price | integer | (none) | Maximum price in Thai Baht. Search mode only. |
bedrooms | integer | (none) | Number of bedrooms, 0 = Studio. Search mode only. |
sort | string | date | date, price, or psf. Search mode only. |
sort_order | string | desc | asc or desc. Search mode only. |
urls | array | (prefill: one Bangkok sample URL) | One or more DDproperty search URLs. URL mode only; ignores the search-mode filters above. |
max_properties | integer | 20 | Stop after this many listings (0 = no limit). Caps both modes. |
enable_detail_pages | boolean | true | Fetch each listing's detail page for latitude/longitude, description, facilities and project info. |
detail_concurrency | integer | 1 | Parallel detail-page fetches (1 to 5). |
session_ttl_seconds | integer | 300 | How long the actor reuses one browsing session before refreshing it. |
resumeFromRunId | string | (none) | Continue one interrupted run: paste its run or dataset ID. |
incrementalMode | boolean | false | Return only new and changed listings on recurring runs of the same search. |
stateKey | string | (none) | Name or share an incremental-mode state across runs. Leave blank to auto-derive it from your search filters. |
emitUnchanged | boolean | false | Also return (and bill) unchanged listings in incremental mode. |
emitExpired | boolean | false | Also return (and bill) listings that disappeared, in incremental mode. |
proxy | object | (prefill: Apify Residential proxy, country TH) | Connection settings. |
mcpConnectors | array | (none) | Optional: send a summary of each listing to apps you authorized under Integrations. |
notionParentPageUrl | string | (none) | Notion connector only: page under which listing pages are created. |
maxNotifyListings | integer | 50 | Cap on items written to each connector per run. |
Output Example
Sample shape: values are illustrative placeholders, not from a live record.
{"id": 12345678,"title": "Condo for Sale in Watthana, Bangkok","address": "Sukhumvit Soi 24, Khlong Tan, Watthana, Bangkok","listing_type": "sale","property_type": "CONDO","price": 8500000,"price_formatted": "฿8,500,000","price_per_sqm": "฿141,667 / sqm","bedrooms": 2,"bathrooms": 2,"floor_area": 60,"tenure": "Freehold","developer": "Sample Developer Co.","is_developer_listing": true,"agent_name": "Agent Name","agent_id": 445566,"agency_id": 778899,"region": "Bangkok","region_code": "TH10","district": "Watthana","area": "Khlong Tan","latitude": 13.7305,"longitude": 100.5697,"location_source": "detail_page","nearby_mrt": "7 min (560 m) from E5 Asok BTS","nearby_station_id": "E5","badges": ["Freehold", "Condo"],"posted_date": "07 Jul 2026","posted_unix": 1783382400,"images": ["https://www.ddproperty.com/sample/image1.jpg"],"image_count": 1,"url": "https://www.ddproperty.com/en/property/sample-condo-12345678","status": "ACT","description": "Spacious condo close to Asok BTS, sample listing description.","facilities": ["Swimming Pool", "Fitness Centre"]}
Plan Requirement
Leaving Connection on its prefilled setting already uses Apify's residential proxy for Thailand, which this site needs to load reliably. You can supply your own proxy URLs instead if you prefer. For large or frequent runs, keep the residential group selected for the most consistent access.
FAQ
How much does it cost?
You pay per listing returned. The Pricing tab shows the current rates. Use Max properties to cap the cost of any run.
Is it legal to scrape DDproperty?
This actor collects only publicly available real estate listing data. You are responsible for how you use it: follow DDproperty's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Listing photos and agent or developer names may be subject to third-party rights.
Can I get only new or changed listings on a schedule?
Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Each run then returns only new, updated and reappeared listings for that search (plus expired ones with Emit expired on), and unchanged ones are not billed unless you turn on Emit unchanged.
What's the difference between Resume and Incremental mode?
Resume (resumeFromRunId) continues one specific interrupted run by its run or dataset ID; it is a one-off continuation. Incremental mode remembers a recurring search itself, across scheduled runs, with no ID to paste, and classifies every listing as new, updated, unchanged, reappeared or expired. They solve different problems and can be combined to bootstrap incremental tracking from an existing run.
Why did my run return fewer listings than expected, or none at all?
The run fails with a clear error message if it cannot establish or refresh a working browsing session, if URL mode is used with no URLs or with a URL that is not a DDproperty link, or if a pasted Resume ID cannot be read. If the session is established but a search page later comes back blocked or empty, the actor stops collecting from that search and still finishes successfully, since it cannot tell a temporary block apart from a genuinely short result set. If you expected more listings than you got, check the run log for warnings before assuming there really were none.
Can I use it with AI agents or MCP?
Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable.
🔗 Want more real estate data?
Pair this actor with these related scrapers from the same team:
| 🏠 CommercialGuru SG Property Listings & Agent Contacts Scraper Scrape commercialguru.com.sg Singapore listings at scale. Extract prices, PSF, floor... | 🏠 Propertyfinder UAE From $0.8/1K. Extract property listings from propertyfinder.ae at scale. Get... |
| 🏠 PropertyGuru SG Scraper From $0.80/1K. Scrape PropertyGuru.com.sg sale and rental listings with 30+ structured... | 🏨 Hipflat Scraper [ Scrape hipflat.co.th property listings and new-project data across Thailand: price, price... |
| 🏠 PropertyGuru MY From $1/1K. Fast, reliable scraper for propertyguru.com.my. Extract sale and rent... | 🏠 Dot Property + Lamudi PH Scraper Scrape Philippines property listings from dotproperty.com.ph and lamudi.com.ph with exact... |
💬 Support & custom scrapers
- 🐞 Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
- 🛠️ Need another site, extra fields or a private build? Email abotapi@proton.me or message Telegram @abotapi.
- ⭐ Enjoying it? A quick review on the actor page helps other users find it.