Bayut Dubai $0.8๐ฐ URL Search | Location Filters | Rich Output
Pricing
from $0.80 / 1,000 results
Bayut Dubai $0.8๐ฐ URL Search | Location Filters | Rich Output
From $0.8/1K. Extract property listings from bayut.com. Get fully-detailed listings with price, bedrooms, baths, area, geocoordinates, agent name + mobile + WhatsApp + email, agency profile, RERA/Trakheesi permit, full photo gallery, categorised amenities, and TruCheck verification dates.
Pricing
from $0.80 / 1,000 results
Rating
5.0
(1)
Developer
Abot API
Maintained by CommunityActor stats
1
Bookmarked
33
Total users
14
Monthly active users
2 days ago
Last modified
Categories
Share
Bayut.com Scraper
Extract property listings from bayut.com - the UAE's largest property portal. Get fully-detailed listings with price, bedrooms, baths, area, geocoordinates, agent name + mobile + WhatsApp + email, agency profile, RERA/Trakheesi permit, full photo gallery, categorized amenities, and TruCheck verification dates.
Why This Scraper?
- 50+ fields per listing - including direct lat/lng, agent phone + WhatsApp, agency logo, RERA/Trakheesi permit number, TruCheck verification date, full photo gallery, and grouped amenities.
- Two input modes - pick city + filter from the form, or paste any bayut.com search URL you already refined in your browser.
- Multi-URL with forward pagination - paste many search URLs, each is walked page-by-page from where it starts.
- For Sale and To Rent - apartments, villas, townhouses, penthouses, hotel apartments, compounds, duplex, land, full/half floors, whole buildings, bulk units, commercial.
- All seven emirates supported - Dubai, Abu Dhabi, Sharjah, Ras Al Khaimah, Ajman, Fujairah, Umm Al Quwain.
- TruCheck filter - only return Bayut's vetted-by-RERA verified listings to skip agency spam.
- Fast and lightweight - ~80 MB peak memory; tens of listings per second on a UAE residential proxy.
- Resilient session management - automatic session refresh and proxy rotation so a long run keeps producing results even when your residential pool ages.
Data You Get
Examples below are illustrative placeholders, not from a live listing.
| Field | Example |
|---|---|
externalID | 00000001 |
url | https://www.bayut.com/property/details-00000001.html |
purpose | for-sale / to-rent |
propertyType | property / apartments / villas / townhouses / โฆ |
title | Sample Listing Title |
titleArabic | <Arabic title placeholder> |
price (AED) | 1000000 |
currency | AED |
rentFrequency | yearly / monthly / weekly / daily (rent only) |
rooms, baths | 2, 2 |
area, areaUnit | 100.0, sqm |
furnishingStatus | furnished / unfurnished / partly-furnished |
completionStatus | completed / off-plan |
country, city | UAE, Dubai |
neighbourhood | Sample Community |
building | Sample Tower |
latitude, longitude | 25.0000, 55.0000 |
isVerified | true (TruCheck verified) |
verifiedAt, trucheckedAt | Unix timestamps |
agentName, agentExternalID | Agent Name, 0000000 |
phoneMobile, phonePhone | +971500000000, +97140000000 |
phoneWhatsapp, phoneProxy | 971500000000, +97140000000 |
agencyName, agencyExternalID | Sample Agency, 0000 |
agencyLogo | https://bayut-production.s3.eu-central-1.amazonaws.com/image/... |
permitNumber | 00000000000 (Trakheesi) |
referenceNumber | REF-0001 |
images[] | Full gallery, high-res CDN URLs |
amenities[] | Grouped by category (Features, Building, Health & Fitness, Recreation & Family, โฆ) |
description | Full seller description (when fetchDetails=true) |
paymentPlans[] | For off-plan listings |
createdAt, updatedAt, reactivatedAt | Unix timestamps |
scrapedAt | ISO timestamp |
changeType | NEW / UPDATED / UNCHANGED / REAPPEARED / EXPIRED (incremental mode only โ see "Resume & recurring updates" below) |
changedFields, firstSeenAt, lastSeenAt | Incremental mode only |
How to Use
Search by City
{"mode": "search","locations": ["dubai"],"purpose": "for-sale","propertyType": "apartments","maxPages": 5,"fetchDetails": true}
Search with Price + Bed 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
{"mode": "search","locations": ["dubai","abu-dhabi","sharjah","ras-al-khaimah","ajman"],"purpose": "to-rent","propertyType": "villas","rentFrequency": "yearly","maxPages": 3}
Multiple URLs (URL mode)
Open Bayut in your browser, refine filters, copy the resulting URL, paste each one here. URL mode supports many URLs in a single run; each is paginated forward independently. Filter-mode fields are ignored in 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","https://www.bayut.com/for-sale/property/sharjah/page-3/"],"maxPages": 5,"fetchDetails": true}
Input Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
mode | string | search | search (use filters) or url (paste URLs) |
locations | string[] | ["dubai"] | City / area slugs (search mode). Examples: dubai, abu-dhabi, dubai/dubai-marina. |
urls | string[] | - | Bayut search URLs (URL mode). Multiple URLs supported with forward pagination per URL. |
purpose | string | for-sale | for-sale or to-rent |
propertyType | string | property | property (any), apartments, villas, townhouses, penthouses, hotel-apartments, compounds, duplex, land, full-floors, half-floors, whole-buildings, bulk-units, commercial |
minPrice, maxPrice | int | - | Price range in AED |
minBedrooms, maxBedrooms | int | - | Bedroom range (0 = studio) |
minArea, maxArea | int | - | Area range in square feet |
furnishing | string | any | any, furnished, unfurnished |
completionStatus | string | any | any, completed, off-plan |
rentFrequency | string | any | any, yearly, monthly, weekly, daily (rent only) |
verifiedOnly | boolean | false | Only TruCheck-verified listings |
sortBy | string | popular | popular, newest, oldest, price-asc, price-desc, verified-score-desc |
maxPages | int | 0 | Safety bound on result pages walked per URL / location (~24 listings per page). 0 (default) means unlimited: the walk stops on its own once a page comes back empty or repeats listings already collected, or sooner once maxListings is reached. Set a number only for an explicit page cap below that natural stop. |
maxListings | int | 20 | The sole soft cap on the run, applied across all locations/URLs. 0 means unlimited. |
fetchDetails | bool | true | Adds description, amenities, full gallery, permit, payment plans |
proxy | object | Apify residential AE | UAE residential strongly recommended |
resumeFromRunId | string | (none) | Continue one specific previous run/dataset: listings already saved there are loaded before scraping starts and skipped, so this run only appends new listings. For recurring daily monitoring of the same search, use incrementalMode instead โ see "Resume & recurring updates" below. |
incrementalMode | boolean | false | Daily/recurring monitoring of the same search. First run returns everything as NEW; later runs return only NEW/UPDATED/REAPPEARED by default. See "Resume & recurring updates" below. |
stateKey | string | (none) | Optional name for a monitoring campaign, so its incremental state stays stable or is deliberately shared. Auto-derived from your city/filters/URL and fetchDetails setting when left empty. |
emitUnchanged | boolean | false | Incremental mode only. Also return listings unchanged since the last run, marked UNCHANGED. Adds and bills extra rows you already have. |
emitExpired | boolean | false | Incremental mode only. Also return listings from a previous run no longer found, marked EXPIRED, once a run has fully scanned every tracked search (not capped, not blocked mid-search, not a resume). Adds and bills extra synthetic rows. |
By default maxPages is 0 (unlimited): a search or URL entry walks every result page until Bayut naturally runs out โ an empty page, or a page that keeps repeating listings already collected โ or until maxListings (the run's only soft cap, default 20, set 0 for unlimited) is reached, whichever comes first. Set maxPages to a number only when you want an explicit page cap below that natural stop.
Resume & recurring updates
Two different features solve two different problems:
| You want to... | Use |
|---|---|
| Continue one specific interrupted or previous large walk-all pull | resumeFromRunId |
| Run the same search every day and receive only changes | incrementalMode |
| Keep separate daily campaigns for similar searches | distinct stateKey values |
Resume (resumeFromRunId) continues one specific interrupted or previous large pull: paste a run ID or dataset ID and this run loads the listings already saved there, skips them, and appends only new listings to a fresh dataset. An automatic same-run checkpoint also protects against platform migrations/resurrects without any input needed.
Incremental mode (incrementalMode) is for a schedule (for example, daily): the actor remembers the previous run of the same search by itself, so you never paste a run ID. The first run returns everything as NEW. Later runs return only NEW, UPDATED, and REAPPEARED listings by default โ duplicates and unchanged listings are suppressed (and not charged, including the detail-page surcharge). Turn on emitUnchanged or emitExpired only when you also want those rows returned (and billed for). State is isolated per city/filters/URL and fetchDetails setting automatically; set stateKey to name or deliberately share a monitoring campaign.
EXPIRED rows (when emitExpired is on) are only produced once a run proves it scanned every tracked search to its natural end โ never when maxListings/maxPages capped it, a search was blocked partway through, or resumeFromRunId was used (a resumed run is a partial scan by definition). Otherwise the previous state for those listings is kept as-is and a log line explains why EXPIRED was skipped this run.
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, and the Apify dataset is never changed.
What gets written to the connector: a condensed, human-readable summary of each record (not the full JSON). Each item becomes one entry with a title (the listing's name / address) and its key fields flattened to plain text. Nested objects are collapsed to their main value and long lists are trimmed. The complete record always stays in the Apify dataset.
- Authorize a connector once under Apify โ Settings โ Integrations (Notion, Linear, Airtable, or Apify).
- Select it in the "Pipe results into your apps" input field. (If the picker is empty, you haven't authorized a connector yet.)
- For Notion, also set
notionParentPageUrlto 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.
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": "property","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","permitNumber": "00000000000","referenceNumber": "REF-0001","images": ["https://images.bayut.com/thumbnails/000000000-800x600.jpeg"],"imageCount": 10,"panoramaCount": 0,"videoCount": 0,"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=true.","createdAt": 1700000000,"updatedAt": 1700000000,"scrapedAt": "2026-01-01T00:00:00.000Z"}
Plan Requirement
Residential proxy access is strongly recommended. The actor will warn and fall back to a backup datacenter pool if your residential pool is unavailable, but first-attempt success on residential is far more reliable.
- Recommended (Apify Starter or above): Use Apify residential with
country: "AE". This is the default. - Free plan: Apify Free does NOT include residential. Bring your own residential proxy URLs (Bright Data, Oxylabs, SmartProxy, IPRoyal) via the proxy field's "Custom proxy URLs" option.
- Custom (BYO): A non-residential pool may produce empty pages. The actor warns up front and still tries - residential is cheaper end-to-end.