Dot Property + Lamudi PH Scraper | Philippines Property avatar

Dot Property + Lamudi PH Scraper | Philippines Property

Pricing

from $1.00 / 1,000 listing results

Go to Apify Store
Dot Property + Lamudi PH Scraper | Philippines Property

Dot Property + Lamudi PH Scraper | Philippines Property

Scrape Philippines property listings from dotproperty.com.ph and lamudi.com.ph with exact map-pin coordinates, price, beds, baths, areas, facilities, full photo galleries, and agent contact details. Covers houses, condos, apartments, townhouses, villas, land, offices and commercial units, for.

Pricing

from $1.00 / 1,000 listing results

Rating

0.0

(0)

Developer

Abot API

Abot API

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 days ago

Last modified

Share

DotProperty.com.ph and Lamudi.com.ph Scraper: Philippines Property Listings with Exact Map Coordinates

DotProperty.com.ph and Lamudi.com.ph Scraper turns the two largest property portals in the Philippines into one clean real estate data feed. Search by location, rent or sale, and property type, paste in search-result pages, or paste direct listing links, and get price, bedrooms, bathrooms, usable and land area, exact map-pin coordinates, facilities, the full photo gallery and agent contact details for houses, condos, apartments, townhouses, villas, land and offices. Every row carries a source field so you always know which portal it came from. Schedule it to run on a recurring basis with Incremental mode to get only what changed, then export the dataset to JSON, CSV or Excel, or read it through the API.

Why This Scraper?

  • Two portals, one dataset. DotProperty.com.ph and Lamudi.com.ph in the same run; every row carries a source field so you can always tell which portal it came from. Portals are walked one at a time and share the same Max listings budget in the order listed, so a small budget with both portals selected can return only the first portal's rows; raise Max listings if you want a real mix of both.
  • Exact map-pin coordinates. Latitude and longitude come from each listing's own detail page, not a rough city-level guess.
  • Full listing detail on demand. Price with currency and rent period, property type, bedrooms, bathrooms, usable and land area, floor, facilities, full description, complete photo gallery and agent contact details, switched on with one setting.
  • Three ways to start. Build a search from location, operation and property-type filters, paste search-result pages, or paste direct listing links from either portal; all three are auto-classified.
  • Built for recurring monitoring. Incremental mode tags every listing NEW, UPDATED, UNCHANGED, REAPPEARED or EXPIRED against your own saved baseline, so a scheduled run reports only what changed.
  • Resume without losing progress. Continue one interrupted run from a pasted run or dataset id; listings it already collected are skipped, not re-scraped and not billed again.
  • Pay only for what was actually collected. The per-listing detail-enrichment fee applies only to listings whose detail page was successfully read; a listing that could not be enriched keeps its search-result fields and is not charged the extra fee.

Use Cases

  • Real estate investment research: track prices, price per square meter and unit availability for condos, houses and land across Metro Manila, Cebu and other cities.
  • Broker and agency lead generation: collect agent names, phone numbers and profile links attached to active listings in a target area.
  • Rental market monitoring: schedule recurring runs with Incremental mode to catch new listings and price changes on a rent-focused search.
  • Map-based property tools: feed the exact latitude and longitude from listing detail pages into your own map, comparables or valuation tool.
  • Competitive monitoring for developers and agencies: watch a development's or area's listings for new units, price changes, and units marked EXPIRED when withdrawn.

Data You Get

Sample shape: values are illustrative placeholders, not from a live record.

