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

🏠 PropertyFinder Scraper extracts property listings, prices, locations & key details from Property Finder. 🚀 Fast, structured data for real estate research, lead gen & market analysis. ✅ Effortless, SEO-friendly. 📈

- **URL**: https://apify.com/scrapio/propertyfinder-scraper.md
- **Developed by:** [Scrapio](https://apify.com/scrapio) (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 $3.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 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

## 🏠 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("scrapio/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("scrapio/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 scrapio/propertyfinder-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "🏠 PropertyFinder Scraper",
        "description": "🏠 PropertyFinder Scraper extracts property listings, prices, locations & key details from Property Finder. 🚀 Fast, structured data for real estate research, lead gen & market analysis. ✅ Effortless, SEO-friendly. 📈",
        "version": "0.1",
        "x-build-id": "ZaV0LmCIy8nSE9OvB"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/scrapio~propertyfinder-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-scrapio-propertyfinder-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/scrapio~propertyfinder-scraper/runs": {
            "post": {
                "operationId": "runs-sync-scrapio-propertyfinder-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/scrapio~propertyfinder-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-scrapio-propertyfinder-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",
                "required": [
                    "listUrls"
                ],
                "properties": {
                    "listUrls": {
                        "title": "🔗 PropertyFinder Search / Listing URLs",
                        "type": "array",
                        "description": "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.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "threads": {
                        "title": "⚡ Parallel Threads",
                        "enum": [
                            "1",
                            "2",
                            "3",
                            "4",
                            "5"
                        ],
                        "type": "string",
                        "description": "How many result pages to fetch in parallel. Higher = faster, but heavier on the target. 2–3 is a safe sweet spot.",
                        "default": "2"
                    },
                    "monitoringMode": {
                        "title": "🆕 Monitoring Mode — only newly listed properties",
                        "type": "boolean",
                        "description": "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.",
                        "default": false
                    },
                    "retrieveUnitNumber": {
                        "title": "🏢 Retrieve Unit Number (Additional Usage)",
                        "type": "boolean",
                        "description": "Resolve the building unit number via an external Unit Finder service. When OFF, `unitNumber` stays null.",
                        "default": false
                    },
                    "enableDelistingTracker": {
                        "title": "📉 Enable Delisting Tracker (Additional Usage)",
                        "type": "boolean",
                        "description": "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.",
                        "default": false
                    },
                    "addEmptyTrackerRecord": {
                        "title": "🧾 Add Tracker ID Record in Monitoring Mode (Additional Usage)",
                        "type": "boolean",
                        "description": "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.",
                        "default": false
                    },
                    "email": {
                        "title": "📧 Notification Email (optional)",
                        "type": "string",
                        "description": "Optional email you'd like associated with this run (for your own reference / reporting).",
                        "default": ""
                    },
                    "proxyConfiguration": {
                        "title": "🌐 Proxy Configuration",
                        "type": "object",
                        "description": "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.",
                        "default": {
                            "useApifyProxy": false
                        }
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
