# BAYUT \[$0.89💰] | Search & Detail(s) & Agent(s) & Company(s) (`memo23/apify-bayut-scraper`) Actor

💰 $0.89 per 1,000 listings, get comprehensive Bayut property data including pricing, specs (rooms, area, furnishing), location details, agent/agency info, verification status, high-res photos, and multilingual descriptions. Ideal for market analysis, lead generation, and property research.

- **URL**: https://apify.com/memo23/apify-bayut-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** Real estate, Lead generation, MCP servers
- **Stats:** 378 total users, 57 monthly users, 100.0% runs succeeded, 8 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $0.70 / 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/actors/running/actors-in-store.md#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

## Bayut Property Scraper — UAE, Saudi Arabia, Jordan, Qatar & Oman

Turn any Bayut URL into structured real-estate data. Paste a search, listing, broker, or agency URL from any of the five Bayut portals — **bayut.com (UAE), bayut.sa (Saudi Arabia), bayut.jo (Jordan), bayut.qa (Qatar) and bayut.om (Oman)** — and get clean JSON or CSV rows with prices, specs, exact locations, photos, agency licenses, and direct contact numbers.

*From studios in Dubai Marina to penthouses in Riyadh: one actor, five markets, ready-to-analyze property data.*

### Why Use This Scraper?

- ✅ All five Bayut markets in one actor — UAE, Saudi Arabia, Jordan, Qatar, Oman — Arabic and English URLs both work
- ✅ Listings, brokers/agents, and agencies/companies from the same input — each URL is auto-routed
- ✅ Fast index-based extraction (~90 fields per listing) with no fragile HTML parsing
- ✅ Saudi REGA compliance data: FAL brokerage license and ad-permit numbers on KSA rows
- ✅ Optional email enrichment adds the listing agent's real `agentEmail` to each row
- ✅ Instant Agent Database mode — 11,000+ pre-collected UAE agents, no scraping needed
- ✅ Monitoring mode collects only new or price-changed listings on scheduled re-runs
- ✅ Built-in residential proxy included at no extra cost

### Overview

The Bayut Property Scraper is built for real-estate investors, market analysts, lead-generation teams, and researchers who need structured property data from the Gulf and the Levant.

The actor produces three row shapes, depending on the URL you start from:

- **Listing rows** — from property search URLs and listing detail pages
- **Broker rows** — from broker directories and individual broker profiles, flattened into single-level JSON for easy CSV/Excel use
- **Company rows** — from agency/company directories and company detail pages, including the full team roster on team pages

Every row carries `market` (`ae` / `sa` / `jo` / `qa` / `om`) and `currency` (`AED` / `SAR` / `JOD` / `QAR` / `OMR`) columns, so multi-country runs stay cleanly separable in one dataset.

By default, listings come straight from Bayut's search index — fast and reliable. Switch on **full details** to also fetch each listing's detail page, which adds the description text, complete photo/video/floor-plan media, and the permit number.

### 🇸🇦 Saudi Arabia support (Bayut.sa)

The same actor scrapes **Bayut.sa**, Bayut's Saudi Arabia portal (70,000+ live KSA listings across Riyadh, Jeddah, Dammam, Makkah, Madinah and every Saudi city). Just paste a bayut.sa URL — **Arabic or English**, both work (Arabic search URLs like `https://www.bayut.sa/للبيع/شقق/الرياض/` are normalized automatically):

- **Search URLs:** `https://www.bayut.sa/en/for-sale/apartments/riyadh/`, `https://www.bayut.sa/en/to-rent/villas/jeddah/`, `https://www.bayut.sa/en/for-sale/property/saudi-arabia/` (country-wide), or their Arabic equivalents straight from your browser
- **Listing detail URLs:** `https://www.bayut.sa/en/property/details-88006062.html`
- All the UAE features work the same way for KSA: search filters (price, beds, baths, area, completion status), pagination, monitoring mode, and the fast index-based extraction (no fragile HTML parsing).

**KSA-specific output fields** on every Saudi listing:

| Field | Description |
|---|---|
| `market` | `sa` for Bayut.sa rows, `ae` for Bayut.com rows |
| `currency` | `SAR` for Saudi listings, `AED` for UAE |
| `regaBrokerageLicenseNumber` | The advertiser's **REGA FAL (brokerage & marketing) license number** — the Saudi government ID that identifies the brokerage across every Saudi property portal, ideal as a cross-platform join key |
| `regaAdLicenseNumber` | The **REGA ad license (permit) number** of the individual advertisement (full-details mode) |
| `regaAdLicenseExpiryDate` | Unix timestamp when the REGA ad license expires |

Saudi listings also include REGA-normalized location data (`extraFields.rega_location_region/city/district/street_name` in Arabic + English), installment/discount data where present (`extraFields.original_price`, `extraFields.discount_percentage`), Saudi property categories (apartments, villas, rest houses/istiraha, chalets, rooms, farms, warehouses, offices), and prices in SAR.

### 🌍 All Bayut country domains — Jordan, Qatar & Oman too

