# Property Finder API Scraper (`rl1987/propertyfinder-api-scraper`) Actor

Scrape Property Finder (MENA real estate: UAE, Saudi Arabia, Qatar, Egypt, Bahrain) public listings: search by location/type/price with full property detail (price, size, beds/baths, location + coordinates, images, agent/broker, amenities, RERA permit). Read-only, no account.

- **URL**: https://apify.com/rl1987/propertyfinder-api-scraper.md
- **Developed by:** [R.L.](https://apify.com/rl1987) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 listing row — basic data

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Property Finder Scraper – Real Estate Listings API for UAE, Saudi Arabia, Qatar, Egypt & Bahrain

Extract **real estate listings from Property Finder** — the Middle East's largest property portal —
as clean, structured JSON. Search apartments, villas, townhouses and commercial units for **rent or
sale** across the **UAE (Dubai, Abu Dhabi), Saudi Arabia, Qatar, Egypt and Bahrain**, and pull full
listing detail: price, size, bedrooms, location with GPS coordinates, photos, agent & brokerage,
amenities and the RERA permit.

Fast and reliable — this **Property Finder scraper** reads the portal's own data API directly, so you
get complete, structured records with no flaky HTML parsing and no headless browser. Export to
**JSON, CSV, Excel, or pull straight from the API** into your own tools.

### 🏙️ What this Property Finder scraper does

- 🔎 **Search listings** by country, location, purpose (buy / rent / commercial / new projects), price,
  bedrooms, bathrooms, property type, furnishing and more.
- 📄 **Full property details** — description, amenities, furnishing, developer/zone, RERA permit,
  price-per-area, agent, and **brokerage contact (phone, email, address)**.
- 📍 **Search by place name** — just type "Dubai Marina", "Downtown Dubai", "Riyadh" or "Doha"; the
  scraper resolves it to the right area automatically. No cryptic IDs.
- 🌍 **5 markets** — `propertyfinder.ae`, `.sa`, `.qa`, `.eg`, `.bh` — from one actor.
- ⚡ **API-fast & structured** — direct data-API access returns clean JSON, not scraped HTML.

### 💡 Use cases

- **Real estate market research & analytics** — track supply, asking prices and price-per-sqft by area.
- **Price & inventory monitoring** — watch new listings and price drops across communities over time.
- **Lead generation** — build brokerage contact lists (**phone, email, address**) alongside their live inventory. *Enable **Fetch full property details** to include brokerage contact.*
- **Investment & valuation** — feed comparable listings into your pricing or CMA models.
- **Property portals & apps** — power aggregators, dashboards and alerts with fresh Gulf real-estate data.

### 📥 Input

Configure a run from the visual input form or via the API. Common examples:

**All apartments for rent in Dubai Marina, cheapest first**

```json
{ "country": "ae", "location": "Dubai Marina", "category": "rent",
  "propertyType": "apartment", "sort": "price_asc", "maxItems": 200 }
```

**Villas for sale in Riyadh, with full details**

```json
{ "country": "sa", "location": "Riyadh", "category": "buy",
  "propertyType": "villa", "includeDetails": true, "maxItems": 100 }
```

Key inputs: `country`, `location` (place name), `category`, `propertyType`, `minPrice` / `maxPrice`,
`bedrooms`, `bathrooms`, `furnished`, `sort`, `includeDetails`, `maxItems`. Use **Property details**
mode with `propertyIds` to fetch full records for specific listings.

### 📤 Output

One row per property, for example:

```json
{
  "id": "141897764",
  "title": "Upgraded Kitchen and Bathroom | Vacant Oct | Large",
  "property_type": "Apartment",
  "price": 325000,
  "currency": "AED",
  "price_period": "yearly",
  "bedrooms": "4",
  "bathrooms": "5",
  "size": 2100,
  "size_unit": "sqft",
  "location_name": "Al Mesk Tower, Dubai Marina Towers, Dubai Marina, Dubai",
  "latitude": 25.078,
  "longitude": 55.139,
  "broker_name": "Rosenheim Luxury Properties",
  "broker_phone": "+971522887777",
  "broker_email": "info@rosenheimgroup.com",
  "broker_address": "Office 203, Emaar Business Park, Dubai",
  "agent_name": "Jane Doe",
  "amenities": ["Balcony", "Central A/C", "Covered Parking", "Shared Pool", "Shared Gym"],
  "furnished": "NO",
  "rera_permit": "R-12345",
  "is_verified": true,
  "images": ["https://static.shared.propertyfinder.ae/.../1136x640.jpg"],
  "share_url": "https://www.propertyfinder.ae/en/plp/.../141897764.html"
}
```

Every record also includes `reference`, `zone_name`, `price_per_area`, `completion_status`,
`listed_date`, `is_featured`, `video_url` and the RERA `rera_validation_url`.

**With *Fetch full property details* enabled**, each row additionally carries `description`,
`amenities`, `furnished`, and the **brokerage contact** — `broker_phone`, `broker_email`,
`broker_address` (ideal for lead generation).

### 🚀 How to scrape Property Finder in 3 steps

1. Choose a **country** and type a **location** (e.g. Dubai Marina) and **purpose** (rent or buy).
2. Add any filters (price, bedrooms, property type) and set **Max items**; toggle **Fetch full
   property details** for descriptions and amenities.
3. Click **Start** and export the results as JSON, CSV or Excel — or fetch them from the API.

### ❓ FAQ

**Is scraping Property Finder legal?** This actor collects only **publicly available** listing data
that anyone can view on the site without logging in. As with any scraping, use the data responsibly
and in line with applicable laws and terms.

**Do I need a Property Finder account or API key?** No. Public listings require no account or token.

**Which countries are supported?** UAE, Saudi Arabia, Qatar, Egypt and Bahrain.

**Can I get an individual listing by ID?** Yes — use **Property details** mode with one or more
`propertyIds` (the number at the end of a listing URL).

**How many listings can I get?** Set `maxItems` to whatever you need; results are paginated
automatically.

### 💳 Pricing

Pay per result:

| Event | When | Price |
|-------|------|-------|
| **Listing row** | per property returned (search or details mode) | $0.001 |
| **Listing details** | additionally per property when full details are included | $0.0005 |

### 🛟 Support

Questions or a field you'd like added? Open an issue and we'll help. Happy scraping!

# Actor input Schema

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

Search returns listings for a country/location with filters; Property details fetches full records for given property IDs.

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

Property Finder market to search.

## `locale` (type: `string`):

Response language.

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

For each search result, also fetch the full listing (description, amenities, RERA permit, furnishing, zone) and merge it into the row. Adds one request per property.

## `category` (type: `string`):

Listing purpose.

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

Place name (city/community/tower), resolved to a Property Finder location at runtime — e.g. 'Dubai Marina', 'Riyadh'. Leave blank to search the whole country.

## `query` (type: `string`):

Optional free-text search within the results.

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

Optional property-type filter.

## `furnished` (type: `string`):

Optional furnishing filter.

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

Optional minimum price (listing currency).

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

Optional maximum price.

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

Optional bedroom counts, e.g. \['studio','1','2'].

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

Optional bathroom counts.

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

Result ordering.

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

Roughly how many listings to return (0 = no limit). Pages are 25.

## `propertyIds` (type: `array`):

Property details mode: Property Finder listing IDs (the numeric id from a search result / the number at the end of a listing URL).

## `maxConcurrency` (type: `integer`):

Max requests in parallel.

## `maxRequestRetries` (type: `integer`):

Retries per request.

## `maxSessionRotations` (type: `integer`):

Retries for a blocked/rate-limited status.

## `locationIds` (type: `array`):

Optional advanced override: raw Property Finder location ids, skipping name resolution.

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

Optional. A UAE/GCC residential IP is recommended for the regional hosts.

## Actor input object example

```json
{
  "mode": "search",
  "country": "ae",
  "locale": "en",
  "includeDetails": false,
  "category": "rent",
  "location": "Dubai Marina",
  "bedrooms": [],
  "bathrooms": [],
  "sort": "featured",
  "maxItems": 100,
  "propertyIds": [],
  "maxConcurrency": 5,
  "maxRequestRetries": 5,
  "maxSessionRotations": 10,
  "locationIds": [],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# 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 = {
    "location": "Dubai Marina",
    "query": "",
    "bedrooms": [],
    "bathrooms": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("rl1987/propertyfinder-api-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 = {
    "location": "Dubai Marina",
    "query": "",
    "bedrooms": [],
    "bathrooms": [],
}

# Run the Actor and wait for it to finish
run = client.actor("rl1987/propertyfinder-api-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 '{
  "location": "Dubai Marina",
  "query": "",
  "bedrooms": [],
  "bathrooms": []
}' |
apify call rl1987/propertyfinder-api-scraper --silent --output-dataset

```

## MCP server setup

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