# PropertyFinder.ae UAE Real Estate Listings (`zinin/propertyfinder-gulf`) Actor

Pull live apartment, villa, penthouse and townhouse listings straight from PropertyFinder.ae — the UAE's biggest real-estate portal — by deal type and emirate, sorted freshest-first. No login, no browser, no proxies.

- **URL**: https://apify.com/zinin/propertyfinder-gulf.md
- **Developed by:** [Tim Zinin](https://apify.com/zinin) (community)
- **Categories:** Real estate
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.55 / 1,000 listing founds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#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

## PropertyFinder.ae UAE Real Estate Listings

Pull live apartment, villa, penthouse, townhouse and land listings straight
from PropertyFinder.ae — the UAE's biggest real-estate portal — filtered by
deal type (sale/rent) and emirate, sorted freshest-first. No login, no API
key, no browser needed on your side.

### What you get

- Title, price (with currency), bedrooms, floor area in m², location,
  coordinates, a short description, up to 5 photos, the listing date and the
  direct listing URL for every ad found.
- Filter by sale or rent, any of the 7 UAE emirates, and optionally drop
  anything older than N days.
- Results are sorted freshest-first among what was scanned.
- Runs on Apify: schedule it, monitor it, call it from the API, export to
  JSON/CSV/Excel or push straight into your own pipeline.

### How to run it

1. Click **Try for free** — no card needed on the free plan.
2. Pick **Deal type** (sell or rent) and **Emirate** (defaults to Dubai).
3. Hit **Start** and pull the results from the dataset (UI, API or webhook).

### Pricing

Pay-per-event: **$0.005 per run start + $0.003 per result**. No monthly seat, no minimum. 100 listings found cost about $0.30 (the one-time start fee plus 100 result rows). Rows where the source returned nothing (zero matching
listings, nothing within your freshness window, or a request that failed) are
returned for transparency but are **never** charged for.

### 简体中文说明

直接从中东最大的房产门户 PropertyFinder.ae 抓取在售/在租的公寓、别墅、顶层豪宅、联排别墅和土地房源，可按 `deal_type`（`sell` 出售 / `rent` 出租）和阿联酋七个酋长国之一筛选（`emirate`，默认 `dubai` 迪拜），扫描到的结果按发布时间从新到旧排序。每条房源包含标题、价格及币种（统一为 `AED` 迪拉姆）、卧室数、按平方米换算的面积、地理位置和坐标、简介、最多 5 张图片、发布日期以及原始链接。

**目前只能按酋长国粒度筛选，无法精确到具体楼盘或社区**：PropertyFinder.ae 的 `robots.txt` 屏蔽了可用于精细筛选的查询字符串检索接口，本 Actor 改为读取 `robots.txt` 明确允许、且出现在官方站点地图中的酋长国整体列表页。也**不会抓取经纪人联系方式、完整设施清单、期房项目信息或卖家电话**——只提取房源卡片本身展示的信息；一次运行会在 `max_pages`/`max_items` 达到上限时停止，返回的是扫描范围内最新的房源，不是对全站的完整爬取保证。

计费为按事件付费：每次运行 $0.005，每条房源结果 $0.003。100 条房源约 $0.30（含一次性启动费）；没有匹配房源、超出新鲜度窗口或请求失败的记录会返回说明，但**不计费**。

### Input

| Field | Required | What it does |
|---|---|---|
| `deal_type` | no | `sell` for properties for sale, `rent` for properties for rent. Default `sell`. |
| `emirate` | no | One of `dubai`, `abu-dhabi`, `sharjah`, `ajman`, `ras-al-khaimah`, `fujairah`, `umm-al-quwain`, `al-ain`. Default `dubai`. |
| `max_items` | no | Total row cap for this run, taken from the freshest candidates found (default 25). |
| `max_pages` | no | How many result pages to scan before picking the freshest `max_items` (default 3). |
| `max_listing_age_days` | no | Drop any listing older than this many days. Leave empty to keep the freshest regardless of age. |

```json
{
    "deal_type": "sell",
    "emirate": "dubai",
    "max_items": 5,
    "max_pages": 1
}
```

### Output

Real row from a live run on the platform (2026-08-01):

```json
{
    "emirate": "dubai",
    "deal_type": "sale",
    "found": true,
    "url": "https://www.propertyfinder.ae/en/plp/buy/villa-for-sale-dubai-villanova-amaranta-amaranta-2-124265342.html",
    "title": "Limited Release | Standalone | Tenanted",
    "price": 6700000,
    "currency": "AED",
    "property_type": "Villa",
    "rooms": 4,
    "area_sqm": 400.04,
    "location": "Amaranta 2, Amaranta, Villanova, Dubai",
    "lat": 25.080896377563477,
    "lng": 55.361793518066406,
    "posted_date": "2026-08-01T04:31:07Z",
    "description": "4-BEDROOM STAND-ALONE VILLA | INVESTOR DEAL\n\nProperty Features:\n\n- Fully fitted kitchen with appliances\n- Built-in wardrobes and walk-in closet\n- Maid’s room and separate laundry room\n- Private garden and outdoor terrace\n- Balcony with dedicated BBQ area\n- Central air conditioning and heating\n- Covered parking with private garage\n- Private swimming pool and gym\n- Storage room\n\nCommunity Amenities:\n\n- Shared swimming pool and gym\n- Children’s play area and nursery\n- Landscaped gardens and walkin…",
    "images": [
        "https://static.shared.propertyfinder.ae/media/images/listing/PDSPT6WS1P28E7MW7HTRBMTNMG/7b3219c7-24fa-4d7b-b1d0-64addff02653/668x452.jpg?v=3e48054949679313e07b2a595982173c",
        "https://static.shared.propertyfinder.ae/media/images/listing/PDSPT6WS1P28E7MW7HTRBMTNMG/804ebc58-3019-46f9-aacc-ad4f3fed3582/668x452.jpg?v=16a78ea9ab29f828da5fcc49062adf86",
        "https://static.shared.propertyfinder.ae/media/images/listing/PDSPT6WS1P28E7MW7HTRBMTNMG/051acb1d-e156-4bb4-bd6f-e698b188d087/668x452.jpg?v=8f0c3f3a4cd47aa87a6b40a06bdacf24"
    ],
    "source_portal": "propertyfinder-gulf",
    "scraped_at": "2026-08-01T05:10:18.680Z",
    "partial": true,
    "partial_reason": "stopped after 1 page(s), 25 item(s) collected — reached this run's own max_pages/max_items limit before the source confirmed (via confirmedEnd) that there is nothing more; there may be additional matching listings beyond what was collected"
}
```

| Field | Meaning |
|---|---|
| `found` | `true` for a real listing row, `false` for a not-found/error row. |
| `price` | Listing price as a number, in `currency` (always `AED`). |
| `rooms` | Bedroom count (`0` for a studio); `null` when not applicable (e.g. land plots). |
| `area_sqm` | Floor/plot area converted to square meters (source lists it in sqft). |
| `location` | Full location string as shown on the listing: tower/building, community, area, emirate. |
| `posted_date` | Full ISO 8601 timestamp of when the listing was posted/refreshed — rows are sorted by this, freshest first. |
| `images` | Up to 5 preview photo URLs. |
| `partial` | `true` when this run stopped without PropertyFinder.ae itself confirming there is nothing more — either `max_pages`/`max_items` was reached, or an unconfirmed empty page came back. `false` only when the source's own response confirmed no further results exist. Carried on every row, found or not. |
| `partial_reason` | Plain-English reason when `partial` is `true`; `null` when it's `false`. |

A not-found row looks like:

```json
{
    "emirate": "fujairah",
    "deal_type": "rent",
    "found": false,
    "note": "PropertyFinder.ae returned listings for this emirate/deal_type, but none were within the last 1 day(s) (25 dropped as stale).",
    "scraped_at": "2026-08-01T05:10:22.842Z"
}
```

### API

Start a run with a bearer token and explicit JSON input:

```bash
curl -sS -X POST 'https://api.apify.com/v2/acts/zinin~propertyfinder-gulf/runs?waitForFinish=60' \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H 'Content-Type: application/json' \
  --data '{"deal_type":"sell","emirate":"dubai","max_items":5,"max_pages":1}'
```

Read Dataset rows using the returned `defaultDatasetId`:

```bash
curl -sS "https://api.apify.com/v2/datasets/$DEFAULT_DATASET_ID/items?clean=true&format=json" \
  -H "Authorization: Bearer $APIFY_TOKEN"
```

### MCP

For an Apify MCP client exposing the standard `call-actor` tool, send this exact payload:

```json
{
  "name": "call-actor",
  "arguments": {
    "actor": "zinin/propertyfinder-gulf",
    "input": {
      "deal_type": "sell",
      "emirate": "dubai",
      "max_items": 5,
      "max_pages": 1
    }
  }
}
```

#### Related tools

Related tools for adjacent workflows in real estate listings and monitoring.

| Actor | What it does |
|---|---|
| [Imovirtual Portugal Real Estate Listings](https://apify.com/zinin/imovirtual-lisbon) | Pair it in the real estate listings and monitoring workflow: Pull live apartment and house listings straight from Imovirtual.com — Portugal's biggest real-estate... |
| [Krisha.kz Kazakhstan Real Estate Listings](https://apify.com/zinin/krisha-kz) | Pair it in the real estate listings and monitoring workflow: Pull live apartment and house listings straight from Krisha.kz — Kazakhstan's biggest real-estate... |
| [Otodom Poland Real Estate Listings](https://apify.com/zinin/otodom-warsaw) | Pair it in the real estate listings and monitoring workflow: Pull live apartment and house listings straight from Otodom.pl — Poland's biggest real-estate classifieds... |
| [Storia Romania Real Estate Listings](https://apify.com/zinin/storia-bucharest) | Pair it in the real estate listings and monitoring workflow: Pull live apartment and house listings straight from Storia.ro — Romania's biggest real-estate classifieds... |
| [Emlakjet Istanbul Real Estate Listings](https://apify.com/zinin/emlakjet-istanbul) | Pair it in the real estate listings and monitoring workflow: Pull live apartment/housing listings straight from Emlakjet.com for Istanbul — one of Turkey's biggest... |

### FAQ / Limitations

**Does this need a PropertyFinder.ae account or API key?** No — it reads
public pages a visitor sees, no login.

**Why emirate-level, not a specific building or district?** PropertyFinder.ae's
`robots.txt` blocks the query-string search endpoint this Actor could
otherwise use for finer filtering. This Actor instead reads the emirate-wide
"properties for sale/rent" page — a plain page confirmed both allowed by
`robots.txt` and currently listed in PropertyFinder's own sitemap. Narrower
filtering isn't available through a robots.txt-compliant path right now.

**What this is NOT.** This does not fetch agent/broker contact details, the
full amenities list, off-plan project listings, or the seller's phone number —
only what a `property`-type listing card carries on the emirate page. It does
not guarantee every listing on PropertyFinder.ae is returned; scanning stops
at `max_pages` / `max_items`, and results are the freshest found within that
scan, not a strict site-wide "newest first" crawl.

Found a bug or need a custom variant (a different GCC portal, extra fields)?
Open an issue on the Actor page.

### Machine use

The Actor is callable through the Apify API, SDK, and Apify MCP server. The input and Dataset row are the machine-facing contract; `rooms`/`area_sqm`/`images` return exactly what a listing card publishes and are `null`/empty rather than guessed when the source doesn't carry a value, and scanning is bounded by `max_pages`/`max_items` — this Actor never claims a full site-wide crawl.

# Actor input Schema

## `deal_type` (type: `string`):

`sell` for properties for sale, `rent` for properties for rent.

## `emirate` (type: `string`):

Which UAE emirate to search. Each is a sitemap-declared, robots.txt-allowed PropertyFinder.ae page — this Actor does not use the /en/search endpoint (see README FAQ).

## `max_items` (type: `integer`):

Maximum number of listing rows to return in this run, taken from the freshest candidates collected (see max\_listing\_age\_days).

## `max_pages` (type: `integer`):

How many result pages to scan (PropertyFinder shows ~20-25 listings per page) before picking the freshest max\_items from what was collected.

## `max_listing_age_days` (type: `integer`):

Optional. Drop any listing whose real posted date is older than this many days. Leave empty to keep the freshest listings regardless of age.

## Actor input object example

```json
{
  "deal_type": "sell",
  "emirate": "dubai",
  "max_items": 5,
  "max_pages": 1
}
```

# Actor output Schema

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

API URL for the default dataset items produced by this run.

# 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 = {
    "deal_type": "sell",
    "emirate": "dubai",
    "max_items": 5,
    "max_pages": 1
};

// Run the Actor and wait for it to finish
const run = await client.actor("zinin/propertyfinder-gulf").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 = {
    "deal_type": "sell",
    "emirate": "dubai",
    "max_items": 5,
    "max_pages": 1,
}

# Run the Actor and wait for it to finish
run = client.actor("zinin/propertyfinder-gulf").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 '{
  "deal_type": "sell",
  "emirate": "dubai",
  "max_items": 5,
  "max_pages": 1
}' |
apify call zinin/propertyfinder-gulf --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

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