One actor covers **every Bayut market**. Paste a URL from any of these domains (Arabic or English):

| Domain | Market | Currency | Example search URL |
|---|---|---|---|
| bayut.com | 🇦🇪 UAE (Dubai, Abu Dhabi, Sharjah…) | AED | `https://www.bayut.com/for-sale/apartments/dubai/` |
| bayut.sa | 🇸🇦 Saudi Arabia (Riyadh, Jeddah, Dammam…) | SAR | `https://www.bayut.sa/en/for-sale/apartments/riyadh/` |
| bayut.jo | 🇯🇴 Jordan (Amman, Zarqa, Irbid…) | JOD | `https://www.bayut.jo/en/for-sale/apartments/amman/` |
| bayut.qa | 🇶🇦 Qatar (Doha, Lusail, The Pearl…) | QAR | `https://www.bayut.qa/en/to-rent/apartments/doha/` |
| bayut.om | 🇴🇲 Oman (Muscat, Seeb, Salalah…) | OMR | `https://www.bayut.om/en/to-rent/apartments/muscat/` |

Every row includes `market` and `currency` columns so multi-country runs stay cleanly separable. Rental listings outside the UAE include **all rent frequencies** (monthly rents dominate in Oman; Saudi includes daily/weekly istiraha lets) with the `rentFrequency` field on each row.

### Supported Inputs

#### URL types

| URL type | Example |
|---|---|
| Property search — for sale | `https://www.bayut.com/for-sale/apartments/dubai/` |
| Property search — to rent | `https://www.bayut.sa/en/to-rent/villas/jeddah/` |
| Filtered search (any browser filters) | `https://www.bayut.com/for-sale/property/dubai/dubai-marina/?price_max=1650000&area_max=74.322432` |
| Listing detail page | `https://www.bayut.com/property/details-12008171.html` |
| Broker directory | `https://www.bayut.com/brokers/dubai/` |
| Broker profile | `https://www.bayut.com/brokers/sheetal-sureen-749540.html` |
| Companies directory | `https://www.bayut.com/companies/abu-dhabi` |
| Company details (with team) | `https://www.bayut.com/companies/oia-properties-10678/?activeTab=team` |

These URL types work on every Bayut domain, and you can mix them freely in one run. Any search filter you can set on the Bayut site (price, beds, baths, area, completion status, keywords…) is honored — just copy the URL from your browser. Arabic URLs are normalized automatically.

#### Copy-pasteable startUrls

```json
{
  "startUrls": [
    "https://www.bayut.com/for-sale/property/dubai/dubai-marina/",
    "https://www.bayut.sa/en/for-sale/apartments/riyadh/",
    "https://www.bayut.jo/en/for-sale/apartments/amman/",
    "https://www.bayut.qa/en/to-rent/apartments/doha/",
    "https://www.bayut.om/en/to-rent/apartments/muscat/"
  ]
}
```

#### Instant Agent Database (no URLs needed)

Skip scraping entirely: switch on `instantDatabase` (or just fill in `dbAgencyName`) and the actor serves UAE real-estate agents from a pre-collected database of 11,000+ profiles — instant results, no proxies, no crawling. Filter by agency name, or narrow to agents that have an email, phone, or WhatsApp number on file.

#### Unsupported inputs

- ❌ URLs from other portals (Dubizzle, Property Finder, Aqar…) — see Explore More Scrapers below for those
- ❌ Content behind a Bayut account login (saved searches, user dashboards)
- ❌ Blog and content pages (MyBayut articles, area guides)

### Use Cases

| Audience | Use case |
|---|---|
| **Investors & market analysts** | Track prices, price-per-m² and inventory across Dubai, Riyadh, Amman, Doha and Muscat in one dataset |
| **Lead-gen & proptech teams** | Build broker/agency contact lists with phone, WhatsApp and (optionally) verified emails |
| **Brokerages & developers** | Monitor competitor listings, agent rosters and new supply in target communities |
| **Valuation & AVM builders** | Feed listing-level specs, coordinates and media into pricing and search products |
| **Researchers & journalists** | Study the Gulf property market with multilingual, REGA-licensed source data |
| **Agencies** | Deliver client-ready Bayut datasets without writing or maintaining scrapers |

### How It Works

1. **Input** — paste one or more Bayut URLs from any of the five domains (Arabic or English), or switch on Instant Database mode
2. **Detect entry type** — each URL is auto-routed to the right handler: property search, listing detail, broker directory/profile, or company directory/detail
3. **Collect rows** — data is pulled from Bayut's structured search index with automatic pagination; the built-in residential proxy handles anti-bot protection
4. **Optional enrichment** — full listing details, agent-email enrichment, or monitoring mode when configured
5. **Output** — download the dataset as JSON, CSV or Excel; every row is stamped with `market` and `currency`

### Input Configuration

#### Input fields

