# Bayut Broker Directory Extractor (`kawsar/bayut-broker-directory-extractor`) Actor

Bayut broker directory extractor that pulls real estate agent profiles from Bayut.com, with contact details, agency info, TruBroker status, and listing counts across UAE cities.

- **URL**: https://apify.com/kawsar/bayut-broker-directory-extractor.md
- **Developed by:** [Kawsar](https://apify.com/kawsar) (community)
- **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?

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 Broker Directory Extractor

<p align="center">
  <img src="https://imgur.com/YAz4AAe.png" alt="USA Automotive Leads Hub" style="max-width:100%; border-radius:14px; width:680px;" />
</p>

**Extract verified real estate agent profiles from Bayut.com's UAE broker directory — at scale, across multiple locations, in one run.**

Bayut is the UAE's largest property portal, with over 30,000 registered brokers listed across Dubai, Abu Dhabi, Sharjah, and other emirates. This actor pulls structured broker data from any Bayut `/brokers/` directory page: names, direct contact numbers, emails, WhatsApp, agency affiliations, TruBroker badge status, active listing counts, specializations, languages spoken, and professional bios.

Point it at one URL or twenty, set how many brokers you need per location, and let it run. No coding required, no API keys to manage on your end.

***

### Why use this actor?

The Bayut broker directory is one of the most complete, up-to-date databases of licensed UAE real estate agents available publicly. Every listing agent on Bayut is registered with RERA (Real Estate Regulatory Authority), and many carry verifiable BRN numbers. That makes this data useful for more than just scraping — it is a starting point for lead qualification, competitor analysis, and market mapping.

Manual collection from the directory is not practical.

***

### What data does this actor extract?

Each broker record contains:

| Field | Description |
|-------|-------------|
| `externalID` | Bayut's unique broker identifier |
| `name` | Full name |
| `slug` | URL identifier |
| `profileUrl` | Link to the broker's Bayut profile page |
| `email` | Direct contact email |
| `phone` | Office phone number |
| `mobile` | Mobile phone number |
| `whatsapp` | WhatsApp contact number |
| `agencyName` | Affiliated real estate agency |
| `agencySlug` | Agency URL identifier |
| `isTruBroker` | Holds Bayut's TruBroker verified badge |
| `isHighlyResponsive` | Holds the Highly Responsive badge |
| `isQualityLister` | Holds the Quality Lister badge |
| `hasBRN` | Has a RERA Broker Registration Number |
| `specialities` | Specialization codes (e.g. residential\_sales, off\_plan\_sales) |
| `languages` | Languages spoken |
| `adsCount` | Total active property listings |
| `saleCount` | Properties currently listed for sale |
| `rentCount` | Properties currently listed for rent |
| `truBrokerRanking` | Numerical TruBroker performance ranking |
| `photoUrl` | Profile photo URL |
| `activeInEmirate` | Primary emirate of activity |
| `bio` | Professional biography |
| `locationUrl` | The directory URL this broker was scraped from |
| `scrapedAt` | ISO 8601 timestamp |

***

### Use cases

- **Lead generation for real estate tech companies**: build contact lists of active brokers across specific districts to run CRM outreach or advertising campaigns
- **Agency benchmarking**: compare listing volumes, badge rates, and specializations across agencies operating in a given area
- **Market mapping**: identify which brokers are most active in a neighborhood — useful for investors evaluating agent density before a purchase decision
- **Data enrichment pipelines**: join broker profiles with property listing data to map agent-to-listing relationships at scale
- **Competitive intelligence**: track how many verified TruBrokers operate in a target district, or how agency market share shifts over time
- **Recruitment tools**: find high-performing brokers (by listing count or badge status) for headhunting or partnership outreach
- **Academic research**: dataset-level analysis of the UAE brokerage market, language diversity among agents, or specialization trends

***

### Input

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `locationUrls` | string list | Dubai broker page | One or more Bayut `/brokers/` directory URLs. Add one per line in the UI. |
| `maxItemsPerUrl` | integer | 40 | Max broker profiles to extract per URL. Each page has 40 brokers; set higher to paginate. |
| `requestTimeoutSecs` | integer | 30 | Per-request timeout in seconds. |

#### Single location example

```json
{
    "locationUrls": [
        "https://www.bayut.com/brokers/dubai/"
    ],
    "maxItemsPerUrl": 40
}
```

#### Multi-location example

```json
{
    "locationUrls": [
        "https://www.bayut.com/brokers/dubai/",
        "https://www.bayut.com/brokers/abu-dhabi/",
        "https://www.bayut.com/brokers/sharjah/",
        "https://www.bayut.com/brokers/dubai/business-bay/",
        "https://www.bayut.com/brokers/dubai/jumeirah-village-circle-jvc/"
    ],
    "maxItemsPerUrl": 80
}
```

#### Supported URL formats

Any Bayut broker directory page works as input:

```
https://www.bayut.com/brokers/dubai/
https://www.bayut.com/brokers/abu-dhabi/
https://www.bayut.com/brokers/sharjah/
https://www.bayut.com/brokers/ajman/
https://www.bayut.com/brokers/ras-al-khaimah/
https://www.bayut.com/brokers/dubai/business-bay/
https://www.bayut.com/brokers/dubai/jumeirah-village-circle-jvc/
https://www.bayut.com/brokers/dubai/downtown-dubai/
https://www.bayut.com/brokers/dubai/palm-jumeirah/
https://www.bayut.com/brokers/dubai/dubai-marina/
https://www.bayut.com/brokers/dubai/dubai-hills-estate/
```

District-level pages work the same as city-level pages and have their own pagination.

***

### Output

Sample record:

```json
{
    "externalID": "2354093",
    "name": "Kieran Sheehan",
    "slug": "kieran-sheehan-2354093",
    "profileUrl": "https://www.bayut.com/agent/kieran-sheehan-2354093/",
    "email": "kieran.sheehan@bhomes.com",
    "phone": "+97144090905",
    "mobile": "+97144090909",
    "whatsapp": "+971545695868",
    "agencyName": "Betterhomes - Motor City",
    "agencySlug": "betterhomes-motor-city-11027",
    "isTruBroker": true,
    "isHighlyResponsive": true,
    "isQualityLister": false,
    "hasBRN": false,
    "specialities": ["residential_sales", "off_plan_sales"],
    "languages": ["en"],
    "adsCount": 19,
    "saleCount": 12,
    "rentCount": 7,
    "truBrokerRanking": 162,
    "photoUrl": "https://static.bayut.com/images/agents/...",
    "activeInEmirate": "Dubai",
    "bio": "Kieran is an accomplished real estate professional with a proven track record...",
    "locationUrl": "https://www.bayut.com/brokers/dubai/",
    "scrapedAt": "2026-09-28T10:15:30.123456+00:00"
}
```

<p align="center">
  <img src="https://imgur.com/T42rBOB.png" alt="USA Automotive Leads Hub" style="max-width:100%; border-radius:14px; width:680px;" />
</p>

***

### How it works

1. Takes one or more Bayut `/brokers/` directory URLs as input
2. Fetches each page through built-in bypass infrastructure that handles Bayut's bot protection layer
3. Parses the server-embedded state JSON from the rendered page — no third-party search APIs are called
4. Extracts 40 broker records per page and paginates automatically using the `/page-N/` URL pattern
5. Repeats for each input URL, stopping when `maxItemsPerUrl` is reached
6. Pushes all structured records to the Apify dataset in real time

The actor does not use a browser. Each request is a single HTTP fetch through the bypass layer, which keeps runs fast and cost-effective.

***

### Scale and performance

| Metric | Value |
|--------|-------|
| Brokers per page | 40 |
| Abu Dhabi total brokers | 3,000+ |
| Typical page fetch time | 10–20 seconds |
| Max items per URL | 1,000 |

For large-scale collection (thousands of brokers across multiple cities), run the actor multiple times or increase `maxItemsPerUrl`. Results accumulate in the same dataset across runs.

***

### Understanding Bayut broker badges

Bayut awards performance badges to agents who meet specific criteria. These are captured in the output:

| Badge | Field | Criteria |
|-------|-------|----------|
| TruBroker | `isTruBroker` | Awarded to agents who are highly responsive AND advertise genuine, verified properties |
| Quality Lister | `isQualityLister` | Awarded to agents with authentic, accurate property listings |
| Highly Responsive | `isHighlyResponsive` | Awarded to agents who respond quickly to buyer and renter inquiries |

The `truBrokerRanking` score is a numerical value — lower is better. Agents ranked under 100 are among the top performers on the platform.

***

### FAQ

**Do I need a Bayut account to run this actor?**
No. The actor scrapes the public-facing broker directory, which is accessible without login.

**How often does Bayut update broker data?**
Badge status, listing counts, and contact information change as agents add listings and earn or lose badges. For up-to-date data, re-run the actor weekly or monthly.

**Can I filter by TruBroker status or specialization?**
Not at the input level — the actor collects all brokers for a given directory page. Filter by `isTruBroker`, `specialities`, or `languages` in the dataset after collection, or use Apify's [dataset filtering](https://docs.apify.com/storage/dataset) options.

**Does the actor scrape individual broker profile pages?**
No. It extracts all available data from the directory listing. Profile pages contain the same contact data but no additional structured fields that aren't already in the directory.

**What happens if a URL is invalid?**
The actor logs a warning, skips that URL, and continues with the remaining ones. The run completes as long as at least one valid URL is provided.

***

### Integrations

Connect Bayut Broker Directory Extractor with other tools using [Apify integrations](https://apify.com/integrations):

- **Google Sheets**: push broker profiles directly into a spreadsheet for review or CRM import
- **Make / Zapier**: trigger workflows when new broker data is ready — push to a CRM, send a Slack alert, or update a database
- **Airbyte**: stream broker data into a data warehouse for ongoing analysis
- **Webhooks**: call any endpoint when a run completes

***

<p align="center">
  <img src="https://imgur.com/44BNpDR.png" alt="USA Automotive Leads Hub" style="max-width:100%; border-radius:14px; width:680px;" />
</p>

# Actor input Schema

## `locationUrls` (type: `array`):

One or more Bayut broker directory URLs to scrape. Add one URL per line. Supports city pages (e.g. /brokers/dubai/) and district pages (e.g. /brokers/dubai/business-bay/).

## `maxItemsPerUrl` (type: `integer`):

Maximum number of broker profiles to extract per location URL. Each page returns 40 brokers. Set to 40 for a single page, or higher to paginate.

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

Per-request timeout in seconds. Increase if the site is slow to respond.

## Actor input object example

```json
{
  "locationUrls": [
    "https://www.bayut.com/brokers/dubai/",
    "https://www.bayut.com/brokers/abu-dhabi/",
    "https://www.bayut.com/brokers/sharjah/",
    "https://www.bayut.com/brokers/dubai/jumeirah-village-circle-jvc/",
    "https://www.bayut.com/brokers/dubai/business-bay/"
  ],
  "maxItemsPerUrl": 40,
  "requestTimeoutSecs": 30
}
```

# Actor output Schema

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

Extracted broker profiles from the Bayut directory, including contact details, agency info, and badge status.

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

// Run the Actor and wait for it to finish
const run = await client.actor("kawsar/bayut-broker-directory-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 = { "locationUrls": ["https://www.bayut.com/brokers/dubai/"] }

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

```

## MCP server setup

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