# Property Finder Scraper — UAE & Gulf Property Listings (`tortuga/propertyfinder-scraper`) Actor

Scrape Property Finder listings for sale or rent in the UAE, Saudi Arabia, Qatar, Bahrain and Egypt: price, beds, size, location, coordinates, agent, broker, permit, photos.

- **URL**: https://apify.com/tortuga/propertyfinder-scraper.md
- **Developed by:** [Trevor Ortega](https://apify.com/tortuga) (community)
- **Categories:** Real estate
- **Features:** Limited permissions
- **Stats:** 3 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.80 / 1,000 listings

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/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

## Property Finder Scraper: UAE & Gulf Property Listings

Scrape property listings for sale and for rent from **Property Finder**, the leading property portal in the UAE, and from its sister sites in **Saudi Arabia, Qatar, Bahrain and Egypt** (propertyfinder.ae, .sa, .qa, .bh, .eg). Paste any search URL from the website, or type locations like "Dubai Marina" or "Riyadh" and pick filters. You get price, rent period, bedrooms, bathrooms, size in sqft and sqm, location down to the building, coordinates, description, photos, agent, brokerage, verified and SuperAgent flags, listing date and more, as JSON, CSV or Excel.

Searches with more results than the website shows (it stops after 50 pages) are split into price bands automatically, so you can collect a whole city. With **Only new or changed items**, a scheduled run outputs only listings that are new or whose price changed.

### What data does Property Finder Scraper extract?

| Field | Example | Notes |
|---|---|---|
| `id`, `url`, `reference` | `155509193`, `https://www.propertyfinder.ae/en/plp/buy/...` | Property Finder listing id, listing URL, advertiser's reference |
| `country`, `category`, `offeringType` | `ae`, `buy`, `Residential for Sale` | buy, rent, commercial-buy, commercial-rent, new-projects |
| `title`, `propertyType`, `description` | `Full Lake View \| Type 1E`, `Townhouse` | Full description text is included in every result |
| `price`, `currency`, `pricePeriod` | `7200000`, `AED`, `sale` | Rentals: `yearly`, `monthly`, `weekly` or `daily`. `priceOnRequest` when hidden |
| `pricePerArea`, `pricePerAreaUnit`, `priceChangePercent` | `1920`, `sqft`, `-9` | As shown on the card |
| `numberOfCheques`, `downPayment`, `paymentMethods` | `4`, `230000`, `["installments"]` | When published |
| `bedrooms`, `isStudio`, `bathrooms` | `3`, `true`, `4` | Studio = 0 bedrooms |
| `size`, `sizeUnit`, `sizeSqft`, `sizeSqm`, `builtUpArea`, `plotSize` | `3749`, `sqft`, `3749`, `348.3` | Both units always filled |
| `furnished`, `completionStatus` | `unfurnished`, `completed` / `off_plan` | |
| `location`, `city`, `community`, `subCommunity`, `building`, `region` | `Al Reem 1, Al Reem, Arabian Ranches, Dubai` | Plus `locationPath` (ids and types) and `locationId` |
| `latitude`, `longitude` | `25.059778`, `55.294853` | |
| `amenities`, `amenityCodes` | `["Balcony", "Shared Pool"]` | |
| `images`, `imagesCount`, `floorPlans`, `videoUrl`, `tour360Url` | photo URLs | Full-size photos with listing pages on |
| `agentName`, `agentId`, `agentUrl`, `agentLanguages`, `isSuperAgent` | `Jonny Brown`, `true` | No agent photo |
| `brokerName`, `brokerId`, `brokerUrl`, `brokerLogo` | `Family Homes DXB` | The brokerage (agency) |
| `permitNumber` | `7200966941` | Advertising permit / licence number when shown on the card (Saudi Arabia, many UAE listings) |
| `isVerified`, `listingLevel`, `isFeatured`, `isPremium`, `isExclusive`, `isDirectFromDeveloper`, `dealBadges` | `true`, `premium`, `["high demand"]` | |
| `listedDate`, `lastRefreshedAt` | `2026-10-07T06:22:58Z` | |
| With **Include licences and regulatory details**: `brokerLicenseNumber`, `agentBrn`, `agentLicenseNumber`, `permitValidationUrl`, `permitAuthorityName`, `permitIssuedLicenseNumber`, `zoneName`, `availableFrom`, `regulatoryDetails`, `agentPosition`, `agentYearsOfExperience` | `39329`, `98349`, `https://trakheesi.dubailand.gov.ae/...` | From the listing page (ORN, BRN, DLD / REGA permit) |
| `search`, `scrapedAt`, `detailsFetched` | | Which search found the listing |
| `changeType`, `previousValues` | `changed`, `{"price": 7500000}` | Only with monitoring on |

With purpose **New projects** (UAE) each record is a development: `title`, developer, location, starting `price`, `downPaymentPercent`, `bedroomOptions`, size range, `deliveryDate`, `constructionPhase`, `paymentPlans`, photos and the project URL.

### How to scrape Property Finder listings

1. Open [propertyfinder.ae](https://www.propertyfinder.ae) (or .sa, .qa, .bh, .eg), search with the filters you want and copy the address bar into **Start URLs**. Both kinds of URLs work: `https://www.propertyfinder.ae/en/rent/dubai/apartments-for-rent.html` and `https://www.propertyfinder.ae/en/search?c=2&l=50&bdr[]=2&fu=1`.
2. Or leave Start URLs empty, pick a **Country**, type **Locations** (one per line: "Dubai Marina", "Jumeirah Village Circle", "Al Reem Island, Abu Dhabi", "Riyadh", "The Pearl") and set the filters: for sale or rent, property type, bedrooms, bathrooms, price, size, furnishing, off-plan or ready, rent frequency, keywords.
3. Set **Max items** and start the run. To get a single listing with all details, paste its URL (`.../en/plp/...-155509193.html`).

### Input example

```json
{
  "country": "ae",
  "locations": ["Dubai Marina", "Jumeirah Village Circle"],
  "purpose": "for-rent",
  "propertyType": "apartment",
  "bedrooms": ["1", "2"],
  "maxPrice": 150000,
  "furnishing": "furnished",
  "sort": "newest",
  "maxItems": 500
}
```

Start URLs from several countries can be mixed in one run:

```json
{
  "startUrls": [
    { "url": "https://www.propertyfinder.ae/en/rent/dubai/apartments-for-rent.html" },
    { "url": "https://www.propertyfinder.sa/en/search?c=1&l=8216" },
    { "url": "https://www.propertyfinder.qa/en/search?c=2&ob=nd" }
  ],
  "maxItems": 3000
}
```

### Output example

```json
{
  "id": "155509193",
  "url": "https://www.propertyfinder.ae/en/plp/buy/townhouse-for-sale-dubai-arabian-ranches-al-reem-al-reem-1-155509193.html",
  "country": "ae",
  "title": "Full Lake View | Type 1E | Maids + Study",
  "offeringType": "Residential for Sale",
  "category": "buy",
  "propertyType": "Townhouse",
  "price": 7200000,
  "currency": "AED",
  "pricePeriod": "sale",
  "pricePerArea": 1920,
  "pricePerAreaUnit": "sqft",
  "bedrooms": 3,
  "bathrooms": 4,
  "size": 3749,
  "sizeUnit": "sqft",
  "sizeSqft": 3749,
  "sizeSqm": 348.3,
  "builtUpArea": 2888,
  "plotSize": 3749,
  "furnished": "unfurnished",
  "completionStatus": "completed",
  "location": "Al Reem 1, Al Reem, Arabian Ranches, Dubai",
  "city": "Dubai",
  "community": "Arabian Ranches",
  "subCommunity": "Al Reem",
  "latitude": 25.059778,
  "longitude": 55.294853,
  "description": "Family Homes DXB is delighted to offer this 3 Bedroom Townhouse for sale in Al Reem 1 ...",
  "images": ["https://static.shared.propertyfinder.ae/media/images/listing/7RRKKE1MCXX5W9WK8WCS66KEHR/b50c2aad-9491-4226-baee-ae6fa3146710/1312x894.jpg?v=c6ef73090f32e3952d8d65dc66afc3bf"],
  "imagesCount": 19,
  "reference": "S-JB009",
  "agentName": "Jonny Brown",
  "agentUrl": "https://www.propertyfinder.ae/en/agent/jonny-brown-280907",
  "isSuperAgent": true,
  "brokerName": "Family Homes DXB",
  "brokerUrl": "https://www.propertyfinder.ae/en/broker/family-homes-dxb-8718",
  "brokerLicenseNumber": "39329",
  "agentBrn": "98349",
  "permitValidationUrl": "https://trakheesi.dubailand.gov.ae/rev/madmoun/listing/validation?khevJujtDig=zaftxhx2vk21i4f701bd76sm9qagzd5m32l5ilkoiebqtqvnf",
  "permitAuthorityName": "FAMILY HOMES REAL ESTATE L.L.C",
  "zoneName": "Wadi Al Safa 6",
  "isVerified": true,
  "listingLevel": "premium",
  "dealBadges": ["high demand"],
  "listedDate": "2026-10-07T06:22:58Z",
  "listingType": "property",
  "detailsFetched": true,
  "search": "propertyfinder.ae: Arabian Ranches, Dubai",
  "scrapedAt": "2026-10-10T07:29:15Z"
}
```

### How many listings can I get per search?

Property Finder shows 50 pages per search. The actor asks for 50 listings per page, so one search gives up to about 2,000-2,500 listings (in the UAE some slots on each page go to promoted new-project units, which are skipped). Pages after 50 come from an older copy of the site's index in a different order, so the actor never uses them. Instead, when a search has more than 2,000 results and **Max items** asks for more, it is cut into price bands that each fit (one extra page request per cut), cheapest first. In tests this returned every listing of a 2,094-result search and 2,600 listings from all 34,782 rentals in Qatar. Listings without a published price cannot be reached through price bands.

### Which countries does it support?

All five Property Finder sites: the UAE (AED, sizes in sqft), Saudi Arabia (SAR), Qatar (QAR), Bahrain (BHD) and Egypt (EGP, sizes in sqm). Location searches run on the site picked in **Country**; start URLs from any of the sites can be mixed. New projects are a UAE category. For Bayut, use a Bayut scraper; this actor reads only Property Finder.

### Does it work without login? Does it collect phone numbers?

No login is needed: the actor reads the same public pages any visitor sees. It does not export phone numbers, WhatsApp numbers or e-mail addresses (the website shows them only after a click), and it leaves out agent photos. It exports the agent's and brokerage's names, profile links and the licence and permit numbers that the listing publishes for regulatory reasons.

### Do I need a proxy?

The default Apify RESIDENTIAL proxy answered every request in tests. Residential traffic is billed by Apify per GB: about 4 MB per 1,000 listings (about $0.03) plus about 150 KB per listing page when **Include licences** is on (about $0.0012 each). Apify datacenter proxy (Proxy on, no group) also works and costs almost nothing in traffic, but Property Finder's CDN refuses about 45% of datacenter requests, which the actor retries, so runs take about twice as long.

### Monitor changes on a schedule

Turn on **Only new or changed items** to watch a search. Each run remembers what earlier runs returned and outputs only new listings and listings whose price changed; unchanged listings are dropped before any listing page request, so they are not charged. **Max items** then sets how many listings are checked per run: keep the "Newest first" sort, e.g. 100-300 for a community. Save the input as a task in Apify and add a Schedule (for example daily); give each watch its own **Monitoring key** if several schedules use the same search. Every output item gets `changeType` (`new` or `changed`), and changed items get `previousValues` with the old price, e.g. `{"price": 7500000}`. Listings just below the window are remembered without being output or charged, so an older listing that moves into the window is not reported as new.

### Pricing

Pay per result: each listing saved to the dataset is one `result` event. With **Include licences and regulatory details** on (and for single listing URLs), each listing whose page is loaded adds one `detail` event. Promoted listings repeated on later pages, overlapping price bands and unchanged listings in monitoring mode are not charged. Platform usage (mostly proxy traffic, see above) is paid by you; a 1,000-listing run used about $0.04 of platform usage in tests.

### Integrations and API

Run it from the Apify API, a schedule, Make, Zapier, n8n or any language with the Apify client; results are available as JSON, CSV, Excel or XML from the dataset. Each listing's `search` field tells you which start URL or location found it.

### Is it legal to scrape Property Finder?

This actor collects publicly visible listing data that anyone can see on the websites without logging in. It does not log in and does not collect phone numbers, WhatsApp numbers, e-mail addresses or anything else shown only after a click. Agent names are personal data under privacy laws such as the UAE PDPL and the Saudi PDPL: you are responsible for having a legitimate purpose for processing them and for respecting Property Finder's terms of use. If in doubt, ask a lawyer.

### Support

Found a bug or need a field that is not there? Open an issue on the Issues tab with the input you used and the run link.

### Related scrapers

- [Inmuebles24 Scraper](https://apify.com/tortuga/inmuebles24-scraper): Mexico Property Listings (+ZonaProp)
- [ZAP Imóveis & VivaReal Scraper](https://apify.com/tortuga/zap-imoveis-scraper): Brazil Property Listings
- [OLX Brazil Scraper](https://apify.com/tortuga/olx-brazil-scraper): Listings, Prices & Sellers
- [Airbnb Scraper](https://apify.com/tortuga/airbnb-scraper): Listings, Prices, Reviews & Calendars
- [99acres Scraper](https://apify.com/tortuga/99acres-scraper): India Property for Sale & Rent

### Found it useful?

A ★ review on this Actor's Apify Store page helps other users find it and tells us what to improve. Issues and feature requests are welcome in the Actor's **Issues** tab.

# Actor input Schema

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

Property Finder search URLs from any of the five sites (propertyfinder.ae, .sa, .qa, .bh, .eg) with any filters set in the browser, e.g. https://www.propertyfinder.ae/en/rent/dubai/apartments-for-rent.html or https://www.propertyfinder.ae/en/search?c=1\&l=50\&bdr\[]=2, or single listing URLs (.../en/plp/buy/...-155509193.html), which return that listing with full details. Leave empty if you use Locations below.

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

Which Property Finder site the Locations searches run on. Start URLs always use their own site.

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

Cities, communities, sub-communities or buildings, one per line, e.g. 'Dubai Marina', 'Jumeirah Village Circle', 'Al Reem Island, Abu Dhabi', 'Riyadh', 'The Pearl'. Each is looked up with the site's own location search and scraped as a separate search. Add ', City' to pick between places with the same name.

## `purpose` (type: `string`):

Residential for sale or for rent, commercial for sale or for rent, or new projects (off-plan developments; UAE only, one record per project). Applies to Locations / whole-country searches; start URLs keep their own.

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

Only this property type. Leave empty for all. Offices, shops, retail, warehouses and showrooms are listed under the commercial purposes. Not every type exists in every country (e.g. townhouse in Saudi Arabia); the run stops with a message if it does not.

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

Number of bedrooms; pick one or more. 'Studio' = 0. Leave empty for any.

## `bathrooms` (type: `array`):

Number of bathrooms; pick one or more. Leave empty for any.

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

Minimum price in the local currency (AED, SAR, QAR, BHD, EGP). For rentals the site compares it with the rent per the rent frequency below (yearly by default in the UAE).

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

Maximum price in the local currency.

## `minArea` (type: `integer`):

Minimum size in the site's unit: square feet on propertyfinder.ae, square metres on the other sites.

## `maxArea` (type: `integer`):

Maximum size in the site's unit (sqft in the UAE, sqm elsewhere).

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

Furnished, unfurnished or partly furnished only. Leave empty for any.

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

Off-plan or ready properties only (UAE and Egypt). Leave empty for any.

## `rentFrequency` (type: `string`):

For rentals: only listings rented yearly, monthly, weekly or daily (also the period the price filter refers to). Leave empty for any.

## `keywords` (type: `string`):

Only listings matching these keywords, as in the site's keyword filter (e.g. 'sea view', 'private pool').

## `sort` (type: `string`):

Order of the results. Applies to Locations searches and to start URLs without a sort of their own. 'Newest first' is stable between pages and best for monitoring; 'Featured' is the site's default and repeats promoted listings across pages (repeats are skipped and not charged).

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

Stop after this many listings in total (across all searches). Keeps cost predictable. Property Finder shows at most 50 pages per search (about 2,000-2,500 listings); larger searches are split into price bands automatically (see below).

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

Also open each listing's page for what the search results do not show: the brokerage licence (ORN), the agent's licence (BRN), the advertising permit (DLD/Trakheesi or REGA permit number, validation link, issuing office), zone name, available-from date, the full regulatory block, all photos in full size and the full amenity list. One extra request per listing; charged as an extra 'detail' event (see pricing). Descriptions are included without this option.

## `splitLargeSearches` (type: `boolean`):

Property Finder serves only 50 pages per search (later pages come from an older copy of the index). When a search has more than 2,000 results and Max items asks for more, cut it into price bands that each fit (one extra page request per cut) so you can get every listing. Results then come band by band, cheapest band first.

## `onlyNewOrChanged` (type: `boolean`):

Remember what earlier runs of this search returned and output only new listings or listings whose price changed. Use with a Schedule; unchanged items are not charged. With this on, Max items is the number of listings checked per run (e.g. the newest 200).

## `monitoringKey` (type: `string`):

Name for this watch, so several schedules on the same search stay separate; defaults to a key derived from the search input

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

Apify RESIDENTIAL proxy is the default: it answered every request in tests. Residential traffic is billed by Apify per GB: about 4 MB per 1,000 listings (about $0.03) plus about 150 KB per listing page when 'Include licences' is on (about $0.0012 each). Datacenter proxy (Apify Proxy without a group) also works and costs almost nothing in traffic, but Property Finder's CDN refuses about 45% of its requests, which are retried, so runs take about twice as long.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.propertyfinder.ae/en/rent/dubai/apartments-for-rent.html"
    }
  ],
  "country": "ae",
  "purpose": "for-sale",
  "sort": "newest",
  "maxItems": 100,
  "includeDetails": false,
  "splitLargeSearches": true,
  "onlyNewOrChanged": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# 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 = {
    "startUrls": [
        {
            "url": "https://www.propertyfinder.ae/en/rent/dubai/apartments-for-rent.html"
        }
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("tortuga/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 = {
    "startUrls": [{ "url": "https://www.propertyfinder.ae/en/rent/dubai/apartments-for-rent.html" }],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("tortuga/propertyfinder-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 '{
  "startUrls": [
    {
      "url": "https://www.propertyfinder.ae/en/rent/dubai/apartments-for-rent.html"
    }
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call tortuga/propertyfinder-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,tortuga/propertyfinder-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/xgzqvltKvjFrAc0Dj/builds/i3hk7fU1Nzd93HhGH/openapi.json
