Bayut.com Scraper - Properties, Prices, Agents & Contacts avatar

Bayut.com Scraper - Properties, Prices, Agents & Contacts

Pricing

from $0.80 / 1,000 results

Go to Apify Store
Bayut.com Scraper - Properties, Prices, Agents & Contacts

Bayut.com Scraper - Properties, Prices, Agents & Contacts

From $0.80/1K. Scrape Bayut.com property listings with prices, beds, baths, area, GPS, agent and agency details, phone, WhatsApp, email, RERA/Trakheesi permits, photos, amenities, and TruCheck verification dates.

Pricing

from $0.80 / 1,000 results

Rating

5.0

(1)

Developer

Abot API

Abot API

Maintained by Community

Actor stats

3

Bookmarked

87

Total users

15

Monthly active users

14 days ago

Last modified

Share

Bayut Scraper: UAE Property Listings, Prices & Agent Contacts

Bayut Scraper turns Bayut, the UAE's largest property portal, into structured data. Get for sale and to rent listings across Dubai, Abu Dhabi, Sharjah, Ras Al Khaimah, Ajman, Fujairah and Umm Al Quwain, with price, beds, baths, area, exact geocoordinates, agent name, mobile and WhatsApp, agency details, the full photo gallery and TruCheck verification status. Search by city and filters, or paste your own Bayut search URLs, then export to JSON, CSV or Excel, or pull results straight into your app through the API.

Why This Scraper?

  • 50+ fields per listing. Price, beds, baths, area, exact lat/lng, agent phone and WhatsApp, agency profile and TruCheck verification dates come back on every listing, with no extra step.
  • Two input modes. Pick a city and filters from the form, or paste any Bayut search URL you already refined in your browser.
  • Multi URL with forward pagination. Paste many search URLs in one run; each is walked page by page from wherever it starts.
  • For Sale and To Rent, every property type. Apartments, villas, townhouses, penthouses, hotel apartments, compounds, duplexes, land, full and half floors, whole buildings, bulk units and commercial.
  • All seven emirates. Dubai, Abu Dhabi, Sharjah, Ras Al Khaimah, Ajman, Fujairah and Umm Al Quwain.
  • TruCheck filter. Return only Bayut's vetted, RERA backed verified listings to skip agency spam.
  • Built for monitoring. Incremental mode returns only new, updated and expired listings on recurring runs, and a refused run fails loudly instead of quietly returning an empty dataset.

Use Cases

  • Real estate portals and CRMs: aggregate active listings across emirates into one comparable feed.
  • Market research and analytics: track asking prices, price per square foot and inventory by area, property type and purpose over time.
  • Lead generation: collect agent and agency names, mobile numbers and WhatsApp contacts for outreach.
  • Investment tracking: monitor off plan projects and completed developments, including payment plan summaries.
  • Recurring monitoring: schedule daily or weekly runs to catch new, updated or delisted properties in a saved search.

Data You Get

Sample shape: values are illustrative placeholders, not from a live listing.

FieldExample
externalID"00000001"
url"https://www.bayut.com/property/details-00000001.html"
purpose"for-sale" / "to-rent"
propertyType"apartments" / "villas" / "townhouses" / …
title / titleArabic"Sample Listing Title" / <Arabic title placeholder>
price / currency1000000 / "AED"
rentFrequency"yearly" / "monthly" / "weekly" / "daily" (rent only)
rooms / baths2 / 2
area / areaUnit100.0 / "sqm"
furnishingStatus"furnished" / "unfurnished" / "partly-furnished"
completionStatus"completed" / "off-plan"
country / city"UAE" / "Dubai"
neighbourhood / building"Sample Community" / "Sample Tower"
latitude / longitude25.0000 / 55.0000
isVerified / trucheckedAttrue / Unix timestamp (TruCheck)
agentName / agentExternalID"Agent Name" / "0000000"
phoneMobile / phoneWhatsapp"+971500000000" / "971500000000"
agencyName / agencyLicenses[]"Sample Agency" / [{"number": "00000", "authority": "RERA"}]
imageCount / images[]10 / photo URLs (800x600)
amenities[]grouped by category, for example Features, Building, Health and Fitness (with fetchDetails)
descriptionfull seller description text (with fetchDetails)
referenceNumber"REF-0001"
scrapedAtISO timestamp
changeType"NEW" / "UPDATED" / "UNCHANGED" / "REAPPEARED" / "EXPIRED" (incremental mode only)

