Bayut Scraper | Property Listings in Five Markets
Pricing
from $2.20 / 1,000 results
Bayut Scraper | Property Listings in Five Markets
Collect Bayut sale and rental listings from the UAE, Saudi Arabia, Egypt, Bahrain, and Qatar. Export prices, property details, and public agent contacts when available. Pay per delivered listing row plus a start fee.
Pricing
from $2.20 / 1,000 results
Rating
0.0
(0)
Developer
kane liu
Maintained by CommunityActor stats
1
Bookmarked
4
Total users
3
Monthly active users
6 hours ago
Last modified
Categories
Security
Limited permissionsShare
Bayut Scraper
Extract Bayut sale and rental listings from the UAE, Saudi Arabia, Egypt, Bahrain, and Qatar as property rows you can export.
- Prices, currencies, bedrooms, bathrooms, size, and listing links.
- Structured locations, property broker or agency details, and public phone numbers when available.
- Optional detail enrichment for descriptions, amenities, photos, and project information.
- Search by market and location, or supply Bayut search and listing URLs.
- Pay for delivered rows: $3.00 per 1,000 rows on the Free plan, plus a start fee.
What does Bayut Scraper do?
Bayut Scraper collects property listings for sale or rent across five Bayut sites. Each dataset row represents one listing. Use the rows to compare asking prices, review rental stock, or organize property research. This is not a record of completed transactions.
- Search: choose a country, location, channel, and property type.
- URL input: provide search pages or individual listing pages in
startUrls. - Detail enrichment: set
scrapeDetailstotrueto add available detail-page information to search rows. It is off by default, enriches the same listing row, and does not create a separately billed add-on row.
| Market | Site | Default location | Currency |
|---|---|---|---|
AE — UAE | bayut.com | dubai | AED |
SA — Saudi Arabia | bayut.sa | riyadh | SAR |
EG — Egypt | bayut.eg | cairo | EGP |
BH — Bahrain | bayut.bh | bahrain | BHD |
QA — Qatar | bayut.qa | qatar | QAR |
What data can you extract from Bayut?
The fields below belong to the same listing row. Optional fields depend on what the listing shows and whether detail enrichment succeeds. Every delivered row has an identifier, title, numeric price, and URL; incomplete rows are not delivered or billed.
| Field | Description | Example |
|---|---|---|
id | Listing identifier | 1234567 |
listingId | Listing identifier as text | "1234567" |
url | Link to the listing | https://www.bayut.com/property/details-1234567.html |
market | Country code | AE |
channel | Sale or rental channel | BUY |
title | Listing headline | Example two-bedroom apartment |
description | Available listing description | Apartment with balcony |
price | Display price including currency | AED 2,100,000 |
priceAmount | Numeric asking price | 2100000 |
currency | Currency code | AED |
pricePeriod | Rental period, when supplied | yearly |
numBedrooms | Bedroom count | 2 |
numBathrooms | Bathroom count | 2 |
propertyType | Property category | Apartments |
size | Property area when available | 115.5 |
sizeUnit | Area unit | sqm |
address | Structured location; full is display text | {"locality":"Dubai Marina","country":"AE"} |
geo | Latitude and longitude when available | null |
person | Named property agent | {"name":"Jane Doe","role":"agent"} |
org | Agency or brokerage | {"name":"Example Realty","id":"123"} |
phones | Public contact numbers and source labels | [{"value":"+1 555 0100","type":null}] |
images | Available image URLs | [] |
amenities | Listed features | ["Balcony"] |
completionStatus | Completion status as supplied | completed |
furnishingStatus | Furnishing status as supplied | furnished |
offplanDetails | Available off-plan information | null |
paymentPlanSummaries | Available payment-plan information | null |
leadSource | Search-only or detail-enriched contact information | search |
leadAbsences | Reasons for missing contact fields | Missing phone or address detail |
scrapedAt | Collection timestamp | 2026-10-24T00:00:00+00:00 |
emails stays empty. External agency websites and social links are not extracted: web.website is null and web.socials is empty. leadReveal is visible, click, or absent, describing whether a public phone was visible, revealed on the page, or not obtained. These fields do not establish that a contact is current or reachable.
How to scrape Bayut
- Open Bayut Scraper in Apify Console.
- Fill a target field such as
market,location, orstartUrls. - Set
maxItemsto3for a small first run. - Click Start and wait for the run to finish.
- Open the dataset and download the rows, or read them through the API.
An empty input starts an example search for UAE apartments for sale in Dubai, using the form's sample values and a limit of three rows. Normal event prices apply. The Actor has one search mode, selected automatically when you fill a target field; there is no mode selector to configure.
Search by market and location
Use market for one country or markets for several. A non-empty markets list takes precedence over market. Leave location empty for each country's default location. The value dubai also changes to the local default outside the UAE. Use location slugs from Bayut URLs for a specific area.
Set channel to BUY or RENT. Choose one propertyType, or use propertyTypes for several categories sharing a market's row limit. Category availability varies by country.
Search or listing URLs
Paste supported Bayut search URLs or individual listing URLs into startUrls. Recognized search URLs determine the market, channel, category, and location instead of those form filters. Listing URLs select the individual properties directly. Keep the original Bayut URL structure; unrelated pages are not supported inputs.
What to fill in
| Field | What to enter | Default |
|---|---|---|
startUrls | Bayut search or listing URLs | Empty |
market | AE, SA, EG, BH, QA, or all | AE when omitted |
markets | Country-code list; overrides market when non-empty | Empty |
location | Area slug; leave empty for country defaults | dubai sample |
channel | BUY or RENT | BUY |
propertyType | Category such as apartments, villas, or property for all types | apartments |
propertyTypes | Category list; overrides propertyType when non-empty | Empty |
expandPrimaryCategories | Expand an all-property search into primary categories | false |
maxItems | Rows per URL or market, from 1 to 2,000 | 70; sample 3 |
maxPages | Search-page limit, from 1 to 100 | 1 |
scrapeDetails | Add detail-page information to search rows | false |
requestDelayMillis | Not currently applied; leave unchanged | 800 |
maxMarketConcurrency | Number of countries processed concurrently, from 1 to 5 | 1 |
strictQuality | Exclude rows with missing required metadata or invalid URLs | true |
Search input:
{"market": "AE","location": "dubai","channel": "BUY","propertyType": "apartments","maxItems": 3}
URL input using the same search mode:
{"startUrls": [{"url": "https://www.bayut.com/for-sale/apartments/dubai/"}],"maxItems": 3,"scrapeDetails": true}
maxItemsis the canonical row limit.maxResults,limit, andmax_resultsare accepted aliases.- Unknown fields do not fail input resolution. Close misspellings can be corrected; other unknown fields are ignored with a note.
- Invalid category filters can be dropped in favor of defaults. Check the interpreted input if the search differs from your intention.
- An invalid
marketstops before row delivery with a message such asINVALID_INPUT: market — market must be one of: AE, SA, EG, BH, QA, all. No rows are charged for this failure, although the start fee still applies. - The
INPUT_REPORTrecord in the default key-value store records how the input was interpreted, including corrections, defaults, ignored fields, and errors.INPUT_ECHOrecords the parsed settings.
Output example
This illustrative row shows the structure, not a currently verified property offer. Optional information can be empty.
{"id": 1234567,"listingId": "1234567","url": "https://www.bayut.com/property/details-1234567.html","source": "bayut","market": "AE","channel": "BUY","title": "Example two-bedroom apartment","price": "AED 2,100,000","priceAmount": 2100000,"currency": "AED","pricePeriod": null,"numBedrooms": 2,"numBathrooms": 2,"propertyType": "Apartments","size": 115.5,"sizeUnit": "sqm","address": {"street": null,"unit": null,"locality": "Dubai Marina","region": "Dubai","postalCode": null,"country": "AE","full": "Dubai Marina, Dubai, AE"},"geo": null,"person": {"name": "Jane Doe", "role": "agent"},"org": {"name": "Example Realty", "id": "123"},"phones": [],"emails": [],"web": {"website": null, "socials": []},"leadSource": "search","leadReveal": "absent","scrapedAt": "2026-10-24T00:00:00+00:00"}
Export the dataset as JSON, CSV, Excel, XML, RSS, or an HTML table. The OUTPUT and RUN_SUMMARY key-value store records contain counts and warnings; ERROR_SUMMARY contains failure details when written.
Why use this Bayut scraper?
- Pay for delivered rows. Listing rows are billed when written to the dataset, not for each page attempted.
- Keep delivered data. Rows already written remain in the dataset after a stop. A stop before delivery can leave it empty; this is not a promise to recover every unfinished search.
- Read specific errors. Input reports and failure records help explain what happened.
- Keep missing values honest. Optional fields stay empty rather than being invented.
- Combine inputs. Supply several URLs or markets in one run, subject to row and spending limits.
- Skip proxy setup. You do not need to set up proxies.
How much does it cost to scrape Bayut?
The Actor uses pay-per-event pricing. The start event costs $0.005 per allocated GB, with a minimum of one event. At the default 512 MB, a normal run has one start event costing $0.005. Platform usage is included in these prices.
| Apify plan | Start at 512 MB | Price per row | Price per 1,000 rows |
|---|---|---|---|
| Free | $0.005 | $0.0030 | $3.00 |
| Starter | $0.005 | $0.0030 | $3.00 |
| Scale | $0.005 | $0.0026 | $2.60 |
| Business | $0.005 | $0.0022 | $2.20 |
| Platinum | $0.005 | $0.0020 | $2.00 |
| Diamond | $0.005 | $0.0016 | $1.60 |
maxItemsapplies to each start URL, or each market without URLs. Its default is 70; larger requests are collected in parts. Property types within one market share that market's limit.- Free Apify plan users can run this Actor up to 10 times, with at most 200 rows across each run. These are developer-set limits. Paid plans remove those free-plan restrictions, not the input or spending limits.
- The whole run stops at the Maximum cost per run you set (
maxTotalChargeUsdin the API).
For example, three delivered listings on the Free plan at 512 MB cost 3 × $0.003 + $0.005 = $0.014. Requesting three rows is a ceiling, not a guarantee of three available properties. A run with no delivered rows has no row charge, but can still incur the start event.
Use with AI agents and the API
Apify MCP server (Claude, ChatGPT, Cursor, VS Code)
Add this Actor to an MCP client supporting remote servers:
https://mcp.apify.com?tools=lentic_clockss/bayut-uae-scraper
Sign in with Apify through OAuth, or send Authorization: Bearer <YOUR_APIFY_TOKEN>. The tool starts a run and returns run and dataset IDs; the agent can read rows with get-dataset-items. For clients without remote support, use npx @apify/actors-mcp-server --tools lentic_clockss/bayut-uae-scraper with APIFY_TOKEN set.
Example prompt: “Get three Bayut apartments for sale in Dubai, UAE, and show their prices, bedrooms, and listing links.”
Apify API
Python:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("lentic_clockss/bayut-uae-scraper").call(run_input={"market": "AE", "location": "dubai", "maxItems": 3})for row in client.dataset(run["defaultDatasetId"]).iterate_items():print(row)
JavaScript:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('lentic_clockss/bayut-uae-scraper').call({market: 'AE', location: 'dubai', maxItems: 3});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
For HTTP, send your JSON input to POST https://api.apify.com/v2/acts/lentic_clockss~bayut-uae-scraper/runs with the Authorization: Bearer header. After completion, read GET https://api.apify.com/v2/datasets/<datasetId>/items?format=json using the run's defaultDatasetId.
Standby HTTP endpoint
Base URL: https://lentic-clockss--bayut-uae-scraper.apify.actor.
| Route | Purpose |
|---|---|
GET / | Service information and readiness |
GET /health | Service health |
GET /input-example | Small sample Actor input |
GET /openapi.json | OpenAPI specification |
These routes provide information only; they do not collect listings. Start a normal Actor run for data. This Actor does not expose a collection route at this endpoint.
Integrations
Use the Actor's Integrations tab to connect results to Google Sheets, Make, Zapier, n8n, Slack, Airtable, or a webhook. Use Apify Schedules for repeated runs. Preserve url and scrapedAt when comparing results over time.
FAQ
Is it legal to scrape Bayut?
The Actor is intended for public listing data. You are responsible for complying with Bayut's terms and applicable data-protection law. Publicly accessible personal data still requires a lawful basis for collection and use; seek legal advice where needed.
Why did my run end as ABORTED?
A run can be stopped manually or by an external client. Check its status message and log for the actual reason. Automatic resumption is not supported for this Actor; do not assume an aborted run will restart. Rows already in the dataset remain available.
How many results can I get?
Set maxItems from 1 to 2,000 per URL or market. Available listings, page coverage, and your spending limit can reduce the result. Free-plan runs are capped at 200 rows in total. A limit does not guarantee that many matching listings exist.
Why are some fields empty?
Listings differ in detail. Search-only rows often contain fewer fields than detail-enriched rows. Enable scrapeDetails when you need additional information, but phones, coordinates, and amenities are not guaranteed.
Can I scrape Saudi Arabia or Egypt as well as the UAE?
Yes. Choose SA or EG; their default locations are riyadh and cairo. Bahrain and Qatar are also supported. markets accepts multiple countries. Jordan, Oman, and Kuwait are not supported.
Does detail enrichment create extra billed rows?
No. It merges additional information into each listing row. It can take longer, and a listing can still lack optional fields. Direct listing URLs select detail pages without requiring a search first.
Can I collect agent email addresses or contact sellers?
Email extraction is not supported. Public phone numbers may be returned, but are not guaranteed. The Actor does not place calls, send messages, or submit contact forms.
Why did my free-plan run stop after 10 runs?
The developer limits Free-plan users to 10 runs of this Actor. Check the run message and RUN_SUMMARY for FREE_TIER_LIMIT. A paid Apify plan removes this free-plan run limit.
Limitations
- Only
bayut.com,bayut.sa,bayut.eg,bayut.bh, andbayut.qaare supported. - Inputs must identify supported property searches or listing pages, not arbitrary Bayut content.
- Categories, listing availability, and optional field coverage vary by country and property.
- Detailed street addresses are not always present;
address.unitis currently empty. - Email addresses, external agency websites, and social profiles are not extracted.
requestDelayMillisis accepted but is not currently applied. Do not rely on it to control request timing.- The Actor does not provide date-window filters or automatic search-word translation.
Related scrapers
More real estate and property data scrapers from the same publisher:
- Zumper Scraper
- Booli Scraper
- Craigslist Scraper
- PropertyGuru Scraper
- OpenSooq Scraper
- Apartments.com Rental Scraper
- Dot Property Scraper
- FINN.no Scraper
Browse all of our scrapers at apify.com/lentic_clockss.
Support
Found a problem or need another field? Open an issue in the Issues tab of this Actor's page and include the run ID and the input you used.