FieldExample
source"dotproperty" (also "lamudi")
id / listing_id"example-0000-1111-2222-000000000001"
url"https://www.dotproperty.com.ph/ads/example-condo-for-sale-in-example-city_example-0000-1111-2222-000000000001"
title"2 Bedroom Condo for Sale in Example City"
operation"sale" (also "rent", lamudi listings only)
property_type"Condo" (lamudi listings only)
price6500000
currency"PHP"
price_period"month" (rent listings only)
price_per_sqm130000
bedrooms / bathrooms2 / 2
usable_area_sqm / land_area_sqm50 / null (land area applies to houses, land and townhouses)
latitude / longitude14.5547 / 121.0244
location_source"detail_page" (set once the detail page supplied the coordinates)
region / city"Metro Manila" / "Example City" (lamudi listings only)
facilities["Swimming pool", "Gym", "24-hour security"]
images / image_count["https://img.example.com/listing/1.jpg", "https://img.example.com/listing/2.jpg"] / 2
agent_name / agent_phone"Example Realty Group" / "+63 900 000 0000"
agent_listing_count42
changeType"NEW" (also "UPDATED", "UNCHANGED", "REAPPEARED", "EXPIRED"; Incremental mode only)

Every listing also carries a full description and a breadcrumb trail of location names. dotproperty listings additionally carry a floor number, the portal's own listing-ID text, and an agent profile URL and verified-seller flag; lamudi listings additionally carry a street address, car park count, contract duration on rentals, and a list of nearby points of interest with their own coordinates. Incremental mode adds changedFields, firstSeenAt and lastSeenAt alongside changeType.

How to Use

  1. Pick a mode: search (build a search from filters) or url (paste one or more dotproperty.com.ph or lamudi.com.ph pages).
  2. In search mode, choose the portals, operation (sale or rent), property types and locations, plus any price, bedroom or floor-area filters.
  3. Set Max listings (and optionally Max pages) to size the run, and choose whether to fetch full detail pages.
  4. Click Start, then download the dataset as JSON, CSV or Excel, or read it through the API.

Search condos for sale in Makati on both portals:

{
"mode": "search",
"sites": ["dotproperty", "lamudi"],
"operation": "sale",
"propertyTypes": ["condos"],
"locations": ["Makati"],
"maxItems": 50
}

Filtered search: houses for rent in Cebu with a price, bedroom and area floor:

{
"mode": "search",
"sites": ["dotproperty"],
"operation": "rent",
"propertyTypes": ["houses"],
"locations": ["Cebu"],
"minPrice": 20000,
"maxPrice": 60000,
"minBedrooms": 3,
"minSqm": 100,
"maxItems": 100
}

Paste search or listing pages from either portal:

{
"mode": "url",
"urls": [
"https://www.dotproperty.com.ph/properties-for-sale/metro-manila/makati",
"https://www.lamudi.com.ph/rent/metro-manila/quezon-city/apartment/"
],
"maxItems": 100
}

Recurring monitoring: only new, changed or withdrawn condo listings:

{
"mode": "search",
"sites": ["dotproperty"],
"operation": "sale",
"propertyTypes": ["condos"],
"locations": ["Makati"],
"incrementalMode": true,
"emitExpired": true,
"maxItems": 300
}

For EXPIRED to ever fire, Max listings has to be set comfortably above the search's real total, so the run reaches the natural end of every search and pasted URL instead of stopping early on the cap. maxItems: 0 is rejected by the input form (the minimum is 1); leave it at a real number sized to your search, and narrow the scope (one portal, one city, one property type) to keep run time and cost predictable.

Run it from your code

Python:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("abotapi/dotproperty-com-ph-scraper").call(run_input={
"mode": "search", "sites": ["dotproperty", "lamudi"], "operation": "sale",
"propertyTypes": ["condos"], "locations": ["Makati"], "maxItems": 50,
})
for listing in client.dataset(run["defaultDatasetId"]).iterate_items():
print(listing.get("title"), listing.get("price"), listing.get("currency"))

