# 🏠 PropertyFinder Scraper (`scraper-engine/propertyfinder-scraper`) Actor

🏠 PropertyFinder Scraper (propertyfinder-scraper) extracts real estate listings from Property Finder with key details for lead gen, market research & pricing insights. 🚀 Fast, automated & reliable—perfect for data-driven teams.

- **URL**: https://apify.com/scraper-engine/propertyfinder-scraper.md
- **Developed by:** [Scraper Engine](https://apify.com/scraper-engine) (community)
- **Categories:** Real estate, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.99 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## 🏠 PropertyFinder Scraper — UAE Real Estate Listings

Extract **structured real-estate data** from [PropertyFinder](https://www.propertyfinder.ae) at scale — prices, sizes, agents, brokers, geolocation, amenities, images, descriptions and dozens of other fields — straight from any search or listing-collection URL.

Works across PropertyFinder country domains (**.ae, .qa, .bh, .eg, .sa**) for both **sale** and **rent** listings.

### ⭐ Why choose this Actor?

- **⚡ Fast & lightweight** — concurrent page workers with in-run de-duplication; no heavy browser overhead.
- **🛡️ Smart proxy fallback** — runs direct by default and *automatically* escalates to datacenter, then residential proxies only if PropertyFinder starts blocking — then sticks with the working tier.
- **🆕 Monitoring mode** — only scrape properties newly listed since your previous run.
- **📉 Delisting detection** — track first-seen / last-seen dates to know which listings disappeared.
- **💾 Live results** — every property is saved the moment it's collected, so a crash never loses progress.
- **📊 Sectioned output** — results are organised into Overview, Location, Pricing, Agent & Broker, Media and Status tabs.

### 🔑 Key features

- Bulk input of search/listing URLs.
- 1–5 parallel threads (you choose the speed).
- Optional unit-number enrichment via an external endpoint.
- Pay-per-event pricing — you only pay for what you scrape.

### 📥 Input

```json
{
  "listUrls": [
    { "url": "https://www.propertyfinder.ae/en/search?c=1&l=21&fu=0&rp=y&ob=mr" }
  ],
  "threads": "2",
  "maxPagesPerUrl": 0,
  "monitoringMode": false,
  "proxyConfiguration": { "useApifyProxy": false }
}
```

| Field | Description |
|---|---|
| `listUrls` | One or more PropertyFinder search/listing URLs (bulk supported). **Required.** |
| `threads` | Parallel result pages to fetch (`1`–`5`). |
| `maxPagesPerUrl` | Stop after N pages per URL. `0` = follow pagination to the end. |
| `monitoringMode` | Only output properties new vs. previous runs. |
| `retrieveUnitNumber` / `unitFinderEndpoint` | Resolve building unit numbers via an external service. |
| `enableDelistingTracker` | Track listings over time to detect delisting. |
| `addEmptyTrackerRecord` | In monitoring mode, also emit minimal records for still-live listings. |
| `proxyConfiguration` | Optional. Force a proxy from the start; otherwise the Actor auto-escalates only when blocked. |

### 📤 Output

Each dataset row is one property:

```json
{
  "id": "96948115",
  "url": "https://www.propertyfinder.ae/en/plp/buy/villa-for-sale-dubai-al-mizhar-al-mizhar-1-96948115.html",
  "title": "Spacious 7BR | GCC Nationals Only | Prime Location",
  "displayAddress": "Al Mizhar 1, Al Mizhar, Dubai",
  "city": "Dubai",
  "community": "Al Mizhar",
  "bedrooms": "7",
  "bathrooms": "7+",
  "price": 12000000,
  "priceCurrency": "AED",
  "propertyType": "Villa",
  "size": 20255,
  "sizeUnit": "sqft",
  "agent": "Faissal Abi Rafeh",
  "agentPhone": "+971521287839",
  "broker": "PACIFIC REAL ESTATE INVESTMENT L.L.C",
  "coordinates": { "latitude": 25.2462, "longitude": 55.4416 },
  "amenities": ["BA", "BW", "AC"],
  "images": ["https://static.shared.propertyfinder.ae/...668x452.jpg"],
  "isVerified": true
}
```

Full field set includes: address & community tree, bedrooms/bathrooms, listed date, agent & broker contacts, RERA / reference identifiers, price & currency, size, furnishing & completion status, amenities & features, description, image URLs, geolocation and many boolean status flags.

### 🚀 How to use the Actor (via Apify Console)

1. Log in at <https://console.apify.com> → **Actors**.
2. Open **PropertyFinder Scraper**.
3. Paste one or more PropertyFinder search URLs into **List URLs**.
4. (Optional) pick the number of threads, toggle monitoring, configure proxy.
5. Click **Start**.
6. Watch the live logs — every property streams in as it's collected.
7. Open the **Output** tab (Overview / Location / Pricing / Agent / Media / Status views) and export to JSON, CSV or Excel.

### 💡 Best use cases

- Build UAE property inventories and market datasets.
- Daily monitoring of new listings in chosen communities.
- Lead generation from agent / broker contact data.
- Price benchmarking, mapping and market analysis.

### ❓ FAQ

**Do I need a proxy?** No. The Actor runs direct by default and only turns on proxies if PropertyFinder blocks it.

**Will it scrape every page?** Yes — by default it follows pagination to the last page. Cap it with `maxPagesPerUrl`.

**Does monitoring mode remember across runs?** Yes, via a named key-value store. Scrape the same URLs each run for meaningful results.

### ⚠️ Legal & ethical use

Only collect **publicly available** data. You are responsible for compliance with applicable laws (GDPR/CCPA, anti-spam, etc.) and the target site's terms of service.

### 🆘 Support & feedback

Found a bug or want a new field? Open an issue on the Actor's page — feedback is welcome.

# Actor input Schema

## `listUrls` (type: `array`):

Paste any PropertyFinder **sale or rent** search-result URLs (each lists many properties). Supports bulk input — add as many as you like. Works for .ae, .qa, .bh, .eg, .sa domains. Example: a Dubai villas-for-sale search page.

## `threads` (type: `string`):

How many result pages to fetch in parallel. Higher = faster, but heavier on the target. 2–3 is a safe sweet spot.

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

When ON, only properties that are **new** compared to previous runs are scraped (uses a key-value store to remember what was seen). Great for daily change tracking. Turn OFF for a full scrape.

## `retrieveUnitNumber` (type: `boolean`):

Resolve the building unit number via an external Unit Finder service. When OFF, `unitNumber` stays null.

## `enableDelistingTracker` (type: `boolean`):

Track every property with first-seen/last-seen dates in a key-value store, so you can detect which listings get delisted across runs. ⚠️ Scrape the SAME URLs each run for meaningful results.

## `addEmptyTrackerRecord` (type: `boolean`):

In Monitoring Mode, also emit a minimal record for every currently-live property that wasn't output as new — so a custom loader can tell which previously-loaded properties are still live.

## `email` (type: `string`):

Optional email you'd like associated with this run (for your own reference / reporting).

## `proxyConfiguration` (type: `object`):

Optional. By default the Actor sends **direct (no-proxy)** requests and only escalates to a **datacenter** proxy, then a **residential** proxy, automatically if PropertyFinder starts blocking. Set a proxy here to force one from the start.

## Actor input object example

```json
{
  "listUrls": [
    "https://www.propertyfinder.ae/en/search?c=1&l=21&fu=0&rp=y&ob=mr"
  ],
  "threads": "2",
  "monitoringMode": false,
  "retrieveUnitNumber": false,
  "enableDelistingTracker": false,
  "addEmptyTrackerRecord": false,
  "email": "",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# 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 = {
    "listUrls": [
        "https://www.propertyfinder.ae/en/search?c=1&l=21&fu=0&rp=y&ob=mr"
    ],
    "threads": "2",
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("scraper-engine/propertyfinder-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 = {
    "listUrls": ["https://www.propertyfinder.ae/en/search?c=1&l=21&fu=0&rp=y&ob=mr"],
    "threads": "2",
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("scraper-engine/propertyfinder-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 '{
  "listUrls": [
    "https://www.propertyfinder.ae/en/search?c=1&l=21&fu=0&rp=y&ob=mr"
  ],
  "threads": "2",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call scraper-engine/propertyfinder-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

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