# Bayut Scraper — UAE Property Listings, Agents & Agencies (`khadinakbar/bayut-scraper`) Actor

Scrape Bayut.com UAE real estate listings (sale & rent), agent contacts, and agencies. HTTP-only via Algolia, no proxy needed. MCP-ready.

- **URL**: https://apify.com/khadinakbar/bayut-scraper.md
- **Developed by:** [Khadin Akbar](https://apify.com/khadinakbar) (community)
- **Categories:** Real estate, Lead generation, MCP servers
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 record returneds

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use 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 Scraper — UAE Property Listings, Agents & Agencies

Scrape Bayut.com — the UAE's #1 real estate portal — for **property listings (sale & rent)**, **agent contacts**, and **agencies**. HTTP-only, no proxy, no captcha, no browser. MCP-ready for AI agents.

### What you get

| Field | Example |
|---|---|
| `externalID`, `url`, `referenceNumber` | `15597302`, `https://www.bayut.com/property/details-15597302.html` |
| `title`, `purpose`, `rentFrequency` | `"Sea view 2BR Marina"`, `for-sale` or `for-rent`, `yearly`/`monthly`/`weekly`/`daily` |
| `price`, `currency` | `1390000`, `AED` |
| `rooms`, `baths`, `area_sqm`, `area_sqft`, `plotArea_sqm` | `2`, `2`, `101.7`, `1094.3`, … |
| `category`, `subCategory`, `propertyType`, `furnishingStatus`, `completionStatus`, `completionDate`, `hasPaymentPlan` | `Residential`, `Apartment`, `property`/`project`, `furnished`, `under-construction`, `2026-Q4`, `true` |
| Location: `city`, `area`, `subArea`, `building`, `locationHierarchy[]`, `cityExternalID`, `areaExternalID`, `lat`, `lng` | Full 5-level hierarchy + geo coords |
| `coverPhoto`, `photoCount`, `videoCount`, `panoramaCount`, `photoUrls[]` | 800×600 image URLs, up to 30 |
| `amenities[]` | `["Central A/C","Built-in Wardrobes",…]` |
| `isVerified`, `truCheckScore` | TruCheck badge |
| **Agent contacts**: `agentName`, `agentPhone`, `agentWhatsapp`, `agentProxyPhone`, `agentExternalID` | Direct mobile + WhatsApp |
| **Agency**: `agencyName`, `agencyExternalID`, `agencyLogo`, `agencyTier` | |
| `createdAt`, `updatedAt`, `reactivatedAt`, `scrapedAt` (ISO 8601) | |

Agency records add: `name`, `logo`, `isFeatured`, `eliteStatus`, `agentsCount`, `locations[]`, `licenses[]`, `languages[]`.
Agent records add: `about`, `email`, `phone`, `isHighlyResponsive`, `isQualityLister`, `isTruBroker`, `activeInEmirate[]`, `listingsCount`.

### Pricing

| Event | Price |
|---|---|
| Actor start | $0.00005 per run |
| Record returned (property / agency / agent) | **$0.005** |

A 100-listing pull costs **$0.50**. A bulk 1,000-listing pull costs **$5**.

### Modes (auto-detected)

| Mode | When | Required input |
|---|---|---|
| `search` | Filtered property search | `city` + filters |
| `url` | Bayut property or search URL | `startUrls[]` |
| `property` | Bulk lookup by Bayut externalIDs | `propertyIds[]` |
| `agency` | Agency profile (+ optional listings) | `agencyIds[]` or `agencyQuery` |
| `agent` | Agent profile (+ optional listings) | `agentIds[]` or `agentQuery` |

`mode: "auto"` (default) picks based on what you provide.

### Examples

#### Dubai Marina 2BR apartments for sale under 3M AED

```json
{
  "purpose": "for-sale",
  "locationQuery": "Dubai Marina",
  "category": "apartments",
  "minBeds": 2,
  "maxBeds": 2,
  "maxPrice": 3000000,
  "maxResults": 100
}
````

#### Yearly rentals in Abu Dhabi, verified only

```json
{
  "purpose": "for-rent",
  "rentFrequency": "yearly",
  "city": "Abu Dhabi",
  "verifiedOnly": true,
  "maxResults": 50
}
```

#### Single property by URL

```json
{
  "startUrls": ["https://www.bayut.com/property/details-15597302.html"]
}
```

#### Bulk by externalID

```json
{
  "propertyIds": ["15597302", "15597303", "15597304"]
}
```

#### Agency profile + every listing they post

```json
{
  "mode": "agency",
  "agencyIds": ["1234"],
  "includeAgencyListings": true,
  "maxResults": 200
}
```

#### Find agents named "Mohammed"

```json
{
  "mode": "agent",
  "agentQuery": "Mohammed",
  "maxResults": 50
}
```

### Filters (search mode)

- `purpose`: `for-sale` | `for-rent`
- `city`: `Dubai`, `Abu Dhabi`, `Sharjah`, `Ajman`, `Ras Al Khaimah`, `Umm Al Quwain`, `Fujairah`
- `locationQuery`: free-text neighborhood (e.g. `Dubai Marina`)
- `locationExternalID`: exact Bayut location ID
- `category`: `apartments`, `villas`, `townhouses`, `penthouses`, `hotel-apartments`, `residential-building`, `residential-floor`, `residential-land`, `commercial`, `offices`, `shops`, `warehouses`
- Beds: `minBeds`, `maxBeds` (0 = studio)
- Baths: `minBaths`, `maxBaths`
- Price: `minPrice`, `maxPrice` (AED)
- Area: `minArea`, `maxArea` (sqm)
- `furnishingStatus`: `furnished` | `unfurnished`
- `completionStatus`: `completed` | `under-construction`
- `rentFrequency`: `yearly` | `monthly` | `weekly` | `daily`
- `verifiedOnly`: true to limit to TruCheck-verified listings

### MCP usage

Bayut Scraper is exposed as `apify--bayut-scraper` in Apify MCP. The tool description is agent-tuned: lead with verb + scope, return shape, price signal. Use from Claude Desktop, Claude Code, ChatGPT MCP, or any MCP client at `mcp.apify.com`.

### Architecture

- **HTTP-only** via Bayut's public Algolia search backend. No proxy, no captcha, no browser.
- Indexes used: `bayut-production-ads-en` (661K listings), `bayut-production-agencies-en` (14K), `bayut-production-agents-en` (20K), `bayut-production-locations-en` (18K).
- Pagination via Algolia `page` / `hitsPerPage` (50 per page).
- `safePushData` wrapper catches schema-validation rejects without crashing the run.
- Triple-guard PPE counter; soft-fail on bad input; honest-fail on Algolia outage.

### FAQ

**Q: Do I need a Bayut login or cookies?**
No. The actor uses public data only.

**Q: How fresh is the data?**
Algolia is Bayut's live search index. Listings appear in seconds after being published on bayut.com.

**Q: Can I scrape sold/archived listings?**
No. Only active listings are indexed.

**Q: Why are some prices `null`?**
The listing has `hidePrice: true` — Bayut allows agents to hide the price and request inquiries. We preserve the flag in the output.

**Q: What about Arabic content?**
Index defaults to English (`-en`). Arabic equivalent indexes (`-ar`) exist but aren't surfaced — open an issue if you need them.

### Legal

This actor reads only public Bayut search results — the same data anyone can see on bayut.com without logging in. Respect [Bayut's Terms of Use](https://www.bayut.com/terms-of-use/) and applicable laws when using extracted contact data. Do not spam, resell, or use for purposes that violate UAE law or Bayut's TOS.

### Related Apify actors (Khadin's portfolio)

- [`zillow-search-scraper`](https://apify.com/khadinakbar/zillow-search-scraper) — US real estate listings
- [`rightmove-all-in-one-scraper`](https://apify.com/khadinakbar/rightmove-all-in-one-scraper) — UK real estate
- [`idealista-scraper`](https://apify.com/khadinakbar/idealista-scraper) — Spain/Portugal/Italy real estate
- [`yellow-pages-uae-scraper`](https://apify.com/khadinakbar/yellow-pages-uae-scraper) — UAE business directory

Built by [Khadin Akbar](https://apify.com/khadinakbar) — 100+ production actors, MCP-first.

# Actor input Schema

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

Which Bayut surface to scrape. 'auto' picks based on what you provide (startUrls -> url, agencyIds -> agency, etc.). 'search' = filtered property search. 'url' = parse Bayut property/search URLs. 'property' = direct property externalIDs. 'agency'/'agent' = agency or agent records (+ optional listings). Defaults to 'auto'.

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

Listing purpose. 'for-sale' = properties for sale; 'for-rent' = rentals. Use with rentFrequency for rental search. Defaults to 'for-sale'. Only used in search mode (URL mode infers from URL).

## `city` (type: `string`):

UAE emirate / city. Example: 'Dubai', 'Abu Dhabi', 'Sharjah', 'Ajman', 'Ras Al Khaimah'. Resolved to a Bayut location externalID via the Algolia locations index. NOT a neighborhood (use locationQuery for those).

## `locationQuery` (type: `string`):

Free-text location at any level: emirate, area, sub-area, building. Example: 'Dubai Marina', 'Downtown Dubai', 'Business Bay'. Resolves to the closest matching Bayut location externalID. Overrides 'city' when set.

## `locationExternalID` (type: `string`):

Bayut location externalID (e.g. '5002' for Dubai, '5003' for Dubai Marina). Use when you already know the exact ID for max precision. Overrides city/locationQuery.

## `query` (type: `string`):

Free-text keyword search across title/description (e.g. 'sea view', 'penthouse', 'Burj Khalifa'). Combined with the city/location filter. Leave blank to return everything matching the filters.

## `category` (type: `string`):

Bayut category slug. 'apartments', 'villas', 'townhouses', 'penthouses', 'hotel-apartments', 'residential-building', 'residential-floor', 'residential-land', 'commercial', 'offices', 'shops', 'warehouses'. Empty = all categories.

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

'property' (default — single units), 'project' (off-plan developments). Empty returns both.

## `minBeds` (type: `integer`):

Minimum number of bedrooms (Bayut 'rooms'). 0 = studio. Empty = no minimum.

## `maxBeds` (type: `integer`):

Maximum number of bedrooms. Empty = no maximum.

## `minBaths` (type: `integer`):

Minimum bathrooms. Empty = no minimum.

## `maxBaths` (type: `integer`):

Maximum bathrooms. Empty = no maximum.

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

Minimum price in AED. Sales are absolute; rentals are per rentFrequency (yearly/monthly). Empty = no minimum.

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

Maximum price in AED. Empty = no maximum.

## `minArea` (type: `number`):

Minimum built-up area in square meters (1 sqm = 10.76 sqft).

## `maxArea` (type: `number`):

Maximum built-up area in square meters.

## `furnishingStatus` (type: `string`):

'furnished', 'unfurnished', or empty for both.

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

'completed' = ready, 'under-construction' = off-plan. Empty = both.

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

For 'for-rent' purpose: 'yearly', 'monthly', 'weekly', 'daily'. Empty = any frequency.

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

Only return Bayut-verified listings (TruCheck). Reduces volume but improves quality. Default false.

## `startUrls` (type: `array`):

Bayut URLs. Each can be a property detail page (https://www.bayut.com/property/details-15597302.html) or a search page (https://www.bayut.com/for-sale/apartments/dubai/). URL mode auto-detects from these.

## `propertyIds` (type: `array`):

List of Bayut property externalIDs (e.g. '15597302'). Useful for bulk lookup. NOT internal numeric ids.

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

Bayut agency externalIDs. Returns agency profile records. Set includeAgencyListings=true to also pull every listing the agency posts.

## `agencyQuery` (type: `string`):

Free-text search across Bayut agency names. Returns agency profiles ranked by relevance.

## `includeAgencyListings` (type: `boolean`):

When true and agencyIds are provided, also push every property posted by those agencies. Counts toward maxResults.

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

Bayut agent externalIDs. Returns agent profile records (name, phone, agency, TruBroker badge, etc.).

## `agentQuery` (type: `string`):

Free-text search across Bayut agent names.

## `includeAgentListings` (type: `boolean`):

When true and agentIds are provided, also push every property posted by those agents. Counts toward maxResults.

## `maxResults` (type: `integer`):

Hard cap on records returned (1-5000). Caps cost at $0.005 per record + $0.00005 start. Default 50. Tune higher for bulk pulls.

## Actor input object example

```json
{
  "mode": "search",
  "purpose": "for-sale",
  "city": "Dubai",
  "locationQuery": "Dubai Marina",
  "locationExternalID": "5002",
  "query": "sea view",
  "category": "apartments",
  "propertyType": "",
  "minBeds": 2,
  "maxBeds": 3,
  "minPrice": 500000,
  "maxPrice": 5000000,
  "furnishingStatus": "",
  "completionStatus": "",
  "rentFrequency": "",
  "verifiedOnly": false,
  "startUrls": [
    "https://www.bayut.com/property/details-15597302.html"
  ],
  "agencyQuery": "Allsopp",
  "includeAgencyListings": false,
  "agentQuery": "Mohammed",
  "includeAgentListings": false,
  "maxResults": 50
}
```

# Actor output Schema

## `records` (type: `string`):

Bayut property listings (recordType=property), agencies (recordType=agency), or agents (recordType=agent) pushed to the default dataset.

# 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 = {
    "purpose": "for-sale",
    "city": "Dubai",
    "maxResults": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("khadinakbar/bayut-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 = {
    "purpose": "for-sale",
    "city": "Dubai",
    "maxResults": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("khadinakbar/bayut-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "purpose": "for-sale",
  "city": "Dubai",
  "maxResults": 50
}' |
apify call khadinakbar/bayut-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=khadinakbar/bayut-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Bayut Scraper — UAE Property Listings, Agents & Agencies",
        "description": "Scrape Bayut.com UAE real estate listings (sale & rent), agent contacts, and agencies. HTTP-only via Algolia, no proxy needed. MCP-ready.",
        "version": "0.1",
        "x-build-id": "ihH9pGklvtgMf42fk"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/khadinakbar~bayut-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-khadinakbar-bayut-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/khadinakbar~bayut-scraper/runs": {
            "post": {
                "operationId": "runs-sync-khadinakbar-bayut-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/khadinakbar~bayut-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-khadinakbar-bayut-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "mode": {
                        "title": "Mode (auto by default)",
                        "enum": [
                            "auto",
                            "search",
                            "url",
                            "property",
                            "agency",
                            "agent"
                        ],
                        "type": "string",
                        "description": "Which Bayut surface to scrape. 'auto' picks based on what you provide (startUrls -> url, agencyIds -> agency, etc.). 'search' = filtered property search. 'url' = parse Bayut property/search URLs. 'property' = direct property externalIDs. 'agency'/'agent' = agency or agent records (+ optional listings). Defaults to 'auto'.",
                        "default": "auto"
                    },
                    "purpose": {
                        "title": "Purpose (sale or rent)",
                        "enum": [
                            "for-sale",
                            "for-rent"
                        ],
                        "type": "string",
                        "description": "Listing purpose. 'for-sale' = properties for sale; 'for-rent' = rentals. Use with rentFrequency for rental search. Defaults to 'for-sale'. Only used in search mode (URL mode infers from URL).",
                        "default": "for-sale"
                    },
                    "city": {
                        "title": "City",
                        "type": "string",
                        "description": "UAE emirate / city. Example: 'Dubai', 'Abu Dhabi', 'Sharjah', 'Ajman', 'Ras Al Khaimah'. Resolved to a Bayut location externalID via the Algolia locations index. NOT a neighborhood (use locationQuery for those)."
                    },
                    "locationQuery": {
                        "title": "Location query (neighborhood / area)",
                        "type": "string",
                        "description": "Free-text location at any level: emirate, area, sub-area, building. Example: 'Dubai Marina', 'Downtown Dubai', 'Business Bay'. Resolves to the closest matching Bayut location externalID. Overrides 'city' when set."
                    },
                    "locationExternalID": {
                        "title": "Location externalID (advanced)",
                        "type": "string",
                        "description": "Bayut location externalID (e.g. '5002' for Dubai, '5003' for Dubai Marina). Use when you already know the exact ID for max precision. Overrides city/locationQuery."
                    },
                    "query": {
                        "title": "Free-text search query",
                        "type": "string",
                        "description": "Free-text keyword search across title/description (e.g. 'sea view', 'penthouse', 'Burj Khalifa'). Combined with the city/location filter. Leave blank to return everything matching the filters."
                    },
                    "category": {
                        "title": "Category slug",
                        "type": "string",
                        "description": "Bayut category slug. 'apartments', 'villas', 'townhouses', 'penthouses', 'hotel-apartments', 'residential-building', 'residential-floor', 'residential-land', 'commercial', 'offices', 'shops', 'warehouses'. Empty = all categories."
                    },
                    "propertyType": {
                        "title": "Property type",
                        "enum": [
                            "",
                            "property",
                            "project"
                        ],
                        "type": "string",
                        "description": "'property' (default — single units), 'project' (off-plan developments). Empty returns both.",
                        "default": ""
                    },
                    "minBeds": {
                        "title": "Min bedrooms",
                        "minimum": 0,
                        "maximum": 20,
                        "type": "integer",
                        "description": "Minimum number of bedrooms (Bayut 'rooms'). 0 = studio. Empty = no minimum."
                    },
                    "maxBeds": {
                        "title": "Max bedrooms",
                        "minimum": 0,
                        "maximum": 20,
                        "type": "integer",
                        "description": "Maximum number of bedrooms. Empty = no maximum."
                    },
                    "minBaths": {
                        "title": "Min bathrooms",
                        "minimum": 0,
                        "maximum": 20,
                        "type": "integer",
                        "description": "Minimum bathrooms. Empty = no minimum."
                    },
                    "maxBaths": {
                        "title": "Max bathrooms",
                        "minimum": 0,
                        "maximum": 20,
                        "type": "integer",
                        "description": "Maximum bathrooms. Empty = no maximum."
                    },
                    "minPrice": {
                        "title": "Min price (AED)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Minimum price in AED. Sales are absolute; rentals are per rentFrequency (yearly/monthly). Empty = no minimum."
                    },
                    "maxPrice": {
                        "title": "Max price (AED)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum price in AED. Empty = no maximum."
                    },
                    "minArea": {
                        "title": "Min area (sqm)",
                        "minimum": 0,
                        "type": "number",
                        "description": "Minimum built-up area in square meters (1 sqm = 10.76 sqft)."
                    },
                    "maxArea": {
                        "title": "Max area (sqm)",
                        "minimum": 0,
                        "type": "number",
                        "description": "Maximum built-up area in square meters."
                    },
                    "furnishingStatus": {
                        "title": "Furnishing",
                        "enum": [
                            "",
                            "furnished",
                            "unfurnished"
                        ],
                        "type": "string",
                        "description": "'furnished', 'unfurnished', or empty for both.",
                        "default": ""
                    },
                    "completionStatus": {
                        "title": "Completion status",
                        "enum": [
                            "",
                            "completed",
                            "under-construction"
                        ],
                        "type": "string",
                        "description": "'completed' = ready, 'under-construction' = off-plan. Empty = both.",
                        "default": ""
                    },
                    "rentFrequency": {
                        "title": "Rent frequency (rentals only)",
                        "enum": [
                            "",
                            "yearly",
                            "monthly",
                            "weekly",
                            "daily"
                        ],
                        "type": "string",
                        "description": "For 'for-rent' purpose: 'yearly', 'monthly', 'weekly', 'daily'. Empty = any frequency.",
                        "default": ""
                    },
                    "verifiedOnly": {
                        "title": "Verified listings only",
                        "type": "boolean",
                        "description": "Only return Bayut-verified listings (TruCheck). Reduces volume but improves quality. Default false.",
                        "default": false
                    },
                    "startUrls": {
                        "title": "Start URLs (URL mode)",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Bayut URLs. Each can be a property detail page (https://www.bayut.com/property/details-15597302.html) or a search page (https://www.bayut.com/for-sale/apartments/dubai/). URL mode auto-detects from these.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "propertyIds": {
                        "title": "Property externalIDs (property mode)",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "List of Bayut property externalIDs (e.g. '15597302'). Useful for bulk lookup. NOT internal numeric ids.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "agencyIds": {
                        "title": "Agency externalIDs (agency mode)",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Bayut agency externalIDs. Returns agency profile records. Set includeAgencyListings=true to also pull every listing the agency posts.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "agencyQuery": {
                        "title": "Agency name search (agency mode)",
                        "type": "string",
                        "description": "Free-text search across Bayut agency names. Returns agency profiles ranked by relevance."
                    },
                    "includeAgencyListings": {
                        "title": "Include agency listings",
                        "type": "boolean",
                        "description": "When true and agencyIds are provided, also push every property posted by those agencies. Counts toward maxResults.",
                        "default": false
                    },
                    "agentIds": {
                        "title": "Agent externalIDs (agent mode)",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Bayut agent externalIDs. Returns agent profile records (name, phone, agency, TruBroker badge, etc.).",
                        "items": {
                            "type": "string"
                        }
                    },
                    "agentQuery": {
                        "title": "Agent name search (agent mode)",
                        "type": "string",
                        "description": "Free-text search across Bayut agent names."
                    },
                    "includeAgentListings": {
                        "title": "Include agent listings",
                        "type": "boolean",
                        "description": "When true and agentIds are provided, also push every property posted by those agents. Counts toward maxResults.",
                        "default": false
                    },
                    "maxResults": {
                        "title": "Max results",
                        "minimum": 1,
                        "maximum": 5000,
                        "type": "integer",
                        "description": "Hard cap on records returned (1-5000). Caps cost at $0.005 per record + $0.00005 start. Default 50. Tune higher for bulk pulls.",
                        "default": 50
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
