# Bayut Properties Detail Listing Scraper (UAE) (`scrapyx/bayut-properties-detail-scraper`) Actor

Full details of Bayut.com property listings: description, amenities, all photos, floor plans, videos, 360° tours, price, beds, baths, area, location, agency and agent profile, verification and whether the listing is still active. Input listing URLs or IDs.

- **URL**: https://apify.com/scrapyx/bayut-properties-detail-scraper.md
- **Developed by:** [Ibnu Adzim](https://apify.com/scrapyx) (community)
- **Categories:** Real estate, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.26 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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 Properties Detail Listing Scraper (UAE)

The **complete listing** behind any Bayut.com property page: full
description, every amenity, all photos (as direct image URLs), floor plans,
videos and 360° tours, price in AED and rent frequency, bedrooms, bathrooms,
area in m² and sqft, furnishing, completion and occupancy status, the full
location chain with coordinates, permit number where published,
verification status, agency (with RERA / ORN licences), listing contact and
phone numbers, and the listing agent's public profile — plus whether the
listing is **still active**.

Give it listing URLs or IDs, or the results of **Bayut Properties Search
Scraper** as they are. HTTP only, no login, no browser.

### What it is for

- **Enrich search results** — search finds listings; this reads each one
  in full (description, amenities, all photos, agent profile).
- **Monitoring specific listings** — price changes, and whether a listing
  has been taken down.
- **Agent and agency intelligence** — broker numbers, languages,
  specialities, listing counts, verification.

### Input

| field | what it does |
| --- | --- |
| `listingUrls` | Bayut listing URLs (`https://www.bayut.com/property/details-15944975.html`). The search actor's `url` column works as is. |
| `listingIds` | The numeric listing IDs, as an alternative. |
| `skipInactive` | Leave out listings Bayut marks as inactive (default: return them, flagged). |
| `includeAgentProfile` | The listing agent's public profile (default on). |
| `maxItems` | Cap per run (default: all given, up to 5,000). |
| `maxConcurrency`, `minRequestInterval` | Speed controls (default 3 in parallel, 1 s between starts). |
| `proxyConfiguration` | UAE residential by default — required (see below). |

Duplicate URLs/IDs are read once.

### Things about Bayut worth knowing before you trust a run

#### 1. Removed listings still show in full

Bayut keeps serving listings that were taken down years ago — complete with
price, photos and phone numbers — and marks them only with an "inactive"
flag. Listings from 2021, 2024 and 2025 all came back this way in testing.
Every row carries `isActive`; turn on `skipInactive` to leave them out.

#### 2. A listing that never existed is reported, not guessed

An unknown ID gets an `ERROR` row with `_error: "not_found"`.

#### 3. Area is in square metres

Bayut stores `area` in m²; the site shows sqft. The Actor adds `areaSqft`,
computed the way the site does (e.g. 979 sqft on a listing that shows
"979 sqft").

#### 4. Why a UAE residential proxy

Bayut shows a "Security check" page to data-centre and non-UAE addresses
(every one we measured). UAE residential addresses get the real page. A
listing page is about 180 KB of residential traffic (measured: 5.4 MB for
30 listings).

#### 5. What is not included

The permit, building-information, service-charge and transaction-history
panels load in the browser from Bayut's API, which Bayut asks crawlers not
to use; they are not collected. The agent's e-mail address is present in
the page's data but not shown on the site, so it is not returned.

### Output

One `LISTING_DETAIL` row per listing — Bayut's own listing object (about 75
fields), with these added: `isActive`, `listingUrl`, `photoUrls`,
`areaSqft`, `createdAtIso` / `updatedAtIso` / `approvedAtIso` and
`agentProfile`. One `RUN_SUMMARY` row with the counts, and an `ERROR` row
for anything that could not be read.

```json
{
  "recordType": "LISTING_DETAIL",
  "externalID": "16476708",
  "isActive": true,
  "title": "Bright & Spacious 2BHK Apartment// All Facilities...",
  "purpose": "for-rent",
  "price": 60000,
  "rentFrequency": "yearly",
  "rooms": 2,
  "baths": 2,
  "areaSqft": 979,
  "photoUrls": ["https://images.bayut.com/thumbnails/...-800x600.jpeg"],
  "amenities": [{"amenities": [{"text": "Parking Spaces", "value": "1"}]}],
  "agentProfile": {"name": "Sikandar Javaid", "brnNumber": "...", "agency": {"name": "..."}},
  "listingUrl": "https://www.bayut.com/property/details-16476708.html"
}
```

# Actor input Schema

## `listingUrls` (type: `array`):

Bayut listing pages, e.g. https://www.bayut.com/property/details-15944975.html. The `url` column of the Bayut Properties Search actor works as is.

## `listingIds` (type: `array`):

Numeric listing IDs (the number in the listing URL), as an alternative to URLs.

## `skipInactive` (type: `boolean`):

Bayut keeps serving removed listings in full, marked inactive. Off: they are returned with isActive=false. On: they are left out.

## `includeAgentProfile` (type: `boolean`):

The listing agent's public profile: name, broker number (BRN), languages, specialities, experience, listing counts, phone/WhatsApp.

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

0 = all given (up to 5,000 per run). Each listing is one page request.

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

Pages fetched at the same time.

## `minRequestInterval` (type: `number`):

Run-wide pacing.

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

UAE residential by default and required: Bayut shows a security-check page to every datacenter and non-UAE address measured.

## Actor input object example

```json
{
  "listingUrls": [
    "https://www.bayut.com/property/details-15944975.html"
  ],
  "skipInactive": false,
  "includeAgentProfile": true,
  "maxItems": 0,
  "maxConcurrency": 3,
  "minRequestInterval": 1,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "AE"
  }
}
```

# Actor output Schema

## `items` (type: `string`):

One row per scraped record. See the dataset's default view for field definitions.

# 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 = {
    "listingUrls": [
        "https://www.bayut.com/property/details-15944975.html"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "AE"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapyx/bayut-properties-detail-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 = {
    "listingUrls": ["https://www.bayut.com/property/details-15944975.html"],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "AE",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("scrapyx/bayut-properties-detail-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 '{
  "listingUrls": [
    "https://www.bayut.com/property/details-15944975.html"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "AE"
  }
}' |
apify call scrapyx/bayut-properties-detail-scraper --silent --output-dataset

```

## MCP server setup

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