# Bayut Property Listings Extractor (`kawsar/bayut-property-listings-extractor`) Actor

Extract Bayut property listings from any search URL: price, beds, baths, size, location, photos, and agent contacts, exported to JSON, CSV, or Excel for market research, price tracking, and CRM feeds.

- **URL**: https://apify.com/kawsar/bayut-property-listings-extractor.md
- **Developed by:** [Kawsar](https://apify.com/kawsar) (community)
- **Categories:** Real estate, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.99 / 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 Listings Extractor

Turn any Bayut search page into clean, structured property data. Paste a Bayut results URL and this actor returns every listing on those pages as rows you can sort, filter, and export: price, bedrooms, bathrooms, size, exact location with coordinates, all listing photos, and the agent and agency contact details.

Bayut is the UAE's largest real estate portal, with hundreds of thousands of active sale and rent listings across Dubai, Abu Dhabi, Sharjah, Ajman, and the rest of the Emirates. This actor reads those listings for you, follows the pagination automatically, and hands back structured data ready for analysis, a CRM, or a spreadsheet.

### Why use this actor

- **No manual copy paste.** One search URL can produce hundreds of clean records in a single run.
- **Full listing detail.** Price, size, room counts, geolocation, every photo, and the agent behind each listing.
- **Any Bayut search.** Sale or rent, any city or community, and any filter combination Bayut supports.
- **Automatic pagination.** Give it a search URL and set how many listings you want. It walks the result pages until it has enough.
- **Export anywhere.** Download as JSON, CSV, Excel, or HTML, or pull the data through the Apify API.

### What you can do with the data

- Compare asking prices and price per square foot across neighborhoods
- Track new sale or rent listings in a specific community over time
- Build agent and agency contact lists for outreach and lead generation
- Feed a property CRM or an internal listings database
- Collect listing photos and details for valuation models or market reports
- Analyze inventory levels and pricing trends for investment research

### How it works

1. You provide one or more Bayut search or category URLs.
2. The actor loads each results page and reads the structured listing data on it.
3. It moves through the paginated results until it reaches your `maxItems` limit.
4. Each property is saved as one record in the dataset, with duplicates removed.

You do not need an account, a login, or any browser setup. Point it at a URL and run.

### Input

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `searchUrls` | Array of strings | Yes | One or more Bayut search or category URLs. Pagination is handled for you. |
| `maxItems` | Integer | No | Maximum number of listings to collect across all URLs. Default 100, maximum 5000. |
| `requestTimeoutSecs` | Integer | No | Per request timeout in seconds. Default 45. |

#### Where to get a search URL

Open [bayut.com](https://www.bayut.com), run any search, apply the filters you want, and copy the URL from your browser. Anything Bayut can display on a results page works here.

Examples:

- All properties for sale in Dubai: `https://www.bayut.com/for-sale/property/dubai/`
- Apartments to rent in Dubai: `https://www.bayut.com/to-rent/apartments/dubai/`
- Villas for sale in Abu Dhabi: `https://www.bayut.com/for-sale/villas/abu-dhabi/`
- A filtered search by price, bedrooms, or community (copy the full URL after applying filters)

#### Example input

```json
{
    "searchUrls": [
        "https://www.bayut.com/for-sale/property/dubai/",
        "https://www.bayut.com/to-rent/apartments/dubai/"
    ],
    "maxItems": 200,
    "requestTimeoutSecs": 45
}
```

### Output

Every listing becomes one dataset record. Here is a real example:

```json
{
    "listingId": "16144665",
    "propertyUrl": "https://www.bayut.com/property/details-16144665.html",
    "listingTitle": "Lowest Price in Majan / 4% DLD Waiver / 40-60 Payment Plan",
    "propertyType": "Apartment",
    "purpose": "for-sale",
    "price": 967000,
    "currency": "AED",
    "bedrooms": 1,
    "bathrooms": 2,
    "areaSize": 680,
    "areaUnit": "SQFT",
    "region": "Dubai",
    "locality": "Majan",
    "latitude": 25.090813566325,
    "longitude": 55.32188921802,
    "coverImage": "https://images.bayut.com/thumbnails/861100023-800x600.jpeg",
    "images": [
        "https://images.bayut.com/thumbnails/861100023-800x600.jpeg",
        "https://images.bayut.com/thumbnails/861100021-800x600.jpeg"
    ],
    "imageCount": 16,
    "agentName": "Yassin El Forkani",
    "agentPhone": "+97145880392",
    "agencyName": "Forsa Properties",
    "agencyUrl": "https://www.bayut.com/companies/forsa-properties-109521/",
    "scrapedAt": "2026-08-23T05:44:59Z"
}
```

#### Output field reference

| Field | Type | Description |
|-------|------|-------------|
| `listingId` | String | Bayut's unique listing identifier. |
| `propertyUrl` | String | Direct link to the full listing page. |
| `listingTitle` | String | The listing headline written by the agent. |
| `propertyType` | String | Property category, for example Apartment, Villa, Townhouse. |
| `purpose` | String | `for-sale` or `for-rent`, taken from the search URL. |
| `price` | Number | Asking price. For rentals this is the period price shown on Bayut. |
| `currency` | String | Price currency, usually AED. |
| `bedrooms` | Number | Number of bedrooms. Studios return 0. |
| `bathrooms` | Number | Number of bathrooms. |
| `areaSize` | Number | Built up area value. |
| `areaUnit` | String | Unit for the area, for example SQFT. |
| `region` | String | City or emirate, for example Dubai. |
| `locality` | String | Community or neighborhood, for example Majan. |
| `latitude` | Number | Map latitude of the property. |
| `longitude` | Number | Map longitude of the property. |
| `coverImage` | String | URL of the main listing photo. |
| `images` | Array | URLs of all listing photos. |
| `imageCount` | Number | How many photos the listing has. |
| `agentName` | String | Name of the listing agent. |
| `agentPhone` | String | Agent contact phone number. |
| `agencyName` | String | Name of the agency the agent works for. |
| `agencyUrl` | String | Bayut profile URL of the agency. |
| `scrapedAt` | String | UTC timestamp of when the record was collected. |

### Exporting your results

After a run finishes, open the dataset and export in one click as JSON, CSV, Excel, or HTML table. You can also fetch results programmatically.

```bash
curl "https://api.apify.com/v2/datasets/DATASET_ID/items?format=csv"
```

Replace `DATASET_ID` with the ID shown on your run, and add your Apify token if the run is private.

### Tips for better results

- Apply your filters on Bayut first, then copy the URL. The actor keeps whatever filters are in the URL.
- Add several search URLs in one run to cover multiple cities or purposes at once.
- Set `maxItems` to control run length and cost. Higher limits read more result pages.
- Run on a schedule to track a market and spot new listings as they appear.

### Frequently asked questions

**Which Bayut pages are supported?**
Any search or category results page, for sale or for rent, in any city or community, with any filter combination.

**How many listings can I collect?**
Up to 5000 per run through the `maxItems` setting. Split very large jobs across multiple runs or schedule them.

**Does it collect listing photos?**
Yes. Each record includes the cover image and the full list of photo URLs, along with a count.

**Do I get agent contact details?**
Yes. Each listing includes the agent name and phone number, plus the agency name and profile URL when Bayut shows them.

**Do I need a Bayut account?**
No. The actor only reads public listing data shown on Bayut search pages.

### Notes and responsible use

This actor collects only public data that Bayut already displays on its search pages. Use it in line with Bayut's terms of service and applicable local laws, and treat any personal contact information responsibly.

# Actor input Schema

## `searchUrls` (type: `array`):

One or more Bayut search or category pages to extract listings from. Paste a full Bayut results URL for any city, area, purpose or property type. Pagination is handled automatically.

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

Maximum number of property listings to collect across all search URLs.

## `requestTimeoutSecs` (type: `integer`):

Per-request timeout in seconds.

## Actor input object example

```json
{
  "searchUrls": [
    "https://www.bayut.com/for-sale/property/dubai/",
    "https://www.bayut.com/to-rent/apartments/dubai/"
  ],
  "maxItems": 20,
  "requestTimeoutSecs": 45
}
```

# Actor output Schema

## `properties` (type: `string`):

Extracted Bayut property listings with prices, bedrooms, area, location, images and agent contacts.

# 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 = {
    "searchUrls": [
        "https://www.bayut.com/for-sale/property/dubai/"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("kawsar/bayut-property-listings-extractor").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 = { "searchUrls": ["https://www.bayut.com/for-sale/property/dubai/"] }

# Run the Actor and wait for it to finish
run = client.actor("kawsar/bayut-property-listings-extractor").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 '{
  "searchUrls": [
    "https://www.bayut.com/for-sale/property/dubai/"
  ]
}' |
apify call kawsar/bayut-property-listings-extractor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,kawsar/bayut-property-listings-extractor"
        }
    }
}

```

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/hRq5kY8lZbLvjzMvc/builds/xMoSSPfU0ClJ3tir1/openapi.json