JavaScript:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('abotapi/dotproperty-com-ph-scraper').call({
mode: 'search', sites: ['dotproperty', 'lamudi'], operation: 'sale',
propertyTypes: ['condos'], locations: ['Makati'], maxItems: 50,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();

Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.

Detail enrichment and what it costs

Fetch detail pages is ON by default. When it is on, listings found through search results or pasted search pages are enriched with exact coordinates, facilities, the full photo gallery, description and agent contact details, and each one that is successfully enriched carries a per-listing detail-enrichment charge. A listing whose detail page could not be read (blocked, removed, or came back with no usable data) keeps only its search-result fields and is never charged that fee. A pasted single-listing URL is always fetched in full and, if it loads successfully, always carries the detail-enrichment charge; the Fetch detail pages setting has no effect on that path, because a pasted listing page has no separate search-result row to fall back to.

Resume and recurring updates

  • Resume (resumeFromRunId) continues one interrupted run: paste its run or dataset id and every listing it already collected is skipped, not re-fetched or billed again. The resumed run still walks each search or pasted URL from its first page, so it can take a little longer to catch up, but because only newly-collected listings count against Max listings, the run naturally reaches pages the earlier run never got to. If the earlier run stopped because it hit Max pages rather than Max listings, raise Max pages on the resumed run too, or it will stop at the same page again.
  • Incremental mode (incrementalMode) is for recurring runs over the same search. Each listing is classified NEW, UPDATED (with changedFields), UNCHANGED (suppressed, and not billed, unless emitUnchanged is on), or EXPIRED. A listing is only ever marked as no longer present when Emit expired listings was on for a run that walked every search and pasted URL to its own natural end, with no Max listings cap reached and no Resume involved; a partial or resumed run leaves the previous state untouched instead of guessing. REAPPEARED can therefore only happen to a listing that a previous complete, Emit-expired run had already marked EXPIRED and a later run found again; it never fires on a listing's first-ever appearance. stateKey is optional: leave it blank to auto-derive the tracked scope from your search filters, or set it to merge two different searches into one monitoring campaign.

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.

  1. Authorize a connector once under Apify → Settings → Integrations (Notion, Linear, Airtable, or Apify).
  2. Select it in the "Pipe results into your apps" input field. (If the picker is empty, you haven't authorized a connector yet.)
  3. For Notion, also set notionParentPageUrl to 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

ParameterTypeDefaultDescription
modestring(prefill: search)search builds URLs from the filters below; url uses pasted dotproperty.com.ph or lamudi.com.ph pages.
sitesarray(prefill: both portals)Which portals to search: dotproperty, lamudi, or both.
operationstringsalesale or rent.
propertyTypesarray(prefill: ["properties"])properties (all), houses, condos, apartments, townhouses, villas, land, offices.
locationsarray(prefill: ["Metro Manila"])Location names or slugs, e.g. Metro Manila, Makati, Cebu. Search mode only.
minPriceinteger-Minimum price in PHP. Leave empty for no minimum.
maxPriceinteger-Maximum price in PHP. Leave empty for no maximum.
minBedroomsinteger-Minimum number of bedrooms (0 = studio).
minSqminteger-Minimum usable floor area in square meters.
sortstringnewestSort order on dotproperty: newest, min_price, max_price, or relevance. Lamudi always uses its own relevance order.
urlsarray(prefill: sample URLs)One or more dotproperty.com.ph or lamudi.com.ph search or listing pages. URL mode only.
maxItemsinteger20Cap on listings collected across all searches and pasted search/category URLs, shared portal by portal in the order listed. Pasted single listing URLs are not counted against this cap; each one is always fetched and billed.
maxPagesinteger-Optional page cap per search. Leave empty for no page limit; the run stops at Max listings instead.
fetchDetailsbooleantrueEnrich results with exact coordinates, facilities, full gallery, description and agent contacts. Adds a per-listing detail-enrichment charge for listings it successfully enriches.
proxyobject(prefill: Apify Proxy, PH)Connection settings for the run.
resumeFromRunIdstring-Paste a previous run or dataset id to continue that one interrupted crawl.
incrementalModebooleanfalseRecurring monitoring: remembers the previous run of this same search and classifies each listing as NEW, UPDATED, UNCHANGED, REAPPEARED or EXPIRED.
stateKeystring-Optional manual key to control which runs share incremental state.
emitUnchangedbooleanfalseIncremental mode: also return (and bill) listings with no detected change.
emitExpiredbooleanfalseIncremental mode: also return (and bill) listings no longer found, after a complete, uncapped, non-resumed scan.
mcpConnectorsarray-MCP connectors to also deliver results into (Notion, Linear, Airtable, Apify). Leave empty to skip.
notionParentPageUrlstring-Notion connector only: URL or id of the page under which item pages are created. Ignored by other connectors.
maxNotifyListingsinteger50Cap on items written to each connector per run. Does not affect the dataset.

Output Example

Sample shape: values are illustrative placeholders, not from a live record.

{
"id": "example-0000-1111-2222-000000000001",
"listing_id": "example-0000-1111-2222-000000000001",
"source": "dotproperty",
"url": "https://www.dotproperty.com.ph/ads/example-condo-for-sale-in-example-city_example-0000-1111-2222-000000000001",
"title": "2 Bedroom Condo for Sale in Example City",
"price": 6500000,
"currency": "PHP",
"price_per_sqm": 130000,
"bedrooms": 2,
"bathrooms": 2,
"usable_area_sqm": 50,
"floor": 12,
"latitude": 14.5547,
"longitude": 121.0244,
"location_source": "detail_page",
"breadcrumbs": ["Philippines", "Metro Manila", "Example City"],
"facilities": ["Swimming pool", "Gym", "24-hour security", "Function room"],
"images": [
"https://img.example.com/listing/1.jpg",
"https://img.example.com/listing/2.jpg"
],
"image_count": 2,
"og_image": "https://img.example.com/listing/1.jpg",
"description": "Bright 2 bedroom unit with balcony and city view, close to Example City's main business district.",
"listing_id_text": "EX-000123",
"agent_name": "Example Realty Group",
"agent_phone": "+63 900 000 0000",
"agent_url": "https://www.dotproperty.com.ph/agency/example-realty-group",
"agent_listing_count": 42,
"agent_verified": true
}

Plan Requirement

Connection settings default to Apify Proxy with no specific group selected, and the run automatically retries with a different connection when one is refused. A Philippines country pin only takes effect once you pick a proxy group under Proxy configuration. For a run that keeps getting blocked, switch the connection group to residential for more headroom.

FAQ

How much does it cost?

You pay a per-listing fee for every row returned in the dataset, plus a separate detail-enrichment fee only for listings whose detail page was actually read successfully. A pasted single-listing URL always carries the detail-enrichment fee when it loads. The Pricing tab shows the current rates. Use Max listings to cap the cost of any run.

This actor collects only publicly available property listing data. You are responsible for how you use it: follow each portal's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Listing facts such as price, size and location are generally facts, but photos and agent-submitted text 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. Unchanged listings are then suppressed and not billed unless you turn on Emit unchanged listings, and withdrawn listings are only reported once a run completes a full, uncapped scan with Emit expired listings on.

Why did I get fewer listings than expected, or none at all?

Each search or pasted URL is walked independently: if one location or portal is temporarily unreachable, the run still returns everything it could read from the others rather than failing the whole run. Check the run log for pages it could not read, then run it again, raise Max pages, or switch the connection group under Proxy configuration.

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:

🏠 Rent.com Scraper
Extract rental listings from rent.com. Get comprehensive data including monthly rent...
🏨 Hipflat Scraper [
Scrape hipflat.co.th property listings and new-project data across Thailand: price, price...
🏠 DDProperty TH
From $1/1K. Extract property listings from ddproperty.com Thailand at scale. Get...
🏠 591.com.tw Scraper
Extract property listings from 591房屋交易網 591.com.tw, Taiwan’s largest real estate...
🏠 Bayut.com Scraper
From $0.80/1K. Scrape Bayut.com property listings with prices, beds, baths, area, GPS...
🏠 REIWA AU
Collect Western Australia real estate data from REIWA.com.au across sale, rental, sold...

👉 Browse all abotapi scrapers

💬 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.