Bayut Scraper | Property Listings in Five Markets avatar

Bayut Scraper | Property Listings in Five Markets

Pricing

from $2.20 / 1,000 results

Go to Apify Store
Bayut Scraper | Property Listings in Five Markets

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

kane liu

Maintained by Community

Actor stats

1

Bookmarked

4

Total users

3

Monthly active users

6 hours ago

Last modified

Security

Limited permissions

Share

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 scrapeDetails to true to 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.
MarketSiteDefault locationCurrency
AE — UAEbayut.comdubaiAED
SA — Saudi Arabiabayut.sariyadhSAR
EG — Egyptbayut.egcairoEGP
BH — Bahrainbayut.bhbahrainBHD
QA — Qatarbayut.qaqatarQAR

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.

FieldDescriptionExample
idListing identifier1234567
listingIdListing identifier as text"1234567"
urlLink to the listinghttps://www.bayut.com/property/details-1234567.html
marketCountry codeAE
channelSale or rental channelBUY
titleListing headlineExample two-bedroom apartment
descriptionAvailable listing descriptionApartment with balcony
priceDisplay price including currencyAED 2,100,000
priceAmountNumeric asking price2100000
currencyCurrency codeAED
pricePeriodRental period, when suppliedyearly
numBedroomsBedroom count2
numBathroomsBathroom count2
propertyTypeProperty categoryApartments
sizeProperty area when available115.5
sizeUnitArea unitsqm
addressStructured location; full is display text{"locality":"Dubai Marina","country":"AE"}
geoLatitude and longitude when availablenull
personNamed property agent{"name":"Jane Doe","role":"agent"}
orgAgency or brokerage{"name":"Example Realty","id":"123"}
phonesPublic contact numbers and source labels[{"value":"+1 555 0100","type":null}]
imagesAvailable image URLs[]
amenitiesListed features["Balcony"]
completionStatusCompletion status as suppliedcompleted
furnishingStatusFurnishing status as suppliedfurnished
offplanDetailsAvailable off-plan informationnull
paymentPlanSummariesAvailable payment-plan informationnull
leadSourceSearch-only or detail-enriched contact informationsearch
leadAbsencesReasons for missing contact fieldsMissing phone or address detail
scrapedAtCollection timestamp2026-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

  1. Open Bayut Scraper in Apify Console.
  2. Fill a target field such as market, location, or startUrls.
  3. Set maxItems to 3 for a small first run.
  4. Click Start and wait for the run to finish.
  5. 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

FieldWhat to enterDefault
startUrlsBayut search or listing URLsEmpty
marketAE, SA, EG, BH, QA, or allAE when omitted
marketsCountry-code list; overrides market when non-emptyEmpty
locationArea slug; leave empty for country defaultsdubai sample
channelBUY or RENTBUY
propertyTypeCategory such as apartments, villas, or property for all typesapartments
propertyTypesCategory list; overrides propertyType when non-emptyEmpty
expandPrimaryCategoriesExpand an all-property search into primary categoriesfalse
maxItemsRows per URL or market, from 1 to 2,00070; sample 3
maxPagesSearch-page limit, from 1 to 1001
scrapeDetailsAdd detail-page information to search rowsfalse
requestDelayMillisNot currently applied; leave unchanged800
maxMarketConcurrencyNumber of countries processed concurrently, from 1 to 51
strictQualityExclude rows with missing required metadata or invalid URLstrue

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
}
  • maxItems is the canonical row limit. maxResults, limit, and max_results are 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 market stops before row delivery with a message such as INVALID_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_REPORT record in the default key-value store records how the input was interpreted, including corrections, defaults, ignored fields, and errors. INPUT_ECHO records 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 planStart at 512 MBPrice per rowPrice 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
  • maxItems applies 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 (maxTotalChargeUsd in 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 ApifyClient
client = 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.

RoutePurpose
GET /Service information and readiness
GET /healthService health
GET /input-exampleSmall sample Actor input
GET /openapi.jsonOpenAPI 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

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, and bayut.qa are 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.unit is currently empty.
  • Email addresses, external agency websites, and social profiles are not extracted.
  • requestDelayMillis is 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.

More real estate and property data scrapers from the same publisher:

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.