# Property Finder Scraper: UAE Listings, Transactions & Prices (`kyungminlee/propertyfinder-listings-scraper`) Actor

Returns Property Finder listings (UAE, Qatar, Bahrain, Egypt, Saudi) by URL or city/community: price, size, bedrooms, location, broker; optional market data. Example: city="Dubai", locations=\["Dubai Marina"]. Pay per event: $0.0008 per listing, $0.0015 market data.

- **URL**: https://apify.com/kyungminlee/propertyfinder-listings-scraper.md
- **Developed by:** [Kyungmin Lee](https://apify.com/kyungminlee) (community)
- **Categories:** Real estate, Lead generation, Business
- **Stats:** 1 total users, 0 monthly users, 92.7% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.80 / 1,000 listings

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

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

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

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### What does Property Finder Listings Scraper do?

**Built for property investors, agents and analysts who track UAE listings.** Screen Dubai and Abu Dhabi communities by price per sqft, compare each asking price with the community average and recorded sale and rent transactions, and watch new listings and price drops on a schedule.

**Cost example:** 1,000 listings cost about **$0.80**, or **$2.30 with market data** (transactions and price trends). Tracking 5 communities x 200 listings every week with market data is about $2.30 per week. No monthly fee.

**Quick start:** 1) click **Try for free** and paste a Property Finder result URL, or type a city and community; 2) pick buy or rent, bedrooms and price range, and switch on **market data**; 3) click **Start** and download JSON, CSV or Excel. Save the run as a task and add a schedule for daily or weekly monitoring.

**Property Finder Listings Scraper** collects property listings from Property Finder, the largest property portal in the UAE, and also from its sites in **Qatar, Bahrain, Egypt and Saudi Arabia**. Paste result pages straight from your browser (for example `propertyfinder.ae/en/buy/dubai/apartments-for-sale-dubai-marina.html`), or just type a **city and community**, pick buy or rent, the property type, **bedrooms, furnishing, price range and completion status (ready / off-plan)**. No URL building needed.

Each listing becomes one clean row: **price and rent frequency, property type, bedrooms, bathrooms, size (sqft and sqm), price per sqft, the full location hierarchy (city, community, sub-community, building) with coordinates, amenities, furnishing, completion status, listed date, verified flag, permit link and the broker company**.

Turn on **market data** to add what most Property Finder scrapers leave out: **recorded sale and rent transactions** of similar units, **monthly and yearly price trends** for the community and the building, the **community average price and how far the listing is above or below it**, plus developer, service charge and building data.

It reads the same public pages a logged-out visitor sees. No Property Finder account, cookies or browser needed: 1,000 listings take about one minute.

This is an **unofficial** tool. It is not affiliated with, endorsed by or connected to Property Finder or its owners.

### Why use Property Finder Listings Scraper?

- **Market context per listing.** Recorded transactions, price trends and the community comparison come as tidy fields next to each listing, ready for yield, valuation and "priced below the area" analysis.
- **Filters without URL building.** City, communities (or "Community > Building" paths), property type, bedrooms, furnishing, price and completion status as plain inputs. Unknown location names are matched against Property Finder's own location list, and the log shows the names it offers.
- **Five countries, one schema.** UAE, Qatar, Bahrain, Egypt and Saudi Arabia listings share the same fields; sizes are given in both sqft and sqm.
- **Privacy-safe.** Agents are individuals, so their names, photos, licence numbers, phone numbers, WhatsApp and e-mail are never collected, and phone numbers and e-mail addresses inside descriptions are masked. Only the broker company is kept (name, licence, office address, logo, profile link).
- **Polite and reliable.** Paced requests with random jitter, automatic back-off when the site slows down, and only pages that Property Finder's robots.txt allows.
- **Fair pricing.** You pay per saved listing; failed searches and failed listing pages are not charged.

Typical uses: rental-yield and price-per-sqft analysis, investor deal screening, broker and inventory monitoring, new-listing alerts, and market research by community or building.

### How to scrape Property Finder

