Bayut UAE Real Estate Scraper
Pricing
Pay per usage
Bayut UAE Real Estate Scraper
Scrape normalized property listings from Bayut, the UAE's top real-estate portal — one row per listing with price, specs, geo-location, agency/agent details, DLD permit number, verification status, and amenities. Search by URL, purpose, location, or custom polygon.
Pricing
Pay per usage
Rating
0.0
(0)
Developer
DevilScrapes
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
🎯 What this scrapes
Bayut is the UAE's #1 property portal — Dubai, Abu Dhabi, Sharjah and every other emirate list for-sale and to-rent properties there first. This Actor wraps Bayut's own listing data directly, writing one structured row per property: price, bed/bath count, floor area, precise geo-coordinates, agency and agent details, the DLD Trakheesi permit number, TruCheck verification status, and amenity tags — a richer combined field set than any single Bayut scraper on the Apify Store ships today. Search by purpose + location, a custom polygon boundary, or direct search URLs.
🔥 What we handle for you
- 🛡️ Browser fingerprint rotation —
curl-cffiimpersonates real Chrome / Firefox / Safari TLS handshakes so the target sees a browser, not Python. - 🌐 Residential proxy rotation via Apify Proxy — fresh session and exit IP on every block.
- 🔁 Retries with exponential backoff on
408 / 429 / 5xx— up to 5 attempts per page,Retry-Afterhonoured. - 🧱 Rate-limit-aware pacing — when the target pushes back, we slow down instead of getting banned.
- 🧊 Clean, typed dataset rows — Pydantic-validated, ISO-8601 timestamps, stable IDs, JSON / CSV / Excel export straight from the Apify Console.
- 💰 Pay-Per-Event pricing — you only pay for results that hit your dataset. No data, no charge.
💡 Use cases
- Investor deal screening — pull every for-sale listing in a target area with price, size, and DLD permit number to spot underpriced units fast.
- Rental market tracking — snapshot to-rent listings across an emirate to build price-per-sqft benchmarks.
- Agency/agent lead lists — collect agency names, agent names, and (optionally) public phone numbers behind active listings.
- Polygon-bound area research — draw a custom boundary instead of picking a fixed emirate/area slug for hyper-local coverage.
⚙️ How to use it
- Click Try for free at the top of the page.
- Fill in the input form — most fields have sensible defaults.
- Click Start. Output streams into the run's dataset.
- Export from Storage → Dataset as JSON, CSV, or Excel — or fetch via the API.
📥 Input
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
searchUrls | array | no | '—' | Direct Bayut search URLs to scrape as-is, e.g. https://www.bayut.com/for-sale/apartments/dubai/downtown-dubai/. Up to 50 |
purpose | string | no | 'for-sale' | Sale vs. rent listings. Required (together with Location) if Search URLs and Polygon are unset. |
propertyType | string | no | 'apartments' | Bayut's own property-type vocabulary. |
location | string | no | 'dubai/downtown-dubai' | Emirate/area path slug, e.g. dubai/downtown-dubai. Required (together with Purpose) if Search URLs and Polygon are unset |
polygon | array | no | '—' | Custom search boundary — a list of at least 3 [lat, lng] pairs. Alternative to Purpose + Location / Search URLs. |
minBeds | integer | no | '—' | Minimum bedrooms (0 = studio). |
maxBeds | integer | no | '—' | Maximum bedrooms. |
minPrice | integer | no | '—' | Minimum price in AED. |
maxPrice | integer | no | '—' | Maximum price in AED. |
maxListings | integer | no | 50 | Hard cap on dataset rows for this run. |
locale | string | no | 'en' | Scrape the English or Arabic (/ar/) site mirror. |
includeAgentPhone | boolean | no | false | Enrich rows with the listing agent's public phone number, where exposed. |
proxyConfiguration | object | no | {"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"]} | Mandatory-by-default RESIDENTIAL — direct/datacenter-IP requests are blocked before reaching listing data. |
Example input
{"purpose": "for-sale","location": "dubai/downtown-dubai","propertyType": "apartments","maxListings": 3,"locale": "en","proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"]}}
📤 Output
Every row is one dataset item.
| Field | Type | Notes |
|---|---|---|
listing_id | string | Bayut internal ID — dedup key. |
listing_url | string | Canonical detail URL. |
locale | string | Locale fetched under — 'en' or 'ar'. |
title | string | Listing headline. |
purpose | string | 'for-sale' or 'to-rent'. |
property_type | string | e.g. 'apartments'. |
price_amount | ['number', 'null'] | Numeric price. |
price_currency | string | Always 'AED' in v1. |
price_frequency | ['string', 'null'] | 'yearly' for rent, null for sale. |
bedrooms | ['integer', 'null'] | 0 = studio. |
bathrooms | ['integer', 'null'] | Bathroom count. |
area_value | ['number', 'null'] | Numeric floor area. |
area_unit | ['string', 'null'] | 'sqft' or 'sqm', as displayed. |
location_hierarchy | array | Breadcrumb, coarse to fine ([0] = emirate). |
latitude | ['number', 'null'] | WGS-84 latitude. |
longitude | ['number', 'null'] | WGS-84 longitude. |
agency_name | ['string', 'null'] | Listing agency. |
agent_name | ['string', 'null'] | Listing agent. |
agent_phone | ['string', 'null'] | Set only if includeAgentPhone=true and public. |
permit_number | ['string', 'null'] | DLD Trakheesi ad-permit number. |
verified | boolean | Bayut 'TruCheck' badge. |
amenities | array | Amenity tags. |
photos_count | integer | Gallery photo count. |
listed_date | ['string', 'null'] | ISO YYYY-MM-DD. |
scraped_at | string | ISO-8601 UTC row creation timestamp. |
Example output
{"listing_id": "8523104","listing_url": "https://www.bayut.com/property/details-8523104.html","locale": "en","title": "Luxury 2BR | Burj Khalifa View","purpose": "for-sale","property_type": "apartments","price_amount": 2450000,"price_currency": "AED","price_frequency": null,"bedrooms": 2,"bathrooms": 3,"area_value": 1450.0,"area_unit": "sqft","location_hierarchy": ["Dubai","Downtown Dubai","Burj Khalifa"],"latitude": 25.1972,"longitude": 55.2744,"agency_name": "Example Real Estate Brokers","agent_name": "Jane Doe","agent_phone": "+971501234567","permit_number": "12345678","verified": true,"amenities": ["Balcony","Shared Pool","Covered Parking"],"photos_count": 18,"listed_date": "2026-07-15","scraped_at": "2026-07-20T14:00:00+00:00"}
💰 Pricing
Pay-Per-Event — you pay only when these events fire:
| Event | USD | What it is |
|---|---|---|
actor-start | $0.01 | One-off warm-up charge per run |
result-row | $0.002 | Charged for each listing row written to the dataset |
Example: 1 000 results at the rates above ≈ $2.01. No subscription, no minimum, no card to start — Apify gives every new account $5 of free credit.
🚧 Limitations
v1 covers UAE listings only — Saudi Arabia is a separate Bayut property and out of scope. Off-plan project microsites, the mortgage calculator, and area-guide content are not scraped. permit_number ships verbatim from the listing; it is not independently verified against DLD/RERA registries. verified reflects Bayut's own TruCheck badge flag, not OCR of the badge graphic.
❓ FAQ
Do I need a Bayut account or API key?
No. This Actor scrapes Bayut's own publicly listed property data — no login, no API key.
Why does this default to a residential proxy?
Bayut blocks direct/datacenter-IP requests before they reach listing data. We default proxyConfiguration to Apify's RESIDENTIAL group so runs clear that check without you tuning anything.
Can I search a custom area instead of a fixed emirate/area?
Yes — supply polygon as a list of at least 3 [lat, lng] pairs instead of purpose + location.
Does agent_phone always populate?
Only when includeAgentPhone is true and the agent's number is publicly exposed on the listing; otherwise it's null.
💬 Your feedback
Spotted a bug, hit a weird edge case, or need a new field? Open an issue on the Actor's Issues tab on Apify Console — we ship fixes weekly and we read every report.