| Field | Type | Default | Notes |
|---|---|---|---|
| `startUrls` | array of strings | — | Bayut URLs from any of the five markets; search, listing, broker and company URLs can be mixed |
| `maxItems` | integer | unset | Stop after this many results. Free accounts are capped at 50; paying accounts honor the value (minimum 10). Leave blank to scrape up to your run's cost limit |
| `fullDetails` | boolean | `false` | Also fetch each listing's detail page — adds description text, full photo/video/floor-plan media and the permit number. Slower than index mode |
| `enrichEmails` | boolean | `false` | Add the listing agent's real `agentEmail` (plus direct phone/cell/WhatsApp) to each listing row. One extra billed request per **unique** agent — cached, so an agent with 50 listings is fetched once |
| `monitoringMode` | boolean | `false` | Only push listings that were not seen in previous runs |
| `enablePriceMonitoring` | boolean | `false` | With monitoring mode on, also re-scrape previously seen listings whose price changed |
| `instantDatabase` | boolean | `false` | Serve UAE agents from the pre-collected 11,000+ agent database instead of live-scraping. Auto-enabled when `dbAgencyName` is set |
| `dbAgencyName` | string | — | Instant Database filter: agency name contains this text |
| `dbHasEmail` | boolean | `false` | Instant Database filter: only agents with an email on file (about 1 in 10) |
| `dbHasPhone` | boolean | `false` | Instant Database filter: only agents with a phone (virtually all) |
| `dbHasWhatsapp` | boolean | `false` | Instant Database filter: only agents with WhatsApp (about 1 in 10) |
| `maxConcurrency` | integer | `10` | Maximum pages processed in parallel |
| `minConcurrency` | integer | `1` | Minimum pages processed in parallel |
| `maxRequestRetries` | integer | `10` | Retries per failed request (maximum 10) |
| `proxy` | object | built-in | Leave empty — the actor routes all traffic through its own residential proxy at no extra cost. Set only to override with your own proxies |

#### Common scenarios

**1. Multi-market search with full listing details**

```json
{
  "startUrls": [
    "https://www.bayut.com/for-sale/apartments/dubai/dubai-marina/",
    "https://www.bayut.sa/en/for-sale/apartments/riyadh/"
  ],
  "fullDetails": true,
  "maxItems": 500
}
```

**2. Lead list — listings with agent emails**

```json
{
  "startUrls": ["https://www.bayut.com/for-sale/property/dubai/"],
  "enrichEmails": true,
  "maxItems": 200
}
```

**3. Scheduled monitoring of new and repriced listings**

```json
{
  "startUrls": ["https://www.bayut.qa/en/to-rent/apartments/doha/"],
  "monitoringMode": true,
  "enablePriceMonitoring": true
}
```

**4. Instant agent database pull (no scraping)**

```json
{
  "instantDatabase": true,
  "dbHasEmail": true,
  "maxItems": 500
}
```

### Output Overview

Each dataset item is one of three row shapes, depending on the start URL:

**Listing rows** contain:

- **Identifiers & status** — `id`, `externalID`, `referenceNumber`, `state`, `slug`, lifecycle timestamps
- **Market & pricing** — `market`, `currency`, `purpose`, `price`, `rentFrequency`, promotion tier
- **Location** — `geography` coordinates plus the full `location[]` hierarchy (country → city → neighbourhood → building) with multilingual names
- **Specs** — `rooms`, `baths`, `area`, `category[]` type hierarchy, furnishing and completion status, amenities
- **Media** — cover photo, photo/video/panorama counts; full media arrays with direct URLs in full-details mode
- **Contact & agency** — phone numbers (direct + proxy), `contactName`, full `agency` object with licenses (DED/RERA/ORN)
- **Verification & quality** — `isVerified`, TruCheck `verification` object, Bayut quality scores

Saudi rows add the REGA license fields; `enrichEmails` adds `agentEmail` (plus direct agent numbers); `fullDetails` adds multilingual `description` text, full media and `permitNumber`.

**Broker rows** are flattened, CSV-ready profiles: identity and bio, direct contacts (email, cell, phone, WhatsApp, proxy numbers), languages, specialities, service areas, listing-count stats, and the agency affiliation with its licenses.

**Company rows** are agency profiles: name, description, logo, licenses, agent count, portfolio stats (total/sale/rent ad counts, property types, service areas), locations — and on `?activeTab=team` pages, the full `agents[]` roster with per-agent contact details.

### Output Samples

#### UAE listing row (search URL start, trimmed)