1. Click **Try for free**.
2. Either paste Property Finder result URLs (open an area on the site, copy the address bar), or set the country, buy/rent, city, communities and property type.
3. Optionally set bedrooms, furnishing, price range and completion status, and switch on **market data**.
4. Click **Start**. Download the results as JSON, CSV or Excel, or read them through the Apify API. Save the run as a task and add a schedule for daily monitoring.

### Input

```json
{
  "searchUrls": ["https://www.propertyfinder.ae/en/rent/dubai/apartments-for-rent-business-bay.html"],
  "country": "ae",
  "offeringType": "buy",
  "city": "Dubai",
  "locations": ["Dubai Marina", "Dubai Marina > Marina Gate", "Jumeirah Village Circle"],
  "propertyType": "apartments",
  "bedrooms": ["1", "2"],
  "furnishing": "any",
  "completionStatus": "ready",
  "minPrice": 1000000,
  "maxPrice": 3000000,
  "maxListingsPerSearch": 200,
  "includeMarketData": true,
  "includeDescription": true,
  "maxPagesPerSearch": 100,
  "proxyConfiguration": { "useApifyProxy": false }
}
```

- `searchUrls`: Property Finder result pages or listing pages (English, `/en/…`) from any of the five sites.
- `country`, `offeringType`, `city`, `locations`, `propertyType`: the location search. Each location (and each bedroom value) is its own search.
- `bedrooms`, `furnishing`, `completionStatus`, `minPrice`, `maxPrice`: filters applied to every search, URLs included.
- `maxListingsPerSearch`: limit per search. `maxPagesPerSearch`: how many result pages a filtered search may read.
- `includeMarketData`: open each listing page for transactions, trends and comparison (extra event).
- `proxyConfiguration`: off by default; turn on Apify Proxy if you see refused requests.

### Quick API example

Minimal input (also the prefill style used in the Apify Console):

```json
{"city": "Dubai", "locations": ["Dubai Marina"], "propertyType": "apartments", "maxListingsPerSearch": 50}
```

Run synchronously and get the dataset items in one call (replace `<TOKEN>` with your Apify API token):

```
POST https://api.apify.com/v2/acts/kyungminlee~propertyfinder-listings-scraper/run-sync-get-dataset-items?token=<TOKEN>
Content-Type: application/json

{"city": "Dubai", "locations": ["Dubai Marina"], "propertyType": "apartments", "maxListingsPerSearch": 50}
```

AI agents using the Apify MCP server can call this Actor as `kyungminlee/propertyfinder-listings-scraper` with the same JSON input.

### Output

One dataset item per listing (lists shortened):

```json
{
  "listingId": "145074240",
  "url": "https://www.propertyfinder.ae/en/plp/buy/apartment-for-sale-dubai-dubai-marina-elite-residence-145074240.html",
  "title": "Elegant Home | High Floor | Full Palm View",
  "offeringType": "buy", "propertyType": "Apartment",
  "price": 5950000, "currency": "AED", "pricePeriod": "sale",
  "pricePerArea": 1852, "pricePerAreaUnit": "sqft",
  "bedrooms": 4, "bathrooms": 5, "size": 3212, "sizeUnit": "sqft", "sizeSqm": 298.4,
  "furnishing": "unfurnished", "completionStatus": "ready", "marketType": "resale",
  "city": "Dubai", "community": "Dubai Marina", "subCommunity": null, "building": "Elite Residence",
  "latitude": 25.089394, "longitude": 55.147797,
  "amenities": ["Maids Room", "Children's Play Area", "Balcony", "…"],
  "listedAt": "2026-09-15T12:24:37Z", "isVerified": true,
  "brokerName": "YHU Properties", "brokerLicence": "44204",
  "brokerUrl": "https://www.propertyfinder.ae/en/broker/yhu-properties-9691-9565",
  "contactByPhone": true, "contactByWhatsapp": true,
  "marketDataStatus": "ok",
  "recordedSales": [{"date": "2025-06-26", "price": 5900000, "size": 3211}, "…"],
  "recordedRents": [{"date": "2026-09-11", "price": 274000, "size": 3212}, "…"],
  "priceTrendUnit": "AED/Sqft",
  "priceTrendMonthly": [{"month": "2026-08", "community": 2470, "building": 1830}, "…"],
  "communityAveragePrice": 10449136, "priceVsCommunityPct": -43.06,
  "developerName": "TAMEER HOLDING INVESTMENT (LLC)", "serviceChargePerSqft": 14.45,
  "searchTotalResults": 3717, "position": 1,
  "scrapedAt": "2026-10-07T00:00:00+00:00"
}
```

