# Bayut Scraper | UAE Saudi Egypt Bahrain Qatar (`lentic_clockss/bayut-uae-scraper`) Actor

Scrape Bayut UAE, Saudi Arabia, Egypt, Bahrain & Qatar listings for sale or rent. Extract prices, beds, agency & photos. Bayut API alternative.

- **URL**: https://apify.com/lentic\_clockss/bayut-uae-scraper.md
- **Developed by:** [kane liu](https://apify.com/lentic_clockss) (community)
- **Categories:** Real estate, Lead generation, Automation
- **Stats:** 1 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.50 / 1,000 results

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

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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

**Scrape Bayut sale and rent listings across the Middle East — then download structured real estate data as Excel, CSV, or JSON.**

This Actor is a practical **Bayut API alternative** for market research, investor screening, rental comps, and lead lists. Choose a market such as **UAE** or **Saudi Arabia**, pick **Buy** or **Rent**, and get listing rows with prices, beds, baths, area, agency, verification, amenities, and photos when present on the detail page.

- Pull **homes for sale** and **apartments for rent** from [Bayut UAE](https://www.bayut.com), [Saudi Arabia](https://www.bayut.sa), [Egypt](https://www.bayut.eg), [Bahrain](https://www.bayut.bh), and [Qatar](https://www.bayut.qa)
- Enrich search results with **detail-page fields** (description, amenities, off-plan / payment plans, media)
- Filter by **property type** (apartments, villas, office-spaces, …) — or paste known **search / detail URLs**
- Export to **Excel / CSV / JSON**, or connect Make, n8n, Zapier, Python, or MCP
- **Pay per event** — Actor start + each Dataset listing; no subscription

---

### What does the Bayut Scraper do?

It turns a Bayut search into a clean Apify Dataset of property listings across five MENA markets.

Under the hood, the Actor:

1. Builds the Bayut search URL for your market, channel, location, and property type
2. Opens pages in Patchright Chrome (**CloakBrowser**) with a market-matched residential proxy
3. Collects listing cards from `window.state.algolia.content.hits[]`
4. Optionally opens detail pages and merges `window.state.property.data`
5. Writes normalized records you can download or push into automations

Residential proxy matched to the market is recommended. Plain HTTP / curl is blocked by Bayut Captcha on most hosts.

---

### What data can you extract from Bayut?

| Data point | Buy | Rent |
| --- | :---: | :---: |
| Title & listing URL | ✅ | ✅ |
| List price or rent + period | ✅ | ✅ |
| Beds / baths / size (sqm) | ✅ | ✅ |
| Property type & purpose | ✅ | ✅ |
| Market + currency | ✅ | ✅ |
| Address / location tree | ✅ | ✅ |
| GPS coordinates (when shown) | ✅ | ✅ |
| Agency / contact availability | ✅ | ✅ |
| Verification / product labels | ✅ | ✅ |
| Amenities & photo gallery | ✅ | ✅ |
| Off-plan / payment plans | ✅ | — |
| Completion / furnished | ✅ | ✅ |

Every Dataset row also includes `scrapedAt` and `source` = `bayut`. An `OUTPUT` / `RUN_SUMMARY` record in the key-value store reports counts and warnings.

---

### Why scrape Bayut property listings?

#### Market research and comps

Build sale and rent comps for Dubai, Riyadh, Cairo, Bahrain, and Qatar without copy-pasting from the site.

#### Investor and off-plan screening

Track prices, completion status, and payment-plan summaries when Bayut exposes them on the detail page.

#### Lead lists and agency coverage

Collect public agency names, listing URLs, and contact-method availability (without clicking Call / WhatsApp / Email).

#### Automations and AI agents

Schedule runs and send Datasets to Sheets, Slack, CRM, Make, n8n, Zapier, or an AI agent via Apify MCP / API.

---

### How to scrape Bayut (no code required)

1. Click **Try for free**
2. Choose a **market** (`AE` / `SA` / `EG` / `BH` / `QA`)
3. Choose a **channel** (Buy or Rent)
4. Optionally set **location**, **property type**, max listings, and whether to open detail pages
5. Keep **Apify RESIDENTIAL** proxy enabled (leave country empty for auto match)
6. Click **Start** — open the **Dataset** tab when the run finishes

Start with `maxItems: 5–10` and `scrapeDetails: false` to verify, then scale up.

<details>
<summary>For developers: minimal input</summary>

```json
{
  "market": "AE",
  "channel": "BUY",
  "location": "dubai",
  "propertyType": "apartments",
  "maxItems": 10,
  "maxPages": 1,
  "scrapeDetails": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"]
  }
}
````

Multi-market:

```json
{
  "markets": ["BH", "QA"],
  "channel": "BUY",
  "propertyType": "apartments",
  "maxItems": 6,
  "scrapeDetails": false
}
```

</details>

***

### Markets covered

| Code | Site | Default location | Currency | URL style |
| --- | --- | --- | --- | --- |
| `AE` | [bayut.com](https://www.bayut.com) | `dubai` | AED | `/for-sale/{type}/{loc}/` |
| `SA` | [bayut.sa](https://www.bayut.sa) | `riyadh` | SAR | `/en/for-sale/{type}/{loc}/` |
| `EG` | [bayut.eg](https://www.bayut.eg) | `cairo` | EGP | `/en/{loc}/{type}-for-sale/` |
| `BH` | [bayut.bh](https://www.bayut.bh) | `bahrain` | BHD | `/en/for-sale/{type}/{loc}/` |
| `QA` | [bayut.qa](https://www.bayut.qa) | `qatar` | QAR | `/en/for-sale/{type}/{loc}/` |

Use `markets: ["BH", "QA"]` or `market: "all"` for multi-country runs (`maxItems` is fair-split). Jordan, Oman, and Kuwait are out of scope for now.

***

### Pricing — how much does it cost to scrape Bayut?

**Pay per event. No subscription.**

| Event | Price | When charged |
| --- | ---: | --- |
| `apify-actor-start` (**Actor Start**) | **$0.005** | When a normal run starts (scaled by allocated memory GB; min 1 event) |
| `apify-default-dataset-item` (**result**) | **$2.50 / 1,000** ($0.0025 each) | Each listing written to the default Dataset |

**User pays platform usage costs: Yes** — compute, residential proxy, and other platform usage are billed to the user in addition to event charges.

**Example product charges (events only):**

| Scenario | Approx. event charge |
| --- | ---: |
| Canary: 10 listings | $0.005 + 10 × $0.0025 = **$0.030** |
| City scan: 100 listings | $0.005 + $0.25 = **$0.255** |
| 1,000 listings | $0.005 + $2.50 = **$2.505** |

Platform usage (especially residential proxy + browser memory) is separate and depends on run duration and memory. Default memory is **2048 MB** (≈ 2× Actor Start events under PPE).

> **Note:** The Actor path remains `bayut-uae-scraper` for API compatibility; the product covers UAE, Saudi Arabia, Egypt, Bahrain, and Qatar.

***

### Input

| Field | Description |
| --- | --- |
| `market` / `markets` | `AE`, `SA`, `EG`, `BH`, `QA`, or `all` |
| `channel` | `BUY` (for-sale) or `RENT` (to-rent / for-rent) |
| `location` | Path slug; empty → market default (`dubai`, `riyadh`, `cairo`, …) |
| `propertyType` / `propertyTypes` | e.g. `apartments`, `villas`, `office-spaces` (`property` / `all` = market all-types) |
| `expandPrimaryCategories` | Expand `all` into primary slugs instead of one all-types URL |
| `maxItems` / `maxPages` | Caps (1–2000 / 1–100); ≈24 listings per SRP page |
| `maxMarketConcurrency` | Parallel country browser sessions (default 2) |
| `strictQuality` | Fail run if required Dataset fields are missing (default true) |
| `scrapeDetails` | Enrich each card from the listing detail page |
| `startUrls` | Optional SRP or LDP URLs (overrides market/channel/type) |
| `proxyConfiguration` | Apify RESIDENTIAL recommended; omit country for per-market match |

Open the **Input** tab in Console for the full form and tooltips.

***

### Output example

You can download the Dataset as **JSON, CSV, Excel, or HTML**.

```json
{
  "id": 11786692,
  "listingId": "11786692",
  "externalId": "11786692",
  "url": "https://www.bayut.com/property/details-11786692.html",
  "source": "bayut",
  "market": "AE",
  "channel": "BUY",
  "title": "Spacious 2 Bedroom Apartment in Downtown Dubai",
  "price": "AED 2,100,000",
  "priceAmount": 2100000,
  "currency": "AED",
  "numBedrooms": 2,
  "numBathrooms": 2,
  "propertyType": "Apartments",
  "size": 115.5,
  "sizeUnit": "sqm",
  "address": "Downtown Dubai · Dubai",
  "agency": { "name": "Example Realty" },
  "scrapedAt": "2026-07-19T04:00:00+00:00"
}
```

***

### Is it legal to scrape Bayut?

Our scrapers are ethical and do not extract private user data such as emails, phone numbers from lead forms, or WhatsApp chats. They only extract what is publicly shown on listing pages. Personal data may still appear in public listing text; personal data is protected by the GDPR in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason. If you are unsure, consult your lawyers. Always respect Bayut’s Terms of Use and robots rules for automated access.

This Actor does **not** click Call, WhatsApp, Email, or other lead CTAs.

***

### FAQ

#### Can I scrape Bayut UAE apartments for sale?

Yes. Set `market` to `AE`, `channel` to `BUY`, `location` to `dubai` (or another slug), and `propertyType` to `apartments`.

#### Can I scrape Bayut Saudi Arabia or Egypt?

Yes. Use `market: "SA"` (default location `riyadh`) or `market: "EG"` (default location `cairo`). Egypt uses SEO URLs such as `/en/cairo/apartments-for-rent/`.

#### Does this work as a Bayut API?

There is no official public Bayut listings API for this use case. This Actor is a practical **Bayut API alternative** that returns structured Dataset rows you can call via the Apify API, schedules, or integrations.

#### Why do I need a residential proxy?

Bayut challenges non-browser and many datacenter IPs with Captcha. Apify RESIDENTIAL proxies matched to the market country are strongly recommended.

#### What about Live View / Standby?

Standby mode exposes **operational** endpoints only (`/`, `/health`, `/input-example`, `/openapi.json`) — documented in the **Standby** tab. It does **not** run a full scrape. Always start a **normal Actor run** to collect listings.

#### Can I request Jordan / Oman / Kuwait?

Not yet. Those markets raise a clear input validation error (`JO` / `OM` / `KW`). Supported markets: `AE`, `SA`, `EG`, `BH`, `QA`.

#### Where can I get help?

Open an Issue on the Actor page in Apify Console with the Run ID, input JSON, and a short description of the failure. Include whether Captcha or empty results appeared in the log.

***

### Tips for better Bayut scraping

- Start small (`maxItems: 5`, `scrapeDetails: false`) to validate a market before large runs
- Leave `apifyProxyCountry` empty so each market uses a matching residential country
- Prefer specific `propertyType` values when you need a category; `property` / `all` uses the market all-types slug
- For multi-market runs, leave `location` empty so each market uses its default city
- Raise memory only if the browser is unstable — higher memory increases Actor Start event count under PPE

# Actor input Schema

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

Bayut search (SRP) or listing detail (LDP) URLs for any supported host (bayut.com / .sa / .eg / .bh / .qa). Search URLs override market/channel/location when provided.

## `market` (type: `string`):

Single market code. Use markets=\[] or market=all for all active countries. JO/OM/KW are not supported yet.

## `markets` (type: `array`):

Optional list of market codes. Overrides market when non-empty. Include "all" to expand to AE+SA+EG+BH+QA.

## `channel` (type: `string`):

BUY (for-sale) or RENT (to-rent). Ignored when startUrls include search URLs.

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

Bayut location path slug. Leave empty to use each market default (dubai / riyadh / cairo / bahrain / qatar). If set to dubai on a non-AE market, the market default is used instead.

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

Category slug in the URL path. property / properties / all = market all-types slug.

## `propertyTypes` (type: `array`):

Optional list of category slugs. Overrides propertyType when non-empty. Fair-split maxItems across URLs.

## `expandPrimaryCategories` (type: `boolean`):

When true and propertyType is all/property, expand to primary slugs (apartments, villas, shops, …) instead of a single all-types SRP.

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

Maximum listing records to emit (fair-split across markets × types when building URLs).

## `maxPages` (type: `integer`):

Maximum SRP pages to crawl per search URL (≈24 listings per page).

## `scrapeDetails` (type: `boolean`):

When true, open each listing LDP and merge window.state.property.data.

## `requestDelayMillis` (type: `integer`):

Pause before the first navigation of a page fetch (ms).

## `maxMarketConcurrency` (type: `integer`):

How many country browser sessions may run in parallel (1–5). Higher uses more memory/proxy.

## `strictQuality` (type: `boolean`):

Fail the run if Dataset rows miss required fields (url/source/market/channel/scrapedAt) or have invalid URLs.

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

Apify RESIDENTIAL recommended. Leave apifyProxyCountry empty so each market uses a matching country (AE/SA/EG/BH/QA). Setting a country forces that proxy for all markets.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.bayut.com/for-sale/apartments/dubai/"
    }
  ],
  "market": "AE",
  "markets": [],
  "channel": "BUY",
  "location": "",
  "propertyType": "property",
  "propertyTypes": [],
  "expandPrimaryCategories": false,
  "maxItems": 25,
  "maxPages": 1,
  "scrapeDetails": true,
  "requestDelayMillis": 800,
  "maxMarketConcurrency": 2,
  "strictQuality": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `listings` (type: `string`):

Normalized Bayut listing records from SRP and optional LDP enrichment.

## `runSummary` (type: `string`):

Counts, engine, and timestamps for the run.

# 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 = {
    "startUrls": [
        {
            "url": "https://www.bayut.com/for-sale/apartments/dubai/"
        }
    ],
    "markets": [],
    "propertyTypes": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("lentic_clockss/bayut-uae-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 = {
    "startUrls": [{ "url": "https://www.bayut.com/for-sale/apartments/dubai/" }],
    "markets": [],
    "propertyTypes": [],
}

# Run the Actor and wait for it to finish
run = client.actor("lentic_clockss/bayut-uae-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 '{
  "startUrls": [
    {
      "url": "https://www.bayut.com/for-sale/apartments/dubai/"
    }
  ],
  "markets": [],
  "propertyTypes": []
}' |
apify call lentic_clockss/bayut-uae-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Bayut Scraper | UAE Saudi Egypt Bahrain Qatar",
        "description": "Scrape Bayut UAE, Saudi Arabia, Egypt, Bahrain & Qatar listings for sale or rent. Extract prices, beds, agency & photos. Bayut API alternative.",
        "version": "0.4",
        "x-build-id": "SeM8T3aBPAZFUKA3P"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/lentic_clockss~bayut-uae-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-lentic_clockss-bayut-uae-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/lentic_clockss~bayut-uae-scraper/runs": {
            "post": {
                "operationId": "runs-sync-lentic_clockss-bayut-uae-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/lentic_clockss~bayut-uae-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-lentic_clockss-bayut-uae-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": {
                    "startUrls": {
                        "title": "Start URLs",
                        "type": "array",
                        "description": "Bayut search (SRP) or listing detail (LDP) URLs for any supported host (bayut.com / .sa / .eg / .bh / .qa). Search URLs override market/channel/location when provided.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "market": {
                        "title": "Market",
                        "enum": [
                            "AE",
                            "SA",
                            "EG",
                            "BH",
                            "QA",
                            "all"
                        ],
                        "type": "string",
                        "description": "Single market code. Use markets=[] or market=all for all active countries. JO/OM/KW are not supported yet.",
                        "default": "AE"
                    },
                    "markets": {
                        "title": "Markets (multi)",
                        "type": "array",
                        "description": "Optional list of market codes. Overrides market when non-empty. Include \"all\" to expand to AE+SA+EG+BH+QA.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "channel": {
                        "title": "Channel",
                        "enum": [
                            "BUY",
                            "RENT"
                        ],
                        "type": "string",
                        "description": "BUY (for-sale) or RENT (to-rent). Ignored when startUrls include search URLs.",
                        "default": "BUY"
                    },
                    "location": {
                        "title": "Location slug",
                        "type": "string",
                        "description": "Bayut location path slug. Leave empty to use each market default (dubai / riyadh / cairo / bahrain / qatar). If set to dubai on a non-AE market, the market default is used instead.",
                        "default": ""
                    },
                    "propertyType": {
                        "title": "Property type",
                        "enum": [
                            "property",
                            "apartments",
                            "villas",
                            "townhouses",
                            "penthouse",
                            "hotel-apartments",
                            "villa-compound",
                            "residential-plots",
                            "residential-lands",
                            "residential-floor",
                            "residential-building",
                            "chalets",
                            "farms",
                            "office-spaces",
                            "offices",
                            "shops",
                            "warehouses",
                            "showrooms",
                            "industrial-land",
                            "commercial-plots",
                            "commercial-villas",
                            "commercial-floors",
                            "buildings",
                            "factories",
                            "labour-camps"
                        ],
                        "type": "string",
                        "description": "Category slug in the URL path. property / properties / all = market all-types slug.",
                        "default": "property"
                    },
                    "propertyTypes": {
                        "title": "Property types (multi)",
                        "type": "array",
                        "description": "Optional list of category slugs. Overrides propertyType when non-empty. Fair-split maxItems across URLs.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "expandPrimaryCategories": {
                        "title": "Expand primary categories",
                        "type": "boolean",
                        "description": "When true and propertyType is all/property, expand to primary slugs (apartments, villas, shops, …) instead of a single all-types SRP.",
                        "default": false
                    },
                    "maxItems": {
                        "title": "Max listings",
                        "minimum": 1,
                        "maximum": 2000,
                        "type": "integer",
                        "description": "Maximum listing records to emit (fair-split across markets × types when building URLs).",
                        "default": 25
                    },
                    "maxPages": {
                        "title": "Max search pages",
                        "minimum": 1,
                        "maximum": 100,
                        "type": "integer",
                        "description": "Maximum SRP pages to crawl per search URL (≈24 listings per page).",
                        "default": 1
                    },
                    "scrapeDetails": {
                        "title": "Scrape detail pages",
                        "type": "boolean",
                        "description": "When true, open each listing LDP and merge window.state.property.data.",
                        "default": true
                    },
                    "requestDelayMillis": {
                        "title": "Delay between requests (ms)",
                        "minimum": 0,
                        "maximum": 15000,
                        "type": "integer",
                        "description": "Pause before the first navigation of a page fetch (ms).",
                        "default": 800
                    },
                    "maxMarketConcurrency": {
                        "title": "Max market concurrency",
                        "minimum": 1,
                        "maximum": 5,
                        "type": "integer",
                        "description": "How many country browser sessions may run in parallel (1–5). Higher uses more memory/proxy.",
                        "default": 2
                    },
                    "strictQuality": {
                        "title": "Strict quality gate",
                        "type": "boolean",
                        "description": "Fail the run if Dataset rows miss required fields (url/source/market/channel/scrapedAt) or have invalid URLs.",
                        "default": true
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Apify RESIDENTIAL recommended. Leave apifyProxyCountry empty so each market uses a matching country (AE/SA/EG/BH/QA). Setting a country forces that proxy for all markets.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ]
                        }
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