```jsonc
{
  "id": 8773336,
  "externalID": "12011965",
  "market": "ae",
  "currency": "AED",
  "state": "active",
  "purpose": "for-sale",
  "price": 930000,
  "rentFrequency": null,
  "title": "NEXT TO METRO STATION | BIGGEST STUDIO | RENTED",
  "title_l1": "شقة في مارينا دايموند 3،مارينا دايموند،دبي مارينا 930000 درهم - 12011965",
  "referenceNumber": "AP7604-1S",
  "permitNumber": "7117257000",
  "geography": { "lat": 25.081678, "lng": 55.14697 },
  "location": [
    { "level": 1, "name": "Dubai", "slug": "/dubai" },
    { "level": 2, "name": "Dubai Marina", "type": "neighbourhood" },
    { "level": 4, "name": "Marina Diamond 3", "type": "condo-building" }
  ],
  "category": [
    { "level": 0, "name": "Residential" },
    { "level": 1, "name": "Apartments" }
  ],
  "rooms": 0,
  "baths": 1,
  "area": 66.33,
  "furnishingStatus": "furnished",
  "completionStatus": "completed",
  "coverPhoto": { "url": "https://bayut-production.s3.eu-central-1.amazonaws.com/image/780986457/%E2%80%A6" },
  "photoCount": 11,
  "phoneNumber": { "mobile": "+971523914299", "proxyPhone": "+97142450076" },
  "contactName": "Anam Hafeez",
  "agency": {
    "name": "Stage Properties",
    "licenses": [
      { "number": "912442", "authority": "DED" },
      { "number": "25174", "authority": "RERA" }
    ],
    "tier": 2
  },
  "isVerified": false,
  "createdAt": 1750691105,
  "updatedAt": 1750933197,
  "extraFields": { "dldPropertySK": "12011965" }
  /* …plus quality scores, verification object, media arrays,
     and multilingual titles/descriptions in full-details mode… */
}
```

#### Saudi listing row (bayut.sa search start, trimmed — note the REGA fields)

```jsonc
{
  "id": 1178418,
  "externalID": "87800999",
  "market": "sa",
  "currency": "SAR",
  "purpose": "for-sale",
  "price": 1489000,
  "title": "Luxury penthouse for sale - Al-Rimal Neighborhood",
  "regaBrokerageLicenseNumber": "1200027497",
  "regaAdLicenseNumber": null,            /* populated in full-details mode */
  "regaAdLicenseExpiryDate": 1787346000,
  "geography": { "lat": 24.862779, "lng": 46.810796 },
  "location": [
    { "level": 0, "name": "KSA", "name_l1": "السعودية" },
    { "level": 1, "name": "Riyadh", "name_l1": "الرياض" },
    { "level": 3, "name": "Al Rimal", "slug": "/riyadh/east-riyadh/al-rimal" }
  ],
  "rooms": 3,
  "baths": 3,
  "area": 149,
  "amenities": ["Electricity", "Water Supply", "Fiber Optics", "Schools", "Mosque"],
  "phoneNumber": { "mobile": "+966920016085", "whatsapp": "966114049994" },
  "contactName": "Abdulaziz Ali",
  "agency": {
    "name": "Al Mayasah Al Oula Real Estate Company",
    "name_l1": "شركة المياسة الأولى العقارية"
  },
  "isVerified": true,
  "extraFields": {
    "brokerage_and_marketing_license_number": "1200027497",
    "ad_license_expiry_date": 1787346000,
    "rega_location_street_name": { "ar": "سعيد بن نفيل", "en": "سعيد بن نفيل" }
  }
  /* …plus ownerAgent (TruBroker), verification, photos… */
}
```

#### Broker row (broker directory or profile start, trimmed)

```jsonc
{
  "user_id": "1869695",
  "name": "Saad Khalid",
  "about_user": "I am the CEO of Biruki Real Estate Brokerage. I specialize in Dubai Hills, Palm Jumeirah…",
  "email": "saadkhalid96@gmail.com",
  "cell": "+971585793379",
  "whatsapp": "+971585793379",
  "proxy_phone": "+97143640970",
  "contactMethodAvailability": { "email": true, "call": true, "whatsapp": true, "sms": true },
  "user_langs": { "en": ["English"] },
  "specialities": { "en": ["Residential Sales", "Residential Leasing"] },
  "service_areas": { "en": ["Palm Jumeirah", "Dubai Hills Estate", "Arabian Ranches", "Tilal Al Ghaf"] },
  "agency": {
    "external_id": "101176",
    "name": { "en": "Biruki Real Estate" },
    "licenses": [
      { "number": "1090256", "authority": "DED" },
      { "number": "31430", "authority": "RERA" }
    ]
  }
  /* …plus profile image, slugs, multilingual variants, listing-count stats… */
}
```

#### Company row (companies directory or detail start, trimmed)

```jsonc
{
  "id": 29557762,
  "externalID": "9364",
  "name": "Open Home Properties",
  "location": "Abu Dhabi",
  "description": "Open Home Property LLC Professional Established Real Estate Brokerage Company in Abu Dhabi…",
  "agentsCount": 32,
  "licenses": [{ "number": "CN-2832576", "authority": "DED" }],
  "logo": { "url": "https://bayut-production.s3.eu-central-1.amazonaws.com/image/86710451/%E2%80%A6" },
  "phoneNumber": { "mobile": "+971581810468" },
  "stats": {
    "adsCount": 1280,
    "adsSaleCount": 1277,
    "adsRentCount": 3,
    "categoryTypes": ["Townhouses", "Penthouses", "Villas", "Apartments", "Villa Compounds", "Plots", "Shops", "Offices"],
    "serviceAreas": ["Al Reem Island", "Saadiyat Island", "Al Raha Beach", "Al Shamkha"]
  },
  "product": "featured",
  "isFeatured": true,
  "active": true
  /* …plus detailed locations[] with ad counts and, on team pages, the full agents[] roster… */
}
```

