# Bayut Property Scraper (`shahidirfan/bayut-property-scraper`) Actor

Extract property listings from Bayut with prices, locations, property types, bedrooms, bathrooms, sizes, amenities, agent details, images, and listing URLs. Ideal for UAE real estate data, property market research, price monitoring, lead generation, and competitor analysis.

- **URL**: https://apify.com/shahidirfan/bayut-property-scraper.md
- **Developed by:** [Shahid Irfan](https://apify.com/shahidirfan) (community)
- **Stats:** 4 total users, 3 monthly users, 100.0% runs succeeded, 0 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

### What does Bayut Property Scraper do?

Bayut Property Scraper collects rich property records from Bayut.com for UAE sale and rental research. Start with a Bayut search URL, enter a keyword or location, choose a sorting order, and receive structured property details including pricing, specifications, media, amenities, agents, agencies, contact methods, verification information, and the full location hierarchy.

Each result is saved as a clean, deduplicated dataset item. Empty and null values are removed, so JSON, CSV, and Excel exports contain useful published data instead of columns filled with blanks. The Actor is suitable for property market analysis, investment research, listing monitoring, brokerage intelligence, and lead enrichment across Dubai, Abu Dhabi, and other UAE locations available on Bayut.

### Why use Bayut Property Scraper?

- **Rich property records** - Every saved item contains the full listing record Bayut publishes to its search layer, including media counts, photo URLs, amenities, agent and agency profiles, and contact availability.
- **Flexible search inputs** - Paste a sale or rental URL, search by keyword, enter a location, or combine these options.
- **Clean exports** - Null values, empty strings, empty arrays, empty objects, duplicate records, localized duplicates, and search-ranking noise are removed.
- **Reliable result limits** - Control the exact number of properties wanted and set a page safety limit for predictable runs.
- **Useful sorting choices** - Collect recommended, newest, lowest-price, highest-price, or verified-first listings.
- **Automation-ready datasets** - Export results or connect them to spreadsheets, databases, dashboards, webhooks, and scheduled workflows.

### What data can you extract from Bayut?

The exact fields depend on what the owner, agent, agency, and Bayut publish for each property. The Actor keeps all useful non-empty source fields and adds convenient normalized fields for common workflows.

| Field or group | Description |
|---|---|
| `id`, `objectID`, `externalID` | Bayut property identifiers used for tracking and deduplication |
| `url` | Canonical public Bayut property URL |
| `title` | Listing headline |
| `purpose` | Whether the property is for sale or for rent |
| `price`, `rentFrequency` | Published price and rental payment frequency when applicable |
| `rooms`, `baths`, `area` | Bedroom, bathroom, and floor-area values |
| `category`, `category_names` | Property category records and readable category hierarchy |
| `location`, `location_names` | Full location records and readable UAE location hierarchy |
| `geography` | Latitude and longitude when published |
| `completionStatus` | Completed or under-construction status |
| `furnishingStatus` | Furnished or unfurnished status when published |
| `occupancyStatus` | Published occupancy information |
| `referenceNumber` | Agency reference number when published |
| `amenities` | Property features and facilities |
| `photos`, `photoIDs`, `coverPhoto`, `cover_photo_url` | Full-size photo URLs, source photo identifiers, and the main image URL |
| `photoCount`, `videoCount`, `panoramaCount` | Published media counts |
| `floorPlanID` | Floor-plan identifier when published |
| `agency`, `agency_name` | Agency profile, identifiers, licenses, logo, and readable name |
| `ownerAgent`, `agent_name`, `contactName` | Agent profile and contact identity |
| `phoneNumber`, `contactMethodAvailability` | Published phone, WhatsApp, email, SMS, and call availability |
| `isVerified`, `verification` | Verification status and related metadata |
| `createdAt`, `reactivatedAt`, `updatedAt` | Listing lifecycle timestamps when published |
| Additional non-empty fields | Project, product, developer, unit-plan, scoring, and source metadata available for a specific property |

### How to use Bayut Property Scraper

1. Open the Actor in Apify Console.
2. Paste a Bayut sale or rental search URL, or enter a keyword or location.
3. Select the sorting order.
4. Set `results_wanted` and `max_pages`.
5. Run the Actor and open the default dataset to preview or export the results.

Proxy access is optional. Listings are read from a public search endpoint that does not require a proxy, so you can leave `proxyConfiguration` disabled for faster runs.

Explicit inputs take priority. For example, if the URL points to Abu Dhabi but `location` is set to `Dubai`, the Actor searches Dubai. A user-provided keyword or sorting choice also overrides the equivalent value in the URL.

### Input Parameters

| Parameter | Type | Required | Default | Description |
|---|---|---:|---|---|
| `start_url` | String | No | Dubai properties for sale | Public Bayut sale or rental search URL |
| `keyword` | String | No | Empty | Property feature or search phrase, such as `sea view` or `private pool` |
| `location` | String | No | Inferred from URL | UAE city, community, sub-community, or building name |
| `sorting` | String | No | `tuned-ranking` | `tuned-ranking`, `date-desc`, `price-asc`, `price-desc`, or `verified-score` |
| `results_wanted` | Integer | No | `20` | Maximum number of rich property records to save |
| `max_pages` | Integer | No | `10` | Maximum number of search pages to inspect (up to 50 properties per page) |
| `proxyConfiguration` | Object | No | Disabled | Optional Apify Proxy or custom proxy settings |

Provide at least one of `start_url`, `keyword`, or `location`. When no run input is supplied during local development, the bundled `INPUT.json` example is used. Values supplied by an Apify Console or API user always take priority.

### Usage Examples

#### Collect Dubai properties from a Bayut URL

Collect the first 20 complete property records from a broad Dubai sale search:

```json
{
  "start_url": "https://www.bayut.com/for-sale/property/dubai/",
  "sorting": "tuned-ranking",
  "results_wanted": 20,
  "max_pages": 3
}
```

#### Search by keyword and location

Search for sea-view properties across Dubai without supplying a URL:

```json
{
  "keyword": "sea view",
  "location": "Dubai",
  "sorting": "date-desc",
  "results_wanted": 50,
  "max_pages": 5
}
```

#### Collect sorted rental villas

Use a property-type rental URL and collect the lowest-priced matching villas first:

```json
{
  "start_url": "https://www.bayut.com/to-rent/villas/dubai/",
  "sorting": "price-asc",
  "results_wanted": 100,
  "max_pages": 10
}
```

#### Override the location in a URL

Reuse a sale URL while explicitly searching another UAE location:

```json
{
  "start_url": "https://www.bayut.com/for-sale/apartments/dubai/",
  "location": "Abu Dhabi",
  "sorting": "verified-score",
  "results_wanted": 25,
  "max_pages": 4
}
```

### Sample Output

```json
{
  "id": 123456789,
  "objectID": "123456789",
  "externalID": "11065329",
  "purpose": "for-sale",
  "price": 1850000,
  "referenceNumber": "DUB-S-10452",
  "title": "High Floor Apartment with Marina View",
  "rooms": 2,
  "baths": 3,
  "area": 1284,
  "location_names": ["UAE", "Dubai", "Dubai Marina"],
  "category_names": ["Residential", "Apartments"],
  "geography": {
    "lat": 25.0805,
    "lng": 55.1403
  },
  "completionStatus": "completed",
  "furnishingStatus": "unfurnished",
  "amenities": ["Balcony or Terrace", "Swimming Pool", "Gym or Health Club"],
  "isVerified": true,
  "agency_name": "Example Real Estate LLC",
  "agent_name": "Example Agent",
  "cover_photo_url": "https://images.bayut.com/thumbnails/853990578-800x600.jpeg",
  "photos": [
    "https://images.bayut.com/thumbnails/853990578-800x600.jpeg",
    "https://images.bayut.com/thumbnails/853990609-800x600.jpeg"
  ],
  "photoCount": 18,
  "videoCount": 0,
  "panoramaCount": 0,
  "contactMethodAvailability": {
    "whatsapp": true,
    "sms": true,
    "email": true,
    "call": true
  },
  "url": "https://www.bayut.com/property/details-11065329.html"
}
```

### Tips for Best Results

- Start with 20 results to confirm the location, property type, and fields before increasing the limit.
- Use a specific Bayut URL for a property type or community when you need a narrow dataset.
- Use `date-desc` for monitoring recently published inventory and price sorts for comparable-property research.
- Proxy access is optional. Runs are fast and reliable without a proxy; enable one only if your network blocks the source.
- Set `max_pages` high enough to reach `results_wanted`; a restrictive page limit can stop a run before the requested count.
- Some properties do not publish every optional field. The Actor removes those missing values rather than saving null placeholders.

### Integrations and export formats

- **Google Sheets** - Send property datasets to a shared spreadsheet for review and analysis.
- **Webhooks** - Notify another application when a run finishes.
- **Make and Zapier** - Connect listings to CRMs, alerts, databases, and no-code workflows.
- **Apify API** - Start runs and retrieve datasets programmatically.
- **Scheduled runs** - Refresh market snapshots daily, weekly, or at another interval.
- **Exports** - Download JSON, JSONL, CSV, Excel, XML, RSS, or HTML table files from Apify datasets.

### Frequently Asked Questions

#### Does each row contain rich property details?

Yes. Every saved row is populated with the property record Bayut publishes to its listing layer, including pricing, specifications, media URLs and counts, amenities, agent and agency profiles, contact availability, verification, and the full location hierarchy. Duplicate and empty values are removed before saving.

#### Can I collect both sale and rental listings?

Yes. Use a URL containing `/for-sale/` or `/to-rent/`. Keyword-only and location-only runs search sale listings unless a rental URL is supplied.

#### Can I search a community or building by name?

Yes. Enter a city, community, sub-community, or building in `location`. The Actor resolves the name to the matching Bayut location before collecting properties.

#### Why are some fields absent from a result?

The source property did not publish those values. The Actor intentionally removes null values, empty strings, empty arrays, and empty objects to keep exports clean.

#### Are duplicate properties removed?

Yes. Properties are deduplicated using their stable Bayut identifiers before they are saved.

#### Can I export Bayut property data to CSV or Excel?

Yes. Open the Apify dataset and choose CSV, Excel, JSON, JSONL, XML, RSS, or HTML table.

#### Can I schedule recurring property monitoring?

Yes. Use Apify schedules to run the Actor repeatedly, then send results through webhooks or an integration.

#### Is it legal to scrape Bayut?

Scraping public web data can be legal, but you are responsible for complying with applicable laws, privacy requirements, and Bayut's terms. Use reasonable collection limits and handle contact information responsibly.

### Related Actors

- [Propertyfinder Scraper](https://apify.com/shahidirfan/propertyfinder-scraper) - Collect UAE listings from Property Finder for cross-portal analysis.
- [Savills Property Scraper](https://apify.com/shahidirfan/savills-property-scraper) - Collect international residential and commercial property listings.
- [DDProperty Scraper](https://apify.com/shahidirfan/ddproperty-scraper) - Collect property listings for Southeast Asian real estate research.

### Support

For bug reports, feature requests, or help with a Bayut URL, open the Issues tab on the Actor page. Include the input used, the run ID, and a short description of the expected result.

### Legal Notice

This Actor is intended for legitimate collection of publicly available property information. Users are responsible for complying with applicable laws, website terms, privacy rules, and restrictions on marketing or contact-data use. This Actor is not affiliated with or endorsed by Bayut.

# Actor input Schema

## `start_url` (type: `string`):

A public Bayut sale or rent search URL. Explicit keyword, location, and sorting inputs override matching URL values.

## `keyword` (type: `string`):

Optional property keyword or feature, such as sea view, furnished, or private pool.

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

Optional UAE city, community, sub-community, or building name. Overrides the location inferred from the URL.

## `sorting` (type: `string`):

Order used by Bayut when returning matching properties.

## `results_wanted` (type: `integer`):

Maximum number of rich property-detail records to save.

## `max_pages` (type: `integer`):

Safety limit for property search pages. Each search page can return up to 50 properties.

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

Optional Apify Proxy or custom proxy URLs. Bayut listings are read from a public search endpoint that does not require a proxy.

## Actor input object example

```json
{
  "start_url": "https://www.bayut.com/for-sale/property/dubai/",
  "sorting": "tuned-ranking",
  "results_wanted": 20,
  "max_pages": 3,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `overview` (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 = {
    "start_url": "https://www.bayut.com/for-sale/property/dubai/",
    "sorting": "tuned-ranking",
    "results_wanted": 20,
    "max_pages": 3,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("shahidirfan/bayut-property-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 = {
    "start_url": "https://www.bayut.com/for-sale/property/dubai/",
    "sorting": "tuned-ranking",
    "results_wanted": 20,
    "max_pages": 3,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("shahidirfan/bayut-property-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 '{
  "start_url": "https://www.bayut.com/for-sale/property/dubai/",
  "sorting": "tuned-ranking",
  "results_wanted": 20,
  "max_pages": 3,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call shahidirfan/bayut-property-scraper --silent --output-dataset

```

## MCP server setup

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