# Property Finder Scraper + Dubai DLD Permit Lookup (`nice_dev/propertyfinder-listings-scraper`) Actor

Scrape Property Finder listings (UAE, Bahrain, Saudi Arabia, Qatar, Egypt) by location, filters or URL: price, size, GPS, agent and agency contacts, permit. Optional Dubai Land Department register lookup with the agent mobile and e-mail on sales.

- **URL**: https://apify.com/nice\_dev/propertyfinder-listings-scraper.md
- **Developed by:** [Nice Dev](https://apify.com/nice_dev) (community)
- **Categories:** Real estate, Lead generation, MCP servers
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.08 / 1,000 listings

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

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

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

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### 🏠 What is Property Finder Scraper + Dubai DLD Permit Lookup?

**Property Finder Scraper** extracts **property listings from [Property Finder](https://www.propertyfinder.ae)** — the UAE's largest portal, and its sites in **Bahrain, Saudi Arabia, Qatar and Egypt**: **price, size, bedrooms, GPS, photos, the agent and the agency with their phone, WhatsApp and licence numbers, and the advertising permit**. With one option it also asks the **Dubai Land Department register** (Trakheesi / Madmoun) about each Dubai listing: official permit, registered size and value and, **on sale listings, the agent's mobile and e-mail as registered with the DLD**. Another option asks the **official register of Abu Dhabi, Saudi Arabia or Bahrain** about each listing of these countries: the permit's status and dates and the agency's registered mobile and e-mail (Abu Dhabi), the title deed, national address and plot borders (Saudi Arabia), the licence holder's mobile and e-mail (Bahrain). A third one finds a Bahrain listing's **agent** in the regulator's licence directory: the agent's own licence and **registered mobile**. And one more adds each Dubai listing's **unit and building as registered with the Dubai Land Department** — the unit's exact size, balcony and parking, the building's floors, elevators and completion date — with the same listing's links on Bayut and Dubizzle. It works as a **Property Finder API alternative**: run it on a schedule, call it from your code, or plug it into Make, Zapier or n8n.

Type a **location** (`Dubai Marina`) or paste any Property Finder search URL, click **Start**, and download the listings in JSON, CSV or Excel. No login, nothing to set up, and it is **fast: about 1,600 listings in 30 seconds** from the search pages, or 20 listings with their full page in 12 seconds.

### 📋 What data can you extract from Property Finder?

One item per listing, 148 fields:

| Category | What you get |
| --- | --- |
| 🏷️ **Listing** | title, link, the site's id and the agency's reference, description, rent or sale — `Furnished 2BR with Marina view` |
| 💰 **Price** | price, currency, rent period, price per sqft, hidden prices flagged — `185,000 AED yearly` |
| 🛏️ **Property** | type, bedrooms (studio flagged), bathrooms, size in sqft and m², plot size, furnishing, ready or off-plan, amenities, number of cheques |
| 📍 **Location** | full address path, city, community, sub-community, building, GPS coordinates, the site's location id |
| 👤 **Agent and agency** | agent name, photo, languages, SuperAgent badge, profile, position, experience, rating and reviews; agency name, e-mail, phone, address, logo; the listing's phone and WhatsApp |
| 🪪 **Permit and licences** | advertising permit number (Abu Dhabi) or its register link (Dubai), brokerage and agent licence numbers, zone, the listing page's full regulatory block (Bahrain, Saudi, Qatar licences) |
| 🏛️ **Dubai Land Department** | official permit number, status, type and dates, registered brokerage and office number, project, building, zone, registered size in m², rooms, declared value — and on sale listings the agent's name, broker card number, **mobile and e-mail** |
| 🏛️ **Registers of Abu Dhabi, Saudi Arabia, Bahrain** | permit or licence number, status, type, dates, exclusivity; the agency's registered name, licence, trade licence and **mobile and e-mail** (Abu Dhabi), the licence holder's **name, mobile and e-mail** (Bahrain); title deed number, national address, plot number, mortgage and seizure (Saudi Arabia) — and with **Saudi Arabia: full register record**, the deed type, plot borders, halt and inheritance, land use, the agency's unified number, the responsible employee's mobile and the same listing on other Saudi portals |
| 🏢 **Unit & building (Dubai)** | the unit's exact size in m², balcony size, parking spaces, freehold, developer; the building's name, floors, parking spaces, elevators, pools, completion date — as registered with the Dubai Land Department; the same listing on Bayut (link) and Dubizzle (id) |
| 🧑‍💼 **Bahrain agent (RERA)** | the listing agent's licence number, type, status and expiry date and **registered mobile**, matched strictly by name — with how the name matched |
| 📸 **Photos and badges** | cover photo, every photo, video, 360° tour; Verified, Featured, Premium, Exclusive, new construction, direct from developer |
| 🕒 **Dates** | listed date (what the date filters read), last refresh, available from |

Every field, with an example, is listed in the **Output** section below.

Fields marked **detail** in the Output tab (licences, agent profile, full photo set, availability date, permit link) are filled when **Extract details** is on (default). Fields marked **DLD** are filled when **Dubai Land Department lookup** is on, fields marked **unit details** when **Unit & building details (Dubai)** is on, fields marked **register** when **Official register lookup** is on, fields marked **RERA** when **Bahrain: agent's registered mobile** is on.

### ✅ Why use Property Finder Scraper?

- 🏛️ **The Dubai Land Department register, per listing, in the same run**: the official permit, registered size and declared value of each Dubai listing — and, on sale listings, the agent's mobile and e-mail as the DLD has them — for $5 per listing found, + $0.02 per agent contact.
- 🏛️ **The registers of Abu Dhabi, Saudi Arabia and Bahrain, per listing**: the agency's mobile and e-mail as registered with Abu Dhabi's regulator, the title deed and national address behind a Saudi listing, the mobile and e-mail of a Bahrain agency's licence holder — and, with its own option, the Bahrain agent's own licence and mobile.
- 🏢 **The unit and its building, per Dubai listing**: the unit's exact size, balcony and parking, the building's floors, elevators and age, as registered with the Dubai Land Department — plus the same listing's links on Bayut and Dubizzle. Charged only for the listings found.
- 🌍 **Five countries in one Actor**: propertyfinder.ae, .bh, .sa, .qa and .eg, same fields everywhere.
- 🚀 **Fast**: about 1,600 listings in 30 seconds from the search pages; 20 listings with their full page in 12 seconds.
- 🧩 **Past the site's 1,250 results**: Property Finder shows at most 50 pages per search; a bigger search is cut into price bands automatically, so you get all of it.
- 🎯 **Type the place, not a URL**: `Dubai Marina`, `Jumeirah Village Circle`, `Abu Dhabi` — or paste any search URL, every filter set on the site is kept.
- 🔔 **Monitoring built in**: tick **Only new listings**, schedule the Actor, and each run returns (and charges) only what it has never delivered before.
- 🔌 API, scheduling, monitoring, integrations (Make, Zapier, n8n, Google Sheets…), proxy rotation and JSON/CSV/Excel export via the Apify platform.

### 🚀 How to scrape Property Finder

1. Create a free Apify account.
2. Open **Property Finder Scraper**, choose the **Country** and **Purpose** (rent or buy) and type a **Location** (e.g. `Dubai Marina`).
3. Or paste your own Property Finder URLs into **Start URLs**: any search results page (all filters set on the site are kept, pagination is automatic) or single listing pages.
4. Set **Max listings** (100 by default, 0 = no limit) — and **Max listings per search** when you run several searches — tick **Dubai Land Department lookup** (Dubai) or **Official register lookup** (Abu Dhabi, Saudi Arabia, Bahrain) if you want the register, and **Unit & building details (Dubai)** for the unit and its building, then click **Start**.
5. Download the dataset in JSON, CSV, Excel or via API.

### 💰 How much does it cost to scrape Property Finder?

This Actor uses **pay per event** pricing: you pay for each listing, and for each option only on the listings that got it.

| Event | Price per 1,000 |
| --- | --- |
| Listing (every row of the dataset) | **$0.09** |
| + Details: the listing's own page (licences, agent profile, full photo set, permit) — on by default | + $0.19 |
| + Dubai Land Department lookup (`enrichDld`): official permit, only for a listing the register knows | + $5,000.00 ($5 per listing) |
| + Agent's contact from the register (mobile and e-mail), only when the register gives the agent's mobile (sale permits) | + $20.00 |
| + Unit & building details (`enrichUnitDetails`): only for a listing found | + $0.40 |
| + Official register lookup (`enrichRegister`), Abu Dhabi (ADREC / ADGM): only for a listing the register knows | + $3,000.00 ($3 per listing) |
| + Official register lookup, Saudi Arabia (REGA): only for a listing the register knows | + $1.50 |
| + Saudi Arabia: full register record (`registerFullRecord`), on top of it: only for a listing the register knows | + $4,000.00 ($4 per listing) |
| + Official register lookup, Bahrain (RERA): only for a listing the register knows | + $3,000.00 ($3 per listing) |
| + Bahrain agent's registered mobile (`registerAgentContact`): only when RERA gives the agent's mobile | + $15.00 |
| Run start | $0.005 per run |
| Dubai Land Department lookup turned on | $0.03 per run |
| Unit & building details turned on | $0.001 per run |

Higher Apify plans (Bronze, Silver, Gold) pay less per listing. With the default settings (details on) 1,000 listings cost **$0.28**; from the search pages only (details off) **$0.09**. Example: 10,000 Dubai listings with details ≈ $2.80; a daily monitor of 200 new sale listings with the register ≈ $852.81 a day (when the register knows 170 of them, $5 each, and names the agent of 136). A lookup that finds nothing (no permit link, a listing it does not know, a refusal) is not charged, and filtered-out listings are not charged at all. Platform usage (compute, proxy) is included in the price.

### ⚙️ Input

```json
{
    "country": "ae",
    "purpose": "buy",
    "location": "Dubai Marina",
    "minBedrooms": 1,
    "maxBedrooms": 2,
    "maxItems": 200,
    "enrichDld": true
}
```

Several searches, a cap per search, only recent listings, only the ones not delivered before:

```json
{
    "purpose": "rent",
    "locations": ["Dubai Marina", "Business Bay", "Downtown Dubai"],
    "searchQueries": ["sea view", "furnished"],
    "maxItemsPerQuery": 50,
    "postedAfter": "7 days",
    "onlyNew": true,
    "stateKey": "dubai-rentals"
}
```

Or with your own URLs:

```json
{
    "startUrls": [
        { "url": "https://www.propertyfinder.ae/en/buy/villas-for-sale.html" },
        { "url": "https://www.propertyfinder.bh/en/search?c=2&ob=nd" },
        { "url": "https://www.propertyfinder.ae/en/plp/buy/apartment-for-sale-dubai-arjan-curve-by-sentro-142822239.html" }
    ],
    "maxItems": 500
}
```

| Field | Notes |
| --- | --- |
| `country` | The Property Finder site: `ae` (UAE, default), `bh` (Bahrain), `sa` (Saudi Arabia), `qa` (Qatar), `eg` (Egypt). |
| `purpose` | `rent` (default), `buy`, `commercial-rent` or `commercial-buy`. |
| `location`, `locations` | City, community or building as typed in the site's location box (`Dubai Marina`, `Jumeirah Village Circle`, `Abu Dhabi`); the site's own best match is used and written in the log, with the other places of that name and their ids (type an id, e.g. `50`, to search that place). Empty = the whole country. `locations` adds more places: every keyword is searched in every location (max 500 searches per run). |
| `query`, `searchQueries` | Keyword searched in the listings, as in the site's keyword box (`sea view`, `pool`); `searchQueries` adds more keywords (one search each). |
| `propertyType` | Apartment, villa, townhouse, penthouse, compound, duplex, full or half floor, whole building, bulk rent unit, bungalow, hotel apartment; empty = all types. Each site has its own list: a type the chosen site does not have for this purpose (townhouse or penthouse in Saudi Arabia, apartment in a commercial search) is refused before the run, with the types it has. |
| `minBedrooms`, `maxBedrooms`, `minBathrooms`, `maxBathrooms` | `0` = studio, `8` = the site's 7+. |
| `minPrice`, `maxPrice`, `minArea`, `maxArea` | Price in the site's currency (AED on propertyfinder.ae; for rentals, per rent period); built-up area in square feet on every site (converted to m² for the sites that count in m²: Bahrain, Saudi Arabia, Qatar, Egypt). |
| `furnishing` | `any` (default), `furnished`, `unfurnished` or `partly`. |
| `completionStatus` | `any` (default), `completed` (ready) or `off_plan`. Applied by the Actor too, on the sites that ignore it in their own search (Bahrain, Saudi Arabia, Qatar). |
| `rentFrequency` | Rentals: the period the price is quoted for — `yearly`, `monthly`, `weekly` or `daily`; empty = the site's default. In Saudi Arabia it keeps only the listings rented for that period. |
| `amenities` | Listings that have ALL of them: `SP` (shared pool), `BA` (balcony), `PP` (private pool), `PA` (pets allowed), `VW` (view of water)… 23 in all. Egypt has no balcony, built-in wardrobes or walk-in closet, and commercial searches have no amenity filter: those are refused before the run. |
| `sortBy` | `newest` (default, what lets **Only new listings** stop early), `featured`, `price_asc`, `price_desc`, `beds_asc`, `beds_desc`. |
| `startUrls` | Search results pages (`https://www.propertyfinder.ae/en/rent/apartments-for-rent.html`, filters kept, pagination automatic) or single listing pages. When set, the search fields above are ignored. |
| `extractDetails` | Open each listing page for the licences, the agent profile, the full photo set and the permit (default on). Off = search-card fields only. |
| `enrichDld` | Look each Dubai listing up in the Dubai Land Department register (turns details on). Charged per listing found in the register. |
| `enrichUnitDetails` | Add each Dubai listing's unit and building as registered with the Dubai Land Department, and the same listing's links on Bayut and Dubizzle (turns details on). Charged per listing found. |
| `enrichRegister` | Look each listing of Abu Dhabi, Saudi Arabia or Bahrain up in its country's register: ADREC / ADGM, REGA, RERA (turns details on). Charged per listing found in its register. |
| `registerFullRecord` | Saudi Arabia: the rest of the REGA record on top of `enrichRegister` (turns it on): the agency's unified number, the responsible employee, deed type, plot borders, land use, halt and inheritance, the same listing on other portals, the raw answer. Charged per Saudi listing found. |
| `registerAgentContact` | Find each Bahrain listing's agent in RERA's licence directory by name, strictly (turns details on): the agent's licence and registered mobile. Charged per listing with the agent's mobile. |
| `maxItems` | Stop after this many listings for the whole run (`0` = unlimited). |
| `maxItemsPerQuery` | Cap for EACH search (keyword × location, or search URL). `0` = no per-search cap. |
| `postedAfter`, `postedBefore` | Listed date range: `2026-09-01`, or a period before now (`7 days`, `2 weeks`, `1 month`, `24 hours`). |
| `excludeKeywords` | Drop the listings whose title or description contains one of these words (`penthouse`), case and accents ignored. |
| `verifiedOnly`, `superAgentOnly` | Keep only the listings with the site's Verified badge, or whose agent is a SuperAgent. Only propertyfinder.ae has the Verified badge: `verifiedOnly` is refused before the run on the other sites. |
| `onlyNew`, `stateKey`, `resetState` | Monitoring: only the listings never delivered under this memory key; `resetState` forgets the memory. |
| Advanced | `proxyConfiguration` (Apify proxy by default, included in the price; the residential proxy is not available), `maxConcurrency`, `maxRequestsPerMinute`, `minRequestIntervalMs`, `maxRequestRetries`, `debugLog`. |

### 📦 Output

A real sale listing of Dubai Marina with details and the Dubai Land Department lookup (run of 2026-09-24; shortened to 80 of the 148 fields, the agent's name and contacts masked):

```json
{
    "id": "149506290",
    "url": "https://www.propertyfinder.ae/en/plp/buy/apartment-for-sale-dubai-dubai-marina-marina-view-marina-view-tower-b-149506290.html",
    "reference": "MCC-S-76681-7",
    "title": "FMarina View | Vacant Soon | Spacious",
    "description": "Property Highlights:\n\n- Built-Up Area: 750 sq. ft.\n- 1 Bedroom, 2 Bathrooms\n- Unfurnished\n- Marina View\n- Vacant Soon\n- Built-in Wardrobes\n- Built-in Kitchen Appliances\n- Balcony\n- Covered Parking\n- Cash Buyers Only",
    "country": "ae",
    "purpose": "buy",
    "offeringType": "Residential for Sale",
    "propertyType": "Apartment",
    "price": 1600000,
    "currency": "AED",
    "pricePeriod": null,
    "isPriceHidden": false,
    "pricePerArea": 2133,
    "bedrooms": 1,
    "isStudio": false,
    "bathrooms": 2,
    "size": 750,
    "sizeUnit": "sqft",
    "sizeSqm": 69.68,
    "furnished": "NO",
    "completionStatus": "completed",
    "amenities": [
        "Built in Wardrobes",
        "Kitchen Appliances",
        "Balcony",
        "Shared Pool"
    ],
    "location": "Marina View Tower B, Marina View, Dubai Marina, Dubai",
    "city": "Dubai",
    "community": "Dubai Marina",
    "subCommunity": "Marina View",
    "tower": "Marina View Tower B",
    "locationId": "3160",
    "latitude": 25.07938575744629,
    "longitude": 55.14193344116211,
    "agentName": "Agent Name",
    "agentLanguages": [
        "English"
    ],
    "agentIsSuperAgent": true,
    "brokerName": "McCone Properties",
    "brokerEmail": "info@mcconeproperties.com",
    "brokerPhone": "+97143806683",
    "phone": "+97143806683",
    "whatsapp": "+9714XXXXXXX",
    "isVerified": true,
    "isFeatured": false,
    "isPremium": false,
    "isExclusive": false,
    "isNewConstruction": false,
    "isDirectFromDeveloper": false,
    "listingLevel": "standard",
    "publishedAt": "2026-09-24T01:01:07.000Z",
    "images": [
        "https://static.shared.propertyfinder.ae/media/images/listing/XMP3DDXVS1H6G1VG8SDDER59N8/45bc0565-dac2-4504-9a62-dd5a14b46922/1312x894.jpg?v=d37d8e948991d92bbeb6c4bb640a8eb9",
        "https://static.shared.propertyfinder.ae/media/images/listing/XMP3DDXVS1H6G1VG8SDDER59N8/cd09d9db-d8ee-4de0-9f6c-fe0e50e49d56/1312x894.jpg?v=637bc83e616782a9342ea68fa91c58ed"
    ],
    "imageCount": 13,
    "hasView360": false,
    "permitNumber": null,
    "permitValidationUrl": "https://trakheesi.dubailand.gov.ae/rev/madmoun/listing/validation?khevJujtDig=jlskgld2acvqis7p4bsb2e5blj316hbmuyl6bloxpukhvwqak",
    "dldListingGuid": "jlskgld2acvqis7p4bsb2e5blj316hbmuyl6bloxpukhvwqak",
    "brokerLicenseNumber": "12065",
    "agentLicenseNumber": "76468",
    "zoneName": "Marsa Dubai",
    "agentPosition": "Property Consultant",
    "agentYearsOfExperience": 4,
    "agentRating": 4.9,
    "dldStatus": "found",
    "dldPermitNumber": "171260",
    "dldPermitStatus": "Auto Approval",
    "dldPermitType": "Sell",
    "dldPermitStartDate": "2026-06-23",
    "dldPermitEndDate": "2026-11-30",
    "dldBrokerageName": "MCCONE PROPERTIES",
    "dldBrokerageLicense": "684748",
    "dldOfficeNumber": "12065",
    "dldBuildingName": "MARINA VIEW TOWERS B",
    "dldZone": "Marsa Dubai",
    "dldPropertyType": "Unit",
    "dldSizeSqm": 69.71,
    "dldRoomType": "1 B/R",
    "dldValue": 1600000,
    "dldAgentName": "AGENT FULL NAME",
    "dldAgentCardNumber": "00000",
    "dldAgentMobile": "+9715XXXXXXXX",
    "dldAgentEmail": "agent@agency.example",
    "searchUrl": "https://www.propertyfinder.ae/en/search?l=50&c=1&fu=0&ob=nd&page=1",
    "scrapedAt": "2026-09-24T05:21:05.132Z"
}
```

You can download the dataset in various formats such as JSON, HTML, CSV or Excel.

#### All 148 fields

| Fields | What you get |
| --- | --- |
| `id`, `url`, `reference`, `title`, `description` | **Listing**: the site's id, link, the agency's reference, title, full text |
| `country`, `purpose`, `offeringType`, `propertyType` | `ae`, `buy` or `rent`, the site's offering type, `Apartment` |
| `price`, `currency`, `pricePeriod`, `isPriceHidden`, `pricePerArea` | **Price**: `2950000`, `AED`, `yearly` (rentals; null on sales), hidden price flag, price per sqft (per m² outside the Emirates) |
| `bedrooms`, `isStudio`, `bathrooms` | **Property**: `2` (`0` = studio), `true` / `false`, `3` |
| `size`, `sizeUnit`, `sizeSqm`, `plotSize` | `1432`, `sqft`, `133.04`, plot size of villas and land |
| `furnished`, `completionStatus`, `amenities`, `numberOfCheques` | `YES` / `NO` / `PARTLY`, `completed` / `off_plan` (or `…_primary`), amenity names, cheques (rentals) |
| `location`, `city`, `community`, `subCommunity`, `tower` | **Location**: `Marina Gate 1, Marina Gate, Dubai Marina, Dubai` and each level |
| `locationId`, `latitude`, `longitude` | the site's id of the most precise place (usable as a **Location**), GPS |
| `agentId`, `agentName`, `agentImage`, `agentLanguages`, `agentIsSuperAgent`, `agentProfileUrl` | **Agent**: id, name, photo, languages, SuperAgent badge, profile page |
| `agentPosition`, `agentYearsOfExperience`, `agentTotalProperties`, `agentReviewCount`, `agentRating` | agent profile (detail) |
| `brokerId`, `brokerName`, `brokerEmail`, `brokerPhone`, `brokerAddress`, `brokerLogo` | **Agency**: id, name, e-mail, phone, address, logo |
| `phone`, `whatsapp` | the listing's call number (often a tracking number of the agency) and WhatsApp |
| `isVerified`, `isFeatured`, `isPremium`, `isExclusive`, `isNewConstruction`, `isDirectFromDeveloper`, `listingLevel` | **Badges** and paid visibility level |
| `publishedAt`, `lastRefreshedAt`, `availableFrom` | **Dates**: listed (ISO, what the date filters read), last refresh, available from (rentals, detail) |
| `imageUrl`, `images`, `imageCount`, `videoUrl`, `hasView360` | **Photos**: cover, every photo (full set with details), count, video, 360° tour |
| `permitNumber`, `permitValidationUrl`, `dldListingGuid`, `adrecPermitNumber` | **Permit** (detail): number (Abu Dhabi; empty in Dubai, where the register gives it), official register page, the listing's key in the Dubai register, Abu Dhabi permit |
| `brokerLicenseNumber`, `agentLicenseNumber`, `zoneName`, `regulatory` | brokerage and agent licence numbers, zone, every regulatory line of the page (detail) |
| `dldStatus` | **Dubai Land Department**: `found`, `not_found` (the register does not know it), `rejected` (the register rejected its permit), `no_permit` (no Dubai permit on the listing), `failed` (no answer, or a register link the Actor cannot read — the log says so); null without the option |
| `dldPermitNumber`, `dldPermitStatus`, `dldPermitType`, `dldPermitStartDate`, `dldPermitEndDate` | official permit: number, status, Sell or Rent, validity dates |
| `dldBrokerageName`, `dldBrokerageLicense`, `dldOfficeNumber` | registered brokerage, trade licence, office number |
| `dldProjectName`, `dldBuildingName`, `dldZone`, `dldPropertyType`, `dldSizeSqm`, `dldRooms`, `dldRoomType`, `dldValue` | registered property: project, building, zone, type, size in m², rooms, declared value (AED) |
| `dldAgentName`, `dldAgentCardNumber`, `dldAgentMobile`, `dldAgentEmail` | agent as registered with the DLD — sale permits only |
| `unitDetailsStatus` | **unit details**: `found` (unit and building details, with the Bayut / Dubizzle links), `dubizzle_only` (only its Dubizzle id), `not_found`, `no_permit` (no Dubai permit on the listing), `failed` (no answer — the log says so); null without the option |
| `bayutListingId`, `bayutUrl`, `dubizzleListingId` | the same listing on Bayut (id, link) and on Dubizzle (id) |
| `unitSizeSqm`, `unitBalconySqm`, `unitParkingSpaces`, `unitFreehold`, `unitDeveloper` | the unit as registered with the Dubai Land Department: exact size in m², balcony size, parking spaces, freehold, developer |
| `buildingName`, `buildingFloors`, `buildingParkingSpaces`, `buildingElevators`, `buildingSwimmingPools`, `buildingCompletionDate` | the building: DLD name, floors, parking spaces, elevators, pools, completion date, as registered with the Dubai Land Department (an unknown count is null, never 0) |
| `registerStatus`, `registerName` | **Registers** (Abu Dhabi, Saudi Arabia, Bahrain): `found`, `not_found` (the register does not know it), `expired` (Abu Dhabi: the permit or its agency's licence expired), `no_permit` (no permit of these registers on the listing: Dubai, the northern emirates, Qatar, Egypt), `failed` (no answer); the register asked: `ADREC`, `ADGM`, `REGA` or `RERA` — null without the option |
| `registerPermitNumber`, `registerPermitStatus`, `registerPermitType`, `registerPermitStartDate`, `registerPermitEndDate`, `registerExclusive` | the permit (Abu Dhabi), the advertising licence (Saudi Arabia) or the agency's licence (Bahrain): number, status, `Rent` / `Sell` (or the licence type), validity dates, exclusive to the agency (Abu Dhabi) |
| `registerAgencyName`, `registerAgencyLicense`, `registerAgencyCrNumber` | the agency as registered: name, licence with the regulator, trade licence / commercial registration (Saudi unified number: with `registerFullRecord`) |
| `registerContactName`, `registerContactMobile`, `registerContactEmail` | who the register names, with `+` and the country code: the agency (Abu Dhabi), the licence holder (Bahrain), the responsible employee (Saudi Arabia, no e-mail; with `registerFullRecord`) |
| `registerCity`, `registerDistrict`, `registerCommunity`, `registerPlotNumber` | official municipality or city, district, community (Abu Dhabi), plot id or land number |
| `registerDeedNumber`, `registerDeedType`, `registerNationalAddress`, `registerBorders`, `registerRestrictions`, `registerLandUse`, `registerOtherListings` | Saudi Arabia: title deed number, national address, `mortgaged` / `constrained`; with `registerFullRecord` also the deed type, the plot's four sides, `halted` / `testament`, land use (Arabic), the same licence on Aqar, Bayut.sa, Wasalt, Deal… with its URL |
| `registerAnswer` | the register's whole answer, as it gives it (Saudi Arabia: with `registerFullRecord`) |
| `registerAgentStatus`, `registerAgentMatch` | **Bahrain agent (RERA)**: `found`, `uncertain` (no contact given), `not_found`, `no_agent` (no person's name on the listing), `no_register` (not a Bahrain listing), `failed` (no answer); how the name matched: `full_name`, `partial_name`, or why it is not sure: `several_names`, `common_name`, `short_name` — null without the option |
| `registerAgentName`, `registerAgentLicense`, `registerAgentLicenseType`, `registerAgentLicenseStatus`, `registerAgentLicenseEndDate`, `registerAgentMobile`, `registerAgentEmail` | the agent's licence as RERA has it: full name, number, `Sales Agents` (or `Real Estate Brokers` for an agency's licence holder), status, expiry date, mobile with `+973`; the e-mail for an agency's licence holder only |
| `searchUrl`, `scrapedAt` | the search the listing was found by (null for a pasted listing URL), ISO timestamp |

### 💡 Tips

#### How to get more results

Set `maxItems` to `0` and search a whole city (`Dubai`) or country (no location). Property Finder shows at most 50 pages (1,250 listings) per search: the Actor cuts a bigger search into price bands by itself, up to 40 bands, and each band is read in full. A search sorted by price (`price_asc`, `price_desc`) is not cut: it is read in price order and goes on from the price of the last listing read, so with `maxItems` you get exactly the cheapest (or dearest) listings.

#### How to reduce costs

The price is per listing, so the levers are `maxItems`, `maxItemsPerQuery`, the filters (a filtered-out listing is free) and `onlyNew` for recurring runs (you never pay twice for the same listing). Turn `extractDetails` off when the search-card fields are enough: $0.09 instead of $0.28 per 1,000. The register lookup is the dear option: narrow the search (a building, a price range, sale listings) before you turn it on.

#### Several searches in one run

Fill `searchQueries` and / or `locations`: the Actor runs one search per keyword × location (3 keywords × 4 communities = 12 searches, up to 500 per run). The single `query` and `location` fields still work and are added to the lists. A listing found by several searches is saved — and charged — once. Set `maxItemsPerQuery` to give every search its own cap: without it the first searches can use up the whole `maxItems` budget. You can also paste several search URLs into `startUrls`: each one is a search of its own, with the same cap.

#### Monitoring: only the new listings

Tick **Only new listings** (`onlyNew`) and schedule the Actor. The first run returns everything; each later run skips the listings already delivered: they are not saved, not charged, and their page is not even opened. The memory lives in a named key-value store of your account (`propertyfinder-listings-scraper-seen`, up to 150,000 listings per key) and is only updated with listings that really reached the dataset, so a failed run never hides anything. Give each schedule its own `stateKey` (two schedules sharing a key would hide each other's listings), and tick `resetState` once to start over. Keep the default sort (newest first): a search then stops once it meets 50 listings in a row you already have.

#### Filter by listed date

`postedAfter` and `postedBefore` take a date (`2026-09-01`, the whole day is included, Dubai time) or a period before now (`7 days`, `2 weeks`, `1 month`; via the API also `24 hours` or a full ISO date-time). The filter reads `publishedAt`; a listing without a listed date is dropped as soon as a date bound is set. Filtered-out listings are never charged and do not count in `maxItems`; the run summary tells how many were filtered. With `postedAfter` and the default sort, a search stops at the first page that is entirely too old.

#### The Dubai Land Department lookup

Every Dubai listing carries a permit link to the Land Department register; the Actor asks the register about it, one listing after the other (about a second each). What it gives depends on the permit: a **sale** permit names the agent with the mobile and e-mail registered with the DLD; a **rental** permit gives the permit, the brokerage and the property, but no agent (the register does not return one). New off-plan sales advertised by a developer may come back without an agent too. Listings outside Dubai (Abu Dhabi has its own permits, the other countries have no DLD) are marked `no_permit` and never charged. The register does not give the unit (apartment) number. The register is asked through a browser: a run with this option gets 1 GB of memory by default (512 MB without it), and a memory set by hand below 1 GB is refused before the run starts.

#### Unit and building details (Dubai)

Tick **Unit & building details (Dubai)** (`enrichUnitDetails`) and each Dubai listing gets its unit and building as registered with the Dubai Land Department: the unit's exact size, balcony, parking, freehold and developer, the building's floors, parking spaces, elevators, pools and completion date — and the same listing's links on Bayut and Dubizzle, matched by the Dubai advertising permit every portal shows. About 6 to 7 Dubai listings in 10 get them; a listing only on Dubizzle gets its Dubizzle id, marked `dubizzle_only`, and is not charged. The unit's data is given only when its size agrees with the listing's (within 5 %): another unit of the same permit is never passed off as this one. A listing put online in the last day may not be found yet (`not_found`, not charged). The unit (apartment) number and its floor are not given. The option needs no extra memory (512 MB).

#### The registers of Abu Dhabi, Saudi Arabia and Bahrain

Tick **Official register lookup** (`enrichRegister`) and each listing is looked up in the register of its own country, with the key its page shows:

- **Abu Dhabi**: the permit number (Madhmoun) goes to ADREC; a 15-digit number (Al Reem and Al Maryah islands) to ADGM. You get the permit's status, dates and exclusivity, the agency's licence, **its registered mobile and e-mail** (often not on the listing), the plot id, district and community. Not the agent, the value or the unit number: the register does not give them.
- **Saudi Arabia**: the advertising licence (REGA) gives the licence's status and dates, the agency's FAL licence, the title deed number, the plot, the national address, mortgage and seizure. Tick **Saudi Arabia: full register record** (`registerFullRecord`) for the rest of the record: the deed type, the plot's borders (neighbours, streets, lengths), halt and inheritance, land use, the agency's unified number, the responsible employee's name and mobile — and the same licence on the other Saudi portals, with their URLs. In Arabic, as the register writes it.
- **Bahrain**: the listing's QR code is the agency's RERA licence: you get the licence holder's **name, mobile and e-mail**, the CR number and the licence's status. One agency's licence is asked once per run, whatever the number of its listings. Some listings still carry an old QR code the register no longer answers: the Actor finds the agency in RERA's directory by the licence number the listing shows, then by the agency's name — `not_found` when neither is sure.

Dubai listings, the northern emirates, Qatar and Egypt have no permit of these registers: marked `no_permit`, never charged. Abu Dhabi and Bahrain need no extra memory (512 MB). Saudi Arabia's register is asked through a browser: a run with this option on propertyfinder.sa (or with pasted URLs) gets 1 GB of memory by default, and a memory set by hand below 1 GB is refused for Saudi listings before the run starts.

#### The Bahrain agent's registered mobile

Property Finder gives no contact of a Bahrain agent of its own (the call and WhatsApp buttons reach the agency or a relay number). Tick **Bahrain: agent's registered mobile** (`registerAgentContact`) and the Actor looks the agent's name up in the licence directory of RERA, Bahrain's real estate regulator — sales agents and the holders of an agency's licence — and reads the licence page of the agent found: licence number, type, status, expiry date and the **mobile registered with RERA**. The match is strict: every word of the name the listing shows must be in the holder's name, one holder only, and one of the words must be uncommon in the directory. A name made only of common words (`Ahmed Ali`), shared by several holders, or of one word gives **no contact** (`registerAgentStatus: uncertain`, the reason in `registerAgentMatch`), and is not charged; a name with no holder is `not_found`. Each agent is looked up once per run, whatever the number of their listings. The agent's photo is never read.

### 🔌 Integrations and API

Call the Actor via the Apify API, the JavaScript or Python clients, or connect it with integrations and webhooks (Make, Zapier, n8n, Google Sheets, Slack, Airtable…). The dataset can be fetched as JSON or CSV from any tool.

### ❓ FAQ

#### Is it legal to scrape Property Finder?

The Actor only reads what Property Finder and other property portals show publicly to any anonymous visitor, and what the public registers (the Dubai Land Department; ADREC and ADGM in Abu Dhabi; REGA in Saudi Arabia; RERA in Bahrain) show to anyone who checks the permit or licence of a listing. It logs in to nothing. Results contain personal data of real-estate professionals — agent names, phone numbers, WhatsApp numbers and e-mail addresses — which is protected by data-protection law (the UAE's PDPL, Saudi Arabia's and Bahrain's PDPL, GDPR for EU residents): do not store it without a legitimate reason, and do not use it for unsolicited marketing. You are responsible for using the data in compliance with Property Finder's Terms of Use, the register's terms and applicable law. This Actor is not affiliated with Property Finder, Bayut, Dubizzle, the Dubai Land Department or any of these registers.

#### Does it need a login or a proxy?

No login. The proxy is included in the price: leave the default setting (the residential proxy is not available). A request the site turns away is retried at once on a new proxy session (without a proxy, after a pause of 5 seconds, doubled at each retry up to 150 seconds).

#### Is the data safe to open in Excel or to show on a web page?

Titles and descriptions are the agents' own words, copied as they are (2 descriptions in 318, read on the 5 sites, begin with `-`). Every phone number is written with `+` and the country code (`+971…`, `+20…`), as the site's call button writes it — the agency phones the site writes `01…` or `05…` and the register's mobiles included; only a short service number (Qatar `800…`) stays as the site writes it: Excel and Google Sheets may read such a cell of a CSV file as a number or a formula. The Actor leaves the text as it is, so that the JSON and the API give the real value: when you open a CSV, import these columns as text. Every URL field (`url`, `imageUrl`, `images`, `videoUrl`, `agentImage`, `agentProfileUrl`, `brokerLogo`, `permitValidationUrl`, `searchUrl`, and the link lines of `regulatory`) holds a whole `http(s)` URL or null — never `javascript:` or `data:`. On a web page, escape every other field like any text written by a stranger.

#### Known limitations

- Property Finder shows at most 1,250 listings per search: a bigger search is cut into price bands (up to 40, cut again when a band is still too big); a search whose listings share one single price cannot be cut, and its first 1,250 are read. With `maxItems` over 1,250 and a sort other than price, the bands are read side by side: you get the first listings of each band (the newest of each price range, for `newest`), not the first of the whole search.
- **Unit & building details** cover **Dubai** listings (they need their Dubai permit), are found for about 6 to 7 in 10, and may miss a listing put online in the last day.
- The Dubai Land Department lookup covers **Dubai** only, gives the agent's contacts on **sale** permits only, and never the unit number.
- The registers of Abu Dhabi and Bahrain give the **agency's** (or licence holder's) contact — the Bahrain agent's own mobile comes with **Bahrain: agent's registered mobile**, only when the name matches one licence holder surely; Saudi Arabia's gives the responsible employee's mobile (with the full record), no e-mail. None gives the unit number.
- Site filters that are not in the input can still be used by pasting a filtered search URL into `startUrls`.
- Fields marked detail are `null` when `extractDetails` is off; fields marked DLD are `null` when `enrichDld` is off, fields marked unit details when `enrichUnitDetails` is off, fields marked register when `enrichRegister` is off, fields marked RERA when `registerAgentContact` is off.
- `onlyNew` remembers listing ids, not their content: a listing whose price changed is not returned again.
- Two runs sharing the same `stateKey` at the same time may both return the same new listing.

**A run the platform stops without warning** (out of memory, run timeout)

- Resurrect it: it goes on from where it stood at most a minute before the stop. What it had read since is read again, and the listings already saved are skipped: none is delivered or charged twice, and `maxItems` still counts them.
- With `onlyNew`, the memory is saved once a minute: resurrect the stopped run and the listings it had saved meanwhile join the memory; leave it stopped for good, and the next run may return up to a minute of them once more.

#### Something doesn't work?

The last line of the log counts the listings saved, filtered out and no longer on Property Finder (removed while the run was reading them), and the requests that failed after every retry. Those requests and the removed listings are listed, with the reason, in the `FAILED_REQUESTS` record of the run's key-value store. A run that saved nothing and had failed requests fails, and its last message gives the cause (a search URL or a location that does not exist says so, instead of "run it again"). A run that saved some listings fails too when at least as many requests failed for good as were read (page 1 read, the next pages refused): a green run with a short dataset would hide the outage. One failed request among many is only a warning.

If Property Finder changes its pages, you are told instead of paying for blank rows. A results page that counts listings but gives none the Actor can read is an error (listed in `FAILED_REQUESTS`), never a quiet "No listings found". If the first 20 listings read all lack their title, listed date, price, agency or GPS — or, with `extractDetails`, their regulatory block — the run saves nothing more, stops and fails, and its last message names the missing field: at most those first listings are charged. A listing that `postedAfter` / `postedBefore` drops because it has no date at all counts among those 20.

If the Dubai Land Department register refuses 6 listings in a row (3 before it has answered once) — or answers them without a permit number and without saying it does not know them (it changed its answers) — the lookup is switched off for the rest of the run and the run's last message says so: the listings are still saved, marked `failed`, and the lookup is not charged. The same goes for each register of **Official register lookup**. **Unit & building details** the same way: 5 listings in a row without an answer, or an answer in a form the Actor does not know, and the option is switched off for the rest of the run, said in the last message, and never charged for those listings.

### 🛟 Support

Open an issue in the **Issues** tab with a link to your run: the run log and the `FAILED_REQUESTS` record of the key-value store show exactly which URLs failed and why.

# Actor input Schema

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

Property Finder search-result URLs (any filter set on the site is kept, pagination is automatic) or single listing URLs (`https://www.propertyfinder.ae/en/plp/buy/apartment-for-sale-dubai-arjan-curve-by-sentro-142822239.html`). Works for propertyfinder.ae, .bh, .sa, .qa and .eg. When this list is not empty, the search fields below (country, purpose, locations, keywords, site filters) are ignored; caps, post-filters and monitoring still apply. Max 1 000 URLs.

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

Property Finder site to search. The Dubai Land Department lookup only works for Dubai listings (propertyfinder.ae).

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

Type of listings.

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

City, community or building, as typed in the site's location box (e.g. `Dubai Marina`, `Jumeirah Village Circle`, `Abu Dhabi`). The best match of the site's own location search is used and written in the log, with the other places of that name and their ids: type an id (e.g. `50`) to search that place. Empty = the whole country.

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

Several locations in one run: one search per location, times each keyword below (searches per run: max 500). Added to **Location**.

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

Keyword searched in the listings, as in the site's keyword box (e.g. `sea view`, `pool`). Empty = no keyword.

## `searchQueries` (type: `array`):

Several keywords in one run: one search per keyword (times each location). Added to **Keyword**; listings found by several searches are saved once.

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

Empty = all types. Each site has its own list: a type the chosen site does not have for this purpose (Townhouse or Penthouse on propertyfinder.sa, Apartment in a commercial search) is refused before the run, with the types it has.

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

0 = studio. 8 = the site's `7+`.

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

0 = studio only. 8 = the site's `7+`.

## `minBathrooms` (type: `integer`):

8 = the site's `7+`.

## `maxBathrooms` (type: `integer`):

8 = the site's `7+`.

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

In the site's currency (AED on propertyfinder.ae). For rentals: price per **Rent frequency** period.

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

In the site's currency (AED on propertyfinder.ae).

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

Built-up area in square feet on every site (converted to m² for Bahrain, Saudi Arabia, Qatar and Egypt, which count in m²).

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

Built-up area in square feet on every site (converted to m² for Bahrain, Saudi Arabia, Qatar and Egypt, which count in m²).

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

Furnished, unfurnished or partly furnished (as declared by the advertiser).

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

Ready or off-plan properties (sale listings).

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

For rentals: the period the price is quoted for. Empty = the site's default (yearly on propertyfinder.ae). On propertyfinder.sa it keeps only the listings rented for that period.

## `amenities` (type: `array`):

Listings that have ALL the selected amenities. propertyfinder.eg has no Balcony, Built in Wardrobes or Walk-in Closet, and commercial searches have no amenity filter: those are refused before the run.

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

Order of the site's results. `newest` (the default) lets **Only new listings** stop early.

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

Maximum number of listings to save for the whole run (after deduplication and filters). 0 = no limit.

## `maxItemsPerQuery` (type: `integer`):

Cap for EACH search (keyword × location, or search URL), so that the first search cannot use up the whole **Max listings** budget. 0 = no per-search cap.

## `extractDetails` (type: `boolean`):

Open each listing page (1 extra request per listing) for the advertising permit (register link in Dubai, permit number in Abu Dhabi), broker and agent licence numbers, agent profile (position, experience, rating), availability date and the full photo set. Needed by **Dubai Land Department lookup**, **Unit & building details**, **Official register lookup** and **Bahrain: agent's registered mobile**. Off = search-card fields only (much faster, cheaper).

## `enrichDld` (type: `boolean`):

For each Dubai listing, look its advertising permit up in the public Dubai Land Department register (Trakheesi / Madmoun) — the check behind the QR code shown on every Dubai listing: official permit number, status and dates, brokerage and its licence, building, zone, registered size in m², rooms and declared value, and, for SALE listings, the agent's name, broker card number, mobile and e-mail as registered with the DLD (rentals: not provided by the register). Turns on **Extract details**. Runs a browser: the run gets 1 GB of memory instead of 512 MB. Charged per listing found in the register.

## `enrichUnitDetails` (type: `boolean`):

For each Dubai listing, add the unit and its building as registered with the Dubai Land Department — the unit's exact size, balcony size, parking spaces, freehold and developer; the building's name, floors, parking spaces, elevators, swimming pools and completion date — and the links of the same listing on Bayut and Dubizzle. Dubai listings only (other listings: `no_permit`); about 6 to 7 Dubai listings in 10 get them. A listing put online less than a day ago may not be found yet (`not_found`). Works with or without **Dubai Land Department lookup**. Turns on **Extract details**. Charged per listing found (not charged when it is not).

## `enrichRegister` (type: `boolean`):

For each listing of Abu Dhabi, Saudi Arabia or Bahrain, look its permit up in the public register of its country — the check behind the permit number or QR code these listings show. **Abu Dhabi** (ADREC, and ADGM for Al Reem / Al Maryah islands): permit status, type, dates and exclusivity, the agency's registered mobile and e-mail, its licence, plot number, district and community. **Saudi Arabia** (REGA): permit status, type and dates, the agency's FAL licence, title deed number, plot, national address, mortgage and seizure (the rest of the record: **Saudi Arabia: full register record**). **Bahrain** (RERA): the licence holder's name, mobile and e-mail, CR number, licence status and dates (one licence per agency; an old QR code the register no longer opens is matched by the agency's licence number, then its name). Turns on **Extract details**. Saudi Arabia's register runs a browser: a run on propertyfinder.sa (or with pasted URLs) gets 1 GB of memory instead of 512 MB. Dubai listings: use **Dubai Land Department lookup**. Charged per listing found in its register.

## `registerFullRecord` (type: `boolean`):

For each Saudi listing, the rest of its REGA record on top of **Official register lookup**: the agency's unified number, the responsible employee's name and mobile as registered with REGA, the title deed type, the plot's borders (neighbours, streets, lengths), the land use, halt and inheritance restrictions, the same listing on other portals (Aqar, Bayut.sa, Wasalt… with their URLs) and the register's raw answer. Turns on **Official register lookup**. Charged per Saudi listing found in the register, on top of it.

## `registerAgentContact` (type: `boolean`):

For each Bahrain listing, find its agent in the public licence directory of RERA (Bahrain's real estate regulator) by the agent's name, and return the agent's licence number, type, status and expiry date and the mobile registered with RERA (and the e-mail when the agent holds the agency's licence). Strict match: every word of the name Property Finder shows, one licence holder only, one uncommon word at least — a name made of common words, or shared by several holders, returns no contact (`registerAgentStatus: uncertain`). Turns on **Extract details**. Charged per listing with the agent's mobile.

## `postedAfter` (type: `string`):

Only listings listed on or after this date (the date the site shows as Listed): `2026-09-01`, or a period before now such as `7 days`, `2 weeks`, `1 month` (API: `24 hours` and full ISO date-times work too).

## `postedBefore` (type: `string`):

Only listings listed on or before this date (the whole day is included), or older than a period such as `30 days`.

## `excludeKeywords` (type: `array`):

Drop the listings whose title or description contains one of these words (e.g. `penthouse`), case and accents ignored.

## `verifiedOnly` (type: `boolean`):

Keep only the listings with the site's `Verified` badge. propertyfinder.ae only: the other sites have no such badge (refused there).

## `superAgentOnly` (type: `boolean`):

Keep only the listings whose agent has the site's `SuperAgent` badge.

## `onlyNew` (type: `boolean`):

Skip the listings that a previous run (same **Memory key**) already delivered: they are not saved and not charged, and their page is not even opened. First run = everything is new.

## `stateKey` (type: `string`):

Name of the memory used by **Only new listings**. Give each schedule / task its own key (e.g. `paris-rentals`) so that they do not share their memory. Letters, digits, `-` and `_`.

## `resetState` (type: `boolean`):

Forget everything remembered under this **Memory key** before the run: this run returns (and charges) every listing again. Untick it afterwards.

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

Apify Proxy or your own proxies. Keep the default: it is included in the price. The residential Apify proxy is not available in this Actor.

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

Maximum number of requests processed in parallel.

## `maxRequestsPerMinute` (type: `integer`):

Most requests to the site in any 60 seconds, all of them counted: results pages, listing pages and the extra page read for a listing. A budget, not an even pace: up to this many can leave at once when the minute starts (spread them with the minimum delay below). Lower it if the site answers HTTP 429 / 403 in the log.

## `minRequestIntervalMs` (type: `integer`):

Smallest gap between two requests, in milliseconds. Unlike the per-minute rate, this spreads the requests evenly instead of letting them go out in a burst. 0 = no gap.

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

Retries per request before it is marked as failed. Behind a proxy, a request the site turns away is also retried on a new proxy session up to 10 times without using up these retries.

## `debugLog` (type: `boolean`):

Include debug messages in the run log.

## Actor input object example

```json
{
  "startUrls": [],
  "country": "ae",
  "purpose": "rent",
  "location": "Dubai Marina",
  "locations": [],
  "searchQueries": [],
  "propertyType": "",
  "furnishing": "any",
  "completionStatus": "any",
  "rentFrequency": "",
  "amenities": [],
  "sortBy": "newest",
  "maxItems": 20,
  "maxItemsPerQuery": 0,
  "extractDetails": true,
  "enrichDld": false,
  "enrichUnitDetails": false,
  "enrichRegister": false,
  "registerFullRecord": false,
  "registerAgentContact": false,
  "excludeKeywords": [],
  "verifiedOnly": false,
  "superAgentOnly": false,
  "onlyNew": false,
  "stateKey": "default",
  "resetState": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "maxConcurrency": 8,
  "maxRequestsPerMinute": 180,
  "minRequestIntervalMs": 0,
  "maxRequestRetries": 5,
  "debugLog": false
}
```

# Actor output Schema

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

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

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

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "location": "Dubai Marina",
    "maxItems": 20,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("nice_dev/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 = {
    "location": "Dubai Marina",
    "maxItems": 20,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("nice_dev/propertyfinder-listings-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "location": "Dubai Marina",
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call nice_dev/propertyfinder-listings-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,nice_dev/propertyfinder-listings-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

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