### Key Output Fields

The most commonly used fields per row shape. Rows can contain additional raw Bayut fields beyond these; multilingual variants follow the `_l1` / `_l2` / `_l3` suffix convention (Arabic / Chinese / Russian on bayut.com; Arabic on the other domains).

#### Listing rows

**Identifiers & status**

| Field | Description |
|---|---|
| `id` / `objectID` | Bayut internal listing ID |
| `externalID` | Public listing ID — the number in the listing URL (`/property/details-12011965.html`) |
| `referenceNumber` | Agency's internal reference code |
| `permitNumber` | Advertising permit number (RERA/DLD in the UAE) — full-details mode |
| `state` / `active` | Listing status |
| `slug` | URL path of the listing |
| `createdAt` / `approvedAt` / `updatedAt` / `touchedAt` / `reactivatedAt` | Unix timestamps of the listing lifecycle |

**Market & pricing**

| Field | Description |
|---|---|
| `market` | `ae`, `sa`, `jo`, `qa` or `om` — which Bayut portal the row came from |
| `currency` | `AED`, `SAR`, `JOD`, `QAR` or `OMR` |
| `purpose` | `for-sale` / `for-rent` |
| `price` | Listing price in the market currency |
| `rentFrequency` | `yearly` / `monthly` / `weekly` / `daily`; `null` for sale listings |
| `product` / `productLabel` | Listing promotion tier (`hot`, `superhot`, …) |
| `hidePrice` | `true` when the price is on-request |

**Location**

| Field | Description |
|---|---|
| `geography.lat` / `geography.lng` | Coordinates; `hasExactGeography` flags precision |
| `location[]` | Hierarchy from country (level 0) down to building — each level with `name`, multilingual `name_l1…l3`, `slug`, and `type` (`neighbourhood`, `condo-building`, …) |

**Property specs**

| Field | Description |
|---|---|
| `rooms` | Bedrooms (0 = studio) |
| `baths` | Bathrooms |
| `area` | Built-up area in m² |
| `plotArea` | Plot area in m² (land/villas), when applicable |
| `category[]` | Property-type hierarchy, e.g. Residential → Apartments |
| `furnishingStatus` | `furnished` / `unfurnished` / `part-furnished` |
| `completionStatus` | `completed` / `off-plan` / `under-construction` |
| `amenities` | Amenity names, where surfaced |

**Media**

| Field | Description |
|---|---|
| `coverPhoto` | Main photo object (direct S3 `url` on UAE index rows) |
| `photoCount` / `videoCount` / `panoramaCount` | Media counts |
| `photos[]` / `videos[]` / `panoramas[]` / `floorPlans[]` | Full media arrays with direct URLs — full-details mode |

**Contact & agency**

| Field | Description |
|---|---|
| `contactName` | Listing agent's name |
| `phoneNumber` | `mobile`, `phone`, `whatsapp`, `proxyPhone` / `proxyMobile`, plus `phoneNumbers[]` / `mobileNumbers[]` |
| `contactMethodAvailability` | Which channels are enabled — call / SMS / email / WhatsApp |
| `agency` | Agency object: `name` (+ multilingual), `externalID`, `licenses[]` (`number` + `authority` — DED/RERA/ORN), `logo.url`, `tier`, `product`, `performanceCohort` |
| `ownerAgent` | Assigned agent profile on KSA rows, including `isTruBroker` |

**Verification & quality**

| Field | Description |
|---|---|
| `isVerified` | Quick verification flag |
| `verification` | `status`, `verifiedAt`, `trucheckedAt` (Bayut TruCheck), … |
| `score` / `indyScore` / `cityLevelScore` / `locationPurposeTier` | Bayut ranking and quality scores |

**Descriptions & multilingual content**

| Field | Description |
|---|---|
| `title`, `title_l1…l3` | Listing title in English plus localized variants |
| `description`, `description_l1…l3` | Full description text — full-details mode |
| `descriptionTranslated*` | Whether each language version is a translation |

**Saudi Arabia (REGA) fields — bayut.sa rows**

| Field | Description |
|---|---|
| `regaBrokerageLicenseNumber` | REGA FAL license of the advertiser — cross-portal join key |
| `regaAdLicenseNumber` | REGA ad (permit) license of the advertisement — full-details mode |
| `regaAdLicenseExpiryDate` | Unix timestamp of the ad-license expiry |
| `extraFields.rega_location_*` | REGA-normalized region/city/district/street names (Arabic + English) |
| `extraFields.original_price` / `extraFields.discount_percentage` | Discount data, where present |

UAE rows carry `extraFields.dldPropertySK` (Dubai Land Department property key) instead.

**Email enrichment fields — when `enrichEmails: true`**

| Field | Description |
|---|---|
| `agentEmail` | The listing agent's real email address |
| `agentPhone` / `agentCell` / `agentWhatsapp` | Direct numbers from the agent's profile |

#### Broker rows

