# Propertyfinder Listings Scraper (`solidcode/propertyfinder-listings-scraper`) Actor

\[💰 $0.9 / 1K] Extract Propertyfinder listings (UAE, Qatar, Bahrain, Saudi, Egypt). Get prices, beds, size, amenities, images, agent and brokerage contacts, RERA permits, locations. Filter by country, purpose (rent/buy/off-plan), type, price, beds — or paste search URLs.

- **URL**: https://apify.com/solidcode/propertyfinder-listings-scraper.md
- **Developed by:** [SolidCode](https://apify.com/solidcode) (community)
- **Categories:** Real estate, Automation, Developer tools
- **Stats:** 5 total users, 2 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.90 / 1,000 results

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

## Propertyfinder Listings Scraper

Extract property listings from **Propertyfinder** across the entire MENA region — United Arab Emirates, Qatar, Bahrain, Saudi Arabia, and Egypt — in a single run. Get pricing, bedrooms, size, amenities, images, listed agent and brokerage contact details (phone, WhatsApp, email), RERA permits, geo-coordinates, and 60+ structured fields per listing. Use guided filters, or paste Propertyfinder search URLs directly.

### Why This Scraper?

- **Five countries, one actor** — search `propertyfinder.ae`, `.qa`, `.bh`, `.sa`, and `.eg` from the same input.
- **Rent, buy, and off-plan** — collect existing rentals, resale homes, and new-developer projects in one pipeline.
- **60+ data fields per listing** — title, description, price, beds/baths, size, amenities, full-resolution images, floor plans, video tours, agent contacts, brokerage details, RERA permits, geo-coordinates, and more.
- **Full agent + brokerage contacts** — every listing includes agent name, phone, WhatsApp, email plus brokerage name, phone, license number, and profile URL — ideal for lead generation.
- **Three ready-made dataset views** — Overview, Detailed, and Contacts — switch between them with one click.
- **Guided filters or raw URLs** — pick Country, Purpose, Location, Property Type, Bedrooms, Price, Furnishing, Sort, and Language from dropdowns, or paste Propertyfinder search URLs.
- **Arabic and English** — get titles, descriptions, and locations in either language. Especially useful for Egypt, where Arabic-language coverage is broader.
- **Pay only for what you collect** — flat per-result pricing. No compute fees, no proxy fees, no surprises.

### Use Cases

**Real Estate Investors & Developers**
- Track new-development supply by community and price band
- Monitor asking price per square foot across neighbourhoods
- Compare off-plan vs ready inventory; identify direct-from-developer listings

**Brokerages & Agents**
- Build prospect lists of agents and brokerages active in your target community
- Track competitors' listing volume, pricing, and exclusivity rates
- Source inventory across all five MENA countries in a single export

**Lead Generation & Sales**
- Pull agent and brokerage contact details (phone, WhatsApp, email) at scale
- Filter the Contacts dataset view by community, price band, or property type
- Identify SuperAgent verified profiles and high-volume brokerages

**Market Research & Analytics**
- Compute median rent and sale prices by community, building, or developer
- Track listing-age and price-change trends by re-running periodically
- Build datasets for proptech, mortgage, valuation, or AVM products

**Relocation & Real Estate Portals**
- Aggregate listings into your own portal or comparison site
- Enrich CRM records with photos, amenities, geo-coordinates, and floor plans

### Getting Started

#### 1. Simple country-wide search

The minimum input — pick a country and a purpose. Defaults to UAE rentals.

```json
{
    "country": "ae",
    "purpose": "rent",
    "maxResults": 200
}
````

#### 2. Guided filters: Dubai Marina apartments to rent, 2+ beds, under AED 200k

```json
{
    "country": "ae",
    "purpose": "rent",
    "locationQuery": "Dubai Marina",
    "propertyType": "apartment",
    "bedroomsMin": 2,
    "priceMax": 200000,
    "rentFrequency": "yearly",
    "maxResults": 500
}
```

#### 3. Paste Propertyfinder search URLs directly

Already crafted the perfect search on the Propertyfinder website? Copy the URL straight from your browser. The actor honours every filter baked into it and paginates from there.

```json
{
    "searchUrls": [
        "https://www.propertyfinder.ae/en/rent/properties-for-rent.html?l=50&t=1&bf=2&pt=200000",
        "https://www.propertyfinder.ae/en/buy/properties-for-sale.html?l=86&t=35"
    ],
    "maxResults": 1000
}
```

#### 4. Off-plan / new projects in Saudi Arabia

```json
{
    "country": "sa",
    "purpose": "newProjects",
    "completionStatus": "offPlan",
    "maxResults": 300
}
```

#### 5. Cross-country, Arabic language: Cairo apartments for sale

For Egypt, Arabic returns broader coverage than English.

```json
{
    "country": "eg",
    "purpose": "buy",
    "locationQuery": "القاهرة الجديدة",
    "propertyType": "apartment",
    "language": "ar",
    "sortBy": "newest",
    "maxResults": 500
}
```

### Input Reference

All fields are optional — leave anything blank to use the default. Pick a country and a purpose, or paste a Search URL, and the actor takes care of the rest.

#### What to scrape

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `searchUrls` | string\[] | `[]` | Paste Propertyfinder search URLs directly. All filters baked into each URL are honored. When provided, the guided filters below are ignored. |
| `country` | string | `ae` | Which Propertyfinder regional site to search. One of `ae` (UAE), `qa` (Qatar), `bh` (Bahrain), `sa` (Saudi Arabia), `eg` (Egypt). |
| `purpose` | string | `rent` | What kind of listings to search for. One of `rent`, `buy`, `newProjects` (off-plan / new developments). |
| `locationQuery` | string | empty | City, neighbourhood, or community name (e.g. `"Dubai Marina"`, `"The Pearl"`). Resolved via Propertyfinder's autocomplete — ambiguous queries pick the best of the top 20 matches, so use the most specific name you know. Leave empty to search the whole country. |

#### Filters

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `propertyType` | string | `any` | Limit results to one type. One of `any`, `apartment`, `villa`, `townhouse`, `penthouse`, `compound`, `duplex`, `fullFloor`, `halfFloor`, `wholeBuilding`, `bungalow`, `hotelApartment`, `land` (Buy only), `bulkSaleUnit` (Buy only), `bulkRentUnit` (Rent only). For multiple types, run the actor more than once or paste multiple Search URLs. |
| `bedroomsMin` | integer | empty | Minimum bedrooms (`0` = studio). Leave empty for any. Range: 0–8. |
| `bedroomsMax` | integer | empty | Maximum bedrooms (`8` means 7+). Leave empty for any. Range: 0–8. |
| `priceMin` | integer | empty | Minimum price in local currency (AED, QAR, BHD, SAR, EGP). |
| `priceMax` | integer | empty | Maximum price in local currency. |
| `rentFrequency` | string | `any` | How rent is quoted. Only applied when Purpose is `rent`. One of `any`, `yearly`, `monthly`, `weekly`, `daily`. |
| `furnishing` | string | `any` | Filter by furnishing status. One of `any`, `furnished`, `unfurnished`, `partlyFurnished`. |
| `completionStatus` | string | `any` | Ready-built vs under construction. Only applies to Buy and Off-plan. One of `any`, `ready`, `offPlan`. |
| `sortBy` | string | `featured` | Result ordering. One of `featured`, `newest`, `priceAsc`, `priceDesc`, `bedsAsc`, `bedsDesc`. |
| `language` | string | `en` | Output language. One of `en`, `ar`. For Egypt, Arabic returns broader coverage. |

#### Options

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `includeListingDetails` | boolean | `false` | Also fold in each listing's full description, full amenities list, floor plans, and RERA permit numbers. Off by default — Propertyfinder currently blocks most detail-page requests from datacenter IPs, so enabling this slows the run and most detail-only fields still come back empty. Every listing already includes title, price, beds/baths, size, location, agent + brokerage contacts, and listing-card images even with this off. |
| `maxResults` | integer | `200` | Max listings to collect across all searches. `0` = unlimited. Results are collected one page at a time (~25 per page), so the actor may overshoot the cap by a few records on the final page. |

### Output

Each result is a flat record with a stable, predictable shape. Sample (sanitized real listing from a Dubai Marina rental search):

```json
{
    "recordType": "listing",
    "listingId": "63264193",
    "referenceNumber": "3WGHCV3ZFJKNCVGJW7W2PC7CQ0",
    "title": "FULL MARINA VIEW - VACANT - PERFECT LAYOUT",
    "description": "Beautiful 2 Bedroom apartment for rent in Continental Tower...",
    "purpose": "rent",
    "propertyType": "Apartment",
    "price": 130000,
    "priceCurrency": "AED",
    "pricePeriod": "yearly",
    "isPriceHidden": false,
    "bedrooms": "2",
    "bathrooms": "3",
    "size": 1288,
    "sizeUnit": "sqft",
    "completionStatus": null,
    "listedDate": "2026-03-13T11:41:45Z",
    "isVerified": true,
    "isPremium": true,
    "locationFullName": "Continental Tower, Dubai Marina, Dubai",
    "city": "Dubai",
    "community": "Dubai Marina",
    "subCommunity": "Continental Tower",
    "country": "ae",
    "countryName": "United Arab Emirates",
    "latitude": 25.0802,
    "longitude": 55.1391,
    "amenities": ["Balcony", "Central A/C", "Covered Parking", "Shared Pool", "Shared Gym", "Concierge", "View of Water"],
    "images": [
        "https://static.shared.propertyfinder.ae/media/images/listing/.../668x452.jpg",
        "https://static.shared.propertyfinder.ae/media/images/listing/.../668x452.jpg"
    ],
    "coverImage": "https://static.shared.propertyfinder.ae/media/images/listing/.../668x452.jpg",
    "agentId": "159291",
    "agentName": "Mohamad Maktbe",
    "agentPhone": "+971555338823",
    "agentWhatsapp": "+97145560345",
    "agentEmail": "mohamad@example.com",
    "agentProfileUrl": "https://www.propertyfinder.ae/en/agent/mohamad-maktbe",
    "agentIsSuperAgent": true,
    "brokerId": "2753",
    "brokerName": "Al Bishri Real Estate",
    "brokerPhone": "+971555338823",
    "brokerEmail": "info@example.com",
    "brokerProfileUrl": "https://www.propertyfinder.ae/en/broker/al-bishri-real-estate-2879",
    "listingUrl": "https://www.propertyfinder.ae/en/plp/rent/apartment-for-rent-dubai-dubai-marina-continental-tower-...html",
    "searchUrl": "https://www.propertyfinder.ae/en/rent/properties-for-rent.html?l=50&t=1&bf=2&pt=200000&rp=y&ob=mr&page=1",
    "pageNumber": 1,
    "positionOnPage": 4,
    "scrapedAt": "2026-04-24T23:16:57+00:00"
}
```

(Truncated for readability — every run produces 68 fields per row. See the full field list below.)

#### All available fields

| Field | Type | Description |
|-------|------|-------------|
| `recordType` | string | Always `"listing"`. |
| `listingId` | string | Propertyfinder's internal listing ID. |
| `referenceNumber` | string | Brokerage reference number. |
| `title` | string | Listing headline. |
| `description` | string | Full description (richer when `includeListingDetails=true`). |
| `purpose` | string | `rent`, `buy`, or `newProject`. |
| `propertyType` | string | Type label (Apartment, Villa, Townhouse...). |
| `price` | number | Asking price in local currency; `null` if hidden. |
| `priceCurrency` | string | `AED`, `QAR`, `BHD`, `SAR`, or `EGP`. |
| `pricePeriod` | string | For rentals: `yearly`, `monthly`, `weekly`, `daily`. |
| `isPriceHidden` | boolean | `true` if price is "Ask agent". |
| `bedrooms` | number/string | Bedroom count (or `"Studio"`). |
| `bathrooms` | number/string | Bathroom count. |
| `size` | number | Built-up area. |
| `sizeUnit` | string | Usually `"sqft"`. |
| `furnishing` | string | `furnished`, `unfurnished`, `partly_furnished`, or `null`. |
| `completionStatus` | string | `ready`, `off_plan`, or `null`. |
| `listedDate` | string | ISO 8601 — when posted. |
| `lastRefreshedAt` | string | ISO 8601 — last refresh by the agent. |
| `isVerified` | boolean | Property verified by Propertyfinder. |
| `isFeatured` | boolean | Paid promotion flag. |
| `isExclusive` | boolean | Brokerage's exclusive listing. |
| `isPremium` | boolean | Premium-tier listing. |
| `isDirectFromDeveloper` | boolean | Off-plan: marketed directly by developer. |
| `isNewConstruction` | boolean | New-build flag. |
| `locationId` | string | Propertyfinder location ID. |
| `locationFullName` | string | "Tower, Sub-Community, Community, City". |
| `locationPath` | string | Hierarchical location path (dot-separated IDs). |
| `locationSlug` | string | URL-safe location slug. |
| `city` | string | Parsed city. |
| `community` | string | Parsed community / district. |
| `subCommunity` | string | Parsed building / sub-community. |
| `country` | string | `ae`, `qa`, `bh`, `sa`, or `eg`. |
| `countryName` | string | Full country name. |
| `latitude` | number | GPS latitude. |
| `longitude` | number | GPS longitude. |
| `amenities` | string\[] | Amenity names ("Pool", "Gym", "Balcony", ...). |
| `images` | string\[] | Listing-card image URLs (typically 1–3 per row). Enable `includeListingDetails` for the full gallery. |
| `coverImage` | string | Hero image URL. |
| `floorPlanImages` | string\[] | Floor-plan image URLs. |
| `videoTourUrl` | string | Video walkthrough URL. |
| `agentId` | string | Agent's Propertyfinder ID. |
| `agentName` | string | Agent's full name. |
| `agentPhotoUrl` | string | Agent's profile photo URL. |
| `agentPhone` | string | Agent's phone (international format). |
| `agentWhatsapp` | string | Agent's WhatsApp number. |
| `agentEmail` | string | Agent's email address. |
| `agentProfileUrl` | string | Agent's Propertyfinder profile URL. |
| `agentYearsOfExperience` | number | Agent's years in the industry. |
| `agentIsSuperAgent` | boolean | Propertyfinder SuperAgent badge. |
| `brokerId` | string | Brokerage's Propertyfinder ID. |
| `brokerName` | string | Brokerage / agency name. |
| `brokerLogoUrl` | string | Brokerage logo URL. |
| `brokerLicenseNumber` | string | Trade-license number. |
| `brokerPhone` | string | Brokerage main phone. |
| `brokerEmail` | string | Brokerage email. |
| `brokerProfileUrl` | string | Brokerage profile URL. |
| `reraPermitNumber` | string | RERA permit (UAE) — populated when `includeListingDetails=true`. |
| `issuedLicenseNumber` | string | Issued real-estate license number. |
| `paymentMethod` | string\[] | Accepted payment options (e.g. `["cash", "cheque"]`). `null` when not provided. |
| `utilitiesPriceType` | string | How utilities are billed. `null` when not specified. |
| `offeringType` | string | Offering classification ("Residential for Rent", ...). |
| `listingUrl` | string | Canonical listing page URL. |
| `shareUrl` | string | Listing's public share URL. |
| `searchUrl` | string | Search URL this row was collected from. |
| `pageNumber` | number | Search-result page (1-based). |
| `positionOnPage` | number | Position within the page (1-based). |
| `scrapedAt` | string | ISO 8601 — when this row was collected. |

#### Three ready-made dataset views

In the Apify UI you can switch between:

- **Overview** — title, purpose, type, price, beds, baths, size, city, community, agent, brokerage, listing URL.
- **Detailed** — every field above.
- **Contacts** — title, city, community, agent name + phone + WhatsApp + email, brokerage name + phone + email + license number, listing URL. Built for lead-generation workflows.

### Tips for Best Results

- **Set `rentFrequency` to `any` for broadest rental coverage.** UAE rentals are usually quoted yearly, but Qatar's market is mostly **monthly** — picking `yearly` on Qatar filters out the bulk of inventory. `any` covers all four periods.
- **For Egypt, switch `language` to `ar`.** The `.eg` portal is Arabic-first; English coverage is genuinely thinner. Run with `language: "ar"` for the full inventory, or run twice (once per language) and merge.
- **Leave `includeListingDetails` off unless you need it.** Propertyfinder currently blocks most detail-page requests from datacenter IPs, so the slower per-listing fetch usually returns empty for the detail-only fields (`reraPermitNumber`, `floorPlanImages`, full descriptions). Every search-results field — title, price, beds/baths, size, location, agent + brokerage contacts, listing-card images — populates with this off. Turn it on only when you've confirmed it works for your specific search.
- **Need multiple property types?** `propertyType` is single-select. Run the actor once per type, or paste multiple Search URLs (each can carry its own type filter).
- **Use `searchUrls` for power-user filters.** Anything you can craft on Propertyfinder's website — multi-keyword, polygon location, completion year, etc. — you can paste in directly.
- **`maxResults: 0` collects everything.** Useful for full inventory snapshots. Combine with a tight `locationQuery` to keep runs targeted.
- **Good to know: bedroom filter is applied after fetch.** Propertyfinder's URL accepts the parameter but doesn't always honour it server-side, so the actor re-applies it client-side to guarantee accuracy. The value `8` means "7 or more".
- **Good to know: bathroom filtering is not supported.** Propertyfinder's search endpoint silently drops bathroom filters, so the actor doesn't expose the field rather than ship a dead toggle. The `bathrooms` value is in every output row — filter client-side after export.
- **Sort impacts what you get when capping.** `featured` returns Propertyfinder's default order; `newest` returns the most recently listed first — best when re-running periodically for fresh inventory.

### Pricing

**Pay-per-result.** You pay only for the listings you actually collect — no compute charges, no proxy fees, no platform overhead.

| Results | Cost |
|---------|------|
| 100 | $0.09 |
| 1,000 | $0.90 |
| 10,000 | $9.00 |

**No compute charges — you only pay per result returned.** Empty searches and metadata-only requests are free. Failed runs do not consume credit.

### Integrations

Export results in JSON, CSV, Excel, XML, or RSS. Connect Propertyfinder data to 1,500+ apps via:

- **Zapier** / **Make** / **n8n** — Push new listings to your CRM, Slack, or Airtable; build no-code workflows that react to new inventory or price changes.
- **Google Sheets** — Direct spreadsheet export, refreshed on every run.
- **Apify API** — Full programmatic access for proptech, valuation, and CRM applications.
- **Webhooks** — Trigger custom systems the moment a run completes.

### Related Actors

- **Propertyfinder Agents & Brokers Scraper** — Pair with this actor to enrich data with full agent biographies, brokerage profiles, license numbers, and listing-portfolio counts.

### Legal & Ethical Use

Built for legitimate market research, real-estate analytics, lead generation, and proptech use cases. Collects only publicly available data displayed on Propertyfinder's regional portals. You are responsible for complying with applicable laws and Propertyfinder's Terms of Service in your jurisdiction. Do not use the collected data for spam, harassment, or any unlawful purpose, and respect agents' and brokerages' contact preferences.

# Actor input Schema

## `searchUrls` (type: `array`):

Paste Propertyfinder search URLs directly (for example, https://www.propertyfinder.ae/en/rent/properties-for-rent.html?l=50 or https://www.propertyfinder.ae/en/buy/properties-for-sale.html?l=86\&t=35). All filters baked into each URL are honored. When provided, the guided filters below are ignored for these URLs.

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

Which Propertyfinder regional site to search. Egypt is Arabic-first — listings are still available in English but coverage is broader in Arabic.

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

What kind of listings to search for: existing properties to rent, existing properties to buy, or off-plan / new developments.

## `locationQuery` (type: `string`):

City, neighbourhood, or community name (for example, 'Dubai Marina', 'Downtown Dubai', 'The Pearl'). Resolved to the matching community via Propertyfinder's autocomplete — ambiguous queries pick the best of the top 20 matches, so use the most specific name you know. Leave empty to search the whole country.

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

Limit results to a single property type. To collect multiple types, run the actor more than once or paste multiple Search URLs.

## `bedroomsMin` (type: `integer`):

Only include properties with at least this many bedrooms (0 = studio). Leave empty for any.

## `bedroomsMax` (type: `integer`):

Only include properties with at most this many bedrooms (8 means 7+). Leave empty for any.

## `priceMin` (type: `integer`):

Only include properties at or above this price, in local currency (AED for UAE, QAR for Qatar, BHD for Bahrain, SAR for Saudi Arabia, EGP for Egypt). Leave empty for no minimum.

## `priceMax` (type: `integer`):

Only include properties at or below this price, in local currency. Leave empty for no maximum.

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

How rent is quoted. Only applied when Purpose is 'For Rent'; ignored for Buy and Off-plan. Tip: defaults vary by country (UAE prefers Yearly, Qatar prefers Monthly) — pick 'Any' to avoid filtering out the bulk of listings.

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

Filter by furnishing status.

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

Whether the property is ready-built or still under construction (off-plan). Only applies to Buy and Off-plan; ignored for Rent.

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

How results should be ordered on Propertyfinder before collection. 'Featured' is the site's default ranked order; 'Newest' lists by listed date.

## `language` (type: `string`):

Language of titles, descriptions, and location names in the output. For Egypt, Arabic produces broader coverage than English.

## `includeListingDetails` (type: `boolean`):

Also visit each listing's detail page to fold in the full description, full amenities list, floor plans, and RERA permit numbers. Off by default — Propertyfinder currently blocks most detail-page requests from datacenter IPs, so enabling this slows the run and most detail-only fields still come back empty. Every listing already includes title, price, beds/baths, size, location, agent + brokerage contacts, and listing-card images even with this off.

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

Maximum number of listings to collect across all searches. Set to 0 to collect everything Propertyfinder has for the search. Results are collected one page at a time (~25 per page), so the actor may overshoot this cap by a few records on the final page.

## Actor input object example

```json
{
  "searchUrls": [],
  "country": "ae",
  "purpose": "rent",
  "propertyType": "any",
  "rentFrequency": "any",
  "furnishing": "any",
  "completionStatus": "any",
  "sortBy": "featured",
  "language": "en",
  "includeListingDetails": false,
  "maxResults": 200
}
```

# Actor output Schema

## `overview` (type: `string`):

Compact table of listings with price, size, beds, baths, community, and link.

## `details` (type: `string`):

Full per-listing fields including description, amenities, images, agent, brokerage, and RERA permits.

## `contacts` (type: `string`):

Lead-generation view: agent and brokerage name, phone, WhatsApp, email, and license number for every listing.

# 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 = {
    "searchUrls": [],
    "country": "ae",
    "purpose": "rent",
    "locationQuery": "",
    "propertyType": "any",
    "rentFrequency": "any",
    "furnishing": "any",
    "completionStatus": "any",
    "sortBy": "featured",
    "language": "en",
    "includeListingDetails": false,
    "maxResults": 200
};

// Run the Actor and wait for it to finish
const run = await client.actor("solidcode/propertyfinder-listings-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "searchUrls": [],
    "country": "ae",
    "purpose": "rent",
    "locationQuery": "",
    "propertyType": "any",
    "rentFrequency": "any",
    "furnishing": "any",
    "completionStatus": "any",
    "sortBy": "featured",
    "language": "en",
    "includeListingDetails": False,
    "maxResults": 200,
}

# Run the Actor and wait for it to finish
run = client.actor("solidcode/propertyfinder-listings-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 '{
  "searchUrls": [],
  "country": "ae",
  "purpose": "rent",
  "locationQuery": "",
  "propertyType": "any",
  "rentFrequency": "any",
  "furnishing": "any",
  "completionStatus": "any",
  "sortBy": "featured",
  "language": "en",
  "includeListingDetails": false,
  "maxResults": 200
}' |
apify call solidcode/propertyfinder-listings-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Propertyfinder Listings Scraper",
        "description": "[💰 $0.9 / 1K] Extract Propertyfinder listings (UAE, Qatar, Bahrain, Saudi, Egypt). Get prices, beds, size, amenities, images, agent and brokerage contacts, RERA permits, locations. Filter by country, purpose (rent/buy/off-plan), type, price, beds — or paste search URLs.",
        "version": "1.0",
        "x-build-id": "gEwkA0yahK85SWd2i"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/solidcode~propertyfinder-listings-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-solidcode-propertyfinder-listings-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/solidcode~propertyfinder-listings-scraper/runs": {
            "post": {
                "operationId": "runs-sync-solidcode-propertyfinder-listings-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/solidcode~propertyfinder-listings-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-solidcode-propertyfinder-listings-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": {
                    "searchUrls": {
                        "title": "Search URLs",
                        "type": "array",
                        "description": "Paste Propertyfinder search URLs directly (for example, https://www.propertyfinder.ae/en/rent/properties-for-rent.html?l=50 or https://www.propertyfinder.ae/en/buy/properties-for-sale.html?l=86&t=35). All filters baked into each URL are honored. When provided, the guided filters below are ignored for these URLs.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "country": {
                        "title": "Country",
                        "enum": [
                            "ae",
                            "qa",
                            "bh",
                            "sa",
                            "eg"
                        ],
                        "type": "string",
                        "description": "Which Propertyfinder regional site to search. Egypt is Arabic-first — listings are still available in English but coverage is broader in Arabic.",
                        "default": "ae"
                    },
                    "purpose": {
                        "title": "Purpose",
                        "enum": [
                            "rent",
                            "buy",
                            "newProjects"
                        ],
                        "type": "string",
                        "description": "What kind of listings to search for: existing properties to rent, existing properties to buy, or off-plan / new developments.",
                        "default": "rent"
                    },
                    "locationQuery": {
                        "title": "Location",
                        "type": "string",
                        "description": "City, neighbourhood, or community name (for example, 'Dubai Marina', 'Downtown Dubai', 'The Pearl'). Resolved to the matching community via Propertyfinder's autocomplete — ambiguous queries pick the best of the top 20 matches, so use the most specific name you know. Leave empty to search the whole country."
                    },
                    "propertyType": {
                        "title": "Property Type",
                        "enum": [
                            "any",
                            "apartment",
                            "villa",
                            "townhouse",
                            "penthouse",
                            "compound",
                            "duplex",
                            "fullFloor",
                            "halfFloor",
                            "wholeBuilding",
                            "bungalow",
                            "hotelApartment",
                            "land",
                            "bulkSaleUnit",
                            "bulkRentUnit"
                        ],
                        "type": "string",
                        "description": "Limit results to a single property type. To collect multiple types, run the actor more than once or paste multiple Search URLs.",
                        "default": "any"
                    },
                    "bedroomsMin": {
                        "title": "Minimum Bedrooms",
                        "minimum": 0,
                        "maximum": 8,
                        "type": "integer",
                        "description": "Only include properties with at least this many bedrooms (0 = studio). Leave empty for any."
                    },
                    "bedroomsMax": {
                        "title": "Maximum Bedrooms",
                        "minimum": 0,
                        "maximum": 8,
                        "type": "integer",
                        "description": "Only include properties with at most this many bedrooms (8 means 7+). Leave empty for any."
                    },
                    "priceMin": {
                        "title": "Minimum Price",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Only include properties at or above this price, in local currency (AED for UAE, QAR for Qatar, BHD for Bahrain, SAR for Saudi Arabia, EGP for Egypt). Leave empty for no minimum."
                    },
                    "priceMax": {
                        "title": "Maximum Price",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Only include properties at or below this price, in local currency. Leave empty for no maximum."
                    },
                    "rentFrequency": {
                        "title": "Rent Frequency",
                        "enum": [
                            "any",
                            "yearly",
                            "monthly",
                            "weekly",
                            "daily"
                        ],
                        "type": "string",
                        "description": "How rent is quoted. Only applied when Purpose is 'For Rent'; ignored for Buy and Off-plan. Tip: defaults vary by country (UAE prefers Yearly, Qatar prefers Monthly) — pick 'Any' to avoid filtering out the bulk of listings.",
                        "default": "any"
                    },
                    "furnishing": {
                        "title": "Furnishing",
                        "enum": [
                            "any",
                            "furnished",
                            "unfurnished",
                            "partlyFurnished"
                        ],
                        "type": "string",
                        "description": "Filter by furnishing status.",
                        "default": "any"
                    },
                    "completionStatus": {
                        "title": "Completion Status",
                        "enum": [
                            "any",
                            "ready",
                            "offPlan"
                        ],
                        "type": "string",
                        "description": "Whether the property is ready-built or still under construction (off-plan). Only applies to Buy and Off-plan; ignored for Rent.",
                        "default": "any"
                    },
                    "sortBy": {
                        "title": "Sort By",
                        "enum": [
                            "featured",
                            "newest",
                            "priceAsc",
                            "priceDesc",
                            "bedsAsc",
                            "bedsDesc"
                        ],
                        "type": "string",
                        "description": "How results should be ordered on Propertyfinder before collection. 'Featured' is the site's default ranked order; 'Newest' lists by listed date.",
                        "default": "featured"
                    },
                    "language": {
                        "title": "Language",
                        "enum": [
                            "en",
                            "ar"
                        ],
                        "type": "string",
                        "description": "Language of titles, descriptions, and location names in the output. For Egypt, Arabic produces broader coverage than English.",
                        "default": "en"
                    },
                    "includeListingDetails": {
                        "title": "Include Full Listing Details",
                        "type": "boolean",
                        "description": "Also visit each listing's detail page to fold in the full description, full amenities list, floor plans, and RERA permit numbers. Off by default — Propertyfinder currently blocks most detail-page requests from datacenter IPs, so enabling this slows the run and most detail-only fields still come back empty. Every listing already includes title, price, beds/baths, size, location, agent + brokerage contacts, and listing-card images even with this off.",
                        "default": false
                    },
                    "maxResults": {
                        "title": "Max Results",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum number of listings to collect across all searches. Set to 0 to collect everything Propertyfinder has for the search. Results are collected one page at a time (~25 per page), so the actor may overshoot this cap by a few records on the final page.",
                        "default": 200
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
