# Property Finder Scraper - UAE Real Estate, Agents & Leads (`scrapesage/property-finder-scraper`) Actor

Scrape Property Finder UAE & GCC listings for sale & rent: price, beds/baths, size, geo, RERA permit, completion status, off-plan projects (developer, payment plans), photos — plus agent & brokerage leads (email, phone, WhatsApp). New-listing & price-drop monitoring. No browser.

- **URL**: https://apify.com/scrapesage/property-finder-scraper.md
- **Developed by:** [Scrape Sage](https://apify.com/scrapesage) (community)
- **Categories:** Real estate, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 property scrapeds

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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 — UAE & GCC Real Estate, Agents & Leads

Extract **complete Property Finder data** for **sale and rent** across the UAE (Dubai, Abu Dhabi, Sharjah and the wider GCC) — price, beds/baths, size, full location & map coordinates, RERA permit number, completion status, full description and photos. Every listing carries the **agent and brokerage contact** (name, **email, phone and WhatsApp**), off-plan **new projects** come with the developer, delivery date and payment plans, and you can run in **monitoring mode** to capture only new listings and price drops.

No login, no cookies, no browser — fast JSON extraction straight from Property Finder's own pages.

### Why this Property Finder scraper?

Most UAE property scrapers stop at the listing card. This actor ships the **richest record in the category** — direct agent **and** brokerage contacts on every listing, off-plan project economics, the RERA permit number, and change monitoring — all from clean pages with no anti-bot gambling:

| Data | Typical scrapers | This actor |
|---|---|---|
| Price, beds/baths, size, location, geo | ✅ | ✅ |
| Agent **email + phone + WhatsApp** | partial | ✅ on every listing |
| Brokerage (agency) name, email, phone, logo | ❌ | ✅ |
| RERA permit number + verified flag | ❌ | ✅ |
| Completion status, furnishing, amenities | partial | ✅ |
| Off-plan **projects** (developer, delivery date, payment plans) | ❌ | ✅ |
| Full description + all photos | partial | ✅ |
| Community **price trends, mortgage & insights** | ❌ | ✅ opt-in |
| Agent & brokerage **leads** (deduplicated) | ❌ | ✅ opt-in |
| New-listing & **price-drop monitoring** | ❌ | ✅ opt-in |
| Location auto-resolve (type a community name) | ❌ | ✅ |
| Lead score (0–100) per record | ❌ | ✅ |

Built for the way buyers actually work the UAE market: search a community, get fully-contacted listings, watch it for new stock and price drops, and roll the agents up into a clean lead list.

### Use cases

- **Real-estate lead generation** — UAE agents and brokerages are high-value B2B buyers (and sellers): proptech, mortgage brokers, conveyancing, interior fit-out, staging, photography, CRM and portals all prospect them. Every listing already carries the agent's email, phone and WhatsApp plus the brokerage's contact; turn on agent leads for one deduplicated record per agent, or pass broker/agency URLs for the agency record (license, total stock, sale/rent split).
- **Investor sourcing & deal-finding** — filter by community, price, beds, size and completion status; sort by newest to catch fresh stock; compute **price-per-sqft** instantly; and track off-plan projects with developer, handover date and payment plans.
- **Market & pricing intelligence** — measure asking prices, £/sqft (AED/sqft), inventory and new-supply by community, building or developer; opt into community **price trends** and **insights** for analytics and reports.
- **Off-plan / new-project research** — capture every new development with its developer, delivery date, payment plan structure and unit size range (sqm) — ideal for off-plan brokers and investment advisories.
- **Portals, dashboards & alerts** — feed property apps, newsletters and Slack/CRM workflows with structured, photo-rich UAE listings for any community.

### How to use

1. [Sign up for Apify](https://console.apify.com/sign-up) — the free plan is enough to try this actor.
2. Open the **Property Finder Scraper**, enter one or more `searchLocations` (e.g. `Dubai Marina`, `Business Bay`, `Abu Dhabi`), pick **buy** or **rent**, set your filters, and click **Start**.
3. Watch results stream into the dataset table.
4. **Export** as JSON, CSV, Excel, XML, or RSS — or pull results programmatically via the [Apify API](https://docs.apify.com/api/v2).

### Input

```json
{
    "dealType": "buy",
    "country": "ae",
    "searchLocations": ["Dubai Marina", "Business Bay"],
    "propertyTypes": ["apartment"],
    "minPrice": 1000000,
    "maxPrice": 3000000,
    "minBedrooms": 1,
    "completionStatus": "ready",
    "sortBy": "newest",
    "includeAgentLeads": true,
    "maxResults": 500
}
````

- **dealType** — `buy` (for sale) or `rent` (applies to `searchLocations`).
- **country** — Property Finder site: `ae` (UAE, default), `qa`, `sa`, `bh`, `eg`.
- **searchLocations** — emirate/city names (`Dubai`, `Abu Dhabi`, `Sharjah`) or community names (`Dubai Marina`, `Jumeirah Village Circle`, `Business Bay`). Each is auto-resolved via Property Finder's own pages. You can also pass a numeric PF location id or a full PF search URL.
- **startUrls** — paste Property Finder **search URLs** (paginated with their filters baked in), **property URLs** (`/en/plp/…html`, scraped in full detail), or **broker/agency URLs** (`/en/broker/<slug>`, returned as agency leads).
- **brokerUrls** — Property Finder broker/agency pages — one rich agency lead each (name, email, phone, RERA license, total stock, sale/rent split).
- **propertyTypes / minPrice / maxPrice / minBedrooms / maxBedrooms / furnished / completionStatus / sortBy** — search filters.
- **includePropertyDetails** *(default false)* — open each property page for amenities, community **price trends**, **mortgage products** and **community insights**. The listing card already carries 40+ fields, so leave off for a faster, cheaper run.
- **includeAgentLeads** *(default false)* — also output one deduplicated lead per unique agent (`type: "agent"`).
- **maxResults** — global cap on properties emitted.
- **monitorMode** *(default false)* — only emit new and price-changed listings (see below).

### Output

One record per property (`type: "property"`, with `listingType` `property` or `project`), plus optional agent/brokerage leads (`type: "agent"`):

```json
{
    "type": "property",
    "listingType": "property",
    "platform": "propertyfinder",
    "country": "ae",
    "id": "100385103",
    "reference": "1038401781034",
    "url": "https://www.propertyfinder.ae/en/plp/buy/apartment-for-sale-dubai-dubai-marina-elite-residence-100385103.html",
    "title": "Full Sea View | 03 Layout | High Floor",
    "dealType": "buy",
    "propertyType": "Apartment",
    "completionStatus": "completed",
    "furnished": "NO",
    "price": 1590000,
    "currency": "AED",
    "pricePerSqft": 1985.02,
    "bedrooms": "1",
    "bathrooms": "2",
    "sizeValue": 801,
    "sizeUnit": "sqft",
    "city": "Dubai",
    "community": "Dubai Marina",
    "subCommunity": "Elite Residence",
    "latitude": 25.089393,
    "longitude": 55.147796,
    "agentName": "Jackson David Williams",
    "agentEmail": "jackson@yhuproperties.com",
    "agentIsSuperAgent": true,
    "brokerName": "YHU Properties",
    "brokerEmail": "info@yhuproperties.com",
    "brokerPhone": "+971554355467",
    "contactPhone": "+971585576360",
    "contactWhatsapp": "+97145560345",
    "rera": "7148067070",
    "isVerified": true,
    "amenities": ["Central A/C", "Shared Pool", "Built in Wardrobes", "Covered Parking"],
    "imageCount": 13,
    "listedDate": "2026-06-09T05:21:49Z",
    "leadScore": 100,
    "scrapedAt": "2026-06-16T22:38:54.967Z"
}
```

Off-plan records (`listingType: "project"`) add `developer`, `deliveryDate`, `paymentPlans`, `effectivePrice` and the unit `sizeMin`/`sizeMax` range. Agent leads carry `agentName/agentEmail/agentPhone/agentWhatsapp/agentLanguages` plus the brokerage contact; brokerage leads (`leadType: "brokerage"`) add `brokerLicense`, `brokerTotalProperties` and the sale/rent split. In **monitoring mode**, records are tagged `changeType` (`new` or `price_changed`) with `previousPrice` and `priceDelta`.

### Monitoring mode & scheduling

Turn on **monitorMode** to remember the properties already returned and emit **only** ones that are new or whose price changed since the last run. This is the cleanest way to track fresh stock and price drops in a community.

It is **fully compatible** with [Apify Schedules](https://docs.apify.com/platform/schedules) — they do different jobs: the schedule decides *when* the run fires (e.g. every morning), and monitoring mode decides *what* is returned (only the deltas). Point each scheduled search at its own `monitorStoreName` to keep histories separate.

### Automate & schedule

Run this actor on autopilot and pull results into your own stack:

- **[Apify API](https://docs.apify.com/api/v2)** — start runs, fetch datasets, and manage schedules over REST.
- **[apify-client for JavaScript](https://docs.apify.com/api/client/js/)** and **[apify-client for Python](https://docs.apify.com/api/client/python/)** — official SDKs.
- **[Schedules](https://docs.apify.com/platform/schedules)** — run it hourly/daily to monitor new stock and price drops in a community; perfect for alerts and lead pipelines.
- **[Webhooks](https://docs.apify.com/platform/integrations/webhooks)** — trigger downstream actions (CRM import, Slack alert, email sequence) the moment a run finishes.

```js
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'MY_APIFY_TOKEN' });

const run = await client.actor('scrapesage/property-finder-scraper').call({
    dealType: 'buy',
    searchLocations: ['Dubai Marina'],
    minBedrooms: 1,
    maxPrice: 3000000,
    includeAgentLeads: true,
    maxResults: 500,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Got ${items.length} properties & agent leads`);
```

### Integrate with any app

Connect the dataset to 5,000+ apps — no code required:

- **[Make](https://docs.apify.com/platform/integrations/make)** — multi-step automation scenarios.
- **[Zapier](https://docs.apify.com/platform/integrations/zapier)** — push new property alerts or agent leads straight into your CRM.
- **[Slack](https://docs.apify.com/platform/integrations/slack)** — get notified when a monitored search finds new stock or a price drop.
- **[Google Drive / Sheets](https://docs.apify.com/platform/integrations/drive)** — auto-export every run to a spreadsheet.
- **[Airbyte](https://docs.apify.com/platform/integrations/airbyte)** — pipe results into your data warehouse.
- **[GitHub](https://docs.apify.com/platform/integrations/github)** — trigger runs from commits or releases.

### Use with AI assistants (MCP)

The output is clean, LLM-ready JSON. Call this actor from Claude, ChatGPT, or any agent framework through the **[Apify MCP server](https://docs.apify.com/platform/integrations/mcp)** — ask your assistant to "find 1-bed ready apartments under 2M AED in Dubai Marina listed this week and give me the agents' phone numbers" and let it run this scraper for you.

### More scrapers from scrapesage

Build a complete **property & real-estate-leads stack**:

- **[Rightmove Scraper](https://apify.com/scrapesage/rightmove-scraper)** — UK property listings, prices & estate-agent leads.
- **[Redfin Scraper](https://apify.com/scrapesage/redfin-scraper)** — US for-sale listings, Redfin Estimate, schools & agent/broker data.
- **[Rent.com Scraper](https://apify.com/scrapesage/rent-com-scraper)** — US rental listings, prices & property-management leads.
- **[FastExpert Agent Scraper](https://apify.com/scrapesage/fastexpert-agent-scraper)** — US real-estate agent leads, stats & reviews.
- **[Airbnb Scraper](https://apify.com/scrapesage/airbnb-scraper)** — short-let listings, prices & availability.
- **[99.co Property Scraper](https://apify.com/scrapesage/99-co-property-scraper)** — Singapore property listings & agent leads.
- **[EdgeProp.sg Scraper](https://apify.com/scrapesage/edgeprop-singapore-scraper)** — Singapore property & agent leads.
- **[Craigslist Scraper](https://apify.com/scrapesage/craigslist-scraper)** — classifieds incl. housing & for-sale-by-owner.

### Tips

- **Communities**: search by community (`Dubai Marina`, `Jumeirah Village Circle`, `Business Bay`) for the tightest, most useful result sets; combine with `propertyTypes`, price and bed filters to narrow further.
- **Fresh stock only**: sort by `newest` and/or turn on `monitorMode` to capture just new and reduced listings.
- **Cost control**: leave `includePropertyDetails` off for a fast run — the listing card already carries 40+ fields including agent & brokerage email/phone/WhatsApp; agent leads are deduplicated per agent.
- **Off-plan**: set `completionStatus` to `off-plan` to focus on new projects (with developer, delivery date and payment plans).
- **Proxies**: the default Apify Proxy works well and keeps costs low. If you hit rate limiting on very large runs, switch the proxy to Residential.

### FAQ

**How do I scrape Property Finder for a specific area?** Put the place in `searchLocations` — an emirate/city (`Dubai`, `Abu Dhabi`) or a community (`Dubai Marina`, `Downtown Dubai`). Combine with filters to narrow by price, beds, type and completion status. You can also paste a full Property Finder search URL into `startUrls`.

**Can I get sale and rental data?** Yes — set `dealType` to `buy` or `rent`. You can also mix both by passing the relevant Property Finder URLs in `startUrls`.

**Where do the agent phone numbers come from?** From the listing itself — Property Finder publishes the marketing agent's name and email plus the brokerage's name, email and phone, and the listing's contact phone and WhatsApp. With `includeAgentLeads` on, the actor rolls these into one deduplicated lead per agent; pass broker URLs for the agency-level record (license, total stock).

**Does it cover off-plan / new projects?** Yes — off-plan developments appear as `listingType: "project"` with the developer, delivery date, payment plans and unit size range.

**How do I monitor new listings and price drops automatically?** Turn on `monitorMode` and create an [Apify Schedule](https://docs.apify.com/platform/schedules). Each run returns only new and price-changed properties; add a [webhook](https://docs.apify.com/platform/integrations/webhooks) or [Zapier zap](https://docs.apify.com/platform/integrations/zapier) to push them into your CRM or a Slack channel.

**Can I export to Google Sheets, CSV, or Excel?** Yes — one click in the dataset view, or automatically on every run via the [Google Drive integration](https://docs.apify.com/platform/integrations/drive).

**A field is null — why?** Some listings genuinely don't publish a value (e.g. a hidden price, or a project with no contact phone in the card). Fields are `null` only when the data doesn't exist, not because the scraper skipped them.

**Is scraping Property Finder legal?** This actor collects publicly available data only. You are responsible for using the data in compliance with applicable laws (including data-protection rules for personal data) and Property Finder's terms.

### Need help?

Open an issue on the actor's **Issues** tab, or visit the [Apify help center](https://help.apify.com/). Feature requests are welcome — this actor is actively maintained.

# Actor input Schema

## `dealType` (type: `string`):

Scrape properties **for sale** (buy) or **to rent**. Applies to the `searchLocations` below — start URLs keep their own type.

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

Which Property Finder site to search. UAE (propertyfinder.ae) is the flagship; Qatar, Saudi, Bahrain and Egypt are also supported.

## `searchLocations` (type: `array`):

Places to search. Use plain names — emirates/cities (`Dubai`, `Abu Dhabi`, `Sharjah`) or communities (`Dubai Marina`, `Business Bay`, `Jumeirah Village Circle`). Each is auto-resolved via Property Finder's own SEO pages. You can also paste a numeric PF location id or a full PF search URL.

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

Optional. Paste Property Finder **search URLs** (`/en/search?...` or `/en/buy/dubai/...html`), individual **property URLs** (`/en/plp/...html`), or **broker/agency URLs** (`/en/broker/<slug>`). Search URLs are paginated with their filters baked in; property URLs are scraped in full detail; broker URLs return the full agent roster as leads.

## `brokerUrls` (type: `array`):

Optional. Property Finder broker/agency page URLs (`https://www.propertyfinder.ae/en/broker/<slug>`). Each returns the brokerage details plus every agent's contact (name, email, phone, WhatsApp, languages) as a `type: "agent"` lead.

## `propertyTypes` (type: `array`):

Restrict to specific property types. Leave empty for all.

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

Minimum price. For rentals this is the listing's annual/period price as published by Property Finder. Leave empty for no minimum.

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

Maximum price. Leave empty for no maximum.

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

Minimum number of bedrooms (use 0 for studios).

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

Maximum number of bedrooms.

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

Restrict by furnishing. Leave as Any for all.

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

Ready (completed) properties, off-plan (under construction), or any.

## `sortBy` (type: `string`):

How Property Finder orders results before they are collected. Newest first is ideal for fresh-stock monitoring.

## `includePropertyDetails` (type: `boolean`):

Open each property page for extra detail: full amenities list, community price trends, mortgage products and community insights. The listing card already carries 40+ rich fields (price, beds/baths, size, geo, RERA, agent & broker email/phone/WhatsApp, description, photos), so leave this OFF for a faster, cheaper run. Adds one page fetch per property.

## `includeAgentLeads` (type: `boolean`):

Emit one extra **lead record per unique agent** found across the results (`type: "agent"`) — agent name, email, phone, WhatsApp, languages, brokerage name/email/phone and a sample listing. Perfect for B2B prospecting (proptech, mortgage, conveyancing, photography, staging, CRM).

## `maxResults` (type: `integer`):

Global cap on the total number of properties emitted in this run.

## `monitorMode` (type: `boolean`):

Remember the properties already returned and emit ONLY ones that are **new** or whose **price changed** since the last run (tagged `changeType` = `new` | `price_changed`, with `previousPrice` and `priceDelta`). Ideal for tracking fresh stock and price drops in a community. Pairs with Apify Schedules — schedule the run, this flag handles the de-duplication.

## `monitorStoreName` (type: `string`):

Named key-value store that holds the 'already seen' properties for monitoring mode. Use a different name per tracked search to keep histories separate (lowercase letters, digits and hyphens).

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

Maximum parallel requests. Keep it moderate to stay friendly to Property Finder's servers and avoid rate limiting.

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

Proxy settings. Property Finder serves clean pages to datacenter IPs, so the default Apify Proxy works well and keeps costs low. If you hit rate limiting on very large runs, switch to Residential.

## Actor input object example

```json
{
  "dealType": "buy",
  "country": "ae",
  "searchLocations": [
    "Dubai Marina"
  ],
  "propertyTypes": [],
  "furnished": "",
  "completionStatus": "",
  "sortBy": "newest",
  "includePropertyDetails": false,
  "includeAgentLeads": false,
  "maxResults": 100,
  "monitorMode": false,
  "monitorStoreName": "property-finder-monitor",
  "maxConcurrency": 5,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

All scraped Property Finder properties and agent leads in the default dataset.

# 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 = {
    "searchLocations": [
        "Dubai Marina"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapesage/property-finder-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 = { "searchLocations": ["Dubai Marina"] }

# Run the Actor and wait for it to finish
run = client.actor("scrapesage/property-finder-scraper").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 '{
  "searchLocations": [
    "Dubai Marina"
  ]
}' |
apify call scrapesage/property-finder-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Property Finder Scraper - UAE Real Estate, Agents & Leads",
        "description": "Scrape Property Finder UAE & GCC listings for sale & rent: price, beds/baths, size, geo, RERA permit, completion status, off-plan projects (developer, payment plans), photos — plus agent & brokerage leads (email, phone, WhatsApp). New-listing & price-drop monitoring. No browser.",
        "version": "0.1",
        "x-build-id": "B6jD786zH80jMZMVh"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/scrapesage~property-finder-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-scrapesage-property-finder-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/scrapesage~property-finder-scraper/runs": {
            "post": {
                "operationId": "runs-sync-scrapesage-property-finder-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/scrapesage~property-finder-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-scrapesage-property-finder-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "dealType": {
                        "title": "Deal type",
                        "enum": [
                            "buy",
                            "rent"
                        ],
                        "type": "string",
                        "description": "Scrape properties **for sale** (buy) or **to rent**. Applies to the `searchLocations` below — start URLs keep their own type.",
                        "default": "buy"
                    },
                    "country": {
                        "title": "Property Finder country site",
                        "enum": [
                            "ae",
                            "qa",
                            "sa",
                            "bh",
                            "eg"
                        ],
                        "type": "string",
                        "description": "Which Property Finder site to search. UAE (propertyfinder.ae) is the flagship; Qatar, Saudi, Bahrain and Egypt are also supported.",
                        "default": "ae"
                    },
                    "searchLocations": {
                        "title": "Locations",
                        "type": "array",
                        "description": "Places to search. Use plain names — emirates/cities (`Dubai`, `Abu Dhabi`, `Sharjah`) or communities (`Dubai Marina`, `Business Bay`, `Jumeirah Village Circle`). Each is auto-resolved via Property Finder's own SEO pages. You can also paste a numeric PF location id or a full PF search URL.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "startUrls": {
                        "title": "Start URLs (search / property / broker pages)",
                        "type": "array",
                        "description": "Optional. Paste Property Finder **search URLs** (`/en/search?...` or `/en/buy/dubai/...html`), individual **property URLs** (`/en/plp/...html`), or **broker/agency URLs** (`/en/broker/<slug>`). Search URLs are paginated with their filters baked in; property URLs are scraped in full detail; broker URLs return the full agent roster as leads.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "brokerUrls": {
                        "title": "Broker / agency URLs (agent leads)",
                        "type": "array",
                        "description": "Optional. Property Finder broker/agency page URLs (`https://www.propertyfinder.ae/en/broker/<slug>`). Each returns the brokerage details plus every agent's contact (name, email, phone, WhatsApp, languages) as a `type: \"agent\"` lead.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "propertyTypes": {
                        "title": "Property types",
                        "type": "array",
                        "description": "Restrict to specific property types. Leave empty for all.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "apartment",
                                "villa",
                                "townhouse",
                                "penthouse",
                                "duplex",
                                "compound",
                                "hotel-apartment",
                                "land",
                                "floor",
                                "building"
                            ],
                            "enumTitles": [
                                "Apartment / flat",
                                "Villa",
                                "Townhouse",
                                "Penthouse",
                                "Duplex",
                                "Compound",
                                "Hotel apartment",
                                "Land / plot",
                                "Whole floor",
                                "Whole building"
                            ]
                        },
                        "default": []
                    },
                    "minPrice": {
                        "title": "Min price (AED)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Minimum price. For rentals this is the listing's annual/period price as published by Property Finder. Leave empty for no minimum."
                    },
                    "maxPrice": {
                        "title": "Max price (AED)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum price. Leave empty for no maximum."
                    },
                    "minBedrooms": {
                        "title": "Min bedrooms",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Minimum number of bedrooms (use 0 for studios)."
                    },
                    "maxBedrooms": {
                        "title": "Max bedrooms",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum number of bedrooms."
                    },
                    "furnished": {
                        "title": "Furnishing",
                        "enum": [
                            "",
                            "furnished",
                            "unfurnished"
                        ],
                        "type": "string",
                        "description": "Restrict by furnishing. Leave as Any for all.",
                        "default": ""
                    },
                    "completionStatus": {
                        "title": "Completion status",
                        "enum": [
                            "",
                            "ready",
                            "off-plan"
                        ],
                        "type": "string",
                        "description": "Ready (completed) properties, off-plan (under construction), or any.",
                        "default": ""
                    },
                    "sortBy": {
                        "title": "Sort order",
                        "enum": [
                            "newest",
                            "price-asc",
                            "price-desc",
                            "verified",
                            "featured"
                        ],
                        "type": "string",
                        "description": "How Property Finder orders results before they are collected. Newest first is ideal for fresh-stock monitoring.",
                        "default": "newest"
                    },
                    "includePropertyDetails": {
                        "title": "Include full property details",
                        "type": "boolean",
                        "description": "Open each property page for extra detail: full amenities list, community price trends, mortgage products and community insights. The listing card already carries 40+ rich fields (price, beds/baths, size, geo, RERA, agent & broker email/phone/WhatsApp, description, photos), so leave this OFF for a faster, cheaper run. Adds one page fetch per property.",
                        "default": false
                    },
                    "includeAgentLeads": {
                        "title": "Also output agent leads",
                        "type": "boolean",
                        "description": "Emit one extra **lead record per unique agent** found across the results (`type: \"agent\"`) — agent name, email, phone, WhatsApp, languages, brokerage name/email/phone and a sample listing. Perfect for B2B prospecting (proptech, mortgage, conveyancing, photography, staging, CRM).",
                        "default": false
                    },
                    "maxResults": {
                        "title": "Max properties (whole run)",
                        "minimum": 1,
                        "maximum": 200000,
                        "type": "integer",
                        "description": "Global cap on the total number of properties emitted in this run.",
                        "default": 100
                    },
                    "monitorMode": {
                        "title": "Monitoring mode — only new & changed",
                        "type": "boolean",
                        "description": "Remember the properties already returned and emit ONLY ones that are **new** or whose **price changed** since the last run (tagged `changeType` = `new` | `price_changed`, with `previousPrice` and `priceDelta`). Ideal for tracking fresh stock and price drops in a community. Pairs with Apify Schedules — schedule the run, this flag handles the de-duplication.",
                        "default": false
                    },
                    "monitorStoreName": {
                        "title": "Monitor store name",
                        "type": "string",
                        "description": "Named key-value store that holds the 'already seen' properties for monitoring mode. Use a different name per tracked search to keep histories separate (lowercase letters, digits and hyphens).",
                        "default": "property-finder-monitor"
                    },
                    "maxConcurrency": {
                        "title": "Max concurrency",
                        "minimum": 1,
                        "maximum": 10,
                        "type": "integer",
                        "description": "Maximum parallel requests. Keep it moderate to stay friendly to Property Finder's servers and avoid rate limiting.",
                        "default": 5
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Proxy settings. Property Finder serves clean pages to datacenter IPs, so the default Apify Proxy works well and keeps costs low. If you hit rate limiting on very large runs, switch to Residential.",
                        "default": {
                            "useApifyProxy": true
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
