# Property Finder Gulf — Qatar, Saudi, Egypt, Bahrain (`logiover/property-finder-gulf-scraper`) Actor

Scrape Property Finder in Qatar, Saudi Arabia, Egypt and Bahrain: price in local currency, size in sq ft and m², bedrooms, coordinates, verification status and listed date, plus the agent with email and the brokerage with phone, email and office address.

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

## Pricing

from $3.50 / 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

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

## How to integrate an Actor?

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

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

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

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

# README

## Property Finder Gulf — Qatar, Saudi, Egypt, Bahrain

Export listings from **Property Finder** across **Qatar, Saudi Arabia, Egypt and Bahrain** — price, size, coordinates, verification status and the full agent and brokerage contact record — to JSON, CSV or Excel. Keyless, no login.

### What does Property Finder Scraper do?

Property Finder runs the same platform in every market it operates in, and embeds its whole search payload in the page. This Actor reads that directly across four Gulf and North African markets from one dropdown. No browser, no rendering, low cost per row.

The United Arab Emirates is deliberately not in the list: it has its own dedicated Actor. Two Store listings competing for the same market split the traffic instead of adding anything.

What makes this export unusually valuable is the **contact record on every listing**. Each row carries the listing agent's name, email and spoken languages, and the brokerage's name, email, phone number and registered office address. In markets where thousands of brokerages compete for the same stock, that turns a property export into a brokerage database — which is exactly what proptech vendors, mortgage brokers, developers and portal competitors want.

Three details are handled deliberately rather than copied blindly:

- **The results array is mixed.** Alongside ordinary properties it carries developer-project blocks, project carousels and recommendation widgets. Those are not properties, so they are filtered out and the row count stays honest.
- **Studios are not a number.** `bedrooms` arrives as a string and studios come through as the word "studio". Both a numeric column and the original label are exported, so you can filter numerically without losing studios.
- **Sizes are in square feet.** The site's own sq ft value is kept and a square-metre column is derived, because everyone outside the Gulf compares in m².

### Who is it for?

- **Brokerages** benchmarking competitor stock and agent activity in Doha, Riyadh, Cairo and Manama.
- **Proptech, CRM and mortgage vendors** prospecting Gulf brokerages with verified contact details.
- **Developers** tracking secondary-market pricing against their own launches.
- **Investors** filtering by price per sq ft, completion status and location.
- **Analysts** measuring supply, verification rates and time-on-market.

### Use cases

- Build a Qatari or Saudi brokerage contact list with phone, email and office address.
- Rank agents by listing count and average asking price.
- Compare price per sq ft across Doha or Riyadh districts using exact coordinates.
- Separate off-plan from completed stock using the completion status.
- Track newly listed properties daily in each market by sorting newest first.

### Why use this Actor?

- **Agent and brokerage contact data** — email, phone and office address on every row.
- **Both size units** — the site's sq ft plus a derived m² column.
- **Exact coordinates**, no geocoding step.
- **Verification and developer flags**, so you can filter to verified stock only.
- **Real listed date**, not a relative label.
- **Keyless and browserless** — no login, no headless Chrome.

### What data can you extract?

Every row carries the property ID and reference, title and URL, property and transaction type, price with currency and a hidden-price flag, numeric bedrooms plus the original label, bathrooms, size in sq ft and m², furnished state, completion status, location name, full location path, location type, latitude and longitude, agent name, email, languages and super-agent flag, brokerage name, email, phone and address, the listing's contact phone and WhatsApp number, verified, developer, new-construction and premium flags, amenity codes, image count and the listed date.

### How to use it

1. Choose the **country market** — Qatar, Saudi Arabia, Egypt or Bahrain.
2. Choose the **transaction** — residential sale or rent, or commercial.
3. Pick a **property type**, or Any.
4. Optionally paste a **location ID** from a Property Finder search URL's `l` parameter.
5. Set a price band and minimum bedrooms if you need them.
6. Set **Maximum results** and run, then export JSON, CSV or Excel.

### Input example

```json
{
  "market": "qa",
  "transaction": "buy",
  "propertyTypeId": "1",
  "minPrice": 1000000,
  "maxPrice": 3000000,
  "minBedrooms": 2,
  "sortBy": "nd",
  "maxResults": 1000
}
```

### Notes and limits

- Prices are asking prices in each market's own currency — Qatari riyal, Saudi riyal, Egyptian pound or Bahraini dinar — and the currency is exported per row. For rentals the figure is the annual rent, which is how these markets quote it.
- Contact details are the business contact information the brokerage publishes on its own adverts — not personal data taken from anywhere else. You remain responsible for how you use it under each market's own law and, where applicable, GDPR when sending marketing.
- Amenities are exported as Property Finder's own two-letter codes; the codes are stable, the display names are not.
- Brokerage phone and office address are absent on a small share of listings because the brokerage has not filled them in.
- This Actor exports the search payload, not full property pages — open the property URL for the complete description and gallery.

