# Lamudi Scraper | Philippines Real Estate + Exact GPS Pin (`memo23/lamudi-scraper`) Actor

Scrape lamudi.com.ph — Philippines real-estate listings with the EXACT map-pin coordinates (lat/lng), street-level address, price, beds, baths, floor area, amenities, and full photo gallery. Houses, condos, land — rent or sale. Monitoring mode returns only new listings

- **URL**: https://apify.com/memo23/lamudi-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** Real estate, AI, Agents
- **Stats:** 20 total users, 20 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $1.50 / 1,000 property listings

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Lamudi Philippines Scraper — Real Estate Listings with Precise Map-Pin Coordinates 🏠📍

Scrape **lamudi.com.ph** — one of the Philippines' largest property portals — and get every listing as clean, structured data: price, bedrooms, bathrooms, floor area, amenities, full photo galleries, street-level addresses, and — unlike any other Lamudi scraper — the **exact map-pin latitude/longitude** for every listing, not just a vague "Metro Manila, Makati" text label.

![How Lamudi Scraper works](https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/how-it-works-lamudi.png)

### Why use this scraper?

- 📍 **Precise coordinates on every row** — the exact map pin from the listing's own map (`14.5732687, 121.0005171`), so you can plot listings, compute distances to MRT stations/schools/offices, and run real geo analysis. Competing Lamudi scrapers only return the coarse location text.
- 🏠 **Street-level addresses** — Lamudi listings expose the actual street in their structured data (`"Diamante, San Andres Bukid, Manila"`), and this actor captures it.
- 📞 **Agent name + phone number** — parsed from the listing's public phone-reveal markup, together with the ISO `postedDate`. Most competing scrapers return neither.
- 🏘️ **Complete listing data** — price with currency and rent period, property type, bedrooms, bathrooms, floor area, amenity tags, full description, and the photo gallery in full resolution.
- 🧭 **Three ways to start** — paste any listing URL, paste direct property URLs, or just give it locations + rent/sale + property types and let the actor build the searches.
- 🔁 **Monitoring mode** — run it on a schedule and receive **only new listings** each time. Ideal for deal-alerting, price tracking, and lead generation.
- ⚡ **Fast, HTTP-only pipeline** — no headless browsers. Server-rendered HTML parsed directly; hundreds of listings per minute at low cost.
- 🎁 **Bonus: Dot Property support** — add `dotproperty` to the `sites` input (or paste dotproperty.com.ph URLs) and sweep both major PH portals in one run; every row carries a `source` field.

### What data does it extract?

| Field group | Fields |
|---|---|
| Identity | `listingId`, `listingUrl`, `title`, `name`, `propertyType`, `operation` (rent/sale), `source` |
| 💰 Price | `price.amount`, `price.currency`, `price.period`, plus `rentPrice` / `salePrice` (both set on listings offered for rent AND sale at once) |
| 📍 Location | **`coordinates.latitude` / `coordinates.longitude` (exact map pin)**, `region`, `city`, `locationText` (street-level), `breadcrumbs` |
| 🛏️ Specs | `bedrooms`, `bathrooms`, `usableAreaSqm` |
| 🏊 Amenities | `facilities[]` — 24-hour security, Garage, Balcony, Concierge, … |
| 📝 Content | `description`, `images[]` (full-size gallery), `ogImage` |
| 👤 Agent | `agentName` (publishing agency/agent), `agentPhone`, `agentInfoText`, `postedDate` (published/updated date as ISO `YYYY-MM-DD`) |
| 📧 Contact (opt-in) | `contactEmail`, `contactWebsite`, `emailEnrichment` — only when `enrichEmails` is enabled |

### Use cases

- **Property investment analysis** — map every rental in a barangay with real coordinates, compare ₱/sqm across areas, find under-priced listings near transit.
- **Relocation / OFW search tooling** — build a filtered feed of family-sized houses near a specific office or school using true distance, not location strings.
- **Market monitoring** — schedule with monitoring mode to get only newly posted listings; feed alerts to Slack/Telegram/email via Apify integrations.
- **Lead generation** — agent name + phone number on every listing; find the most active brokers per city and reach them directly.
- **Academic / urban research** — housing price distribution, supply density, amenity coverage across Philippine metros.

