Dot Property Scraper - TH, PH, MY & VN Listings avatar

Dot Property Scraper - TH, PH, MY & VN Listings

Pricing

from $2.20 / 1,000 results

Go to Apify Store
Dot Property Scraper - TH, PH, MY & VN Listings

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

kane liu

Maintained by Community

Actor stats

1

Bookmarked

6

Total users

1

Monthly active users

6 hours ago

Last modified

Security

Limited permissions

Share

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 markets or set market to all.
  • Thailand areas: use areaSlugs, or expand a location with sliceByArea.
  • Detail enrichment: scrapeDetails is 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.

FieldDescriptionExample
idListing identifier5782686
urlListing page linkhttps://www.dotproperty.co.th/en/ads/example_1234567
marketCountry site codeTH
categorySearch categorycondos
channelSale or rental channelBUY
titleListing title1 Bedroom Condo for sale in Bangkok
projectNameProject name when shownExample Residence
priceDisplayed price text฿2,700,000
priceAmountNumeric asking price2700000
currencyCurrency codeTHB
numBedroomsBedroom count1
numBathroomsBathroom count1
propertyTypeDisplayed property typeCondo
indoorAreaIndoor area with units24 SqM
plotSizeLand area when listed100 SqM
addressArea-level address object{"full":"Bangkok","country":"TH"}
geoAvailable coordinates{"lat":13.75,"lng":100.56}
descriptionListing descriptionOne-bedroom condo with balcony.
featuresAmenity labels["Swimming Pool"]
imagesPhoto URLs["https://example.com/property.jpg"]
listedByLister type on Thailand listingsAgent
personAvailable name or lister role{"name":null,"role":"Agent"}
orgAvailable seller or organization name{"name":"Example Agency"}
phonesAvailable contact numbers[{"value":"+1 555 0100","type":"agent"}]
emailsAvailable emails, including their type[{"value":"name@example.com","type":"platform"}]
webWebsite and contact-channel values{"website":null,"socials":[]}
leadSourceSearch or detail source of contact fieldsdetail
leadRevealContact availability classificationvisible
leadAbsencesReasons for missing contact fieldsReason keyed by address.unit
scrapedAtCollection timestamp2026-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

  1. Open Dot Property Scraper in Apify Console.
  2. Fill a target such as location, market, or startUrls.
  3. Set maxItems to 5 for a small first run.
  4. Click Start and wait for the results.
  5. 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

FieldWhat to enterDefault
startUrlsSearch or listing links from a supported country siteEmpty
marketTH, PH, MY, VN, or allThailand when omitted
marketsCountry-code list; overrides marketEmpty
locationPlace name or slug, such as bangkokMarket's default area
areaSlugsThailand areas, such as bangkok/watthanaEmpty
channelBUY for sale or RENT for rentBUY
propertyTypeOne category, properties, or allproperties
propertyTypesMultiple categories; overrides propertyType[]
maxItemsRow limit per URL or market, from 1 to 200070; form example 1
scrapeDetailsAdd available listing detailstrue
localeThailand page language: en, th, or emptyMarket default
sliceByAreaSearch the component areas of a Thailand locationfalse
nationalSliceWith sliceByArea on and location empty, search all included Thailand areasfalse
maxPagesHas no effect on these Actor runs; use maxItems1
requestDelayMillisDelay between requests in milliseconds, 0–15000800
maxConcurrencyMaximum simultaneous detail requests, 1–82
useGraphqlAlternative Thailand search option; same listing fieldsfalse

Small search example:

{
"market": "TH",
"location": "bangkok",
"channel": "BUY",
"propertyType": "condos",
"maxItems": 5,
"scrapeDetails": true
}
  • maxResults and limit are accepted aliases for maxItems.
  • 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_REPORT in the default key-value store, including filled, corrected, and ignored fields.
  • Out-of-range row limits are adjusted to the allowed range. Check INPUT_REPORT when 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 planStart at 1024 MBPrice per rowPrice 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 ABORTED status means a scheduled resumption; read the status message.
  • Synchronous API endpoints, run-sync and run-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 after SUCCEEDED, 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 ApifyClient
client = 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

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, and useGraphql apply 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.

More real estate and property data scrapers from the same publisher:

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.