# Dubai Property Scraper — PropertyFinder Listings (`matakupanlabs/dubai-property-listings-scraper`) Actor

Scrape Dubai and UAE property listings from PropertyFinder: sale and rent, price, price per sqm, bedrooms, size, coordinates, agent and broker, amenities, RERA permit, plus community price trends. Pure HTTP, no login, robots-compliant URLs.

- **URL**: https://apify.com/matakupanlabs/dubai-property-listings-scraper.md
- **Developed by:** [uzi](https://apify.com/matakupanlabs) (community)
- **Categories:** Real estate, Lead generation, Automation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 property listings

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

Learn more: https://docs.apify.com/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

## Dubai Property Listings Scraper (PropertyFinder UAE)

A production-grade, fast, and lightweight Apify Actor designed to scrape real-estate listings across Dubai and all UAE Emirates (Abu Dhabi, Sharjah, Ajman, Ras Al Khaimah, Fujairah, Umm Al Quwain) from **PropertyFinder.ae**.

It extracts complete property records for both **sale** and **rent**, with industry-leading data depth: built-up area in both **sqft** and **sqm**, price per area, agent & broker details, verified status, RERA permit numbers, high-resolution photo galleries, full descriptions, amenities, and **community price trends (12-month % change, community average price, active inventory)**.

***

### Key Features

- **Pure HTTP / Server-Side Rendering (No Heavy Browser)**: Powered by `got-scraping` and Cheerio, consuming minimal RAM and compute credits while delivering ultra-fast scrape speeds.
- **Deep Market Metrics**: Beyond basic titles and prices, extracts 12-month community price trends (`communityPriceTrend12mPct`), community average pricing, and total active listings in the community.
- **Dual Area Metrics**: Automatically calculates both built-up area in square feet (`sizeSqft`) and square metres (`sizeSqm`).
- **Comprehensive Agent & Broker Profiles**: Captures listing agent names, profile slugs, agency/brokerage names, emails, phone numbers, and license/permit codes.
- **Full RERA Compliance Tracking**: Extracts official regulatory permits, DLD validation references, and RERA broker/agent licenses.
- **Robots.txt & Anti-Block Polite Architecture**: Strictly adheres to robots.txt allowances by requesting path-based listing directories (never using disallowed `/en/search` paths), with automatic exponential backoff on rate limits.

***

### Use Cases

1. **Real Estate Investment Analysis & Valuation**: Track historical and current asking prices across Dubai communities (e.g. Palm Jumeirah, Downtown Dubai, Arabian Ranches, Dubai Marina) to identify undervalued properties and calculate price-per-square-metre yields.
2. **Brokerage & Agency Competitive Intelligence**: Monitor new listings, commission opportunities, price drops, and competitor inventory in real time across residential and commercial sectors.
3. **Lead Generation for PropTech & Home Services**: Power B2B lead generation for interior designers, home renovation contractors, mortgage brokers, and moving companies targeting newly listed properties.
4. **Macro Real Estate Research & Market Indexes**: Build aggregate price indices, monitor community-level inflation/deflation trends, and analyze inventory velocity over time.

***

### Input Parameters

| Parameter | Type | Default | Description |
|---|---|---|---|
| `mode` | String (`select`) | `"BUY"` | Listing type: `"BUY"` for properties for sale, `"RENT"` for properties for rent. |
| `location` | String (`select`) | `"dubai"` | Target emirate/market: `dubai`, `abu-dhabi`, `sharjah`, `ajman`, `ras-al-khaimah`, `fujairah`, `umm-al-quwain`. |
| `propertyType` | String (`select`) | `"ANY"` | Property type: `ANY`, `APARTMENT`, `VILLA`, `TOWNHOUSE`, `PENTHOUSE`, `HOTEL_APARTMENT`, `VILLA_COMPOUND`, `LAND`, `BUILDING`, `OFFICE`, `SHOP`, `WAREHOUSE`, `LABOUR_CAMP`. |
| `minPrice` | Integer | *optional* | Minimum asking price in AED (client-side filter). |
| `maxPrice` | Integer | *optional* | Maximum asking price in AED (client-side filter). |
| `minBedrooms` | Integer | *optional* | Minimum number of bedrooms. |
| `maxBedrooms` | Integer | *optional* | Maximum number of bedrooms. |
| `furnishing` | String (`select`) | `"ANY"` | Furnishing status: `"ANY"`, `"FURNISHED"`, `"UNFURNISHED"`. |
| `includeDetails` | Boolean | `true` | Fetch each listing detail page to enrich with full description, amenities, high-res images, and community price trends. |
| `maxPages` | Integer | `3` | Maximum search result pages to crawl (each page holds 25–35 listings). |
| `maxItems` | Integer | `200` | Hard cap on saved listing records. |
| `startUrls` | Array of Strings | `[]` | Optional direct PropertyFinder path URLs (e.g. `https://www.propertyfinder.ae/en/buy/dubai/villas-for-sale.html`). |
| `proxyConfiguration` | Object | *optional* | Optional proxy settings. Datacenter or residential proxies can be attached if running heavy volume. |

***

### Output Dataset Schema

Each dataset item contains clean, typed fields conforming exactly to the actor schema:

| Field | Type | Description |
|---|---|---|
| `_type` | String | Fixed to `"property"`. |
| `source` | String | Fixed to `"propertyfinder"`. |
| `listingId` | String | Unique PropertyFinder listing ID. |
| `url` | String | Canonical URL to the listing on PropertyFinder. |
| `name` | String | Listing title / headline. |
| `adDescription` | String | Full markdown/text listing description. |
| `transactionType` | String | `"sale"` or `"rent"`. |
| `propertyType` | String | Property category (e.g. `"Villa"`, `"Apartment"`). |
| `price` | Number | Asking price in AED. |
| `currency` | String | Currency code (`"AED"`). |
| `pricePeriod` | String | Price frequency (`"sell"`, `"yearly"`, `"monthly"`). |
| `pricePerArea` | Number | Asking price per square foot. |
| `sizeSqft` | Number | Built-up area in square feet. |
| `sizeSqm` | Number | Built-up area in square metres (calculated to 2 decimal places). |
| `bedrooms` | Number | Bedroom count. |
| `bathrooms` | Number | Bathroom count. |
| `locationFullName` | String | Full location breadcrumb path. |
| `community` | String | Master community (e.g. `"Arabian Ranches"`). |
| `subCommunity` | String | Sub-community or tower name. |
| `city` | String | Emirate / city name. |
| `latitude` | Number | Geographic latitude coordinate. |
| `longitude` | Number | Geographic longitude coordinate. |
| `agentName` | String | Assigned agent name. |
| `agentSlug` | String | Agent profile slug. |
| `brokerName` | String | Brokerage / agency name. |
| `brokerEmail` | String | Brokerage contact email. |
| `brokerPhone` | String | Brokerage contact phone number. |
| `brokerSlug` | String | Brokerage profile slug. |
| `reference` | String | Broker internal listing reference. |
| `rera` | String | Official RERA permit / validation number. |
| `listedDate` | String | Listing publication timestamp (ISO). |
| `lastRefreshedAt` | String | Last refresh timestamp (ISO) or null. |
| `isVerified` | Boolean | True if the listing is verified. |
| `isExclusive` | Boolean | True if exclusive listing. |
| `isNewConstruction` | Boolean | True if new development. |
| `isAvailable` | Boolean | Availability flag. |
| `furnished` | String | `"YES"`, `"NO"`, `"PARTLY"`, etc. |
| `completionStatus` | String | `"completed"`, `"off-plan"`, etc. |
| `amenities` | Array\[String] | Array of amenity names (e.g. `["Private Pool", "Balcony", "Security"]`). |
| `imageCount` | Number | Total count of property images. |
| `images` | Array\[String] | List of high-resolution image URLs. |
| `communityAvgPrice` | Number | Average community listing price. |
| `communityActiveListings` | Number | Total active listings in the community. |
| `communityPriceTrend12mPct` | Number | 12-month community price trend (% change). |
| `scrapedAt` | String | Timestamp when the record was scraped (ISO). |

***

### Sample Output Record

```json
{
  "_type": "property",
  "source": "propertyfinder",
  "listingId": "164563288",
  "url": "https://www.propertyfinder.ae/en/plp/buy/villa-for-sale-dubai-the-springs-springs-15-164563288.html",
  "name": "Turn Key | Private Pool | Maids Room | Extended",
  "adDescription": "Turn Key | Private Pool | Maids Room | Extended\n\n- Springs 15\n- Type 3E\n- Fully renovated | Move-in ready\n- 3 Bedroom Plus Maids\n- Extended from kitchen and study side\n- Private heated and chilled pool...",
  "transactionType": "sale",
  "propertyType": "Villa",
  "price": 7350000,
  "currency": "AED",
  "pricePeriod": "sell",
  "pricePerArea": 1662,
  "sizeSqft": 4420,
  "sizeSqm": 410.63,
  "bedrooms": 3,
  "bathrooms": 4,
  "locationFullName": "Springs 15, The Springs, Dubai",
  "community": "The Springs",
  "subCommunity": "Springs 15",
  "city": "Dubai",
  "latitude": 25.051973342895508,
  "longitude": 55.178489685058594,
  "agentName": "Jack Evans",
  "agentSlug": "jack-evans",
  "brokerName": "Barnes International Realty",
  "brokerEmail": "danial@arabianestates.ae",
  "brokerPhone": "+971585566633",
  "brokerSlug": "barnes-international-realty-v2-4338",
  "reference": "PB-S-35978-7",
  "rera": "939996",
  "listedDate": "2026-10-26T06:12:08Z",
  "lastRefreshedAt": null,
  "isVerified": true,
  "isExclusive": false,
  "isNewConstruction": false,
  "isAvailable": true,
  "furnished": "NO",
  "completionStatus": "completed",
  "amenities": [
    "Maids Room",
    "Balcony",
    "Shared Pool",
    "Shared Gym",
    "Covered Parking",
    "View of Landmark",
    "Private Pool",
    "Built in Wardrobes",
    "Children's Play Area",
    "Children's Pool",
    "Barbecue Area",
    "Security"
  ],
  "imageCount": 19,
  "images": [
    "https://static.shared.propertyfinder.ae/media/images/listing/4MZB0TCCN0AKR2B74J4MX0P388/d3c6fb0c-d9ba-4bc2-a149-70ac283fcecb/1312x894.jpg?v=36c1a9ca00dc2306cbb5a75940cd3e19"
  ],
  "communityAvgPrice": 5958035,
  "communityActiveListings": 389,
  "communityPriceTrend12mPct": -4.04,
  "scrapedAt": "2026-11-03T18:02:52.488Z"
}
```

***

### Cost & Compute Efficiency

Because this Actor operates purely over standard HTTP requests without running headless Chromium or browser automation frameworks, resource utilization is extremely light:

- **Memory footprint**: Runs comfortably within 256MB–512MB RAM.
- **Speed**: ~15–25 enriched listings per second under moderate concurrency.
- **Cost**: A typical run of 1,000 enriched listings consumes less than $0.05 in Apify compute units.

***

### Legal & Compliance Notice

This Actor extracts exclusively publicly available data published on PropertyFinder.ae. It accesses only paths permitted by PropertyFinder's `robots.txt` policy and strictly avoids disallowed search query paths. Users are responsible for complying with local regulations and the website's terms of service.

# Actor input Schema

## `mode` (type: `string`):

BUY = properties for sale, RENT = properties for rent.

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

Target market. Dubai has the deepest inventory.

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

ANY keeps every property type. Other values map to PropertyFinder type-specific path URLs.

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

Client-side filter applied after parsing. Leave empty for no minimum.

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

Client-side filter applied after parsing. Leave empty for no maximum.

## `minBedrooms` (type: `integer`):

Client-side filter. Leave empty for any.

## `maxBedrooms` (type: `integer`):

Client-side filter. Leave empty for any.

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

Client-side filter on the furnished field.

## `includeDetails` (type: `boolean`):

Open each listing page to add full description, amenities and community price trends. Slower but richer.

## `maxPages` (type: `integer`):

One page holds 25-35 listings. Each page is a single HTTP request.

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

Hard cap on saved listings.

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

Advanced: paste PropertyFinder path-based listing URLs (e.g. https://www.propertyfinder.ae/en/buy/dubai/villas-for-sale.html). Query-string pagination is appended automatically. Never use /en/search? URLs.

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

Optional. The source responds fine from datacenter IPs; enable a proxy only if you hit rate limits.

## Actor input object example

```json
{
  "mode": "BUY",
  "location": "dubai",
  "propertyType": "ANY",
  "furnishing": "ANY",
  "includeDetails": true,
  "maxPages": 3,
  "maxItems": 200
}
```

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("matakupanlabs/dubai-property-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 = {}

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

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,matakupanlabs/dubai-property-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/EgDoitn8m2OHluoSs/builds/xcEpCNcBHPYM35Val/openapi.json