### Input configuration

Either paste URLs:

```json
{
    "startUrls": [
        "https://www.lamudi.com.ph/rent/metro-manila/makati/house/",
        "https://www.lamudi.com.ph/property/41032-73-3f893ff3e404-f4bc-19e5841-8dbd-73e3"
    ],
    "maxItems": 200
}
```

Or use the search builder:

```json
{
    "locations": ["Metro Manila", "Cebu"],
    "operation": "rent",
    "propertyTypes": ["houses", "condos"],
    "maxItems": 500
}
```

| Input | Type | Description |
|---|---|---|
| `startUrls` | array | Any lamudi.com.ph listing or property URLs — auto-classified. Takes priority over the search builder. |
| `locations` | array | Location names or slugs ("Metro Manila", "makati", "cebu"). |
| `operation` | string | `rent` (default) or `sale`. |
| `propertyTypes` | array | `properties` (all), `houses`, `condos`, `apartments`, `land`, `offices`. |
| `sites` | array | Defaults to `["lamudi"]`; add `dotproperty` to sweep both portals. |
| `monitoringMode` | boolean | Only return listings not delivered on previous runs. |
| `maxItems` | integer | Hard cap on listings collected (default 1000). |
| `proxy` | object | Proxy settings; a small residential pool is plenty. |
| `enrichEmails` | boolean | Opt-in, experimental: best-effort contact-email discovery for each listing. Adds `contactEmail`, `contactWebsite`, and a detailed `emailEnrichment` object to the row. Default `false`. |

### Output sample

```json
{
    "type": "property",
    "source": "lamudi",
    "listingId": "41032-73-3f893ff3e404-f4bc-19e5841-8dbd-73e3",
    "listingUrl": "https://www.lamudi.com.ph/property/41032-73-3f893ff3e404-f4bc-19e5841-8dbd-73e3",
    "title": "House For Rent in Central Manila",
    "operation": "rent",
    "propertyType": "House",
    "price": { "amount": 70000, "currency": "PHP", "period": "month" },
    "coordinates": { "latitude": 14.5732687, "longitude": 121.0005171 },
    "region": "Metro Manila",
    "city": "Manila",
    "locationText": "Diamante, San Andres Bukid, Manila, Kalakhang Maynila, Pilipinas",
    "bedrooms": 3,
    "bathrooms": 4,
    "usableAreaSqm": 210,
    "facilities": ["24 hours security", "Garage", "Balcony", "Concierge"],
    "description": "House for Rent — newly renovated house …",
    "images": ["https://img.lamudi.com/…full-size…jpg"],
    "agentName": "Fareast Habitat and Settlements. Inc.",
    "agentPhone": "+639177719660",
    "agentInfoText": "7 Apr 2026 - Published by Fareast Habitat and Settlements. Inc.",
    "postedDate": "2026-04-07",
    "scrapedAt": "2026-07-08T03:20:00.000Z"
}
```

Export as **JSON, CSV, Excel, or XML** straight from the Apify dataset, or pull via API into your own pipeline.

### How it works

1. **Classify** every start URL: listing page vs direct property URL.
2. **Walk pagination** on listing pages (`?page=N`) until `maxItems` is reached.
3. **Fetch each property page once** and parse Lamudi's structured-data block: geo coordinates (the precise pin), price specification, address, specs, amenities, plus the photo gallery.
4. **Push one row per listing** — no padding rows, no duplicate charges.

### FAQ

**How are the coordinates different from other Lamudi scrapers?**
Other scrapers return only the location text. This actor extracts the listing's own map-pin latitude/longitude — the same pin you see on the listing's map — precise enough to compute walking distance to an MRT station.