Turning on detail enrichment (fetchDetails) additionally fills in description, descriptionArabic, amenities, the full images gallery, floorPlans, paymentPlans, isStudio and isDeveloper. Two fields, permitNumber and contactEmail, are always null: Bayut no longer publishes the Trakheesi permit or an agent email address on the public listing page, so use phoneMobile or phoneWhatsapp for contact instead. Incremental mode also adds changedFields, firstSeenAt and lastSeenAt.

How to Use

  1. Pick a mode: search (choose city and filters) or url (paste Bayut search links).
  2. For search mode, choose one or more emirates or areas, buy or rent, property type, and any price, bedroom, area or furnishing filters.
  3. Set Max total listings and, if needed, Max result pages, and turn on detail enrichment if you want the full description, amenities and payment plans.
  4. Click Start, then download the dataset as JSON, CSV or Excel, or read it through the API.

Search by city:

{
"mode": "search",
"locations": ["dubai"],
"purpose": "for-sale",
"propertyType": "apartments",
"maxPages": 5,
"fetchDetails": true
}

Search with price and bedroom filters:

{
"mode": "search",
"locations": ["dubai/dubai-marina", "dubai/downtown-dubai"],
"purpose": "for-sale",
"propertyType": "apartments",
"minPrice": 1500000,
"maxPrice": 4500000,
"minBedrooms": 2,
"maxBedrooms": 3,
"verifiedOnly": true,
"sortBy": "price-asc",
"maxPages": 10
}

Multi city sweep, to rent:

{
"mode": "search",
"locations": ["dubai", "abu-dhabi", "sharjah", "ras-al-khaimah", "ajman"],
"purpose": "to-rent",
"propertyType": "villas",
"rentFrequency": "yearly",
"maxPages": 3
}

Paste your own search URLs (URL mode):

{
"mode": "url",
"urls": [
"https://www.bayut.com/for-sale/villas/dubai/?price_min=5000000",
"https://www.bayut.com/to-rent/apartments/abu-dhabi/?rent_frequency=yearly&rooms_in=2,3"
],
"maxPages": 5,
"fetchDetails": true
}

Open Bayut in your browser, refine the filters you want, copy the resulting URL and paste it here. Filter mode fields such as locations, purpose and minPrice are ignored in URL mode; edit the URL itself to change what it fetches. Each URL is paginated forward independently, starting from its own page if the URL ends in /page-N/.

Run it from your code

Python:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("abotapi/bayut-com-scraper").call(run_input={
"mode": "search",
"locations": ["dubai"],
"purpose": "for-sale",
"propertyType": "apartments",
})
for listing in client.dataset(run["defaultDatasetId"]).iterate_items():
print(listing["title"], listing["price"], listing["currency"])

