# Bayut.com Scraper - Properties, Prices, Agents & Contacts (`abotapi/bayut-com-scraper`) Actor

From $0.80/1K. Scrape Bayut.com property listings with prices, beds, baths, area, GPS, agent and agency details, phone, WhatsApp, email, photos, amenities, and TruCheck verification dates.

- **URL**: https://apify.com/abotapi/bayut-com-scraper.md
- **Developed by:** [Abot API](https://apify.com/abotapi) (community)
- **Categories:** Real estate, Agents, Automation
- **Features:** Limited permissions
- **Stats:** 107 total users, 13 monthly users, 66.7% runs succeeded, 3 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.80 / 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?

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

## Bayut Scraper: UAE Property Listings, Prices & Agent Contacts

Bayut Scraper turns Bayut, the UAE's largest property portal, into structured data - plus its sister sites in Saudi Arabia, Qatar, Jordan and Oman. Get for sale and to rent listings across Dubai, Abu Dhabi, Sharjah, Ras Al Khaimah, Ajman, Fujairah and Umm Al Quwain, with price, beds, baths, area, exact geocoordinates, agent name, mobile and WhatsApp, agency details, the full photo gallery and TruCheck verification status. Switch "What to collect" to pull Bayut's agent or agency directories instead of listings. Search by city and filters, or paste your own Bayut search URLs, then export to JSON, CSV or Excel, or pull results straight into your app through the API.

### Why This Scraper?

- **50+ fields per listing.** Price, beds, baths, area, exact lat/lng, agent phone and WhatsApp, agency profile and TruCheck verification dates come back on every listing, with no extra step.
- **Two input modes.** Pick a city and filters from the form, or paste any Bayut search URL you already refined in your browser.
- **Multi URL with forward pagination.** Paste many search URLs in one run; each is walked page by page from wherever it starts.
- **For Sale and To Rent, every property type.** Apartments, villas, townhouses, penthouses, hotel apartments, compounds, duplexes, land, full and half floors, whole buildings, bulk units and commercial.
- **All seven emirates, plus four more countries.** Dubai, Abu Dhabi, Sharjah, Ras Al Khaimah, Ajman, Fujairah and Umm Al Quwain on bayut.com, and Saudi Arabia, Qatar, Jordan and Oman on their own Bayut country sites.
- **TruCheck filter.** Return only Bayut's vetted, RERA backed verified listings to skip agency spam.
- **Built for monitoring.** Incremental mode returns only new, updated and expired listings on recurring runs, and a refused run fails loudly instead of quietly returning an empty dataset.

### Use Cases

- **Real estate portals and CRMs:** aggregate active listings across emirates into one comparable feed.
- **Market research and analytics:** track asking prices, price per square foot and inventory by area, property type and purpose over time.
- **Lead generation:** collect agent and agency names, mobile numbers and WhatsApp contacts for outreach.
- **Investment tracking:** monitor off plan projects and completed developments, including payment plan summaries.
- **Recurring monitoring:** schedule daily or weekly runs to catch new, updated or delisted properties in a saved search.

### Data You Get

> Sample shape: values are illustrative placeholders, not from a live listing.

| Field | Example |
| --- | --- |
| `externalID` | `"00000001"` |
| `url` | `"https://www.bayut.com/property/details-00000001.html"` |
| `purpose` | `"for-sale"` / `"to-rent"` |
| `propertyType` | `"apartments"` / `"villas"` / `"townhouses"` / … |
| `title` | `"Sample Listing Title"` |
| `price` / `currency` | `1000000` / `"AED"` |
| `rentFrequency` | `"yearly"` / `"monthly"` / `"weekly"` / `"daily"` (rent only) |
| `rooms` / `baths` | `2` / `2` |
| `area` / `areaUnit` | `100.0` / `"sqm"` |
| `furnishingStatus` | `"furnished"` / `"unfurnished"` / `"partly-furnished"` |
| `completionStatus` | `"completed"` / `"off-plan"` |
| `country` / `city` | `"UAE"` / `"Dubai"` |
| `neighbourhood` / `building` | `"Sample Community"` / `"Sample Tower"` |
| `latitude` / `longitude` | `25.0000` / `55.0000` |
| `isVerified` / `trucheckedAt` | `true` / Unix timestamp (TruCheck, with `fetchDetails`) |
| `agentName` / `agentExternalID` | `"Agent Name"` / `"0000000"` |
| `phoneMobile` / `phoneWhatsapp` | `"+971500000000"` / `"971500000000"` |
| `agencyName` / `agencyLicenses[]` | `"Sample Agency"` / `[{"number": "00000", "authority": "RERA"}]` (licences with `fetchDetails`) |
| `imageCount` / `images[]` | `10` / photo URLs (800x600) |
| `amenities[]` | grouped by category, for example Features, Building, Health and Fitness (with `fetchDetails`) |
| `description` | full seller description text (with `fetchDetails`) |
| `referenceNumber` | `"REF-0001"` |
| `scrapedAt` | ISO timestamp |
| `changeType` | `"NEW"` / `"UPDATED"` / `"UNCHANGED"` / `"REAPPEARED"` / `"EXPIRED"` (incremental mode only) |
| `market` | `"uae"` / `"ksa"` / `"qatar"` / `"jordan"` / `"oman"` |

Turning on detail enrichment (`fetchDetails`) additionally fills in `description`, `amenities`, the full `images` gallery, `paymentPlans`, `isStudio` and `isDeveloper`. `descriptionArabic` and `floorPlans` stay in the output for compatibility but are currently empty: Bayut no longer puts an Arabic description or floor plans on the English listing page. Some fields are always empty on bayut.com listing rows, and some agency fields now need detail enrichment; see "Fields Bayut does not publish any more" below. Incremental mode also adds `changedFields`, `firstSeenAt` and `lastSeenAt`, plus `previousPrice`, `priceChange` and `priceChangePercent` on a listing whose price moved since the last run (`null` on every other row). Set "What to collect" to agents or agencies to get directory rows instead of listings: every row carries a `recordType` field (`"listing"`, `"agent"` or `"agency"`).

### How to Use

1. Pick a **mode**: `search` (choose city and filters) or `url` (paste Bayut search links).
2. For search mode, choose one or more emirates or areas, buy or rent, property type, and any price, bedroom, area or furnishing filters.
3. Set **Max total listings** and, if needed, **Max result pages**, and turn on detail enrichment if you want the full description, amenities and payment plans.
4. Click **Start**, then download the dataset as JSON, CSV or Excel, or read it through the API.

**Search by city:**

```json
{
  "mode": "search",
  "locations": ["dubai"],
  "purpose": "for-sale",
  "propertyType": "apartments",
  "maxPages": 5,
  "fetchDetails": true
}
```

**Search with price and bedroom filters:**

```json
{
  "mode": "search",
  "locations": ["dubai/dubai-marina", "dubai/downtown-dubai"],
  "purpose": "for-sale",
  "propertyType": "apartments",
  "minPrice": 1500000,
  "maxPrice": 4500000,
  "minBedrooms": 2,
  "maxBedrooms": 3,
  "verifiedOnly": true,
  "sortBy": "price-asc",
  "maxPages": 10
}
```

**Multi city sweep, to rent:**

```json
{
  "mode": "search",
  "locations": ["dubai", "abu-dhabi", "sharjah", "ras-al-khaimah", "ajman"],
  "purpose": "to-rent",
  "propertyType": "villas",
  "rentFrequency": "yearly",
  "maxPages": 3
}
```

**Paste your own search URLs (URL mode):**

```json
{
  "mode": "url",
  "urls": [
    "https://www.bayut.com/for-sale/villas/dubai/?price_min=5000000",
    "https://www.bayut.com/to-rent/apartments/abu-dhabi/?rent_frequency=yearly&rooms_in=2,3"
  ],
  "maxPages": 5,
  "fetchDetails": true
}
```

**Default URLs (disclosed behaviour):** if you switch **Mode** to URL and leave **URLs** untouched, the run scrapes one example of each supported shape (a city search, a sub-area search, a `/page-2/` page, a sorted rent search, new projects, one listing and the agency directory) instead of nothing. Clear the field or paste your own links to change that.

Open Bayut in your browser, refine the filters you want, copy the resulting URL and paste it here. Filter mode fields such as `locations`, `purpose` and `minPrice` are ignored in URL mode; edit the URL itself to change what it fetches. Each search-shaped URL is paginated forward independently, starting from its own page if the URL ends in `/page-N/`.

**Other Bayut countries, and agent/agency directories:** set **Country site** to Saudi Arabia, Qatar, Jordan or Oman to search that country's own Bayut domain with that country's own city slugs (for example `riyadh`, `doha`, `amman`, `muscat`); in URL mode the country is read from the pasted link's own domain instead. Set **What to collect** to Agents or Agencies to pull Bayut's broker or company directory for the chosen locations instead of property listings - optionally narrowed with **Agent name contains** - or paste a `/brokers/` or `/companies/` link straight into URL mode. Extra filters such as **Property types** (multi-select), **Keywords**, **Only these agencies/agents/developers**, **Has a video/360° tour/floor plan** and **Min/Max bathrooms** narrow a listings search further; see the Input Parameters table below for all of them.

**Every URL shape URL mode supports:**

| Shape | Example | What happens |
| --- | --- | --- |
| Search (emirate) | `https://www.bayut.com/for-sale/property/dubai/` | Paginated forward like any search |
| Sub-area | `https://www.bayut.com/for-sale/apartments/dubai/dubai-marina/` | Same |
| Building | `https://www.bayut.com/for-sale/property/sharjah/sharjah-waterfront-city/blue-beach-residence/` | Same |
| Bedroom / studio slug | `https://www.bayut.com/for-sale/2-bedroom-apartments/dubai/`, `.../studio-apartments/dubai/` | Same |
| `/page-N/` | `https://www.bayut.com/for-sale/apartments/dubai/page-2/` | Collection starts from page N |
| Query filters | `?price_min=`, `price_max=`, `beds_in=`, `baths_in=`, `area_min=`/`area_max=`, `sort_by=`, `keywords=`, `completion_status=`, `furnishing_status=`, `rent_frequency=`, `verified=` | Passed straight through to Bayut |
| Commercial type | `https://www.bayut.com/for-sale/offices/dubai/` | Same |
| Country root | `https://www.bayut.com/for-sale/property/uae/` | Same |
| New projects | `https://www.bayut.com/new-projects/dubai/` | Project listings, same output shape as a regular listing |
| Developer projects | `https://www.bayut.com/new-projects/developers/emaar/` | One developer's projects, same shape |
| Landing page `/s/` | `https://www.bayut.com/s/upgraded-apartments-for-sale-in-dubai-marina/` | Same as a search |
| Language prefix | `https://www.bayut.com/ar/for-sale/apartments/dubai/`, `/zh/property/details-<id>.html` | Same |
| No `www.` / `http://` / no scheme / UTM-tagged / `&amp;` | `https://bayut.com/...`, `http://www.bayut.com/...`, `www.bayut.com/...`, `?utm_source=...` | Fixed to the `https://www.` form automatically (Bayut answers the other forms with an empty redirect), then the same as above |
| Detail page | `https://www.bayut.com/property/details-<id>.html` | Fetched **directly by its id** (#2802) - returns exactly that one listing, with full detail enrichment, never run through the search-results parser |
| Agent / broker directory or profile | `https://www.bayut.com/brokers/<area-slug>/`, `https://www.bayut.com/brokers/<name>-<id>.html` | A directory URL is paginated forward and returns one row per agent; a single profile URL returns that one agent - mapped through the agent record shape, never mislabeled as a listing |
| Agency / company directory or profile | `https://www.bayut.com/companies/<area-slug>/`, `https://www.bayut.com/companies/<name>-<id>/` | Same, for Bayut's agency directory |
| Sister-market URL | `https://www.bayut.sa/en/for-sale/apartments/riyadh/`, `.../en/brokers/doha/` (bayut.qa), `.../en/for-rent/...` (bayut.jo, bayut.om) | The country is read from the pasted URL's own domain; every shape above works the same way on that country's site |

Pages that hold no listings (the home page, blog articles, area and building guides, market reports, floor-plan and information pages) and links to other sites are skipped with a warning naming the link, never mislabeled as listings or counted as a block. If every pasted link is such a page, the run stops with a message saying so.

#### Run it from your code

Python:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("abotapi/bayut-com-scraper").call(run_input={
    "mode": "search",
    "locations": ["dubai"],
    "purpose": "for-sale",
    "propertyType": "apartments",
})
for listing in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(listing["title"], listing["price"], listing["currency"])
```

JavaScript:

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

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('abotapi/bayut-com-scraper').call({
  mode: 'search',
  locations: ['dubai'],
  purpose: 'for-sale',
  propertyType: 'apartments',
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the **Integrations** tab.

#### How Max result pages and Max total listings shape a run

Each search walks its result pages (24 listings per page) until it runs out on its own, an empty page or a page that repeats listings already collected, or until **Max total listings** (the run's only soft cap, default 10, set `0` for unlimited) is reached, whichever comes first. Set **Max result pages** to a number only when you want an explicit page cap below that natural stop.

#### Resume and recurring updates

- **Resume** (`resumeFromRunId`) continues one specific interrupted or previous large pull: paste its run ID or dataset ID and this run loads the listings already saved there, skips them, and appends only new listings.
- **Incremental mode** (`incrementalMode`) is for running the same search again and again, for example daily. The actor remembers the previous run of that search itself, so no run ID is needed. The first run returns everything as `NEW`; later runs return only `NEW`, `UPDATED` (with `changedFields`) and `REAPPEARED` listings by default. Turn on `emitUnchanged` or `emitExpired` to also get those rows back, billed. `EXPIRED` rows only appear once a run has scanned every tracked search to its natural end, never when a page or listing cap, a block, or a resume cut it short. `stateKey` names or shares one monitoring campaign; leave it empty and the actor derives a key from your city, filters or URL and the `fetchDetails` setting automatically.

### Send results into your apps (MCP connectors)

Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step after the scrape; the Apify dataset is never changed.

**What gets written to the connector:** a condensed, human readable **summary** of each listing, not the full JSON. Each item becomes one entry with a **title** and its key fields flattened to plain text. The **complete record always stays in the Apify dataset**.

1. Authorize a connector once under **Apify → Settings → Integrations** (Notion, Linear, Airtable, or Apify).
2. Select it in the **"Pipe results into your apps"** input field. (If the picker is empty, you have not authorized a connector yet.)
3. For **Notion**, also set `notionParentPageUrl` to the page where items should be created.

The connection is mediated by Apify's MCP proxy, so this actor never sees your third party credentials. Leave the field empty to skip.

### Input Parameters

| Parameter | Type | Default | Description |
| --- | --- | --- | --- |
| `mode` | string | `search` | `search` (pick city and filters) or `url` (paste Bayut search links). |
| `market` | string | `uae` | Which Bayut country site to search: `uae` (bayut.com), `ksa` (bayut.sa), `qatar` (bayut.qa), `jordan` (bayut.jo) or `oman` (bayut.om). Prices come back in that country's currency, and every row carries a `market` field. Use that country's own city slugs in Locations. URL mode reads the country from each pasted link instead. |
| `searchFor` | string | `listings` | `listings` (default), `agents` or `agencies`. Switches the search to Bayut's agent (broker) or agency (company) directory for the chosen locations instead of property listings; every row then carries `recordType`. Search mode only - URL mode detects an agent/agency link automatically. |
| `locations` | array | (none) | City or area names for search mode, typed the way you say them: `Dubai`, `Abu Dhabi`, `Al Ain`, `Dubai Marina`, `Yas Island`, `Al Khan`, `JVC`, `JLT`. About 500 UAE areas are matched offline to their real city (so `Yas Island` searches Abu Dhabi); Bayut's own slug (`dubai/dubai-marina`) works too and picks the city when a name exists in two cities (the run warns and names them). An unresolved location logs a loud warning rather than silently returning 0 results. Prefilled with `["dubai"]`. |
| `agentName` | string | (none) | Agents only. Keep only agents whose name contains this text (not case-sensitive). |
| `purpose` | string | `for-sale` | `for-sale` or `to-rent`. Search mode only. |
| `propertyType` | string | `property` | `property` (any residential), `apartments`, `villas`, `townhouses`, `penthouses`, `hotel-apartments`, `compounds`, `duplex`, `land`, `full-floors`, `half-floors`, `whole-buildings`, `bulk-units`, or `commercial`. Search mode only. |
| `propertyTypes` | array | (none) | Multi-select of exact Bayut property types (residential and commercial sub-types); overrides `propertyType` when set. Also works on the sister-market sites; a type the site doesn't have logs a warning instead of silently returning unfiltered results. |
| `minPrice` | integer | (none) | Minimum price in AED. Search mode only. |
| `maxPrice` | integer | (none) | Maximum price in AED. Search mode only. |
| `minBedrooms` | integer | (none) | Minimum bedrooms, `0` for studio. Search mode only. |
| `maxBedrooms` | integer | (none) | Maximum bedrooms. Search mode only. |
| `minBathrooms` | integer | (none) | Minimum bathrooms. Search mode only. |
| `maxBathrooms` | integer | (none) | Maximum bathrooms. Search mode only. |
| `minArea` | integer | (none) | Minimum area in square feet. Search mode only. |
| `maxArea` | integer | (none) | Maximum area in square feet. Search mode only. |
| `furnishing` | string | `any` | `any`, `furnished`, or `unfurnished`. Search mode only. |
| `completionStatus` | string | `any` | `any`, `completed` (ready to move in), or `off-plan`. Search mode only. |
| `rentFrequency` | string | `any` | `any`, `yearly`, `monthly`, `weekly`, or `daily`. Applies only when `purpose` is `to-rent`. |
| `verifiedOnly` | boolean | `false` | Return only TruCheck verified listings. Search mode only. |
| `keywords` | array | (none) | Words Bayut's own keyword search must find in the listing, for example `private pool`, `sea view`, `maids room`, `upgraded`, `gym`. Amenity names also work here. |
| `agencyIds` | array | (none) | Limit listings to one or more agencies - paste the agency's Bayut page link, slug or id. An entry with no id in it (a plain name) is reported in the log and not used. |
| `agentIds` | array | (none) | Limit listings to one or more agents - paste the agent's Bayut profile link, slug or id. An entry with no id in it (a plain name) is reported in the log and not used. |
| `developerIds` | array | (none) | Limit listings to projects by one or more developers: type the name (`Emaar`, `Sobha Realty`, `DAMAC Properties`) or paste the developer's Bayut page link; each is looked up on the developer's own Bayut page and the log shows the match. A Bayut developer id also works. If no developer is found the run stops with a clear message instead of returning unfiltered listings. |
| `hasVideo` | boolean | `false` | Only listings with at least one video. |
| `has360Tour` | boolean | `false` | Only listings with a 360° virtual tour. |
| `hasFloorPlan` | boolean | `false` | Only listings with a floor plan. |
| `sortBy` | string | `popular` | `popular`, `newest`, `oldest`, `price-asc`, `price-desc`, or `verified-score-desc`. Search mode only; URL mode keeps the sort already encoded in your pasted URL. |
| `urls` | array | (none) | Bayut URLs for URL mode - any search/sub-area/filtered page, a `/property/details-<id>.html` detail page, a `/brokers/`/`/companies/` directory or profile page, `/new-projects/`, or the same shapes on a sister-market domain (bayut.sa/.qa/.jo/.om); see the URL shape table above. Multiple URLs are each handled independently. Prefilled with one example of every supported shape. |
| `maxPages` | integer | `0` | Safety bound on result pages walked per location or URL (24 listings per page). `0` means unlimited, bounded by the natural stop or `maxListings`. |
| `maxListings` | integer | `10` | The sole soft cap on the run, applied across all locations and URLs. `0` means unlimited. |
| `fetchDetails` | boolean | `false` | Enrich every listing with its full description, amenities, photo gallery and payment plans. Billed per enriched listing. |
| `proxy` | object | (none) | Proxy connection settings. Prefilled with Apify residential proxy, country AE. |
| `mcpConnectors` | array | (none) | Optional: send a summary of each listing to apps you authorized under Apify Settings, Integrations. |
| `notionParentPageUrl` | string | (none) | Notion connector only: page under which listing pages are created. |
| `maxNotifyListings` | integer | `50` | Cap on items written to each connector per run. Does not affect the dataset. |
| `resumeFromRunId` | string | (none) | Continue one specific interrupted or previous run: listings already saved there are skipped and only new listings are appended. |
| `incrementalMode` | boolean | `false` | Return only new, updated and expired listings on recurring runs of the same search. |
| `stateKey` | string | (none) | Name or share an incremental mode monitoring campaign. Left empty, the actor derives a key from your search automatically. |
| `emitUnchanged` | boolean | `false` | Incremental mode only. Also return listings unchanged since the last run, marked `UNCHANGED`, billed. |
| `emitExpired` | boolean | `false` | Incremental mode only. Also return listings no longer found after a complete scan, marked `EXPIRED`, billed. |
| `ignoreFieldsForChanges` | array | `["scrapedAt"]` | Incremental mode only. Field names (matched at any nesting depth) excluded from change detection - a listing whose ONLY differences are in these fields stays `UNCHANGED` instead of `UPDATED`. Added on top of `scrapedAt`, which always stays ignored. A run that skips `fetchDetails` for a listing already enriched by a previous run carries that listing's detail fields (description, amenities, photos, floor plans, payment plans and similar) forward from the saved baseline automatically, so a one-off detail-fetch miss is never mistaken for those fields going blank. |

#### Output views

Next to the default **Listings** table, the dataset carries six more views. **All fields** shows every column of a listing row. Three narrow a listing row to one job's columns: **Agent & Agency** (every contact field - agent, agency, phones, WhatsApp - for lead generation), **Listing detail** (the fields `fetchDetails` adds), and **Changes (incremental mode)** (`changeType`, `changedFields`, `previousPrice`, `firstSeenAt`/`lastSeenAt` next to the listing's title, price and link). The other two, **Agents (directory)** and **Agencies (directory)**, show the directory/profile rows `searchFor` collects, with their own columns (languages, specialities, badges for agents; agents count, ads count, service areas for agencies). Switch between them on the run's **Dataset** tab, or fetch one directly through the API with `?view=agents`, `?view=detail`, `?view=changes`, `?view=agents_directory`, `?view=agencies` or `?view=full`.

### Output Example

> Sample shape: values are illustrative placeholders, not from a live listing.

```json
{
  "externalID": "00000001",
  "id": 10000000,
  "url": "https://www.bayut.com/property/details-00000001.html",
  "purpose": "for-sale",
  "propertyType": "apartments",
  "title": "Sample Listing Title",
  "price": 1000000,
  "currency": "AED",
  "rentFrequency": null,
  "rooms": 2,
  "baths": 2,
  "area": 100.0,
  "areaUnit": "sqm",
  "furnishingStatus": "unfurnished",
  "completionStatus": "completed",
  "country": "UAE",
  "city": "Dubai",
  "neighbourhood": "Sample Community",
  "building": "Sample Tower",
  "latitude": 25.0000,
  "longitude": 55.0000,
  "isVerified": true,
  "verificationStatus": "verified",
  "verifiedAt": 1700000000,
  "trucheckedAt": 1700000000,
  "agentName": "Agent Name",
  "agentExternalID": "0000000",
  "phoneMobile": "+971500000000",
  "phonePhone": "+97140000000",
  "phoneWhatsapp": "971500000000",
  "phoneProxy": "+97140000000",
  "agencyName": "Sample Agency",
  "agencyExternalID": "0000",
  "agencySlug": "sample-agency-0000",
  "agencyLicenses": [{ "number": "00000", "authority": "RERA" }],
  "isStudio": false,
  "isDeveloper": false,
  "permitNumber": null,
  "referenceNumber": "REF-0001",
  "images": ["https://images.bayut.com/thumbnails/000000000-800x600.jpeg"],
  "imageCount": 10,
  "amenities": [
    {
      "group": "Features",
      "items": [
        { "slug": "balcony-or-terrace", "text": "Balcony or Terrace", "value": null },
        { "slug": "parking-spaces", "text": "Parking Spaces", "value": "1" }
      ]
    }
  ],
  "amenitiesFlat": ["balcony-or-terrace", "parking-spaces", "centrally-air-conditioned"],
  "description": "Full seller description text appears here when fetchDetails is true.",
  "createdAt": 1700000000,
  "updatedAt": 1700000000,
  "scrapedAt": "2026-01-01T00:00:00.000Z"
}
```

#### Fields Bayut does not publish any more

- `permitNumber` is always `null`. Bayut no longer puts the Trakheesi/RERA permit number on the public listing page, so there is nothing to read. The key stays in the output so saved integrations keep working. On bayut.sa, the Saudi REGA ad licence is still public and is exported as `regaAdLicenseNumber` and `regaPermitUrl`.
- `titleArabic` is `null` on bayut.com listings. Bayut no longer publishes an Arabic version of the listing title, either in search results or on the listing page. bayut.sa listings carried it in early October 2026.
- Always empty on bayut.com listing rows, because Bayut does not publish them any more: `titleL2`, `titleL3`, `projectNumber`, `agencyCommercialNumber`, `agencyShortNumber`, `agencyRoles` (`[]`), `descriptionArabic` and `floorPlans` (`[]`; `floorPlanID` is still filled on listings that have a floor plan). `hasUnitPlan` is always `false`. The keys stay in the output so saved integrations keep working.
- Some agency and verification fields on listing rows need the full-detail option: `agencyLicenses`, `agencyProduct`, `agencyProductScore`, `agencyCreatedAt`, `agencyActive`, `trucheckedAt`, `dldPropertySK`, `dldBuildingNK` and `extraFields`. Bayut's search results stopped carrying them in October 2026; the listing's own page still has them. Without full detail they are `null` (`[]` for `agencyLicenses`). `panoramaCount` and `agentAdStoriesCount` are only reliable on rows collected with full detail: on search-only rows they are always `0`, a placeholder rather than a count. `agencyLogo` and `agentPhotoUrl` are still filled on every row.
- `contactEmail` is always `null` on listing rows. Bayut's listing page shows no email address, only a contact form. Use `phoneMobile` or `phoneWhatsapp`, or collect the agent's own row with "What to collect" = Agents: agent rows include the agent's `email`.

### Plan Requirement

Bayut is protected by an anti-bot check that answers with a "Security check | Bayut" page (HTTP 503) to ordinary, unauthenticated connections, including datacenter and plain residential connections. A plain datacenter connection does not work. Apify residential proxy, with country set to `AE`, is the default and the recommended setup; the run reads pages through it and retries on a different connection when one is refused, including a backup connection when the primary one is exhausted, and when the site refuses every connection for a short while it waits and tries your configured connection again. You can also supply your own residential proxy URLs through the Connection field.

A free Apify plan does not include residential proxies. On a free plan the run logs this warning once and continues on a backup connection: "The selected connection is unavailable to this run. Apify free plans do not include residential proxies. Continuing on a backup connection; some pages may still be unavailable. For residential access, upgrade at https://apify.com/pricing or supply your own proxy URLs." Pages may still be refused there, so a paid plan (or your own proxy URLs) is the reliable way to use this actor.

If no page could be read the run fails instead of returning a silent empty dataset, with one of three messages:

- Every connection was refused by the proxy for the account: "The proxy connection was refused for this account, so no page could be read. Your Apify plan does not include proxy access; a paid plan is required: https://apify.com/pricing. If you entered your own proxy URLs, check that their credentials are valid."
- Free plan, backup connection also got no page: "No results: residential proxies are unavailable on this run (Apify free plans do not include them), and the backup connection could not load the requested Bayut pages. Upgrade at https://apify.com/pricing or supply your own proxy URLs, then try again."
- Any other run where no page loaded (including a paid or own-proxy run the site itself refused): "Could not load any results page (the requests failed), so nothing was collected. This is a connection problem, not an empty search. Please try again later."

### FAQ

#### How much does it cost?

Pricing is pay-per-event: a small charge when a run starts, a charge per result (listing, agent or agency row), plus a charge per listing whose detail page was read when detail enrichment (`fetchDetails`) is on, for the extra fields it fetches. Higher plan tiers pay less per result; the **Pricing** tab shows the exact rates for your tier. **Max total listings** caps the size, and therefore the cost, of any run.

#### Is it legal to scrape Bayut?

This actor collects only publicly available property listing data. You are responsible for how you use it: follow Bayut's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Listing facts such as price and specifications are generally not protected, but photos, logos and agency branding may be subject to third party rights.

#### Can I track new or changed listings on a schedule?

Yes. Schedule the actor from the **Schedules** tab and turn on **Incremental mode**. The first run returns every matching listing as `NEW`; later runs return only new, updated and reappeared listings, and unchanged ones are not billed unless you turn that on.

#### Why does URL mode ignore my price and bedroom filters?

Filter fields like `locations`, `purpose`, `minPrice` and `minBedrooms` only apply in search mode. URL mode is a pure pass-through of the links you paste, so change the filters in the URL itself, for example by adjusting it on bayut.com before copying it in.

#### Why did my run fail instead of returning an empty dataset?

If every search in the run could not get a single readable page after every retry the site allowed, the run fails with a message asking you to run it again in a few minutes, rather than reporting a successful empty result. A run also fails immediately, before any scraping, if a pasted `resumeFromRunId` does not match a run or dataset your account can read, if `resumeFromRunId` is combined with `incrementalMode` for a search that already has saved incremental state (remove the resume ID or set a different `stateKey`), if the proxy configuration cannot be resolved, if a developer filter names no developer Bayut knows, or if every pasted link is a page that holds no listings (the home page, a blog article, a guide). A genuinely empty search, where the site answered normally but no listings matched your filters, still completes successfully with `0` results.

#### Can I use this with AI agents or MCP?

Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable.

### 🔗 Want more real estate data?

Pair this actor with these related scrapers from the same team:

<table>
<tr><td>🚗 <a href="https://apify.com/abotapi/dubizzle-com-scraper"><b>Dubizzle.com Scraper</b></a><br>From $1/1K. Scrape dubizzle.com across the UAE for property, motors, and agent listings...</td><td>🏠 <a href="https://apify.com/abotapi/propertyfinder-ae-scraper"><b>Property Finder UAE Scraper</b></a><br>Scrape PropertyFinder.ae listings at scale. Extract prices, property details, images...</td></tr>
<tr><td>🏠 <a href="https://apify.com/abotapi/iproperty-com-my-scraper"><b>iProperty MY Scraper</b></a><br>Scrape property listings from iProperty.com.my for sale or rent: price, PSF, bedrooms...</td><td>🏠 <a href="https://apify.com/abotapi/rumah123-indonesia-property-scraper"><b>Rumah123 Scraper</b></a><br>Pull structured property listings from Rumah123.com, Indonesia’s largest property portal...</td></tr>
<tr><td>🏠 <a href="https://apify.com/abotapi/dotproperty-com-ph-scraper"><b>DotProperty &amp; Lamudi Real Estate</b></a><br>Scrape Philippines property listings from dotproperty.com.ph and lamudi.com.ph with exact...</td><td>🏠 <a href="https://apify.com/abotapi/cian-ru-scraper"><b>Cian RU</b></a><br>Collect property listings from Cian.ru by search filters or direct URLs. Returns...</td></tr>
</table>

👉 [Browse all abotapi scrapers](https://apify.com/abotapi)

### 💬 Support

- 🐞 **Found a bug or a missing field?** Open a ticket on the [Issues tab](https://apify.com/abotapi/bayut-com-scraper/issues/open). We usually reply within hours.
- 🛠️ **Need another site, extra fields or a private build?** Email <contact@abotapi.com>.
- ⭐ **Enjoying it?** A quick review on the actor page helps other users find it.

# Actor input Schema

## `mode` (type: `string`):

Search mode = pick city + property type + filters below. URL mode = paste any bayut.com search URL(s) you already refined in a browser. URL mode supports multiple URLs and walks pagination forward from each.

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

Which Bayut country site to search: bayut.com (UAE, default), bayut.sa (Saudi Arabia), bayut.qa (Qatar), bayut.jo (Jordan) or bayut.om (Oman). Prices come back in that country's currency (AED, SAR, QAR, JOD, OMR) and every row carries a `market` field. Use that country's own city slugs in Locations, e.g. 'riyadh' or 'jeddah' (Saudi Arabia), 'qatar' or 'doha' (Qatar), 'amman' (Jordan), 'muscat' (Oman). In URL mode the country is read from each pasted link instead.

## `searchFor` (type: `string`):

Property listings (default), or Bayut's agent or agency directory for the chosen locations. Agent rows include languages, specialities, service areas, badges (TruBroker, Quality Lister, Responsive), listing counts, email, phone and WhatsApp, and the agency with its licence. Agency rows include agent count, listing counts (sale/rent), property types, service areas, logo and tier. Turn on the full-detail option to also open each profile: agents then add years of experience, nationality and broker licence number; agencies add their description and licences. Every row has a `recordType` field: listing, agent or agency. Property filters below apply to listings only.

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

Type city or area names as you would say them, one per line, e.g. 'Dubai', 'Abu Dhabi', 'Al Ain', 'Dubai Marina', 'Downtown Dubai', 'Yas Island', 'Al Khan', 'JVC', 'JLT'. Names are matched to Bayut's own areas (about 500 UAE areas are known offline, each under its real city, so 'Yas Island' searches Abu Dhabi). You can also paste the slug Bayut shows in its URL, e.g. 'dubai/dubai-marina' or 'abu-dhabi/yas-island'; use that form to pick the city when an area name exists in more than one city (the run warns and names them). On another country site use its own names, e.g. 'riyadh' or 'jeddah' (Saudi Arabia), 'amman' (Jordan). A name that does not match a real Bayut area is reported in the log by name instead of silently returning 0 results.

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

When collecting Agents, keep only agents whose name contains this text (not case-sensitive), e.g. 'Anna'. The scraper reads the agent directory page by page and keeps the matches, so narrow Locations (e.g. 'dubai/dubai-marina') for a faster search.

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

Pick for-sale or for-rent. Search mode only.

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

What kind of property to search for. 'property' includes everything residential. Search mode only.

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

Pick one or more exact Bayut property types, residential and commercial sub-types included. Results include any of the picked types. When set, this replaces the single Property type above. Also works on the other country sites; if a site has no such type, the run log says so instead of quietly returning unfiltered results.

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

Minimum price filter in AED. Leave empty for no minimum. Search mode only.

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

Maximum price filter in AED. Leave empty for no maximum. Search mode only.

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

Minimum bedrooms (0 = studio). Search mode only.

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

Maximum bedrooms. Search mode only.

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

Minimum bathrooms. Search mode only.

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

Maximum bathrooms. Search mode only.

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

Minimum area in square feet. Search mode only.

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

Maximum area in square feet. Search mode only.

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

Furnishing filter. Search mode only.

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

Completed = ready to move in. Off-plan = under construction / pre-launch. Search mode only.

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

Only applies when purpose=to-rent.

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

Only return TruCheck-verified listings (Bayut's vetted-by-RERA badge). Useful to filter agency spam.

## `keywords` (type: `array`):

Words Bayut's own keyword search must find in the listing, e.g. 'private pool', 'sea view', 'maids room', 'upgraded', 'gym'. Amenity names work here too: this is the same filter Bayut uses for amenities.

## `agencyIds` (type: `array`):

Limit listings to one or more agencies. Paste the agency's Bayut page link (e.g. https://www.bayut.com/companies/white-co-10212/), its slug ('white-co-10212') or its id ('10212'). Every listing row's agencyExternalID is this id. An entry with no id in it (for example a plain agency name) is reported in the log and not used.

## `agentIds` (type: `array`):

Limit listings to one or more agents. Paste the agent's Bayut profile link (e.g. https://www.bayut.com/brokers/jane-doe-2126457.html), slug or id. Every listing row's agentExternalID is this id. An entry with no id in it (for example a plain agent name) is reported in the log and not used.

## `developerIds` (type: `array`):

Limit listings to projects by one or more developers. Type the developer's name, e.g. 'Emaar', 'Sobha Realty', 'DAMAC Properties', or paste its Bayut developer page link (e.g. https://www.bayut.com/new-projects/developers/emaar/). Each name is looked up on the developer's own Bayut page at the start of the run and the log shows what it matched. A Bayut developer id (every listing row's developerExternalID, e.g. '12') also works. A name that is not found is reported in the log; if none is found the run stops with a clear message instead of returning unfiltered listings.

## `hasVideo` (type: `boolean`):

Only listings with at least one video.

## `has360Tour` (type: `boolean`):

Only listings with a 360° virtual tour.

## `hasFloorPlan` (type: `boolean`):

Only listings with a floor plan.

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

How to order results. Search mode only - in URL mode the sort is taken from your pasted URL.

## `urls` (type: `array`):

One or more Bayut links, one per line, on any Bayut site (bayut.com, bayut.sa, bayut.qa, bayut.jo, bayut.om). Each link is scraped on its own. Search-mode filters are ignored here: the filters, sort and page come from the link itself. Supported link types (the prefill has one example of each): a search or results page at any level (city, area, building, bedroom page such as /2-bedroom-apartments/, commercial types, /uae/, /s/ landing pages, /new-projects/ and /new-projects/developers/<name>/ pages), with or without /page-N/ or query filters such as ?price_min=, beds_in= or sort_by=, and with or without a language prefix such as /ar/; a listing link (/property/details-<id>.html), which returns exactly that listing; an agent directory or profile (/brokers/<city>/ or /brokers/<name>-<id>.html), which returns agent rows; an agency directory or profile (/companies/<city>/ or /companies/<name>-<id>/), which returns agency rows. Links without www., with http://, without https:// or copied with & are fixed automatically. Pages that hold no listings (the home page, blog, area or building guides, market reports) and links to other sites are skipped with a warning naming the link.

## `maxPages` (type: `integer`):

Safety bound on how many result pages to walk per location or start URL (24 listings per page). 0 (default) means unlimited - the walk stops naturally once a page comes back empty or repeats listings already collected, or sooner once Max total listings is reached. Set a number only for an explicit page cap below that natural stop.

## `maxListings` (type: `integer`):

The sole soft cap on the run, applied across all locations/URLs. Defaults to 10 so a run stays small unless you raise it. 0 means unlimited (bounded only by the natural stop on Max result pages).

## `fetchDetails` (type: `boolean`):

Off by default. The base result already includes ~50 fields: lat/lng, agent phone, WhatsApp, agency, beds/baths, area, price and photo IDs. Turn this on to additionally enrich every listing with its full description, categorized amenities, the full photo gallery, payment plans, off-plan completion details, and the agency's licences, product tier and TruCheck date (Bayut's search results stopped carrying these in October 2026). Each enriched listing opens its listing page: one extra request. Billed per enriched listing.

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

Apify residential proxy with country=AE is strongly recommended. Datacenter proxies often produce empty pages - residential IPs (especially UAE) give the most reliable results.

## `resumeFromRunId` (type: `string`):

Optional. Paste a previous run ID or dataset ID to continue a large walk-all pull: listings already saved by that run are loaded before scraping starts and skipped, so this run only appends new listings. For recurring daily monitoring of the same search, use Incremental mode below instead. Leave empty for a normal fresh run.

## `incrementalMode` (type: `boolean`):

Turn this on for daily or recurring monitoring of the SAME search. The first run returns all matching listings as NEW. Later runs normally return only NEW, UPDATED, and REAPPEARED listings. Turn on "Emit unchanged" or "Emit expired" only when you also want those listings returned (and billed). State is kept separately per city/filters/URL and fetchDetails setup; use State key when you want to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from a prior run above.

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

Optional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty to let the actor derive a key automatically from the city/filters/URL and fetchDetails settings — different searches then never mix state with each other.

## `emitUnchanged` (type: `boolean`):

Off by default. Turn on to also return listings that have not changed since the last run, marked UNCHANGED. This returns — and bills — extra rows you already have, so leave it off unless you specifically want the full snapshot every run.

## `emitExpired` (type: `boolean`):

Off by default. Turn on to also return listings that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned every tracked search — not when Max total listings or Max result pages capped it, when a block stopped a search early, or when Resume was used. This returns — and bills — extra synthetic rows, so leave it off unless you need expiry tracking.

## `ignoreFieldsForChanges` (type: `array`):

Optional. Field names excluded from change detection in incremental mode, matched at any nesting depth. A listing whose ONLY differences are in these fields still classifies UNCHANGED and is never returned/billed as UPDATED for them. Added ON TOP OF "scrapedAt" (the per-fetch timestamp this actor stamps on every listing, which always differs and is never a real content change) - scrapedAt stays ignored no matter what you put here. Add a field name here if you find one that rotates on every scrape without the listing actually changing.

## `mcpConnectors` (type: `array`):

Optionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify → Settings → Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON; the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com).

## `notionParentPageUrl` (type: `string`):

URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors.

## `maxNotifyListings` (type: `integer`):

Cap on items written to each connector per run. Does not affect the dataset.

## Actor input object example

```json
{
  "mode": "search",
  "market": "uae",
  "searchFor": "listings",
  "locations": [
    "dubai"
  ],
  "purpose": "for-sale",
  "propertyType": "property",
  "furnishing": "any",
  "completionStatus": "any",
  "rentFrequency": "any",
  "verifiedOnly": false,
  "hasVideo": false,
  "has360Tour": false,
  "hasFloorPlan": false,
  "sortBy": "popular",
  "urls": [
    "https://www.bayut.com/for-sale/property/dubai/",
    "https://www.bayut.com/for-sale/apartments/dubai/dubai-marina/",
    "https://www.bayut.com/for-sale/property/sharjah/sharjah-waterfront-city/blue-beach-residence/",
    "https://www.bayut.com/for-sale/2-bedroom-apartments/dubai/",
    "https://www.bayut.com/for-sale/apartments/dubai/page-2/",
    "https://www.bayut.com/for-sale/apartments/dubai/?price_min=1000000&price_max=5000000&beds_in=2,3&baths_in=2,3&sort_by=price-asc&completion_status=ready&furnishing_status=furnished",
    "https://www.bayut.com/to-rent/apartments/dubai/dubai-marina/?sort_by=price-asc",
    "https://www.bayut.com/for-sale/offices/dubai/",
    "https://www.bayut.com/for-sale/property/uae/",
    "https://www.bayut.com/s/upgraded-apartments-for-sale-in-dubai-marina/",
    "https://www.bayut.com/new-projects/dubai/",
    "https://www.bayut.com/new-projects/developers/emaar/",
    "https://www.bayut.com/ar/for-sale/apartments/dubai/dubai-marina/",
    "https://www.bayut.sa/en/for-sale/properties/riyadh/",
    "https://www.bayut.jo/en/amman/properties-for-sale/",
    "https://www.bayut.com/property/details-16667906.html",
    "https://www.bayut.com/brokers/dubai/",
    "https://www.bayut.com/brokers/david-marsh-2764589.html",
    "https://www.bayut.com/companies/dubai/",
    "https://www.bayut.com/companies/golden-wolf-real-estate-102943/",
    "https://www.bayut.com/companies/"
  ],
  "maxPages": 0,
  "maxListings": 10,
  "fetchDetails": false,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "AE"
  },
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": false,
  "ignoreFieldsForChanges": [
    "scrapedAt"
  ],
  "maxNotifyListings": 50
}
```

# Actor output Schema

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

No description

## `agents` (type: `string`):

No description

## `detail` (type: `string`):

No description

## `changes` (type: `string`):

No description

## `agents_directory` (type: `string`):

No description

## `agencies` (type: `string`):

No description

## `full` (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 = {
    "mode": "search",
    "locations": [
        "dubai"
    ],
    "urls": [
        "https://www.bayut.com/for-sale/property/dubai/",
        "https://www.bayut.com/for-sale/apartments/dubai/dubai-marina/",
        "https://www.bayut.com/for-sale/property/sharjah/sharjah-waterfront-city/blue-beach-residence/",
        "https://www.bayut.com/for-sale/2-bedroom-apartments/dubai/",
        "https://www.bayut.com/for-sale/apartments/dubai/page-2/",
        "https://www.bayut.com/for-sale/apartments/dubai/?price_min=1000000&price_max=5000000&beds_in=2,3&baths_in=2,3&sort_by=price-asc&completion_status=ready&furnishing_status=furnished",
        "https://www.bayut.com/to-rent/apartments/dubai/dubai-marina/?sort_by=price-asc",
        "https://www.bayut.com/for-sale/offices/dubai/",
        "https://www.bayut.com/for-sale/property/uae/",
        "https://www.bayut.com/s/upgraded-apartments-for-sale-in-dubai-marina/",
        "https://www.bayut.com/new-projects/dubai/",
        "https://www.bayut.com/new-projects/developers/emaar/",
        "https://www.bayut.com/ar/for-sale/apartments/dubai/dubai-marina/",
        "https://www.bayut.sa/en/for-sale/properties/riyadh/",
        "https://www.bayut.jo/en/amman/properties-for-sale/",
        "https://www.bayut.com/property/details-16667906.html",
        "https://www.bayut.com/brokers/dubai/",
        "https://www.bayut.com/brokers/david-marsh-2764589.html",
        "https://www.bayut.com/companies/dubai/",
        "https://www.bayut.com/companies/golden-wolf-real-estate-102943/",
        "https://www.bayut.com/companies/"
    ],
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "AE"
    },
    "incrementalMode": false,
    "emitUnchanged": false,
    "emitExpired": false,
    "ignoreFieldsForChanges": [
        "scrapedAt"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("abotapi/bayut-com-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 = {
    "mode": "search",
    "locations": ["dubai"],
    "urls": [
        "https://www.bayut.com/for-sale/property/dubai/",
        "https://www.bayut.com/for-sale/apartments/dubai/dubai-marina/",
        "https://www.bayut.com/for-sale/property/sharjah/sharjah-waterfront-city/blue-beach-residence/",
        "https://www.bayut.com/for-sale/2-bedroom-apartments/dubai/",
        "https://www.bayut.com/for-sale/apartments/dubai/page-2/",
        "https://www.bayut.com/for-sale/apartments/dubai/?price_min=1000000&price_max=5000000&beds_in=2,3&baths_in=2,3&sort_by=price-asc&completion_status=ready&furnishing_status=furnished",
        "https://www.bayut.com/to-rent/apartments/dubai/dubai-marina/?sort_by=price-asc",
        "https://www.bayut.com/for-sale/offices/dubai/",
        "https://www.bayut.com/for-sale/property/uae/",
        "https://www.bayut.com/s/upgraded-apartments-for-sale-in-dubai-marina/",
        "https://www.bayut.com/new-projects/dubai/",
        "https://www.bayut.com/new-projects/developers/emaar/",
        "https://www.bayut.com/ar/for-sale/apartments/dubai/dubai-marina/",
        "https://www.bayut.sa/en/for-sale/properties/riyadh/",
        "https://www.bayut.jo/en/amman/properties-for-sale/",
        "https://www.bayut.com/property/details-16667906.html",
        "https://www.bayut.com/brokers/dubai/",
        "https://www.bayut.com/brokers/david-marsh-2764589.html",
        "https://www.bayut.com/companies/dubai/",
        "https://www.bayut.com/companies/golden-wolf-real-estate-102943/",
        "https://www.bayut.com/companies/",
    ],
    "proxy": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "AE",
    },
    "incrementalMode": False,
    "emitUnchanged": False,
    "emitExpired": False,
    "ignoreFieldsForChanges": ["scrapedAt"],
}

# Run the Actor and wait for it to finish
run = client.actor("abotapi/bayut-com-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 '{
  "mode": "search",
  "locations": [
    "dubai"
  ],
  "urls": [
    "https://www.bayut.com/for-sale/property/dubai/",
    "https://www.bayut.com/for-sale/apartments/dubai/dubai-marina/",
    "https://www.bayut.com/for-sale/property/sharjah/sharjah-waterfront-city/blue-beach-residence/",
    "https://www.bayut.com/for-sale/2-bedroom-apartments/dubai/",
    "https://www.bayut.com/for-sale/apartments/dubai/page-2/",
    "https://www.bayut.com/for-sale/apartments/dubai/?price_min=1000000&price_max=5000000&beds_in=2,3&baths_in=2,3&sort_by=price-asc&completion_status=ready&furnishing_status=furnished",
    "https://www.bayut.com/to-rent/apartments/dubai/dubai-marina/?sort_by=price-asc",
    "https://www.bayut.com/for-sale/offices/dubai/",
    "https://www.bayut.com/for-sale/property/uae/",
    "https://www.bayut.com/s/upgraded-apartments-for-sale-in-dubai-marina/",
    "https://www.bayut.com/new-projects/dubai/",
    "https://www.bayut.com/new-projects/developers/emaar/",
    "https://www.bayut.com/ar/for-sale/apartments/dubai/dubai-marina/",
    "https://www.bayut.sa/en/for-sale/properties/riyadh/",
    "https://www.bayut.jo/en/amman/properties-for-sale/",
    "https://www.bayut.com/property/details-16667906.html",
    "https://www.bayut.com/brokers/dubai/",
    "https://www.bayut.com/brokers/david-marsh-2764589.html",
    "https://www.bayut.com/companies/dubai/",
    "https://www.bayut.com/companies/golden-wolf-real-estate-102943/",
    "https://www.bayut.com/companies/"
  ],
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "AE"
  },
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": false,
  "ignoreFieldsForChanges": [
    "scrapedAt"
  ]
}' |
apify call abotapi/bayut-com-scraper --silent --output-dataset

```

## MCP server setup

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