| Group | Fields |
|---|---|
| Identity | `user_id` / `external_id`, `name` (+ `_l1…l3`), `about_user` bio, `user_image`, `slug` |
| Contact | `email`, `cell` + `cell_numbers[]`, `phone` + `phone_numbers[]`, `whatsapp`, `proxy_phone` / `proxy_whatsapp`, `contactMethodAvailability` |
| Professional | `experience` (years), `user_langs`, `specialities`, `service_areas` (+ `service_areas_external_ids`) |
| Listing stats | `basicInfo.sale_count`, `basicInfo.rent_count`, `basicInfo.detailedAdCountStats` (per-location totals incl. TruChecked) |
| Agency | `agency.external_id`, `agency.name`, `agency.slug`, `agency.logo.url`, `agency.licenses[]` (DED/RERA/ORN) |

#### Company rows

| Group | Fields |
|---|---|
| Profile | `id` / `objectID` / `externalID`, `name`, `description`, `slug`, `logo.url`, `active`, `isFeatured`, `product` / `productScore`, `type` |
| Compliance | `licenses[]` (`number` + `authority`), `agentsCount` |
| Contact | `phoneNumber.mobile` (+ `mobileNumbers[]`), `contactMethodAvailability` |
| Footprint | `location`, `locations[]` (with `_geoloc`, `adCount`, `hierarchy`), `stats.serviceAreas[]` |
| Portfolio | `stats.adsCount`, `stats.adsSaleCount`, `stats.adsRentCount`, `stats.categoryTypes[]`, `stats.purposes[]` |
| Team | `agents[]` — each agent with the broker-row contact shape (name, email, cell, WhatsApp, languages, …) on `?activeTab=team` pages |

### FAQ

#### Which Bayut URLs are supported?

Property search URLs (with any filters), listing detail pages (`/property/details-….html`), broker directories and profiles (`/brokers/…`), and company directories and detail pages (`/companies/…`) — on all five domains: bayut.com, bayut.sa, bayut.jo, bayut.qa and bayut.om. Blog/content pages (MyBayut) and URLs from other portals are not supported.

#### Do Arabic URLs work?

Yes. Arabic search URLs (e.g. `https://www.bayut.sa/للبيع/شقق/الرياض/`) are normalized automatically — purpose and category segments are mapped to their English equivalents, and Arabic location slugs are resolved natively.

#### What is the difference between the default mode and `fullDetails`?

By default, listings are returned straight from Bayut's search index — fast and reliable, with ~90 fields per listing including price, location, agency, contact numbers, amenities and the cover photo. `fullDetails: true` additionally fetches each listing's detail page, adding the description text, the complete photo/video/floor-plan media, and the permit number. Full-details mode is slower.

#### How do I get agent email addresses?

Three ways: (1) `enrichEmails: true` on listing runs adds `agentEmail` to each row — billed once per unique agent and cached across that agent's listings; (2) broker rows include the agent's public `email` where Bayut exposes it; (3) Instant Database mode with `dbHasEmail: true` returns only database agents with an email on file (about 1 in 10).

#### What are the REGA fields on Saudi listings?

Every bayut.sa row carries `regaBrokerageLicenseNumber` — the advertiser's REGA FAL (brokerage & marketing) license, a Saudi government ID that stays the same across every Saudi property portal, making it an ideal cross-platform join key. Full-details mode adds `regaAdLicenseNumber`, the permit of the individual advertisement, with its expiry in `regaAdLicenseExpiryDate`.

#### How does monitoring mode work?

The actor keeps a record of listing IDs seen in previous runs. With `monitoringMode: true`, only new listings are pushed to the dataset. Add `enablePriceMonitoring: true` to also re-scrape previously seen listings whose price changed. Ideal for scheduled runs that track new supply or price cuts. Monitoring requires a paid Apify account.

#### What is the Instant Agent Database?

A pre-collected database of 11,000+ UAE real-estate agents that the actor can serve without any live scraping — instant results at zero proxy cost. Turn on `instantDatabase` (or set `dbAgencyName`) and optionally filter to agents with an email, phone, or WhatsApp on file. Virtually every agent has a phone; about 1 in 10 has an email or WhatsApp number.

#### Can I scrape private or login-only content?

No. The actor only accesses publicly available listing, broker and company pages. Saved searches, user dashboards, and anything behind a Bayut account login are out of scope.

#### Do I need my own proxies?

No. The actor routes all traffic through its own built-in residential proxy at no extra cost. The `proxy` input exists only if you want to override it with your own proxies.

#### How many results can I get?

Free Apify accounts are capped at 50 items and the first 100 start URLs. Paying accounts honor `maxItems` (minimum 10) — or, when it's left blank, scrape until the run's cost limit is reached. Search URLs paginate automatically until the cap or the end of results.

#### Which export formats are available?

Whatever the Apify platform supports: JSON, CSV, Excel, XML and RSS from the dataset tab, or programmatic access through the Apify API.

### Support

- Found a bug or need a feature? Open an issue on the actor's [Issues tab](https://apify.com/memo23/apify-bayut-scraper/issues).
- Author's website: <https://muhamed-didovic.github.io/>
- Email: <muhamed.didovic@gmail.com>

