Bayut Dubai $0.8๐Ÿ’ฐ URL Search | Location Filters | Rich Output avatar

Bayut Dubai $0.8๐Ÿ’ฐ URL Search | Location Filters | Rich Output

Pricing

from $0.80 / 1,000 results

Go to Apify Store
Bayut Dubai $0.8๐Ÿ’ฐ URL Search | Location Filters | Rich Output

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

Abot API

Maintained by Community

Actor stats

1

Bookmarked

33

Total users

14

Monthly active users

2 days ago

Last modified

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.

FieldExample
externalID00000001
urlhttps://www.bayut.com/property/details-00000001.html
purposefor-sale / to-rent
propertyTypeproperty / apartments / villas / townhouses / โ€ฆ
titleSample Listing Title
titleArabic<Arabic title placeholder>
price (AED)1000000
currencyAED
rentFrequencyyearly / monthly / weekly / daily (rent only)
rooms, baths2, 2
area, areaUnit100.0, sqm
furnishingStatusfurnished / unfurnished / partly-furnished
completionStatuscompleted / off-plan
country, cityUAE, Dubai
neighbourhoodSample Community
buildingSample Tower
latitude, longitude25.0000, 55.0000
isVerifiedtrue (TruCheck verified)
verifiedAt, trucheckedAtUnix timestamps
agentName, agentExternalIDAgent Name, 0000000
phoneMobile, phonePhone+971500000000, +97140000000
phoneWhatsapp, phoneProxy971500000000, +97140000000
agencyName, agencyExternalIDSample Agency, 0000
agencyLogohttps://bayut-production.s3.eu-central-1.amazonaws.com/image/...
permitNumber00000000000 (Trakheesi)
referenceNumberREF-0001
images[]Full gallery, high-res CDN URLs
amenities[]Grouped by category (Features, Building, Health & Fitness, Recreation & Family, โ€ฆ)
descriptionFull seller description (when fetchDetails=true)
paymentPlans[]For off-plan listings
createdAt, updatedAt, reactivatedAtUnix timestamps
scrapedAtISO timestamp
changeTypeNEW / UPDATED / UNCHANGED / REAPPEARED / EXPIRED (incremental mode only โ€” see "Resume & recurring updates" below)
changedFields, firstSeenAt, lastSeenAtIncremental 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

ParameterTypeDefaultDescription
modestringsearchsearch (use filters) or url (paste URLs)
locationsstring[]["dubai"]City / area slugs (search mode). Examples: dubai, abu-dhabi, dubai/dubai-marina.
urlsstring[]-Bayut search URLs (URL mode). Multiple URLs supported with forward pagination per URL.
purposestringfor-salefor-sale or to-rent
propertyTypestringpropertyproperty (any), apartments, villas, townhouses, penthouses, hotel-apartments, compounds, duplex, land, full-floors, half-floors, whole-buildings, bulk-units, commercial
minPrice, maxPriceint-Price range in AED
minBedrooms, maxBedroomsint-Bedroom range (0 = studio)
minArea, maxAreaint-Area range in square feet
furnishingstringanyany, furnished, unfurnished
completionStatusstringanyany, completed, off-plan
rentFrequencystringanyany, yearly, monthly, weekly, daily (rent only)
verifiedOnlybooleanfalseOnly TruCheck-verified listings
sortBystringpopularpopular, newest, oldest, price-asc, price-desc, verified-score-desc
maxPagesint0Safety 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.
maxListingsint20The sole soft cap on the run, applied across all locations/URLs. 0 means unlimited.
fetchDetailsbooltrueAdds description, amenities, full gallery, permit, payment plans
proxyobjectApify residential AEUAE residential strongly recommended
resumeFromRunIdstring(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.
incrementalModebooleanfalseDaily/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.
stateKeystring(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.
emitUnchangedbooleanfalseIncremental mode only. Also return listings unchanged since the last run, marked UNCHANGED. Adds and bills extra rows you already have.
emitExpiredbooleanfalseIncremental 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 pullresumeFromRunId
Run the same search every day and receive only changesincrementalMode
Keep separate daily campaigns for similar searchesdistinct 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.

  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 haven't 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.

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.