**Does it include the agent's name or phone?**
Yes — every row carries `agentName` (the publishing agency or agent), `agentPhone` (international format, when Lamudi prints one), `agentInfoText` (the listing's own "7 Apr 2026 - Published by …" line), and `postedDate` (that date as ISO `YYYY-MM-DD`). All of it comes from the listing page's public HTML — no login or lead forms are bypassed. Dot Property rows — via the `sites` input — include agent name, city, and listing count, but not the phone (Dot Property gates it behind login).

**Can it find contact emails?**
Optionally — enable `enrichEmails` and the actor makes a best-effort attempt to discover a contact email per listing, adding `contactEmail`, `contactWebsite`, and an `emailEnrichment` detail object to the row. It is experimental and off by default; rows without a discoverable email simply leave the fields `null`.

**Can I only get new listings on repeat runs?**
Yes — enable `monitoringMode`. The first run seeds a private per-user baseline; every later run returns only listings you haven't received before, and skipped listings are never charged.

**Does it work for sale listings as well as rentals?**
Yes — both, across houses, condos, apartments, land, and commercial.

**What about listings offered for rent AND sale at the same time?**
Some Lamudi listings carry two prices. Both are returned: `rentPrice` (with monthly period) and `salePrice`, while `price` reflects the operation context the listing was found under. Single-operation listings fill only the matching field.

**Are monitoring IDs kept separate per portal?**
Yes — delivered-listing IDs are namespaced by portal (`dp_…` / `lm_…`) in your private per-user store, so Dot Property and Lamudi IDs can never collide or cause a listing to be skipped incorrectly.

**How many listings can it handle?**
Broad searches match tens of thousands of listings. Use `maxItems` to cap the run; the actor streams results as it goes.

### Support & feature requests

Found an issue or need an extra field? Open an issue in the **Issues** tab of this actor in the Apify Console — we typically respond within 24 hours.

### Additional services

Need a custom scraper, a private variant of this actor, delivery to your own database, or a different property portal covered? Reach out via the Apify contact form.

### Explore more scrapers

Check out our other actors on the [memo23 Apify profile](https://apify.com/memo23) — job boards, real estate, travel, e-commerce, and lead-generation scrapers.

### 🤖 For AI Agents & LLM Apps

Compact reference for AI agents calling this actor via the [Apify MCP server](https://mcp.apify.com) or the Apify API (actor: `memo23/lamudi-scraper`).

**Purpose:** scrape Philippine real-estate listings from lamudi.com.ph into structured JSON rows, each with the listing's exact map-pin `coordinates` (latitude/longitude), street-level address, and the agent's name + phone.

**Minimal input — search mode:**

```json
{ "locations": ["Makati"], "operation": "rent", "propertyTypes": ["condos"], "maxItems": 50 }
```

**Minimal input — URL mode:** `{ "startUrls": ["<any lamudi.com.ph listing/property URL>"], "maxItems": 50 }` — URLs are auto-classified; `startUrls` takes priority over the search-builder fields.

**Output:** one dataset row per listing: `listingId`, `listingUrl`, `title`, `operation` (rent/sale), `propertyType`, `price {amount, currency, period}`, `coordinates {latitude, longitude}`, `region`, `city`, `locationText` (street-level), `bedrooms`, `bathrooms`, `usableAreaSqm`, `facilities[]`, `description`, `images[]`, `agentName`, `agentPhone`, `postedDate`, `source`.

**Behaviors an agent should know:**

- Always set `maxItems` — broad searches match tens of thousands of listings.
- `monitoringMode: true` returns only listings not delivered on previous runs (per-user state); use for scheduled change-tracking.
- `sites: ["lamudi", "dotproperty"]` sweeps both major PH portals in one run; default is Lamudi only.
- Listings offered for rent AND sale return both `rentPrice` and `salePrice`.
- `enrichEmails: true` (experimental, off by default) adds best-effort `contactEmail` / `contactWebsite` fields.
- Billing is pay-per-event on delivered listing rows; listings skipped by monitoring mode are never charged.

### ⚠️ Disclaimer

This actor is not affiliated with, endorsed by, or sponsored by Lamudi, Lifull Connect, or any of their subsidiaries. It only accesses publicly available data that any visitor can see in a browser, and it does not bypass authentication or access controls. You are solely responsible for how you use the extracted data and for complying with applicable laws, the target website's terms of service, and data-protection regulations (including the Philippine Data Privacy Act) in your jurisdiction. Use reasonable request rates. If you plan to republish or commercialize scraped data, obtain independent legal advice first.

### SEO Keywords

lamudi scraper, lamudi.com.ph scraper, lamudi philippines data, philippines real estate scraper, philippines property data, manila property listings scraper, makati condo rental data, cebu property scraper, philippines rental listings api, property listing coordinates latitude longitude, real estate data extraction philippines, philippines housing market data, condo for sale data philippines, house for rent scraper manila, property market monitoring philippines, lamudi api alternative

# Actor input Schema

## `startUrls` (type: `array`):

Full lamudi.com.ph URLs to crawl. Mix listing and property URLs in the same array if useful. Takes priority over the location builder below.

## `locations` (type: `array`):

Location names or slugs — e.g. "Metro Manila", "makati", "Cebu". Case and spaces don't matter; they're slugified automatically.

## `operation` (type: `string`):

Whether to search rental listings or listings for sale. Used with Locations.

## `propertyTypes` (type: `array`):

Which property types to search. `properties` means all types. Used with Locations. (Lamudi routes: houses, condos, apartments, land, offices→commercial; townhouses/villas exist only on Dot Property.)

## `sites` (type: `array`):

Which portals the location builder searches. Defaults to Lamudi in this actor; add `dotproperty` to also sweep dotproperty.com.ph in the same run (every row carries a `source` field).

## `monitoringMode` (type: `boolean`):

When enabled, listings whose ID has already been delivered to you are silently skipped (no detail page is fetched and no charge applies for them). The first run after enabling monitoring returns every match — that builds your baseline. Every subsequent run returns only new listings. Combine with Apify's scheduler for a 'listings posted since last run' feed.

## `resetMonitoringState` (type: `boolean`):

One-shot toggle: clear the saved 'listings already seen' record at the start of this run. Use this when you change search URL, want to rebuild the baseline, or recover from a missed delivery. Has no effect when monitoring mode is off.

## `enrichEmails` (type: `boolean`):

If enabled, finds a contact email for each result from its own website (or by discovering it from the name). Adds contactEmail + contactWebsite columns plus a detailed emailEnrichment object. Best-effort.

## `maxItems` (type: `integer`):

Hard cap on the number of listings collected. Broad searches on Lamudi can match tens of thousands of listings; use this cap to limit billing.

## `maxConcurrency` (type: `integer`):

Maximum number of listing detail pages processed in parallel.

## `minConcurrency` (type: `integer`):

Minimum number of listing detail pages processed in parallel.

## `maxRequestRetries` (type: `integer`):

Number of retries before a failed request is given up.

## `proxy` (type: `object`):

Leave empty — the actor already routes all traffic through its own built-in residential proxy at no extra cost to you. Only set this if you want to use your own proxies.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.lamudi.com.ph/rent/metro-manila/makati/house/"
  ],
  "operation": "rent",
  "propertyTypes": [
    "properties"
  ],
  "sites": [
    "lamudi"
  ],
  "monitoringMode": false,
  "resetMonitoringState": false,
  "enrichEmails": false,
  "maxItems": 1000,
  "maxConcurrency": 10,
  "minConcurrency": 1,
  "maxRequestRetries": 5
}
```

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrls": [
        "https://www.lamudi.com.ph/rent/metro-manila/makati/house/"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/lamudi-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "startUrls": ["https://www.lamudi.com.ph/rent/metro-manila/makati/house/"] }

# Run the Actor and wait for it to finish
run = client.actor("memo23/lamudi-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrls": [
    "https://www.lamudi.com.ph/rent/metro-manila/makati/house/"
  ]
}' |
apify call memo23/lamudi-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=memo23/lamudi-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/pluvAdAq8V2eP3NuU/builds/oBhg1wD7FgjFKMO0y/openapi.json
