Dot Property Scraper - TH, PH, MY & VN Listings
Pricing
from $2.20 / 1,000 results
Dot Property Scraper - TH, PH, MY & VN Listings
Extract Dot Property sale and rental listings from Thailand, the Philippines, Malaysia, and Vietnam. Get prices, rooms, areas, photos, and available contacts. Pay per delivered row plus a start fee.
Pricing
from $2.20 / 1,000 results
Rating
0.0
(0)
Developer
kane liu
Maintained by CommunityActor stats
1
Bookmarked
6
Total users
1
Monthly active users
6 hours ago
Last modified
Categories
Security
Limited permissionsShare
Dot Property Scraper
Extract Dot Property sale and rental listings from Thailand, the Philippines, Malaysia, and Vietnam as property rows you can export.
- Prices, currencies, bedrooms, bathrooms, floor areas, and listing URLs.
- Residential and commercial searches, or specific listing pages.
- Descriptions, amenities, photos, and available contact information.
- JSON, CSV, and Excel exports for comparisons and scheduled reporting.
- Pay for delivered rows: $3 per 1,000 rows on the Free plan, plus a start fee.
What does Dot Property Scraper do?
Dot Property Scraper collects listings from dotproperty.co.th, dotproperty.com.ph, dotproperty.com.my, and dotproperty.com.vn. Each row represents one property listing. Use the results to compare asking prices, review rental inventory, or follow a location over time.
There is one collection mode: property listings. You can choose:
- Searches: fill
market,location,channel, and a property type. - Specific pages: provide search or listing URLs in
startUrls. - Several markets: use
marketsor setmarkettoall. - Thailand areas: use
areaSlugs, or expand a location withsliceByArea. - Detail enrichment:
scrapeDetailsis on by default. It adds available descriptions, features, and photos to the same row, not extra billed rows.
What data can you extract from Dot Property?
Fields depend on the listing and whether details are requested. Examples below illustrate values, not guaranteed availability.
| Field | Description | Example |
|---|---|---|
id | Listing identifier | 5782686 |
url | Listing page link | https://www.dotproperty.co.th/en/ads/example_1234567 |
market | Country site code | TH |
category | Search category | condos |
channel | Sale or rental channel | BUY |
title | Listing title | 1 Bedroom Condo for sale in Bangkok |
projectName | Project name when shown | Example Residence |
price | Displayed price text | ฿2,700,000 |
priceAmount | Numeric asking price | 2700000 |
currency | Currency code | THB |
numBedrooms | Bedroom count | 1 |
numBathrooms | Bathroom count | 1 |
propertyType | Displayed property type | Condo |
indoorArea | Indoor area with units | 24 SqM |
plotSize | Land area when listed | 100 SqM |
address | Area-level address object | {"full":"Bangkok","country":"TH"} |
geo | Available coordinates | {"lat":13.75,"lng":100.56} |
description | Listing description | One-bedroom condo with balcony. |
features | Amenity labels | ["Swimming Pool"] |
images | Photo URLs | ["https://example.com/property.jpg"] |
listedBy | Lister type on Thailand listings | Agent |
person | Available name or lister role | {"name":null,"role":"Agent"} |
org | Available seller or organization name | {"name":"Example Agency"} |
phones | Available contact numbers | [{"value":"+1 555 0100","type":"agent"}] |
emails | Available emails, including their type | [{"value":"name@example.com","type":"platform"}] |
web | Website and contact-channel values | {"website":null,"socials":[]} |
leadSource | Search or detail source of contact fields | detail |
leadReveal | Contact availability classification | visible |
leadAbsences | Reasons for missing contact fields | Reason keyed by address.unit |
scrapedAt | Collection timestamp | 2026-10-24T00:00:00+00:00 |
Read address.full for the address text. Do not assume address is a string. On Thailand listings, listedBy describes a role: it is not a person's name. web.socials can contain platform contact channels rather than the lister's private accounts.
How to scrape Dot Property
- Open Dot Property Scraper in Apify Console.
- Fill a target such as
location,market, orstartUrls. - Set
maxItemsto5for a small first run. - Click Start and wait for the results.
- Open the dataset and download an export, or read it through the API.
An empty input starts a one-row example using the form's sample values: Thailand and bangkok. This is a billed run, not a free preview. Filling one target selects the listings mode automatically; there is no mode field to set.
Property listings
For a search, choose BUY or RENT and a category such as condos, houses, land, or offices. propertyTypes overrides propertyType when non-empty. properties searches all property types together; all expands the main categories supported for the chosen channel.
With no location, the market defaults are bangkok for Thailand, metro-manila for the Philippines, kuala-lumpur for Malaysia, and a national search for Vietnam. These defaults do not mean a whole-country search in every market.
For known pages, use startUrls. Their country, category, and location come from the URLs rather than the search fields. Both search and individual listing links are accepted. A listing link targets that listing, not its neighboring properties.
What to fill in
| Field | What to enter | Default |
|---|---|---|
startUrls | Search or listing links from a supported country site | Empty |
market | TH, PH, MY, VN, or all | Thailand when omitted |
markets | Country-code list; overrides market | Empty |
location | Place name or slug, such as bangkok | Market's default area |
areaSlugs | Thailand areas, such as bangkok/watthana | Empty |
channel | BUY for sale or RENT for rent | BUY |
propertyType | One category, properties, or all | properties |
propertyTypes | Multiple categories; overrides propertyType | [] |
maxItems | Row limit per URL or market, from 1 to 2000 | 70; form example 1 |
scrapeDetails | Add available listing details | true |
locale | Thailand page language: en, th, or empty | Market default |
sliceByArea | Search the component areas of a Thailand location | false |
nationalSlice | With sliceByArea on and location empty, search all included Thailand areas | false |
maxPages | Has no effect on these Actor runs; use maxItems | 1 |
requestDelayMillis | Delay between requests in milliseconds, 0–15000 | 800 |
maxConcurrency | Maximum simultaneous detail requests, 1–8 | 2 |
useGraphql | Alternative Thailand search option; same listing fields | false |
Small search example:
{"market": "TH","location": "bangkok","channel": "BUY","propertyType": "condos","maxItems": 5,"scrapeDetails": true}
maxResultsandlimitare accepted aliases formaxItems.- Unknown fields do not fail the run. Close misspellings can be corrected; other unknown fields are ignored with a note.
- Invalid filters are ignored with a warning. Unusable targets fail before any row is charged, with
INVALID_INPUT: <field> — <how to fix>. The start fee may still apply. - Each run writes its interpretation to
INPUT_REPORTin the default key-value store, including filled, corrected, and ignored fields. - Out-of-range row limits are adjusted to the allowed range. Check
INPUT_REPORTwhen the accepted input differs from what you submitted.
Output example
This illustrative Thailand row uses a placeholder contact number:
{"id": 5782686,"url": "https://www.dotproperty.co.th/en/ads/example_1234567","source": "dotproperty","market": "TH","category": "condos","channel": "BUY","title": "1 Bedroom Condo for sale in Bangkok","price": "฿2,700,000","priceAmount": 2700000,"currency": "THB","numBedrooms": "1","numBathrooms": "1","indoorArea": "24 SqM","address": {"full": "Bangkok", "country": "TH"},"phones": [{"value": "+1 555 0100", "type": "agent"}],"emails": [],"person": {"name": null, "role": "Agent"},"org": null,"leadSource": "detail","leadReveal": "visible","scrapedAt": "2026-10-24T00:00:00+00:00"}
You can export the dataset as JSON, CSV, Excel, XML, RSS, or an HTML table. The RUN_SUMMARY and OUTPUT records contain run counts and warnings; they are not extra property rows.
Why use this Dot Property scraper?
- Row-based charges: result charges apply to rows written to the dataset, not every page attempted.
- Partial results: rows already delivered remain available after a stop. When a timed-out collection returns partial results, those rows can still be delivered; unreturned data is not guaranteed.
- Readable failures: input errors name the field and the correction. Run records distinguish empty searches from failures.
- Missing values stay missing: unavailable listing details are not filled with invented values.
- Multiple inputs: supply several URLs or markets without preparing a separate run for each.
- No proxy configuration: you do not need to set up proxies.
How much does it cost to scrape Dot Property?
The Actor uses pay-per-event pricing. The start event costs $0.005 per allocated GB, with a minimum of one event. At the default 1024 MB, the start charge is $0.005. Platform usage is included in these prices.
| Apify plan | Start at 1024 MB | Price per row | Price per 1,000 rows |
|---|---|---|---|
| Free | $0.005 | $0.003 | $3.00 |
| Starter | $0.005 | $0.003 | $3.00 |
| Scale | $0.005 | $0.0026 | $2.60 |
| Business | $0.005 | $0.0022 | $2.20 |
| Platinum | $0.005 | $0.002 | $2.00 |
| Diamond | $0.005 | $0.0016 | $1.60 |
maxItems applies to each start URL, or each market when URLs are absent. It defaults to 70; larger requests are collected in parts of 70. Categories within one market share its allowance. Detail enrichment does not add another billed row for the same listing.
Free Apify plan runs are capped at 200 rows, and this Actor allows 10 runs on that plan. The whole run also stops at the Maximum cost per run you set in run options, named maxTotalChargeUsd in the API. A requested limit is not a promise that enough matching listings exist.
Example: three search URLs delivering 50 rows each produce 150 rows. On the Free plan at 1024 MB, the charge is 150 × $0.003 + $0.005 = $0.455. A run with no delivered rows has no row charges, but can still incur the start charge.
What happens when the run timeout is too short
If there is insufficient time to wait and automatic resumption is accepted, the Actor pauses rather than treating the wait as a failed search. Its status message reads: "Queued on the collection backend; this run will resume automatically when results are ready (about Ns)." The run temporarily shows as ABORTED.
When results are ready, the same run resumes, delivers to the same dataset, and finishes as SUCCEEDED after successful delivery. It can report "Resumed: delivering N rows." Already delivered rows are skipped rather than delivered and charged twice. You do not need to start another run for this pause.
- Automatic pauses are limited to three per run. Keep the default timeout of 3600 seconds to reduce the need for them.
- Not every timeout or
ABORTEDstatus means a scheduled resumption; read the status message. - Synchronous API endpoints,
run-syncandrun-sync-get-dataset-items, wait at most 300 seconds and can return an empty dataset during a pause. For longer runs, start asynchronously and read the dataset afterSUCCEEDED, or use a success webhook.
Use with AI agents and the API
Apify MCP server
Use this remote MCP URL in Claude, ChatGPT, Cursor, VS Code, or another compatible client:
https://mcp.apify.com?tools=lentic_clockss/dot-property-th-scraper
Sign in with Apify through OAuth when prompted, or send Authorization: Bearer <YOUR_APIFY_TOKEN>. The tool returns run and dataset IDs; read the results with get-dataset-items. Clients without remote MCP support can use npx @apify/actors-mcp-server --tools lentic_clockss/dot-property-th-scraper with APIFY_TOKEN set.
Example prompt: "Get five Bangkok condos for sale from Dot Property, with prices, areas, and listing links."
Apify API
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("lentic_clockss/dot-property-th-scraper").call(run_input={"location": "bangkok", "propertyType": "condos", "maxItems": 5})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item)
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('lentic_clockss/dot-property-th-scraper').call({ location: 'bangkok', propertyType: 'condos', maxItems: 5 });const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
For asynchronous HTTP access, send the input as JSON to POST https://api.apify.com/v2/acts/lentic_clockss~dot-property-th-scraper/runs, using the same authorization header. After completion, read GET https://api.apify.com/v2/datasets/<datasetId>/items?format=json.
Integrations
Use the Actor's Integrations tab to connect results to Google Sheets, Make, Zapier, n8n, Slack, Airtable, or a webhook. Use Apify Schedules for repeated searches.
FAQ
Is it legal to scrape Dot Property?
This Actor collects publicly accessible listing information. You are responsible for complying with the site's terms and applicable data-protection law. Processing personal data requires a lawful basis; public visibility alone does not provide one.
Why did my run end as ABORTED?
An automatic pause can temporarily show ABORTED; look for the message that says the run will resume automatically. A manual abort is different. Check the run status and logs before starting another run.
How many results can I get?
Request up to 2,000 rows per URL or market with maxItems. Available listings, your maximum charge, and Free-plan caps can reduce delivery. Increasing the limit cannot create listings that the source does not show.
Why are some fields empty?
Search cards contain fewer details than listing pages, and not every listing provides every field. Keep scrapeDetails enabled for detail enrichment. Use leadAbsences to interpret missing contact information.
Can I search several countries at once?
Yes. Use markets with TH, PH, MY, and VN, or market: "all". Leave location empty to use each market's default area; one explicit location is applied across the selected markets.
Will I get agent phone numbers and emails?
Not for every listing. Thailand details can provide a visible phone number. Philippines, Malaysia, and Vietnam phone fields remain empty when login-gated. An email with type: "platform" belongs to the platform, not the listing agent. Do not treat it as a personal contact.
Why did a Free-plan run stop at a limit?
The Actor permits ten runs and up to 200 rows per run on the Free Apify plan. These are publisher-set limits. A lower maximum charge can stop delivery sooner.
Why does the Actor name contain th?
The Store name remains lentic_clockss/dot-property-th-scraper from the original Thailand release. Supported markets now also include the Philippines, Malaysia, and Vietnam.
Limitations
- Singapore, Hong Kong, Laos, Indonesia, Cambodia, and Myanmar are not supported markets.
- Agent-directory pages are not supported inputs; use property search or listing links.
- Land is a sale category; serviced apartments are a rental category.
areaSlugs,sliceByArea,nationalSlice, anduseGraphqlapply only to Thailand. Area expansion does not remove row or cost limits.- Addresses are area-level, not guaranteed street or unit addresses. Thailand lister roles must not be read as personal names, and organization names can be absent.
- Contact access restrictions remain in place. Photo, coordinate, and contact completeness varies by listing; a matching search can return zero rows.
Related scrapers
More real estate and property data scrapers from the same publisher:
- Zumper Scraper
- Booli Scraper
- Craigslist Scraper
- PropertyGuru Scraper
- OpenSooq Scraper
- Apartments.com Rental Scraper
- FINN.no Scraper
- Immobiliare.it Scraper
Browse all of our scrapers at apify.com/lentic_clockss.
Support
Report a problem or request a field through the Issues tab of this Actor's page. Include the run ID and the input you used.