### Additional Services

- Need a custom export shape, extra fields, or a tailored version of this scraper? I do custom work — email <muhamed.didovic@gmail.com>.
- Whole-dataset delivery (you receive the data, no setup on your side): <muhamed.didovic@gmail.com>
- API access to this scraper without the Apify fee (usage fee only): <muhamed.didovic@gmail.com>

### Explore More Scrapers

If you found this useful, you might also like:

- [**Dubizzle Scraper**](https://apify.com/memo23/dubizzle-search-listing-s-scraper) — real estate, cars and brokers from Dubizzle search and detail pages
- [**Property Finder Scraper**](https://apify.com/memo23/apify-propertyfinder-cheerio-ppe) — property listings and agents from PropertyFinder across UAE, Saudi Arabia, Qatar and Egypt
- [**Idealista Scraper**](https://apify.com/memo23/idealista-scraper) — Spanish, Italian and Portuguese listings with agent email enrichment
- [**Zillow Scraper**](https://apify.com/memo23/zillow-scraper-ppe) — US listings without the 500-result search limit

Full list at [apify.com/memo23](https://apify.com/memo23).

***

### 🤖 For AI Agents & LLM Apps

Compact reference for AI agents calling this actor via the [Apify MCP server](https://mcp.apify.com) or the Apify API (actor: `memo23/apify-bayut-scraper`).

**Purpose:** Scrapes property listings, broker profiles, and agency/company profiles from all five Bayut portals (bayut.com, bayut.sa, bayut.jo, bayut.qa, bayut.om) — each URL is auto-routed to the right handler and every row is stamped with `market` and `currency`.

**Minimal input:**

```json
{
  "startUrls": ["https://www.bayut.com/for-sale/property/dubai/"],
  "maxItems": 50
}
```

No-scrape variant: `{ "instantDatabase": true, "maxItems": 50 }` serves UAE agents from the pre-collected 11,000+ agent database instead of live scraping.

**Output:** one dataset row per listing, broker, or company — the row shape follows the start URL type. Listing rows: `id`, `externalID`, `market`, `currency`, `purpose`, `price`, `rentFrequency`, `title`, `geography {lat, lng}`, `location[]`, `category[]`, `rooms`, `baths`, `area`, `furnishingStatus`, `completionStatus`, `coverPhoto {url}`, `phoneNumber {mobile, whatsapp, proxyPhone}`, `contactName`, `agency {name, licenses[]}`, `isVerified`; bayut.sa rows add `regaBrokerageLicenseNumber`, `regaAdLicenseNumber`, `regaAdLicenseExpiryDate`. Broker rows are flat contact profiles (`name`, `email`, `cell`, `whatsapp`, `service_areas`, `agency`); company rows are agency profiles (`name`, `licenses[]`, `agentsCount`, `stats`, plus `agents[]` on `?activeTab=team` pages).

**Behaviors an agent should know:**

- Always set `maxItems` — an uncapped search run paginates until the run's cost limit. Free accounts are capped at 50 items; paying accounts honor the value (minimum 10).
- Search, listing-detail, broker, and company URLs from any of the five domains can be mixed in one `startUrls` run; Arabic URLs are normalized automatically.
- `fullDetails: true` adds description text, full media arrays, and the permit number, but is slower than the default index mode (~90 fields per listing).
- `enrichEmails: true` adds `agentEmail` to listing rows — one extra billed request per unique agent, cached across that agent's listings.
- `monitoringMode: true` pushes only listings unseen in previous runs; add `enablePriceMonitoring: true` to also re-push previously seen listings whose price changed. Requires a paid Apify account.
- Built-in residential proxy — leave `proxy` empty. Login-gated content, MyBayut blog pages, and other portals' URLs are unsupported. Pay-per-event billing — see the Pricing tab on the actor page.

***

### ⚠️ Disclaimer

This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Bayut FZ-LLC or any of its subsidiaries. All trademarks mentioned, including Bayut, TruBroker and TruCheck, are the property of their respective owners.

The scraper accesses only publicly available listing, broker and company pages on the Bayut portals. It does not access private user accounts, paid features, or content hidden behind a customer login. Users are responsible for ensuring that their use of this Actor complies with the Bayut Terms of Service, applicable data-protection law (GDPR, CCPA, etc.), and any contractual obligations of their own organization.

***

### SEO Keywords

bayut scraper, bayut.com scraper, bayut.sa scraper, bayut saudi arabia scraper, bayut.jo scraper, bayut jordan scraper, bayut.qa scraper, bayut qatar scraper, bayut.om scraper, bayut oman scraper, bayut api, bayut property data, dubai real estate scraper, riyadh real estate data, amman property listings, doha real estate scraper, muscat property data, REGA license scraper, uae property scraper, ksa real estate api, gcc real estate data, bayut agent scraper, bayut listings export json csv

# Actor input Schema

## `instantDatabase` (type: `boolean`):

Serve agents from the database instead of live-scraping. Auto-enabled if you set Agency name below.

## `dbAgencyName` (type: `string`):

e.g. Zero Commission Real Estate. Optional. Filters Instant Database results to agents whose agency name contains this text (case-insensitive substring match); setting it auto-enables Instant Database mode.

## `dbHasEmail` (type: `boolean`):

About 1 in 10 agents in the database has a real email address on file — turn this on to narrow to just those.

## `dbHasPhone` (type: `boolean`):

Virtually every agent in the database has a phone number.

## `dbHasWhatsapp` (type: `boolean`):

About 1 in 10 agents in the database has a WhatsApp number on file — turn this on to narrow to just those.

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

Maximum number of results to return. On search URLs the crawl stops once this many items have been collected (it no longer keeps paginating). Free accounts are capped at 50; paying accounts honor this value, with a minimum of 10. Leave blank to scrape up to your run's cost limit.

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

Bayut URLs from any market — bayut.com (UAE), bayut.sa (Saudi Arabia), bayut.jo (Jordan), bayut.qa (Qatar), bayut.om (Oman); Arabic and English URLs both work. Supported: search URLs (`https://www.bayut.com/for-sale/apartments/dubai/`, `https://www.bayut.sa/en/for-sale/apartments/riyadh/`, `https://www.bayut.jo/en/for-sale/apartments/amman/`, Arabic `https://www.bayut.sa/للبيع/شقق/الرياض/`), listing detail pages (`/property/details-…html`), broker searches/profiles (`/brokers/…`) and company pages (`/companies/…`).

## `fullDetails` (type: `boolean`):

When OFF (default), listings are returned straight from Bayut's search index — fast and reliable, with ~90 fields per listing including price, location, agency, contact phone numbers, amenities, availability and photo URLs. Turn ON to additionally fetch each listing's full detail page (adds the description text, full photo/video/floor-plan media, and permit number). Full-detail mode is slower and depends on Bayut's app authentication.

## `enrichEmails` (type: `boolean`):

When ON, each listing row gets the assigned agent's real email address in an `agentEmail` field (plus the agent's direct phone/cell/WhatsApp from their profile). Bayut only exposes agent emails behind an authenticated profile lookup, so this makes one extra request per unique agent — results are cached, so an agent with 50 listings is fetched only once. Billed per agent email retrieved. Leave OFF for the fastest, cheapest run.

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

When ON, each UAE listing is matched against Dubai Land Department (DLD) open records to add its registered **unit number** (`dldUnitNumber`) plus land number, registered size and sale/rent history. It NEVER guesses: when several identical units share the same building, size and bedrooms it returns `dldUnitNumber: null` with a `dldCandidateCount` instead of a fabricated value — so you only pay when a unit is confidently resolved. Requires 'Scrape full listing details' to be ON (it needs the permit/building/size). No owner personal data. Leave OFF for the fastest, cheapest run.

## `monitoringMode` (type: `boolean`):

When enabled, listings already delivered to you on previous runs are skipped, so each run returns only new listings; the actor keeps a private per-user record of delivered listing IDs. (Price-change re-scraping is a separate toggle, enablePriceMonitoring.) The first run builds the baseline.

## `enablePriceMonitoring` (type: `boolean`):

If checked, it will only scrape listings if the price has changed compared to the previous run. Also monitoring mode must be enabled as we need to compare the price of the listings.

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

Maximum number of pages that can be processed at the same time.

## `minConcurrency` (type: `integer`):

Minimum number of pages that will be processed at the same time.

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

Number of times the crawler will retry a failed request before giving up.

## `proxy` (type: `object`):

Leave empty — the actor already routes all traffic through its own built-in residential proxy at no extra cost to you. Only set this if you want to use your own proxies.

## Actor input object example

```json
{
  "instantDatabase": false,
  "dbHasEmail": false,
  "dbHasPhone": false,
  "dbHasWhatsapp": false,
  "startUrls": [
    "https://www.bayut.com/for-sale/property/dubai/",
    "https://www.bayut.sa/en/for-sale/apartments/riyadh/"
  ],
  "fullDetails": false,
  "enrichEmails": false,
  "enrichDld": false,
  "monitoringMode": false,
  "enablePriceMonitoring": false,
  "maxConcurrency": 10,
  "minConcurrency": 1,
  "maxRequestRetries": 10
}
```

# 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 = {
    "startUrls": [
        "https://www.bayut.com/for-sale/property/dubai/",
        "https://www.bayut.sa/en/for-sale/apartments/riyadh/"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/apify-bayut-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 = { "startUrls": [
        "https://www.bayut.com/for-sale/property/dubai/",
        "https://www.bayut.sa/en/for-sale/apartments/riyadh/",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("memo23/apify-bayut-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 '{
  "startUrls": [
    "https://www.bayut.com/for-sale/property/dubai/",
    "https://www.bayut.sa/en/for-sale/apartments/riyadh/"
  ]
}' |
apify call memo23/apify-bayut-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,memo23/apify-bayut-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/GLe30YgAs5xqzNBQg/builds/lpEpST3zCAjEsbYtR/openapi.json
