DDproperty Thailand Scraper at a glance
DDproperty Thailand Scraper is a ready-to-run Apify actor from abotapi for collecting real estate data. Its documented output includes id, title, address, type and property, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $1.80 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify.
- Runs on
- Apify cloud: console, API, schedules and integrations
- Data type
- Real Estate, Developer Tools, Automation
- Pricing
- $1.80 per 1,000 results (Free plan), from $1.00 on paid plans
- Output
- Documented below · JSON, CSV, Excel
- Inputs
- 31 options
- Run success
- 95.2% of completed public runs in the last 30 days
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.
What DDproperty Thailand Scraper can do
- 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 (or the full legal name on new-launch project rows) 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.
- 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.
Choose what to collect
These inputs let you configure DDproperty Thailand Scraper - Properties, Prices & Agents. Open the actor on Apify to enter your values and review the current options.
| Input | What it controls |
|---|---|
modestring | Search mode = build URLs from the filters below. URL mode = paste one or more ddproperty.com search URLs (recommended for refined searches; pagination still auto-advances forward from any ?page=N you provide). |
listing_typestring | sale or rent |
property_typestring | Filter by property type code |
searchstring | Free-text location search (e.g. 'Sukhumvit', 'Ari', 'Phuket'). Use this OR the region code below, not both. If both are set, this takes priority. |
regionstring | Location code: region (TH10=Bangkok, TH83=Phuket), district (TH1033=Watthana), or area (TH103302=Khlong Tan). |
min_priceinteger | Minimum price in Thai Baht |
max_priceinteger | Maximum price in Thai Baht |
Show 24 more inputs
| Input | What it controls |
|---|---|
bedroomsinteger | Number of bedrooms (0=Studio) |
sortstring | Sort results |
sort_orderstring | Sort direction: ascending or descending |
urlsarray | One or more ddproperty.com links. Open the site in a browser, refine your search with any filters, then paste the resulting URLs here. Listing-page links (region, district, near-station, property-type, commercial, filtered/sorted, new-launch) are walked page by page: pagination auto-advances forward from each URL, and a ?page=N start page is honoured. Single-page links: a listing detail page, a project detail page (with its unit-type price ladder) and an agent profile page return one record each; the agent directory page returns one agent row per featured card (about 30 to 35, a rotating set) and the agent search page up to 20 agent rows. Every row counts against Max properties and is billed. In URL mode, the search-mode fields above are ignored. Bare ddproperty.com links are normalised to www. The /th/ locale is refused by the site and rejected up front. The prefilled list has one example link per shape, but all links share the Max properties budget (default 20), so the first link fills it; raise Max properties or remove links to reach the other shapes. |
startUrlsarray | ddproperty.com search URLs. Same as "Search URLs (URL mode)"; setting this switches the run to URL mode. Plain strings or {"url": ...} objects are accepted. |
searchQueriesarray | Free-text location queries such as "Sukhumvit" or "Phuket". Each entry runs as its own search with the filters above; Max items / Max properties is the TOTAL cap across all queries. |
countrystring | Only "th" (Thailand) is served by this actor. sg, my and vn are accepted for compatibility but the run stops with a pointer to the sister scrapers. |
listingTypestring | sale or rent. Same value as "Listing type (Search mode)". |
propertyTypestring | th_ values map to the property_type codes: th_condo=CONDO, th_single_detached=BUNG, th_semi_detached=SEMI, th_villa=VIL, th_townhouse=TOWN, th_land=LAND, th_apartment=APT. auto and th_all apply no type filter. sg_, my_ and vn_ values are out of scope and stop the run. |
minPriceinteger | Same value as "Min price (THB)". |
maxPriceinteger | Same value as "Max price (THB)". |
maxItemsinteger | Same value as "Max properties" (0 = unlimited). Total cap across all URLs and queries. |
max_propertiesinteger | Maximum number of properties to scrape (0=unlimited). Caps both Search and URL modes. Pagination stops automatically when this cap is hit or the site runs out of results. Hard upper bound 100000. |
enable_detail_pagesboolean | Fetch the per-listing detail page in addition to the search page. Adds latitude/longitude, description, facilities, project info, etc. |
session_ttl_secondsinteger | How long to reuse a single edge session before forcing a refresh. |
resumeFromRunIdstring | Paste a previous run ID or dataset ID to continue that ONE interrupted crawl - properties it already collected are skipped, not re-scraped. Unrelated to Incremental mode below, which tracks a recurring search across scheduled runs. |
incrementalModeboolean | When ON, this actor remembers the last run of this SAME search (via its own saved state, keyed on your filters or on State key below) and classifies every property as NEW / UPDATED / REAPPEARED / EXPIRED. Unrelated to Resume from run/dataset ID above, which continues one specific interrupted run. Default OFF - normal runs return every matching property every time. |
stateKeystring | Optional. Set this to a name of your choice to manually control which runs share incremental state (e.g. to deliberately merge two different searches into one monitoring campaign). Leave blank to auto-derive the key from your search filters - two different filter setups then never share a baseline. |
emitUnchangedboolean | When ON, properties with no detected change are still returned (tagged changeType=UNCHANGED) instead of being suppressed. Off by default so a recurring run returns only what actually changed. Turning this ON returns - and bills, at the standard per-result rate - every property scanned, not just the changed ones. |
emitExpiredboolean | When ON, properties tracked by a previous incremental run that no longer appear are returned once, tagged changeType=EXPIRED. Only fires after a run that scans its search to a genuine natural end (no Max properties cap hit, no Resume) - a partial run leaves previous state untouched instead of guessing. Turning this ON returns - and bills, at the standard per-result rate - these extra rows. |
ignoreFieldsForChangesarray | Incremental mode only. Field names (e.g. price_formatted, badges) that must NOT count as a change: they stay in the output but never make a listing UPDATED or appear in changedFields. Matches the name at any depth. Already ignored automatically: recency, a relative posted_date text ("2 days ago"), and query strings on image URLs. Leave empty to detect changes on every other field. |
mcpConnectorsarray | Optionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify → Settings → Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON, the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com). |
notionParentPageUrlstring | URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors. |
maxNotifyListingsinteger | Cap on items written to each connector per run. Does not affect the dataset. |
Fields in the output
The documented dataset includes the fields below. Availability can depend on the source page and selected mode.
idID (text)titleTitle (text)addressAddress (text)listing_typeType (text)property_typeProperty (text)price_formattedPrice (text)bedroomsBeds (number)bathroomsBaths (number)floor_areaArea (sqm) (number)tenureTenure (text)urlURL (link)latitudeLat (number)Show 41 more fields
longitudeLng (number)location_sourceSource (text)nearby_mrtNearby MRT (text)nearest_mrt_stationnearest_mrt_stationnearest_mrt_linenearest_mrt_lineregionRegion (text)districtdistrictagent_nameAgent (text)agent_idAgent ID (text)agency_idagency_iddeveloperDeveloper (text)is_developer_listingis_developer_listingprice_per_sqmPrice / sqm (text)land_areaLand (sqm) (number)developer_full_nameDeveloper full name (text)descriptionDescription (text)facilitiesFacilities (array)amenitiesAmenities (array)highlightsHighlights (array)images_fullImages (array)floor_plansFloor plans (array)videosVideos (array)changeTypeChange (text)changedFieldsChanged fields (array)statusStatus (text)firstSeenAtFirst seen (text)lastSeenAtLast seen (text)completion_yearCompletion year (text)total_unitsTotal units (text)unit_typesUnit types (text)brochure_urlBrochure URL (text)agency_nameAgency name (text)job_titleJob title (text)is_agent_verifiedVerified agent (text)active_sale_listingsActive sale listings (text)active_rent_listingsActive rent listings (text)profile_sale_listingsProfile for-sale listings (text)profile_rent_listingsProfile for-rent listings (text)years_on_siteYears on site (text)websiteAgent website (link)directory_sectionDirectory section (text)Example output
An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.
{
"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"
]
}Ways to use this data
- 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.
Before you run
Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.
Questions about this actor
What data does DDproperty Thailand Scraper return?
The documented output for DDproperty Thailand Scraper includes id, title, address, type, property, price, beds and baths. Availability of each field depends on the source page and the selected mode.
How much does DDproperty Thailand Scraper cost?
It costs $1.80 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.
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.
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.