### FAQ

**Do I need a Property Finder account?**
No. Search results are public and the Actor needs nothing from you.

**Why is the UAE missing?**
It has its own Actor. Listing the same market twice in the Store would split search traffic between two pages rather than growing it.

**Where do I get the location ID?**
Search on the country site for your area and copy the `l` parameter from the URL. Leaving it empty searches the whole country.

**Does it cover rentals and commercial?**
Yes — all four combinations of residential/commercial and sale/rent.

**Why are there two size columns?**
The site quotes square feet; the square-metre column is derived so the data is comparable internationally.

**How am I charged?**
Pay per result — you pay for the properties delivered.

# Actor input Schema

## `market` (type: `string`):

Which Property Finder country site to scrape. The United Arab Emirates has its own dedicated Actor and is intentionally not listed here.

## `transaction` (type: `string`):

Residential sale or rent, or the commercial equivalents.

## `propertyTypeId` (type: `string`):

Property Finder's numeric property-type code. 1 apartment, 3 villa, 4 townhouse, 5 penthouse, 22 land.

## `locationId` (type: `string`):

Optional Property Finder location code from the search URL's `l` parameter. Leave empty to search the whole country.

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

Sale price, or annual rent when renting, in the market's local currency. 0 disables the filter.

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

Sale price, or annual rent when renting, in the market's local currency. 0 disables the filter.

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

Only return properties with at least this many bedrooms. 0 disables the filter.

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

Result order. Newest first is best when monitoring the market.

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

Stop after this many properties. Property Finder renders 25 per page and the Actor walks pages until the target is met.

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

Property Finder embeds its search payload in the page; the default datacenter proxy is enough.

## Actor input object example

```json
{
  "market": "qa",
  "transaction": "buy",
  "propertyTypeId": "1",
  "minPrice": 0,
  "maxPrice": 0,
  "minBedrooms": 0,
  "sortBy": "nd",
  "maxResults": 500,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `propertyId` (type: `string`):

No description

## `reference` (type: `string`):

No description

## `title` (type: `string`):

No description

## `propertyUrl` (type: `string`):

No description

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

No description

## `transactionType` (type: `string`):

No description

## `priceAmount` (type: `string`):

No description

## `currency` (type: `string`):

No description

## `isPriceHidden` (type: `string`):

No description

## `bedrooms` (type: `string`):

No description

## `bedroomsLabel` (type: `string`):

No description

## `bathrooms` (type: `string`):

No description

## `sizeSqft` (type: `string`):

No description

## `sizeSqm` (type: `string`):

No description

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

No description

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

No description

## `locationName` (type: `string`):

No description

## `locationFullName` (type: `string`):

No description

## `locationType` (type: `string`):

No description

## `latitude` (type: `string`):

No description

## `longitude` (type: `string`):

No description

## `agentName` (type: `string`):

No description

## `agentEmail` (type: `string`):

No description

## `agentLanguages` (type: `string`):

No description

## `isSuperAgent` (type: `string`):

No description

## `brokerName` (type: `string`):

No description

## `brokerEmail` (type: `string`):

No description

## `brokerPhone` (type: `string`):

No description

## `brokerAddress` (type: `string`):

No description

## `contactPhone` (type: `string`):

No description

## `contactWhatsapp` (type: `string`):

No description

## `isVerified` (type: `string`):

No description

## `isFromDeveloper` (type: `string`):

No description

## `isNewConstruction` (type: `string`):

No description

## `isPremium` (type: `string`):

No description

## `amenityCodes` (type: `string`):

No description

## `imageCount` (type: `string`):

No description

## `listedDate` (type: `string`):

No description

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

No description

## `source` (type: `string`):

No description

## `scrapedAt` (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 = {
    "market": "qa",
    "transaction": "buy",
    "propertyTypeId": "1",
    "locationId": "",
    "minPrice": 0,
    "maxPrice": 0,
    "minBedrooms": 0,
    "sortBy": "nd",
    "maxResults": 500,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("logiover/property-finder-gulf-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 = {
    "market": "qa",
    "transaction": "buy",
    "propertyTypeId": "1",
    "locationId": "",
    "minPrice": 0,
    "maxPrice": 0,
    "minBedrooms": 0,
    "sortBy": "nd",
    "maxResults": 500,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("logiover/property-finder-gulf-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 '{
  "market": "qa",
  "transaction": "buy",
  "propertyTypeId": "1",
  "locationId": "",
  "minPrice": 0,
  "maxPrice": 0,
  "minBedrooms": 0,
  "sortBy": "nd",
  "maxResults": 500,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call logiover/property-finder-gulf-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,logiover/property-finder-gulf-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/d42s08zpJPY2wdyjb/builds/g5Yh1eYRDcTpYM4Kc/openapi.json
