# Lamudi Philippines Scraper with Contacts & Features (`fatihtahta/lamudi-ph-property-scraper`) Actor

Collect structured public property listing records from Lamudi Philippines. Start from locations, search pages, or direct listing URLs when supported, then save CleanedWeb records to the default dataset for market research, monitoring, CRM, BI, ETL, and property workflows.

- **URL**: https://apify.com/fatihtahta/lamudi-ph-property-scraper.md
- **Developed by:** [Fatih Tahta](https://apify.com/fatihtahta) (community)
- **Categories:** Real estate, Automation, Agents
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.70 / 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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 PH Property Scraper

**Slug:** `fatihtahta/lamudi-ph-property-scraper`

### Overview

Lamudi PH Property Scraper collects structured public property listing records from Lamudi Philippines, including listing identity, sale or rental mode, asking price, property attributes, location fields, media links, source context, and optional enriched detail fields when available. [Lamudi Philippines](https://www.lamudi.com.ph/) is a public real estate marketplace for residential, commercial, land, rental, and sale listings across the Philippines, making it useful for monitoring visible inventory and researching market segments. The actor helps property researchers, investors, brokers, analysts, proptech teams, and operators turn public listing pages into repeatable JSON records. Users can start from a location-based query, filtered search criteria, direct Lamudi search URLs, or direct listing URLs. Results are delivered as structured dataset records suitable for review, export, ETL pipelines, BI dashboards, AI-agent workflows, and downstream processing. The actor is designed for dependable recurring public data acquisition and consistent output handling, while the exact fields and listing availability depend on what Lamudi publicly exposes at run time.

### What Makes This Actor Different

- **Pipeline-ready property records:** Each dataset item is a grouped `property_listing` JSON record with stable top-level objects such as `source_context`, `entity`, `listing`, `pricing`, `location`, `property`, `media`, `contact_details`, `relationships`, and `attributes`.
- **Deduplication-friendly identity:** The output includes `record_id`, `url`, `listing.listing_id`, `property.property_id`, and source identifiers under `source_context.external_ids` when available, giving data teams several supported keys for upserts and repeated-run comparison.
- **Structured search and direct URL modes:** Users can build a Lamudi search from `location`, `deal_type`, property type, price, room count, area, amenities, foreclosure handling, freshness, and sort fields, or paste direct Lamudi search/listing URLs for repeatable known scopes.
- **Optional richer listing details:** `enrich_data` is available for runs that need fuller listing records, such as amenities, land area, agency/contact signals, source-specific detail fields, and enriched availability indicators when Lamudi exposes them.
- **Run summary artifacts:** Each run can produce `RUN-SUMMARY` and `RUN-SUMMARY.html` artifacts with saved listing counts, input summary, enrichment counts, coverage counts, representative records, map readiness, and stop reason.
- **Map-ready review:** Listings can include `location.latitude` and `location.longitude`, and the actor writes a stable `results-map` artifact for coordinate-capable runs so teams can inspect listing distribution visually.
- **Agentic usability:** The input schema, field reference, output example, stable identifiers, and run artifacts are designed to support AI agents, workflow automations, search indexes, vector stores, CRMs, and BI pipelines without private context.
- **Field-preserving grouped contract:** Meaningful schema-supported listing, property, pricing, location, media, contact, agency, and source values are grouped into documented public objects instead of being flattened into ambiguous columns.

### Who Should Use This Actor

- **Real estate investors and analysts:** collect public asking prices, locations, property types, room counts, and visible availability signals for market research and comparable listing review.
- **Brokerages, agencies, and property operations teams:** monitor public listing inventory, refresh known listing URLs, and route structured records into CRM or operations workflows.
- **Market research and analytics teams:** build repeatable datasets for supply monitoring, price-band analysis, location coverage, category movement, and dashboard reporting.
- **Proptech, data engineering, and product teams:** ingest nested JSON records into warehouses, APIs, search indexes, enrichment services, or listing intelligence products.
- **AI agents and workflow automations:** run scoped property-data acquisition tasks, inspect run summaries, use stable identifiers, and hand records to downstream review or enrichment steps.
- **Lead generation and enrichment teams:** add current public listing context, source URLs, agency details, contact signals, amenities, and property attributes to internal records when available.
- **Monitoring and operations teams:** schedule recurring runs to compare public listing records across time and flag new, removed, repriced, or changed records in downstream systems.

### Common Use Cases

- **Market intelligence:** monitor public property supply, asking prices, location distribution, property types, amenities, availability labels, and category movement.
- **Comparable listing research:** collect public listing attributes for a specific city, neighborhood, property type, room count, floor area, land area, or price segment.
- **Competitive monitoring:** track visible listing activity across agencies, locations, property categories, and recurring saved searches.
- **Catalog and listing database building:** populate internal property or listing tables with structured public records and stable source URLs.
- **Data enrichment:** append current Lamudi listing details to CRM, BI, underwriting, portfolio, lead-review, or analytics datasets.
- **Recurring reporting:** schedule periodic runs for market snapshots, inventory reports, alerts, dashboards, or analyst review queues.
- **Agentic research workflows:** let an internal agent collect a scoped dataset, read the run summary, summarize changes, and route records to the next workflow step.
- **Map-based review:** use coordinate-capable records and the `results-map` artifact to inspect where collected listings are distributed.

### Real-World Questions This Data Can Answer

- Which public Lamudi listings match a specific location, listing mode, property type, price band, room count, area range, amenity set, or freshness filter?
- Which listings are visible for sale versus rent in a target market segment?
- Which properties have enough structured attributes to support enrichment, review, monitoring, or BI workflows?
- Which records have coordinates and can be reviewed on a map?
- Which listings appear new, removed, repriced, or changed when compared with a previous internal dataset?
- Which cities, regions, property types, room counts, or price ranges are most visible in the collected segment?
- Which runs need follow-up because they returned fewer records, fewer coordinates, fewer enriched details, or unexpected optional-field coverage?

### Quick Start

1. Choose a location-based search, direct Lamudi search URL, or direct listing URL.
2. Set a small `limit`, such as 10 or 25, for the first validation run.
3. Choose `deal_type` and any filters that define the target property segment.
4. Run the actor in Apify Console.
5. Inspect the first dataset records and the run summary artifacts.
6. Increase the limit, add scheduling, export the dataset, or connect downstream workflows after the output shape is verified.

### Input Parameters

The actor supports location/query-based collection, direct Lamudi URL collection, optional detail enrichment, result limits, and optional MCP summary delivery.

| Parameter | Type | Description | Default |
| --- | --- | --- | --- |
| `location` | string | City, province, neighborhood, or market supported by Lamudi Philippines, such as Metro Manila, Quezon City, Cebu, or Pampanga. Use one focused market per run for cleaner comparison. | - |
| `deal_type` | string | Listing mode for structured searches. Allowed values: `buy`, `rent`. | `buy` |
| `property_type` | array of strings | One or more Lamudi property groups or types. Allowed values: `gt-apartment`, `room`, `gt-commercial`, `building`, `offices`, `retail`, `service-office`, `warehouse`, `gt-condo`, `condotel`, `loft`, `penthouse`, `studio`, `gt-house`, `beach-house`, `single-family-house`, `townhouse`, `villas`, `gt-land`, `agricutural-lot`, `beach-lot`, `commercial-lot`, `residential-lot`. | - |
| `enrich_data` | boolean | Collect richer listing details when available, such as amenities, agency/contact signals, land area, and detail-page context. Turn off for faster validation when standard fields are enough. | `true` |
| `sort_by` | string | Sort order for Lamudi search results. Allowed values: `popularity`, `newest`, `price-low`, `price-high`. | `popularity` |
| `min_price` | integer | Minimum asking price or rent in PHP. Use with `max_price` for a budget band. | - |
| `max_price` | integer | Maximum asking price or rent in PHP. | - |
| `bed_count` | array of strings | Bedroom counts to include. Allowed values: `1`, `2`, `3`, `4`, `5` where `5` represents 5+. | - |
| `bathroom_count` | array of strings | Bathroom counts to include. Allowed values: `1`, `2`, `3`, `4`, `5` where `5` represents 5+. | - |
| `min_floor_area` | integer | Minimum floor area in square meters. | - |
| `max_floor_area` | integer | Maximum floor area in square meters. | - |
| `min_land_area` | integer | Minimum land or plot area in square meters. Useful for land, lots, warehouses, and larger commercial properties. | - |
| `max_land_area` | integer | Maximum land or plot area in square meters. | - |
| `foreclosed_property` | string | Foreclosure handling. Allowed values: `included`, `excluded`, `yes` where `yes` means only foreclosed properties. | `included` |
| `amenities` | array of strings | Amenities or property features that matching listings should include. Supported values include security, guardhouse, CCTV, concierge, alarm, 24-hour security, roof garden, swimming pool, gym, sauna, jacuzzi, tennis court, playground, multipurpose room, terrace, balcony, garden, garage, internet, WiFi, air conditioning, heating, fireplace, water, electricity, built-in wardrobe, lift, furnished, equipped kitchen, storage room, office, and other schema-listed options. | - |
| `publication_date` | string | Freshness window. Allowed values: `1` for last 24 hours, `7` for last 7 days, `30` for last 30 days. | - |
| `url` | array of strings | Direct Lamudi search, category, filtered results, listing, or supported source URLs. Use this when the target scope is already defined on Lamudi or when refreshing known property pages. | - |
| `limit` | integer | Maximum number of property listing records to save. Start small for validation, then increase for monitoring or export runs. | - |
| `mcpConnectors` | array | Optional user-authorized Apify MCP connectors for post-run delivery of a concise listing summary with dataset, report, and map links when available. | `[]` |

### Choosing Inputs

Use structured query fields when you want the actor to define a focused Lamudi search from location and filters. Start with `location` and `deal_type`, then add property type, price, bedrooms, bathrooms, area, amenities, foreclosure handling, freshness, or sort options only when those filters are part of your research question.

Use `url` when you already have Lamudi search pages, results pages, listing pages, or supported source URLs that represent the exact scope you want to refresh. This is useful for recurring monitoring and targeted property checks because the same saved URLs can be reused.

Narrower filters produce more targeted datasets and cleaner comparisons. Broader filters improve discovery but may require a higher `limit` and more careful downstream segmentation. For cleaner analysis, split broad work into separate runs by location, property type, listing mode, price band, or freshness window.

Use a small `limit` for the first run, then increase it after confirming the output fields, record count, and map/run-summary artifacts match your workflow.

### Input Recipes

- **Validation run:** choose a single location such as Metro Manila, keep `deal_type` at `buy`, enable `enrich_data`, and set a small `limit` to inspect the grouped output shape.
- **Targeted residential search:** combine `location`, `deal_type`, `property_type`, `min_price`, `max_price`, `bed_count`, and `bathroom_count` to collect comparable residential listings.
- **Commercial or land review:** choose `gt-commercial` or `gt-land` in `property_type`, then use land or floor-area fields to keep the segment aligned with the operational question.
- **Fresh inventory monitoring:** use `publication_date` with `sort_by` set to `newest`, then repeat the same input on a schedule to compare new or changed public listings.
- **Direct search refresh:** paste one or more saved Lamudi result pages into `url` and set a limit that matches the expected review workload.
- **Known listing enrichment:** paste known property URLs into `url`, keep `enrich_data` enabled, and route the resulting grouped rows into a CRM, warehouse, or review queue.

### Example Inputs

#### Example 1: Location-driven validation run

```json
{
  "location": "Metro Manila",
  "deal_type": "buy",
  "property_type": ["gt-condo"],
  "enrich_data": true,
  "limit": 25
}
````

#### Example 2: Filtered rental monitoring run

```json
{
  "location": "Quezon City",
  "deal_type": "rent",
  "sort_by": "newest",
  "min_price": 15000,
  "max_price": 60000,
  "bed_count": ["1", "2"],
  "publication_date": "7",
  "limit": 100
}
```

#### Example 3: Direct Lamudi URL run with summary handoff

```json
{
  "url": [
    "https://www.lamudi.com.ph/buy/metro-manila/",
    "https://www.lamudi.com.ph/sample-property-listing-001.html"
  ],
  "enrich_data": true,
  "limit": 50,
  "mcpConnectors": []
}
```

### Output

#### Output destination

The actor writes results to an Apify dataset as JSON records. The dataset is designed for direct consumption by analytics tools, ETL pipelines, AI agents, and downstream APIs with minimal post-processing.

The current dataset contract contains one primary record shape: `property_listing`. Run-level reports, maps, and summaries are saved as key-value-store artifacts, not as dataset rows.

#### Record envelope and stable identifiers

Each property row includes required fields `record_type`, `record_id`, `url`, `source_context`, and `entity`. The recommended idempotency key is `record_id`; if your system needs a public URL key, use `url` or `source_context.canonical_url` when present. For listing-scoped systems, `listing.listing_id` and `property.property_id` repeat the listing identifier inside domain-specific groups.

Use `record_id` for upserts, deduplication, and repeated-run comparison. Stable identifiers make records easier to merge, deduplicate, sync, and compare across recurring runs. `source_context` preserves source domain, source URL, seed type and value, loaded URL, page position, enrichment status, external IDs, search context, and timestamp-style provenance fields when available.

#### Examples

##### Example: property listing record

```json
{
  "record_type": "property_listing",
  "record_id": "sample-lamudi-listing-001",
  "url": "https://www.lamudi.com.ph/sample-property-listing-001.html",
  "source_context": {
    "source_id": "lamudi_ph_property_scraper",
    "source_domain": "lamudi.com.ph",
    "source_url": "https://www.lamudi.com.ph/sample-property-listing-001.html",
    "seed_type": "location",
    "seed_value": "Metro Manila",
    "loaded_url": "https://www.lamudi.com.ph/buy/metro-manila/",
    "canonical_url": "https://www.lamudi.com.ph/sample-property-listing-001.html",
    "seed_url": "https://www.lamudi.com.ph/buy/metro-manila/",
    "page_number": 1,
    "position": 3,
    "scraped_at": "2026-07-09T10:00:00+00:00",
    "language": "en-PH",
    "country": "PH",
    "fingerprint": "sample-fingerprint-001",
    "enrichment_status": "enriched",
    "external_ids": {
      "listing_id": "sample-lamudi-listing-001",
      "reference_id": "SAMPLE-REF-001",
      "detail_page_id": "sample-proppit-001",
      "proppit_id": "sample-proppit-001"
    },
    "search": {
      "url": "https://www.lamudi.com.ph/buy/metro-manila/",
      "title": "Property For Sale in Metro Manila",
      "location": "Metro Manila",
      "deal_type": "buy"
    }
  },
  "entity": {
    "title": "Sample 2-Bedroom Condo for Sale in Metro Manila",
    "description": "Sample public listing description for a condominium unit near business districts and transit routes.",
    "category": "property"
  },
  "listing": {
    "listing_id": "sample-lamudi-listing-001",
    "listing_type": "property_listing",
    "deal_type": "sale",
    "transaction_type": "For Sale",
    "availability": "InStock"
  },
  "pricing": {
    "price": 6800000,
    "price_text": "PHP 6800000",
    "currency": "PHP",
    "availability": "InStock"
  },
  "location": {
    "address": "Sample Avenue, Metro Manila, Philippines",
    "city": "Makati",
    "region": "Metro Manila",
    "country": "PH",
    "latitude": 14.5547,
    "longitude": 121.0244,
    "coordinates": {
      "latitude": 14.5547,
      "longitude": 121.0244
    },
    "map_address": "Sample Avenue, Makati, Metro Manila"
  },
  "property": {
    "property_id": "sample-lamudi-listing-001",
    "property_type": "condo",
    "bedrooms": 2,
    "bathrooms": 1,
    "floor_area": 54,
    "land_area": 0,
    "area_unit": "sqm",
    "amenities": ["Swimming pool", "Gym", "24 hours security"],
    "features": ["Balcony", "Lift"]
  },
  "media": {
    "main_image_url": "https://www.lamudi.com.ph/sample-image-001.jpg",
    "image_urls": [
      "https://www.lamudi.com.ph/sample-image-001.jpg",
      "https://www.lamudi.com.ph/sample-image-002.jpg"
    ]
  },
  "contact_details": {
    "phones": ["+63 900 000 0000"],
    "websites": ["https://www.lamudi.com.ph/sample-agency-profile"],
    "contacts": [
      {
        "name": "Sample Property Team",
        "role": "Agency contact"
      }
    ]
  },
  "relationships": {
    "agency": {
      "name": "Sample Realty Group",
      "reference_id": "sample-agency-001"
    }
  },
  "attributes": {
    "source_specific": {
      "schema_org": {
        "listing_type": "RealEstateListing",
        "offer_type": "Offer",
        "address_type": "PostalAddress",
        "geo_type": "GeoCoordinates",
        "floor_size_type": "QuantitativeValue"
      },
      "measurement_sources": {
        "floor_area": {
          "schema_org_unit_code": "MTK"
        }
      },
      "listing_type_label": "For Sale",
      "detail_page": {
        "embedded_listing": {
          "id": "sample-proppit-001",
          "operation_type": "sale",
          "price": 6800000,
          "currency": "PHP"
        }
      }
    }
  }
}
```

#### Run Summary, Map, And Artifacts

The actor exposes stable run artifacts through Apify key-value-store links:

| Artifact | Type | What it is useful for |
| --- | --- | --- |
| `RUN-SUMMARY` | JSON | Machine-readable run receipt with generated time, input summary, saved record counts, record families, search modes, enrichment counts, field coverage, representative records, artifact keys, and map statistics. |
| `RUN-SUMMARY.html` | HTML | Human-readable run report for quick operator review before export or downstream ingestion. |
| `results-map` | HTML | Interactive listing map generated from records with usable `location.latitude` and `location.longitude`. |
| `RUN-SUMMARY-ERROR` | JSON | Public-safe artifact summary if post-save run artifacts cannot be created. |

These artifacts help property teams and data teams verify completion, compare recurring runs, inspect enrichment and coordinate coverage, decide whether a retry or segmented run is needed, and attach a concise run receipt to tickets, reports, alerts, or AI-agent workflows. The artifacts are not dataset rows and should not replace the listing dataset as the primary output.

### Field Reference

#### Record envelope

- **record\_type** *(string, required)*: normalized record family. Current listing rows use `property_listing`.
- **record\_id** *(string, required)*: stable record identifier recommended for deduplication and upserts.
- **url** *(string, required)*: primary public Lamudi listing URL.

#### `source_context`

- **source\_context.source\_id** *(string, optional)*: source identifier for the actor's Lamudi listing source.
- **source\_context.source\_domain** *(string, optional)*: source domain, typically `lamudi.com.ph`.
- **source\_context.source\_url** *(string, optional)*: primary source URL for the normalized listing.
- **source\_context.seed\_type** *(string, optional)*: discovery or input mode such as `location`, `search_url`, or `detail_url`.
- **source\_context.seed\_value** *(string, optional)*: concrete seed value used for the run, such as a resolved location or input URL.
- **source\_context.loaded\_url** *(string, optional)*: search or detail page URL loaded while collecting the record.
- **source\_context.canonical\_url** *(string, optional)*: canonical listing URL when available.
- **source\_context.seed\_url** *(string, optional)*: search or source URL that led to the listing.
- **source\_context.page\_number** *(integer, optional)*: result page number when available.
- **source\_context.position** *(integer, optional)*: listing position on the source page or direct detail result.
- **source\_context.scraped\_at** *(string, optional)*: timestamp for when the record was normalized.
- **source\_context.language** *(string, optional)*: language or locale signal.
- **source\_context.country** *(string, optional)*: country code or country label.
- **source\_context.fingerprint** *(string, optional)*: additional fingerprint for audit and deduplication support.
- **source\_context.enrichment\_status** *(string, optional)*: enrichment state such as standard, enriched, or finalized after detail recovery was exhausted.
- **source\_context.external\_ids** *(object, optional)*: source identifiers such as `listing_id`, `reference_id`, `detail_page_id`, or `proppit_id` when available.
- **source\_context.search** *(object, optional)*: search context, resolved location, listing mode, URL, or breadcrumbs when available.

#### `entity`

- **entity.title** *(string, optional)*: listing title.
- **entity.description** *(string, optional)*: public listing description when available.
- **entity.category** *(string, optional)*: broad entity category, typically `property`.

#### `listing`

- **listing.listing\_id** *(string, optional)*: listing identifier repeated inside the listing group.
- **listing.listing\_type** *(string, optional)*: normalized listing type.
- **listing.deal\_type** *(string, optional)*: normalized sale or rent mode.
- **listing.transaction\_type** *(string, optional)*: source-facing transaction label when available.
- **listing.availability** *(string, optional)*: public availability signal when exposed by the source.

#### `pricing`

- **pricing.price** *(number, optional)*: numeric asking price or rent as displayed by Lamudi.
- **pricing.price\_text** *(string, optional)*: human-readable displayed price.
- **pricing.currency** *(string, optional)*: currency code, usually `PHP`.
- **pricing.billing\_period** *(string, optional)*: normalized rent billing period when available.
- **pricing.billing\_period\_raw** *(string, optional)*: original billing-period value when it differs from the normalized value.
- **pricing.availability** *(string, optional)*: source availability label associated with the offer.
- **pricing.offer\_url** *(string, optional)*: offer or listing URL associated with the displayed price when it is meaningfully different from the primary listing URL.

#### `location`

- **location.address** *(string, optional)*: public address or location string.
- **location.city** *(string, optional)*: city or municipality.
- **location.region** *(string, optional)*: province or region.
- **location.country** *(string, optional)*: country code or label.
- **location.latitude** *(number, optional)*: latitude for coordinate-capable records.
- **location.longitude** *(number, optional)*: longitude for coordinate-capable records.
- **location.coordinates** *(object, optional)*: latitude and longitude repeated as an object for map and GIS-friendly consumers.
- **location.map\_address** *(string, optional)*: map address when it differs from the structured address.

#### `property`

- **property.property\_id** *(string, optional)*: property or listing identifier repeated in the property group.
- **property.property\_type** *(string, optional)*: property category or type.
- **property.bedrooms** *(number, optional)*: bedroom count when available.
- **property.bathrooms** *(number, optional)*: bathroom count when available.
- **property.floor\_area** *(number, optional)*: numeric floor area in square meters when available.
- **property.land\_area** *(number, optional)*: numeric land or plot area in square meters when available.
- **property.area\_unit** *(string, optional)*: area unit, commonly `sqm`.
- **property.amenities** *(array of strings, optional)*: amenity labels exposed by the listing.
- **property.features** *(array of strings, optional)*: additional property feature labels.

#### `media`

- **media.main\_image\_url** *(string, optional)*: primary listing image URL.
- **media.image\_urls** *(array of strings, optional)*: listing image URLs in source-provided order when available.

#### `contact_details`

- **contact\_details.phones** *(array of strings, optional)*: phone numbers exposed by the detail page.
- **contact\_details.visible\_phone\_prefix** *(string, optional)*: partial phone prefix shown by Lamudi when a full number is not exposed.
- **contact\_details.websites** *(array of strings, optional)*: agency or contact profile URLs when available.
- **contact\_details.contacts** *(array of objects, optional)*: enriched agency or contact entries.

#### `relationships`

- **relationships.agency** *(object, optional)*: agency information, such as name, profile/logo links, verification label, or reference ID when available.

#### `attributes`

- **attributes** *(object, optional)*: additional source-specific details that do not fit a stronger public group, such as schema-style provenance, area text, listing labels, or detail-page summary values.

### Data Model Notes

- **Identity fields:** use `record_id` as the primary idempotency key. Use `url`, `source_context.canonical_url`, `listing.listing_id`, or `property.property_id` as secondary matching fields when your downstream system requires listing-scoped identifiers.
- **Source and provenance fields:** `source_context` helps trace a record back to the public source, original search context, position, enrichment status, and external IDs when available.
- **Property and listing attributes:** `entity`, `listing`, `property`, `pricing`, `location`, and `media` carry the main user-facing listing value.
- **Pricing and status fields:** prices, availability labels, billing periods, and transaction labels are point-in-time public signals and should be verified before operational decisions.
- **Nested objects:** grouped objects keep related fields together for JSON-first systems, ETL pipelines, BI staging, and AI-agent review.
- **Optional fields:** fields such as contact details, agency relationships, coordinates, land area, amenities, and detailed media depend on what each public listing exposes.
- **Repeated runs:** compare records across runs by stable identifiers plus run metadata from Apify, and store the input configuration used for each recurring segment.

### Data Quality, Guarantees, And Handling

- **Structured records:** results are normalized into predictable JSON objects for downstream use.
- **Field preservation:** meaningful schema-supported listing and property values should be kept in stable public fields or grouped objects instead of being silently discarded; optional source values may still be absent when Lamudi does not expose them for a specific record.
- **Best-effort extraction:** fields may vary by region, availability, account visibility, listing type, UI experiments, or source-side changes.
- **Optional fields:** null-check in downstream code, dashboards, and AI-agent prompts.
- **Deduplication:** use `record_id` as the recommended stable key, with `url`, `source_context.canonical_url`, `listing.listing_id`, and `property.property_id` as useful supporting identifiers.
- **Freshness:** results reflect the publicly available listing data at run time.
- **Repeated runs:** use the recommended idempotency key when syncing data into warehouses, CRMs, search indexes, vector stores, or monitoring systems.
- **Schema awareness:** downstream systems should rely on documented fields and handle newly missing optional fields gracefully.
- **Run receipts:** use run summary and map artifacts to audit listing counts, enrichment status, coordinate coverage, stop reason, map readiness, and export readiness without treating them as replacement dataset records.

### Tips For Best Results

- Start with a small `limit` to validate the output shape before scaling up.
- Use one city, neighborhood, property type, listing mode, or price band per run when you need clean comparison sets.
- Leave optional filters empty when the goal is broad discovery.
- Add filters gradually to understand how each field changes the resulting dataset.
- Keep `enrich_data` enabled when you need richer property, contact, agency, amenity, or land-area fields.
- Schedule recurring runs for monitoring workflows instead of relying on manual one-off exports.
- Use `record_id` for deduplication when storing results over time.
- Review `RUN-SUMMARY`, `RUN-SUMMARY.html`, and `results-map` before importing listings into production pipelines, dashboards, CRMs, or research workflows.

### How to Run on Apify

1. Open the Actor in Apify Console.
2. Configure the available input fields for the target location, filters, direct search URLs, or listing URLs.
3. Set the maximum number of outputs with `limit` if you want a bounded run.
4. Click **Start** and wait for the run to finish.
5. Open the dataset and inspect the first records.
6. Download results in JSON, CSV, Excel, or another supported Apify dataset format.

### Agentic And API-First Usage

This actor can be used as a structured public property-data acquisition step inside larger automated workflows. It is useful when an AI agent, data pipeline, or operations workflow needs a bounded Lamudi listing dataset, a clear field contract, and a run receipt that summarizes counts, enrichment, coordinate coverage, and artifact readiness.

Agent workflow pattern:

1. Generate or select a scoped input from the supported schema.
2. Run the actor manually, on a schedule, or through Apify platform automation.
3. Wait for completion and read the dataset records.
4. Validate records against the field reference.
5. Read `RUN-SUMMARY`, `RUN-SUMMARY.html`, or `results-map` to verify counts, enrichment state, coordinate coverage, stop reason, and export readiness.
6. Upsert records into the downstream system using `record_id`.
7. Trigger market analysis, enrichment, alerts, BI refreshes, vector/search indexing, lead review, or human verification.

Practical notes for agentic use:

- Keep prompts and automations grounded in the documented input parameters.
- Start with small validation runs before allowing broad automated collection.
- Feed the Field Reference and one output sample to downstream AI steps.
- Feed run summary or map artifacts to downstream agents so they can reason about completion, record counts, location distribution, and follow-up actions.
- Treat optional property and listing fields as nullable instead of asking agents to infer missing values.
- Store run ID, input configuration, and dataset export metadata outside or alongside records when building audit trails.
- For tools such as Claude, Codex, internal copilots, or property workflow agents, pass the input schema, Field Reference, idempotency key, and one representative output example rather than the full README when context is limited.

### Scheduling & Automation

#### Scheduling

**Automated Data Collection**

You can schedule runs to keep public Lamudi listing datasets refreshed for recurring research, reporting, monitoring, or enrichment workflows.

- Navigate to **Schedules** in Apify Console
- Create a new schedule, such as daily, weekly, or custom cron
- Configure input parameters for the target segment
- Enable notifications for run completion
- Add webhooks for automated processing

#### Integration Options

- **CRM enrichment:** sync public listing, location, price, agency, contact, and property attributes into account, lead, or portfolio records.
- **BI dashboards:** monitor asking prices, availability labels, property mix, geographic coverage, and coordinate availability over time.
- **Warehouses and ETL pipelines:** load grouped JSON records into analytics tables while preserving nested property, pricing, location, and source-context groups.
- **Webhooks:** trigger validation, deduplication, notifications, enrichment, or ingestion workflows after each completed run.
- **Google Sheets or Airtable:** review smaller scoped datasets, compare listing segments, and share lightweight research outputs with stakeholders.
- **MCP connectors:** authorize a connector in Apify, select it in `mcpConnectors`, and use the delivered listing summary, dataset link, report link, or map link in the destination tool.
- **Search and vector indexes:** index listing titles, descriptions, source URLs, locations, and attributes for discovery, semantic search, retrieval workflows, or agent context.

### Export Formats And Downstream Use

- **JSON:** for APIs, applications, AI agents, and data pipelines that need nested objects and full field fidelity.
- **CSV or Excel:** for spreadsheet workflows, stakeholder review, lightweight analysis, and manual quality checks.
- **API access:** for automated ingestion into internal systems and recurring data products.
- **BI and warehouses:** for reporting, dashboards, historical analysis, monitoring, and segment comparison.
- **Search or vector indexes:** for discovery, semantic search, retrieval workflows, property knowledge bases, or AI-agent context.

### Downstream Pipeline Guide

- **Idempotency:** use `record_id` for upserts; keep `url`, `listing.listing_id`, and `property.property_id` as secondary matching keys.
- **Null handling:** treat optional fields as nullable, especially contact details, agency relationships, coordinates, amenities, land area, and media arrays.
- **Type handling:** preserve numbers, booleans, arrays, and nested objects when exporting to JSON-first systems.
- **Flattening:** if exporting to CSV or Excel, flatten nested objects deliberately and keep the original JSON export for full fidelity.
- **Partitioning:** store run date, input segment, location, property type, listing mode, price band, and workflow name outside or alongside records for easier analysis.
- **Change detection:** compare repeated runs by `record_id` and selected business fields such as `pricing.price`, `pricing.price_text`, `listing.availability`, `entity.title`, `property.property_type`, bedrooms, bathrooms, and area fields.
- **Quality checks:** monitor record count, duplicate rate, required identifiers, price availability, coordinate availability, enrichment status, and important optional field fill rates.
- **Human review:** route records with missing critical fields, unusual prices, changed availability, high-value segments, or unexpected location values into a review queue when needed.
- **Retention:** decide how long to keep raw exports versus normalized warehouse tables based on the monitoring, research, or compliance needs of your workflow.

### Performance And Coverage Expectations

Recent validation artifacts available for this actor are small test-style runs, not broad live-market benchmarks. Use the measured values below as evidence that the output and artifact surfaces were exercised, not as a promise about production speed.

| Run type | Example scope | Listings | Duration | Coverage notes |
| --- | --- | --- | --- | --- |
| Validation artifact | Sample location-driven run with a limit of 2 | 2 | 1 second | 2 coordinate-capable records, 2 map markers, run stopped after the sample source was exhausted |

Planning estimates for real Lamudi runs:

| Run size | Estimated duration |
| --- | --- |
| Small runs under 1,000 outputs | About 3-5 minutes |
| Medium runs from 1,000 to 5,000 outputs | About 5-15 minutes |
| Large runs over 5,000 outputs | About 15-30 minutes |

Execution time varies based on filters, result volume, target availability, target response size, enrichment depth, coordinate/map artifact creation, and how much information is returned per listing. Highly filtered runs can finish faster, while broad discovery, enrichment, or detail-rich listing records may take longer. The actor does not claim complete market coverage, official listing completeness, or guaranteed listing availability.

### Limitations

- Availability depends on what Lamudi Philippines publicly exposes at run time.
- Some optional fields may be missing on sparse listings or listings without detail-rich public information.
- Very broad searches may take longer or require a higher `limit`.
- Target-side changes can affect field availability, labels, or visible listing structure.
- Regional, account, visibility, listing status, or availability differences may change visible results.
- Listing prices, availability, status, descriptions, and contact signals are point-in-time public signals and should be verified before operational decisions.
- The actor provides structured public real estate listing data, not legal, financial, investment, valuation, appraisal, brokerage, or MLS advice.

### Troubleshooting

- **No results returned:** check location spelling, filters, property category, direct URLs, and whether Lamudi currently has matching public records.
- **Fewer results than expected:** broaden filters, raise `limit`, split the search differently, or verify that Lamudi contains enough matching public records.
- **Some fields are empty:** optional fields depend on what each listing publicly provides.
- **Duplicate-looking records:** compare `record_id`, `url`, and listing identifiers to decide whether records represent variants, updated pages, or repeated source visibility.
- **Run takes longer than expected:** reduce scope, lower `limit` for validation, disable enrichment when standard fields are enough, or split broad collection into smaller segments.
- **Output changed:** compare the current output with the Field Reference and provide a small sample if support is needed.
- **Downstream import failed:** check JSON validity, nullable fields, nested objects, and whether your destination expects flattened columns.

### FAQ

#### What data does this actor collect?

It collects public Lamudi Philippines property listing records, including listing identity, title, description, source URL, sale/rent mode, price, currency, location, property attributes, media, source context, and optional enriched detail fields.

#### Can I filter by location, property type, date, price, status, or other criteria?

Yes. The schema supports `location`, `deal_type`, `property_type`, `sort_by`, price range, bedroom counts, bathroom counts, floor area, land area, foreclosure handling, amenities, and `publication_date`.

#### Can I use direct Lamudi URLs?

Yes. Use `url` for known Lamudi search pages, results pages, direct listing pages, or supported source URLs.

#### Why did I receive fewer results than my limit?

The limit is a maximum, not a guarantee. A run may return fewer records if Lamudi exposes fewer matching public listings for the selected scope or if filters narrow the search strongly.

#### Where can I find the run summary and interactive map?

Open the actor run output links for `RUN-SUMMARY`, `RUN-SUMMARY.html`, and `results-map` when those artifacts are available. They are key-value-store artifacts, not dataset rows.

#### How should I choose a limit for my first run?

Start with a small limit such as 10, 25, or 50. Confirm the output shape and fields, then increase the limit for recurring monitoring, exports, or broad research.

#### Can I schedule recurring runs?

Yes. Use Apify schedules to run the same input daily, weekly, or on a custom cron schedule.

#### How do I avoid duplicates across runs?

Use `record_id` as the primary idempotency key. Keep `url`, `source_context.canonical_url`, `listing.listing_id`, and `property.property_id` as supporting keys where useful.

#### Can I use the output with AI agents or automated workflows?

Yes. The grouped JSON records, field reference, stable identifiers, run summary, and map artifact are designed to support AI-agent workflows, automated review, ETL, BI, search indexing, and enrichment pipelines.

#### Can I export the data to CSV, Excel, or JSON?

Yes. Apify datasets can be exported in JSON, CSV, Excel, and other supported formats. JSON preserves the nested record structure best.

#### Does this actor collect private data or provide official MLS or appraisal data?

No. It collects publicly available listing information from Lamudi Philippines. It does not provide MLS access, appraisal-grade valuation, ownership verification, legal advice, investment advice, or guaranteed availability.

### Compliance & Ethics

#### Responsible Data Collection

This actor collects publicly available property listing information from Lamudi Philippines for legitimate business purposes, including:

- **Real estate** research and market analysis
- Public listing monitoring and operational reporting
- CRM, BI, ETL, and AI-agent workflow enrichment

This section is informational and not legal advice.

#### Best Practices

- Use collected data in accordance with applicable laws, regulations, and the target site's terms.
- Respect individual privacy and personal information.
- Use data responsibly and avoid disruptive or excessive collection.
- Do not use this actor for spamming, harassment, discrimination, unlawful housing practices, or other harmful purposes.
- Follow relevant data protection, fair housing, consumer protection, and sector-specific requirements where applicable.
- Review your own retention, access control, and data-sharing policies before operationalizing the dataset.

### Support

For help, use the Issues tab or the actor page support channel. Include the input used with sensitive values redacted, the run ID, expected versus actual behavior, a small output sample if relevant, and the downstream destination or export format if the issue is pipeline-related.

# Actor input Schema

## `location` (type: `string`):

Enter a city, province, neighborhood, or market supported by Lamudi Philippines, such as Metro Manila, Quezon City, Cebu, or Pampanga. Use one focused market per run when you want cleaner price comparisons, recurring monitoring, or downstream deduplication.

## `deal_type` (type: `string`):

Select whether the structured search should collect Lamudi properties listed for sale or for rent. Pair this with location and optional filters when you need comparable market slices for monitoring, CRM enrichment, reporting, or ETL ingestion.

## `property_type` (type: `array`):

Choose one or more broad Lamudi property groups or specific property types. Leave empty to include all property types that match the selected location and listing mode.

## `sort_by` (type: `string`):

Choose how Lamudi should order matching listings before collection. Use newest for monitoring recent inventory, or price ordering when reviewing market ranges.

## `min_price` (type: `integer`):

Set the lowest listing price to include, in PHP. Use with a maximum price when you need a clean budget band for monitoring, dashboards, CRM imports, or market analysis.

## `max_price` (type: `integer`):

Set the highest listing price to include, in PHP. Leave empty if you only need a lower bound or want Lamudi to return all matching prices above the minimum.

## `bed_count` (type: `array`):

Select one or more bedroom counts to include. Leave empty when bedroom count should not narrow the property search, such as broad commercial or land monitoring.

## `bathroom_count` (type: `array`):

Select one or more bathroom counts to include. This is most useful for residential searches where room configuration is part of the downstream comparison.

## `min_floor_area` (type: `integer`):

Set the smallest floor area to include, in square meters. Use area filters for more consistent comparison sets in ETL, reporting, or property-review workflows.

## `max_floor_area` (type: `integer`):

Set the largest floor area to include, in square meters. Pair this with minimum floor area when you need a precise size band.

## `min_land_area` (type: `integer`):

Set the smallest land or plot area to include, in square meters. This is useful for lots, warehouses, commercial properties, and land-focused monitoring.

## `max_land_area` (type: `integer`):

Set the largest land or plot area to include, in square meters. Leave empty when larger lots should remain eligible.

## `foreclosed_property` (type: `string`):

Choose whether foreclosed Lamudi listings should be included with normal listings, excluded from the search, or collected exclusively. Use this when foreclosure status matters for sourcing, risk review, or investment-screening workflows.

## `amenities` (type: `array`):

Select Lamudi amenities or features that matching listings should include. Leave empty for broader discovery; add amenities when your downstream workflow needs a targeted property profile.

## `publication_date` (type: `string`):

Choose a recent publication window when you want newly listed properties for monitoring, alerting, lead review, or recurring inventory refreshes. Leave empty when older matching listings should remain eligible.

## `url` (type: `array`):

Paste one Lamudi search, category, filtered results, listing, or supported source URL per line. Use this when the target scope is already defined in Lamudi or when you want to refresh known property pages directly.

## `enrich_data` (type: `boolean`):

Keep this enabled when CRM enrichment, BI reporting, market review, search indexing, or AI-agent workflows need richer listing records. Turn it off for faster validation runs when the standard search-result fields are enough.

## `limit` (type: `integer`):

Choose the maximum number of Lamudi property records to save for this run. Start with a small limit to validate the output shape, then increase it for recurring monitoring, bounded exports, or downstream analysis.

## `mcpConnectors` (type: `array`):

Choose user-authorized MCP connectors for optional post-run delivery of a concise listing summary with dataset, run-summary, and map links when Apify storage links are available. Leave empty to only save listings to the Apify dataset and key-value store.

## Actor input object example

```json
{
  "deal_type": "buy",
  "sort_by": "popularity",
  "foreclosed_property": "included",
  "enrich_data": true,
  "limit": 100,
  "mcpConnectors": []
}
```

# Actor output Schema

## `results` (type: `string`):

Primary dataset export containing grouped Lamudi property\_listing records.

## `runSummaryJson` (type: `string`):

Machine-readable run summary with totals, coverage, input summary, and sample listings.

## `runSummaryHtml` (type: `string`):

Readable HTML report for quick run review.

## `resultsMap` (type: `string`):

HTML map generated from saved listings with usable latitude and longitude values.

# 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 = {
    "limit": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("fatihtahta/lamudi-ph-property-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 = { "limit": 100 }

# Run the Actor and wait for it to finish
run = client.actor("fatihtahta/lamudi-ph-property-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 '{
  "limit": 100
}' |
apify call fatihtahta/lamudi-ph-property-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Lamudi Philippines Scraper with Contacts & Features",
        "description": "Collect structured public property listing records from Lamudi Philippines. Start from locations, search pages, or direct listing URLs when supported, then save CleanedWeb records to the default dataset for market research, monitoring, CRM, BI, ETL, and property workflows.",
        "version": "0.1",
        "x-build-id": "ShDl3XQ7K0zHicbcf"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/fatihtahta~lamudi-ph-property-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-fatihtahta-lamudi-ph-property-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/fatihtahta~lamudi-ph-property-scraper/runs": {
            "post": {
                "operationId": "runs-sync-fatihtahta-lamudi-ph-property-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/fatihtahta~lamudi-ph-property-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-fatihtahta-lamudi-ph-property-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "location": {
                        "title": "Set a Lamudi Location or Market",
                        "type": "string",
                        "description": "Enter a city, province, neighborhood, or market supported by Lamudi Philippines, such as Metro Manila, Quezon City, Cebu, or Pampanga. Use one focused market per run when you want cleaner price comparisons, recurring monitoring, or downstream deduplication."
                    },
                    "deal_type": {
                        "title": "Choose Sale or Rental Listings",
                        "enum": [
                            "buy",
                            "rent"
                        ],
                        "type": "string",
                        "description": "Select whether the structured search should collect Lamudi properties listed for sale or for rent. Pair this with location and optional filters when you need comparable market slices for monitoring, CRM enrichment, reporting, or ETL ingestion.",
                        "default": "buy"
                    },
                    "property_type": {
                        "title": "Filter by Property Category or Type",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Choose one or more broad Lamudi property groups or specific property types. Leave empty to include all property types that match the selected location and listing mode.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "gt-apartment",
                                "room",
                                "gt-commercial",
                                "building",
                                "offices",
                                "retail",
                                "service-office",
                                "warehouse",
                                "gt-condo",
                                "condotel",
                                "loft",
                                "penthouse",
                                "studio",
                                "gt-house",
                                "beach-house",
                                "single-family-house",
                                "townhouse",
                                "villas",
                                "gt-land",
                                "agricutural-lot",
                                "beach-lot",
                                "commercial-lot",
                                "residential-lot"
                            ],
                            "enumTitles": [
                                "Apartment",
                                "Room",
                                "Commercial Space",
                                "Building",
                                "Offices",
                                "Retail",
                                "Serviced Office",
                                "Warehouse",
                                "Condo",
                                "Condotel",
                                "Loft",
                                "Penthouse",
                                "Studio",
                                "House and Lot",
                                "Beach House",
                                "House",
                                "Townhouse",
                                "Villas",
                                "Lot",
                                "Agricultural Lot",
                                "Beach Lot",
                                "Commercial Lot",
                                "Residential Lot"
                            ]
                        }
                    },
                    "sort_by": {
                        "title": "Choose the Lamudi Sort Order",
                        "enum": [
                            "popularity",
                            "newest",
                            "price-low",
                            "price-high"
                        ],
                        "type": "string",
                        "description": "Choose how Lamudi should order matching listings before collection. Use newest for monitoring recent inventory, or price ordering when reviewing market ranges.",
                        "default": "popularity"
                    },
                    "min_price": {
                        "title": "Set a Minimum Asking Price or Rent",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Set the lowest listing price to include, in PHP. Use with a maximum price when you need a clean budget band for monitoring, dashboards, CRM imports, or market analysis."
                    },
                    "max_price": {
                        "title": "Set a Maximum Asking Price or Rent",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Set the highest listing price to include, in PHP. Leave empty if you only need a lower bound or want Lamudi to return all matching prices above the minimum."
                    },
                    "bed_count": {
                        "title": "Filter by Bedroom Counts",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Select one or more bedroom counts to include. Leave empty when bedroom count should not narrow the property search, such as broad commercial or land monitoring.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "1",
                                "2",
                                "3",
                                "4",
                                "5"
                            ],
                            "enumTitles": [
                                "1",
                                "2",
                                "3",
                                "4",
                                "5+"
                            ]
                        }
                    },
                    "bathroom_count": {
                        "title": "Filter by Bathroom Counts",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Select one or more bathroom counts to include. This is most useful for residential searches where room configuration is part of the downstream comparison.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "1",
                                "2",
                                "3",
                                "4",
                                "5"
                            ],
                            "enumTitles": [
                                "1",
                                "2",
                                "3",
                                "4",
                                "5+"
                            ]
                        }
                    },
                    "min_floor_area": {
                        "title": "Set a Minimum Floor Area",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Set the smallest floor area to include, in square meters. Use area filters for more consistent comparison sets in ETL, reporting, or property-review workflows."
                    },
                    "max_floor_area": {
                        "title": "Set a Maximum Floor Area",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Set the largest floor area to include, in square meters. Pair this with minimum floor area when you need a precise size band."
                    },
                    "min_land_area": {
                        "title": "Set a Minimum Land or Plot Area",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Set the smallest land or plot area to include, in square meters. This is useful for lots, warehouses, commercial properties, and land-focused monitoring."
                    },
                    "max_land_area": {
                        "title": "Set a Maximum Land or Plot Area",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Set the largest land or plot area to include, in square meters. Leave empty when larger lots should remain eligible."
                    },
                    "foreclosed_property": {
                        "title": "Choose How to Handle Foreclosed Properties",
                        "enum": [
                            "included",
                            "excluded",
                            "yes"
                        ],
                        "type": "string",
                        "description": "Choose whether foreclosed Lamudi listings should be included with normal listings, excluded from the search, or collected exclusively. Use this when foreclosure status matters for sourcing, risk review, or investment-screening workflows.",
                        "default": "included"
                    },
                    "amenities": {
                        "title": "Require Specific Amenities or Property Features",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Select Lamudi amenities or features that matching listings should include. Leave empty for broader discovery; add amenities when your downstream workflow needs a targeted property profile.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "security",
                                "guardhouse",
                                "cctv",
                                "concierge",
                                "security-door",
                                "alarm",
                                "24-hour-security",
                                "roof-garden",
                                "swimming_pool",
                                "gym",
                                "sauna",
                                "jacuzzi",
                                "tennis-court",
                                "children-s-area",
                                "multiuse-room",
                                "deck",
                                "balcony",
                                "garden",
                                "grill",
                                "green-area",
                                "courtyard",
                                "garage",
                                "internet",
                                "wi-fi",
                                "video-cable",
                                "air-conditioning",
                                "heating",
                                "fireplace",
                                "natural-gas",
                                "intercom",
                                "water-tank",
                                "water",
                                "electricity",
                                "built-in-wardrobe",
                                "library",
                                "panoramic-view",
                                "lift",
                                "disabled-access",
                                "furnished",
                                "equipped-kitchen",
                                "integral-kitchen",
                                "ensuite",
                                "cleaning-room",
                                "cellar",
                                "storage-room",
                                "office"
                            ],
                            "enumTitles": [
                                "Security",
                                "Guardhouse",
                                "CCTV",
                                "Concierge",
                                "Security door",
                                "Alarm",
                                "24 hours security",
                                "Roof garden",
                                "Swimming pool",
                                "Gym",
                                "Sauna",
                                "Jacuzzi",
                                "Tennis court",
                                "Playground",
                                "Multipurpose room",
                                "Terrace",
                                "Balcony",
                                "Garden",
                                "Grill",
                                "Green area",
                                "Yard",
                                "Garage",
                                "Internet",
                                "WiFi",
                                "Video cable",
                                "Air conditioning",
                                "Heating",
                                "Fireplace",
                                "Natural gas",
                                "Intercom",
                                "Water tank",
                                "Water",
                                "Electricity",
                                "Built-in wardrobe",
                                "Library",
                                "Panoramic view",
                                "Lift",
                                "Access for people with disabilities",
                                "Furnished",
                                "Equipped kitchen",
                                "Integral kitchen",
                                "Service room",
                                "Laundry room",
                                "Cellar",
                                "Storage room",
                                "Office room"
                            ]
                        }
                    },
                    "publication_date": {
                        "title": "Filter by Listing Freshness",
                        "enum": [
                            "1",
                            "7",
                            "30"
                        ],
                        "type": "string",
                        "description": "Choose a recent publication window when you want newly listed properties for monitoring, alerting, lead review, or recurring inventory refreshes. Leave empty when older matching listings should remain eligible."
                    },
                    "url": {
                        "title": "Add Direct Lamudi URLs",
                        "type": "array",
                        "description": "Paste one Lamudi search, category, filtered results, listing, or supported source URL per line. Use this when the target scope is already defined in Lamudi or when you want to refresh known property pages directly.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "enrich_data": {
                        "title": "Collect Richer Property Listing Details",
                        "type": "boolean",
                        "description": "Keep this enabled when CRM enrichment, BI reporting, market review, search indexing, or AI-agent workflows need richer listing records. Turn it off for faster validation runs when the standard search-result fields are enough.",
                        "default": true
                    },
                    "limit": {
                        "title": "Set the Maximum Number of Listings to Save",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Choose the maximum number of Lamudi property records to save for this run. Start with a small limit to validate the output shape, then increase it for recurring monitoring, bounded exports, or downstream analysis."
                    },
                    "mcpConnectors": {
                        "title": "MCP Delivery Connectors",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Choose user-authorized MCP connectors for optional post-run delivery of a concise listing summary with dataset, run-summary, and map links when Apify storage links are available. Leave empty to only save listings to the Apify dataset and key-value store.",
                        "default": []
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