A `SUMMARY` record in the run's key-value store lists every search with its total result count, saved listings, filtered-out and duplicate counts, failures and request timings.

### Data fields

| Field | Description |
|---|---|
| `listingId`, `url`, `title`, `reference` | Property Finder ID, listing URL, title and the broker's reference |
| `offeringType`, `propertyType` | `buy`, `rent`, `commercial-buy` or `commercial-rent`; Apartment, Villa, Office Space… |
| `price`, `currency`, `pricePeriod`, `priceHidden` | Asking price, currency, `sale` or the rent frequency (`yearly`, `monthly`, `weekly`, `daily`) |
| `pricePerArea`, `pricePerAreaUnit` | Price per sqft or sqm as shown by Property Finder |
| `bedrooms`, `bedroomsLabel`, `bathrooms` | Counts (studio = 0, label `studio`) |
| `size`, `sizeUnit`, `sizeSqft`, `sizeSqm` | Size as listed and converted |
| `furnishing`, `completionStatus`, `marketType` | `furnished` / `unfurnished` / `partly-furnished`; `ready` / `off-plan`; `primary` (developer) or `resale` |
| `locationName`, `city`, `community`, `subCommunity`, `building`, `locationTree` | Location hierarchy |
| `latitude`, `longitude` | Map position of the building or community as published |
| `amenities`, `imageCount`, `mainImage`, `imageUrls`, `floorPlanCount`, `videoUrl`, `has360Tour` | Features and media |
| `listedAt`, `updatedAt` | Listing date and last refresh (when shown) |
| `isVerified`, `isFeatured`, `isPremium`, `listingLevel`, `isExclusive`, `isDirectFromDeveloper`, `isPriceDrop`, `isGreatValue`, `isHighDemand`, `agentIsSuperAgent` | Property Finder badges |
| `permitNumber`, `permitValidationUrl` | Advertising permit and the regulator's validation link (UAE) |
| `brokerId`, `brokerName`, `brokerLicence`, `brokerAddress`, `brokerLogo`, `brokerUrl` | Broker company (never the agent); the licence comes from the listing page |
| `contactByPhone`, `contactByWhatsapp`, `contactByEmail` | Which contact channels the listing offers (no numbers) |
| `description` | Listing text with phone numbers and e-mails masked |
| `position`, `searchInput`, `searchUrl`, `searchTotalResults`, `country`, `scrapedAt` | Search context |
| **Market data** (`includeMarketData`) | |
| `recordedSales`, `recordedRents` | Recorded transactions of similar units: date, price, size |
| `priceTrendUnit`, `priceTrendCommunity`, `priceTrendBuilding`, `priceTrendMonthly`, `priceTrendYearly` | Community and building price trend (e.g. AED/sqft for sales, AED/year for rents) |
| `communityAveragePrice`, `communityAverageSize`, `communityAveragePricePerArea`, `priceVsCommunityPct`, `sizeVsCommunityPct` | Community comparison |
| `communityActiveListings`, `communityPriceMin`, `communityPriceMax`, `communityRating`, `buildingActiveListings`, `buildingPriceMin`, `buildingPriceMax`, `buildingRating` | Area and building stock |
| `developerName`, `masterDeveloperName`, `buildingCompletionYear`, `serviceChargePerSqft`, `availableFrom`, `zoneName`, `brokerLegalName`, `brokerTotalListings` | Building and listing details |
| `marketDataStatus`, `marketDataError` | `ok`, `not-available` (page has no market data) or `failed` |