JavaScript:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('abotapi/bayut-com-scraper').call({
mode: 'search',
locations: ['dubai'],
purpose: 'for-sale',
propertyType: 'apartments',
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();

Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.

How Max result pages and Max total listings shape a run

Each search walks its result pages (24 listings per page) until it runs out on its own, an empty page or a page that repeats listings already collected, or until Max total listings (the run's only soft cap, default 20, set 0 for unlimited) is reached, whichever comes first. Set Max result pages to a number only when you want an explicit page cap below that natural stop.

Resume and recurring updates

  • Resume (resumeFromRunId) continues one specific interrupted or previous large pull: paste its run ID or dataset ID and this run loads the listings already saved there, skips them, and appends only new listings.
  • Incremental mode (incrementalMode) is for running the same search again and again, for example daily. The actor remembers the previous run of that search itself, so no run ID is needed. The first run returns everything as NEW; later runs return only NEW, UPDATED (with changedFields) and REAPPEARED listings by default. Turn on emitUnchanged or emitExpired to also get those rows back, billed. EXPIRED rows only appear once a run has scanned every tracked search to its natural end, never when a page or listing cap, a block, or a resume cut it short. stateKey names or shares one monitoring campaign; leave it empty and the actor derives a key from your city, filters or URL and the fetchDetails setting automatically.

Send results into your apps (MCP connectors)

Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step after the scrape; the Apify dataset is never changed.

What gets written to the connector: a condensed, human readable summary of each listing, not the full JSON. Each item becomes one entry with a title and its key fields flattened to plain text. The complete record always stays in the Apify dataset.

  1. Authorize a connector once under Apify → Settings → Integrations (Notion, Linear, Airtable, or Apify).
  2. Select it in the "Pipe results into your apps" input field. (If the picker is empty, you have not authorized a connector yet.)
  3. For Notion, also set notionParentPageUrl to the page where items should be created.

The connection is mediated by Apify's MCP proxy, so this actor never sees your third party credentials. Leave the field empty to skip.

Input Parameters

ParameterTypeDefaultDescription
modestringsearchsearch (pick city and filters) or url (paste Bayut search links).
locationsarray(none)City or area slugs for search mode, for example dubai, abu-dhabi, dubai/dubai-marina. Prefilled with ["dubai"].
purposestringfor-salefor-sale or to-rent. Search mode only.
propertyTypestringpropertyproperty (any residential), apartments, villas, townhouses, penthouses, hotel-apartments, compounds, duplex, land, full-floors, half-floors, whole-buildings, bulk-units, or commercial. Search mode only.
minPriceinteger(none)Minimum price in AED. Search mode only.
maxPriceinteger(none)Maximum price in AED. Search mode only.
minBedroomsinteger(none)Minimum bedrooms, 0 for studio. Search mode only.
maxBedroomsinteger(none)Maximum bedrooms. Search mode only.
minAreainteger(none)Minimum area in square feet. Search mode only.
maxAreainteger(none)Maximum area in square feet. Search mode only.
furnishingstringanyany, furnished, or unfurnished. Search mode only.
completionStatusstringanyany, completed (ready to move in), or off-plan. Search mode only.
rentFrequencystringanyany, yearly, monthly, weekly, or daily. Applies only when purpose is to-rent.
verifiedOnlybooleanfalseReturn only TruCheck verified listings. Search mode only.
sortBystringpopularpopular, newest, oldest, price-asc, price-desc, or verified-score-desc. Search mode only; URL mode keeps the sort already encoded in your pasted URL.
urlsarray(none)Bayut search URLs for URL mode. Multiple URLs are each paginated forward independently. Prefilled with a sample Dubai for sale URL.
maxPagesinteger0Safety bound on result pages walked per location or URL (24 listings per page). 0 means unlimited, bounded by the natural stop or maxListings.
maxListingsinteger20The sole soft cap on the run, applied across all locations and URLs. 0 means unlimited.
fetchDetailsbooleanfalseEnrich every listing with its full description, amenities, photo gallery, floor plans and payment plans. Billed per enriched listing.
proxyobject(none)Proxy connection settings. Prefilled with Apify residential proxy, country AE.
mcpConnectorsarray(none)Optional: send a summary of each listing to apps you authorized under Apify Settings, Integrations.
notionParentPageUrlstring(none)Notion connector only: page under which listing pages are created.
maxNotifyListingsinteger50Cap on items written to each connector per run. Does not affect the dataset.
resumeFromRunIdstring(none)Continue one specific interrupted or previous run: listings already saved there are skipped and only new listings are appended.
incrementalModebooleanfalseReturn only new, updated and expired listings on recurring runs of the same search.
stateKeystring(none)Name or share an incremental mode monitoring campaign. Left empty, the actor derives a key from your search automatically.
emitUnchangedbooleanfalseIncremental mode only. Also return listings unchanged since the last run, marked UNCHANGED, billed.
emitExpiredbooleanfalseIncremental mode only. Also return listings no longer found after a complete scan, marked EXPIRED, billed.

Output Example

Sample shape: values are illustrative placeholders, not from a live listing.

{
"externalID": "00000001",
"id": 10000000,
"url": "https://www.bayut.com/property/details-00000001.html",
"purpose": "for-sale",
"propertyType": "apartments",
"title": "Sample Listing Title",
"price": 1000000,
"currency": "AED",
"rentFrequency": null,
"rooms": 2,
"baths": 2,
"area": 100.0,
"areaUnit": "sqm",
"furnishingStatus": "unfurnished",
"completionStatus": "completed",
"country": "UAE",
"city": "Dubai",
"neighbourhood": "Sample Community",
"building": "Sample Tower",
"latitude": 25.0000,
"longitude": 55.0000,
"isVerified": true,
"verificationStatus": "verified",
"verifiedAt": 1700000000,
"trucheckedAt": 1700000000,
"agentName": "Agent Name",
"agentExternalID": "0000000",
"phoneMobile": "+971500000000",
"phonePhone": "+97140000000",
"phoneWhatsapp": "971500000000",
"phoneProxy": "+97140000000",
"agencyName": "Sample Agency",
"agencyExternalID": "0000",
"agencySlug": "sample-agency-0000",
"agencyLicenses": [{ "number": "00000", "authority": "RERA" }],
"isStudio": false,
"isDeveloper": false,
"permitNumber": null,
"referenceNumber": "REF-0001",
"images": ["https://images.bayut.com/thumbnails/000000000-800x600.jpeg"],
"imageCount": 10,
"amenities": [
{
"group": "Features",
"items": [
{ "slug": "balcony-or-terrace", "text": "Balcony or Terrace", "value": null },
{ "slug": "parking-spaces", "text": "Parking Spaces", "value": "1" }
]
}
],
"amenitiesFlat": ["balcony-or-terrace", "parking-spaces", "centrally-air-conditioned"],
"description": "Full seller description text appears here when fetchDetails is true.",
"createdAt": 1700000000,
"updatedAt": 1700000000,
"scrapedAt": "2026-01-01T00:00:00.000Z"
}

Plan Requirement

Apify residential proxy, with country set to AE, is the default and is recommended for reliable access to Bayut. You can also supply your own residential proxy URLs through the Connection field. A non-residential connection may return empty or blocked pages more often.

FAQ

How much does it cost?

You pay per listing returned. Turning on detail enrichment (fetchDetails) adds a per-listing charge for the extra fields it fetches. The Pricing tab shows current rates, and Max total listings caps the size, and therefore the cost, of any run.

This actor collects only publicly available property listing data. You are responsible for how you use it: follow Bayut's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Listing facts such as price and specifications are generally not protected, but photos, logos and agency branding may be subject to third party rights.

Can I track new or changed listings on a schedule?

Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. The first run returns every matching listing as NEW; later runs return only new, updated and reappeared listings, and unchanged ones are not billed unless you turn that on.

Why does URL mode ignore my price and bedroom filters?

Filter fields like locations, purpose, minPrice and minBedrooms only apply in search mode. URL mode is a pure pass-through of the links you paste, so change the filters in the URL itself, for example by adjusting it on bayut.com before copying it in.

Why did my run fail instead of returning an empty dataset?

If every search in the run could not get a single readable page after every retry the site allowed, the run fails with a message asking you to run it again in a few minutes, rather than reporting a successful empty result. A run also fails immediately, before any scraping, if a pasted resumeFromRunId does not match a run or dataset your account can read, if resumeFromRunId is combined with incrementalMode for a search that already has saved incremental state (remove the resume ID or set a different stateKey), or if the proxy configuration cannot be resolved. A genuinely empty search, where the site answered normally but no listings matched your filters, still completes successfully with 0 results.

Can I use this with AI agents or MCP?

Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable.

🔗 Want more real estate data?

Pair this actor with these related scrapers from the same team:

🚗 Dubizzle.com Scraper
From $1/1K. Scrape dubizzle.com across the UAE for property, motors, and agent listings...
🏠 Propertyfinder UAE
From $0.8/1K. Extract property listings from propertyfinder.ae at scale. Get...
🏠 Rent.com Scraper
Extract rental listings from rent.com. Get comprehensive data including monthly rent...
🏠 Dot Property + Lamudi PH Scraper
Scrape Philippines property listings from dotproperty.com.ph and lamudi.com.ph with exact...
🏠 Otodom Pl
Pull property listings from Otodom.pl. Apartments, houses, plots, commercial, garages...
🏠 Property24
From $1/1K. Extract structured property listings from Property24, South Africa’s largest...

👉 Browse all abotapi scrapers

💬 Support & custom scrapers

  • 🐞 Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
  • 🛠️ Need another site, extra fields or a private build? Email abotapi@proton.me or message Telegram @abotapi.
  • ⭐ Enjoying it? A quick review on the actor page helps other users find it.