### Pricing: how much does it cost to scrape Property Finder?

This Actor uses pay-per-event pricing:

- `listing`: **$0.80 per 1,000 listings** saved.
- `market-data`: **$1.50 per 1,000** listings with market data (only when `includeMarketData` is on, on top of `listing`).

So 1,000 listings cost about $0.80, or $2.30 with market data. Searches that fail are not charged, and a listing whose page fails or shows no market data is charged as `listing` only. Set a maximum charge for the run and the Actor stops at that limit.

### Tips and limits

- **No-code automation:** a ready-to-import [n8n workflow](https://github.com/m2kyungmin/apify-actors/blob/main/integrations/n8n/5-propertyfinder-new-listings-to-google-sheets.json) runs this Actor on a schedule and sends weekly new listings to Google Sheets ([all templates](https://github.com/m2kyungmin/apify-actors/tree/main/integrations)).

- **Filters are applied to the results.** Property Finder's robots.txt asks crawlers not to load filtered search addresses, so price, completion status and (for URLs) bedrooms and furnishing are checked on each listing. Bedrooms and "furnished" in the location search use Property Finder's own pages and are fast; a narrow price range in a big area reads more pages (see `maxPagesPerSearch`). You only pay for listings that match.

- **Sort order** is Property Finder's default (featured first). Each listing is saved once per run, even if several searches find it.

- **Market data** needs one listing page per listing: about 12 minutes per 1,000 listings. Recorded transactions are published for the UAE. Qatar, Bahrain and Egypt listings have price trends and the community comparison; Saudi listings usually have no market data, and those rows are charged as `listing` only.

- **Locations:** use the community name as Property Finder shows it, or `Community > Building` for deeper levels. If a name is not found, the log lists the names Property Finder offers.

- **New-project pages and developer project cards** are not included; only property listings are.

- Only English pages (`/en/…`) are supported.

- **Property data for other countries:** [UK (Rightmove)](https://apify.com/kyungminlee/rightmove-property-scraper), [Poland (Otodom)](https://apify.com/kyungminlee/otodom-listings-scraper), [Brazil (ZAP Imóveis & VivaReal)](https://apify.com/kyungminlee/zap-vivareal-property-scraper).

### FAQ

#### Do I need a Property Finder account?

No. The Actor reads public result and listing pages that anyone can open without logging in. It never asks for or uses credentials.

#### Does it collect personal data?

It does not collect agents' names, photos, licence numbers, phone numbers or e-mail addresses, and it masks contact details inside descriptions. Broker company details are business information. You are responsible for using the data in line with the laws that apply to you.

#### Can I monitor new listings or price drops?

Yes. Save the run as a task with a daily schedule and compare `listingId`, `price` and `isPriceDrop` between runs.

#### Is it legal to scrape Property Finder?

The Actor collects public listing data at a polite rate, only loads pages that Property Finder's robots.txt allows, and does not get around logins or captchas. Check Property Finder's terms and the law in your country for your use case.

#### Is this an official Property Finder product?

No. This is an unofficial, independent tool and is not affiliated with Property Finder. Property Finder is a trademark of its owner.

Found a problem or need another field? Open an issue on the **Issues** tab.

# Actor input Schema

## `searchUrls` (type: `array`):

Optional list of Property Finder result page URLs, e.g. \["https://www.propertyfinder.ae/en/buy/dubai/apartments-for-sale-dubai-marina.html"]; works on .ae, .qa, .bh, .eg, .sa English pages, also /en/plp/ pages. /search?... URLs are rejected (robots.txt). Minimal run: give searchUrls and/or city/locations. Using both runs both.

## `country` (type: `string`):

Enum ae, qa, bh, eg, sa (default ae): Property Finder site used by the city/locations search. URLs in searchUrls always use their own site.

## `offeringType` (type: `string`):

Enum buy, rent, commercial-buy, commercial-rent (default buy).

## `city` (type: `string`):

City or region as Property Finder names it, e.g. "Dubai", "Abu Dhabi", "Doha", "Cairo", "Ar Riyadh". Empty = whole country. Setting city or locations triggers the location search even if searchUrls is also given.

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

Optional list of communities inside city, e.g. \["Dubai Marina", "Business Bay"]; sub-community as "Dubai Marina > Marina Gate". Each location is a separate search with its own maxListingsPerSearch. Unknown names are reported in the run log.

## `propertyType` (type: `string`):

Enum for the location search (default properties = all types): apartments, villas, townhouses, penthouses, offices, land, etc. Commercial types need offeringType commercial-buy or commercial-rent.

## `bedrooms` (type: `array`):

Optional list of bedroom counts, e.g. \[1, 2]. Location search reads one page per value; for searchUrls results are filtered. Empty = all. Each value is a separate search with its own listing cap.

## `furnishing` (type: `string`):

Enum any, furnished, unfurnished, partly-furnished (default any).

## `completionStatus` (type: `string`):

Enum any, ready, off-plan (default any). Applies only to offeringType buy; rentals ignore it.

## `minPrice` (type: `integer`):

Optional integer, lowest listed price in the listing's own currency (AED, QAR, BHD, EGP or SAR), e.g. 1000000. Rents compared as listed (yearly in UAE). Listings with hidden price are skipped when a price filter is set.

## `maxPrice` (type: `integer`):

Optional integer, highest listed price in the listing's own currency (AED, QAR, BHD, EGP or SAR), e.g. 3000000.

## `maxListingsPerSearch` (type: `integer`):

Integer, default 200 (prefill 50): max listings saved per search URL and per location (and per bedroom value). Each listing saved is one charged 'listing' event ($0.0008); the run's max charge can stop earlier.

## `includeMarketData` (type: `boolean`):

Boolean (default false). true = open every listing page and add market data (similar-unit sale/rent transactions, community/building price trends, average price and deviation, developer, service charge). One extra request per listing (~12 min per 1,000); charged as extra 'market-data' event ($0.0015) only when data exists.

## `includeDescription` (type: `boolean`):

Boolean (default true). Include listing description text; phone numbers, e-mails and WhatsApp links are masked. Set false for smaller rows.

## `maxPagesPerSearch` (type: `integer`):

Integer, default 100: cap on result pages (25 listings each) read per search while price, completion or URL bedroom/furnishing filters are active. Unfiltered searches are not limited by it.

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

Apify proxy settings object, default {"useApifyProxy": false} (run's own IP works). Set {"useApifyProxy": true} to rotate IPs when requests are refused.

## Actor input object example

```json
{
  "country": "ae",
  "offeringType": "buy",
  "city": "Dubai",
  "locations": [
    "Dubai Marina"
  ],
  "propertyType": "apartments",
  "furnishing": "any",
  "completionStatus": "any",
  "maxListingsPerSearch": 50,
  "includeMarketData": false,
  "includeDescription": true,
  "maxPagesPerSearch": 100,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

No description

# 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 = {
    "city": "Dubai",
    "locations": [
        "Dubai Marina"
    ],
    "propertyType": "apartments",
    "maxListingsPerSearch": 50,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("kyungminlee/propertyfinder-listings-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 = {
    "city": "Dubai",
    "locations": ["Dubai Marina"],
    "propertyType": "apartments",
    "maxListingsPerSearch": 50,
    "proxyConfiguration": { "useApifyProxy": False },
}

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

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

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

```

## CLI example

```bash
echo '{
  "city": "Dubai",
  "locations": [
    "Dubai Marina"
  ],
  "propertyType": "apartments",
  "maxListingsPerSearch": 50,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call kyungminlee/propertyfinder-listings-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,kyungminlee/propertyfinder-listings-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/Em9aZOCjUI7qdMAlV/builds/ndD779yqEfqnBusVV/openapi.json
