Dubai Real Estate Location Scraper
Pricing
from $3.00 / 1,000 property scrapeds
Dubai Real Estate Location Scraper
γ ππππ $π¬.π¬π¬π―/π½πΏπΌπ½π²πΏππ γπ Market's best price! Extract 1000+ Bayut listings in minutes instead of hours. Stop copying Dubai & UAE properties manually! Advanced filters (price, rooms, area, agency), clean JSON/CSV. Zero technical skills needed. Real estate pros choose us! π―
Pricing
from $3.00 / 1,000 property scrapeds
Rating
5.0
(3)
Developer
SIΓN OΓ
Actor stats
4
Bookmarked
24
Total users
17
Monthly active users
20 hours ago
Last modified
Categories
Share
Dubai Real Estate Location Scraper - Extract UAE Property Areas, Coordinates & Listing Counts π
π Get Every Bayut Location β Plus Full Property Listings With Prices, Photos, Agents & Amenities
One actor, two modes: build a complete UAE/KSA/Egypt property location database AND extract live listings with 50+ data points each
π Overview
The Bayut Property Scraper gives you the complete intelligence behind Bayut's property portal. Run it in two modes:
- Location mode β every city, neighbourhood, and sub-area with GPS coordinates and live listing counts
- Property mode β full property listings inside any location: prices, photos, agent contact details, amenities, permit numbers, floor plans, and 50+ data points per record
Coverage spans the full Bayut footprint: United Arab Emirates (Dubai, Abu Dhabi, Sharjah), Saudi Arabia, and Egypt β anywhere realtyAPI's Bayut endpoint reaches.
Perfect for proptech developers, real estate agents, market analysts, and lead-generation teams who need structured property intelligence.
Why real estate professionals choose us:
- β Two modes in one actor: location autocomplete + full property search, no extra setup
- π GPS Coordinates Included: Latitude & longitude on every record β map-ready instantly
- π Live Listing Counts: See exactly how many active properties exist in each area
- π 50+ Property Fields: Price, beds, baths, area, photos, amenities, agent contact, permit number
- π― 25+ Search Filters: Price range, area, bedrooms, furnishing, completion status, agency, media filters, and more
- π Direct Agent Contact: Listing agent name + mobile/office/WhatsApp numbers
- π Bulk Mode (PAID): Process multiple locations or location IDs in a single run
- π° Risk-Free Trial: Test with FREE tier, no credit card required
β¨ Features
Location mode:
- πΊοΈ Full hierarchy: Level 1 (city), Level 2 (neighbourhood), Level 3 (sub-area) with parent tracking
- π GPS coordinates (
lat+lng) for every location - π
adCountshows real-time listing supply per area - π’ Internal + external Bayut IDs for API integration
Property mode:
- π·οΈ Listing essentials:
price,rentFrequency,purpose,propertyTitle,slug - π Specs:
rooms,baths,area,plotArea,pricePerSqft,categoryName(apartment, villa, townhouse, β¦) - β¨ Features:
furnishingStatus,completionStatus,amenitiesarray,permitNumber,floorPlanID - πΈ Media:
coverPhotoUrl,photoUrlsarray,photoCount,videoCount,panoramaCount - π€ Agent:
agentName,phoneMobile,phoneOffice,phoneWhatsapp,agentIsTruBroker,agentSlug - π’ Agency:
agencyName,agencyId,agencyLogoUrl,agencySlug,agencyTier - π Geography:
city,neighbourhood,lat,lng - π Timestamps:
createdAt,updatedAt,reactivatedAt,scrapedAt
π¬ Quick Start
Get listings in Dubai Marina, for sale:
curl -X POST 'https://api.apify.com/v2/acts/sian.agency/bayut-property-scraper/runs?token=YOUR_TOKEN' \-H 'Content-Type: application/json' \-d '{"location_external_id": "5002", "purpose": "for-sale"}'
Find the location ID for "Marina" first:
curl -X POST 'https://api.apify.com/v2/acts/sian.agency/bayut-property-scraper/runs?token=YOUR_TOKEN' \-H 'Content-Type: application/json' \-d '{"locationName": "Marina", "pageNumber": 0}'
π Getting Started
This actor runs in two modes. Pick whichever fits the job β or chain them.
Mode 1: Location Autocomplete (Step 1)
Start here when you don't know the location_external_id yet, or when you need a clean location database for an autocomplete UI / map.
- Type a city or area name in
locationName(e.g.Dubai,Marina,Abu Dhabi) - Click Run
- Get a list of matching locations, each with its
externalID,lat,lng, andadCount
Mode 2: Property Search (Step 2)
Use the externalID from Mode 1 as location_external_id, set purpose (for-rent or for-sale), and add any filters you want.
- Set
location_external_id(e.g.5002for Dubai Marina) - Set
purposetofor-rentorfor-sale(required) - Optionally apply filters (price range, beds, baths, furnishing, agency, etc.)
- Click Run
- Get full property listings with prices, photos, agents, and amenities
Mode detection: if you supply location_external_id (or bulkLocationExternalIds), the actor runs Property Search. Otherwise it runs Location Autocomplete.
π₯ Input Configuration
Step 1 β Location Autocomplete
| Field | Type | Required | Description |
|---|---|---|---|
locationName | string | Yes (single mode) | Location name to look up (e.g. Dubai, Marina) |
bulkLocationNames | array | No | Multiple location names per run (PAID tier) |
pageNumber | integer | No | Autocomplete page (0-indexed). Default 0. |
Step 2 β Property Search
| Field | Type | Required | Description |
|---|---|---|---|
location_external_id | string | Yes (single mode) | The externalID from Step 1 (e.g. 5002) |
bulkLocationExternalIds | array | No | Multiple location IDs per run (PAID tier) |
purpose | string | Yes | for-rent or for-sale |
hitsPerPage | integer | No | Listings per page (1β100, default 25) |
page | integer | No | Property results page (0-indexed) |
Step 2 β Optional Property Filters
| Field | Type | Description |
|---|---|---|
category | string | residential or commercial |
category_external_id | string | Specific property type: apartment, villa, townhouse, penthouse, hotel apartment, villa compound, residential plot/floor/building, office, shop, warehouse, labour camp, commercial villa/plot/floor/building, factory, industrial land, mixed-use land, showroom, other commercial |
min_price / max_price | string | Price range in local currency (AED/SAR/EGP) |
min_area / max_area | string | Area range in square feet |
rooms | string | Bedrooms β studio, 1β7 |
baths | string | Bathrooms β 1β7 |
furnishingStatus | string | furnished / unfurnished |
rent_frequency | string | daily / weekly / monthly / yearly (rent only) |
completionStatus | string | under-construction / completed (sale only) |
product | string | hot (featured) / superhot (premium) listings only |
hasFloorplan | boolean | Only listings with a floor plan |
hasPanorama | boolean | Only listings with a 360Β° panorama |
hasVideo | boolean | Only listings with a video |
agency_external_ids | string | Comma-separated agency IDs to filter by |
Single-location property search:
{"location_external_id": "5002","purpose": "for-sale","min_price": "500000","max_price": "2000000","rooms": "2","hitsPerPage": 25}
Location autocomplete:
{"locationName": "Dubai Marina","pageNumber": 0}
Bulk property search (PAID):
{"bulkLocationExternalIds": ["5002", "5003", "5004"],"purpose": "for-rent","hasVideo": true}
π€ Output
Location records (Mode 1)
| Field | Type | Description |
|---|---|---|
locationId | integer | Bayut's internal location ID |
externalID | string | External reference ID (use this in Mode 2) |
name | string | Location name |
slug | string | URL slug used in Bayut links |
locationType | string | city, neighbourhood, or unknown |
level | integer | 1 = city, 2 = neighbourhood, 3 = sub-area |
parent | string | Parent location name |
lat / lng | number | GPS coordinates |
adCount | integer | Active listings count |
originalLocationName | string | The search input that returned this match |
page / scrapedAt | int / string | Pagination + ISO timestamp |
Property records (Mode 2)
Listing essentials, specs, features, media, agent + agency contact, geography, and timestamps. Full field list:
| Group | Fields |
|---|---|
| IDs | propertyId, externalID, referenceNumber, permitNumber, searchLocationExternalId |
| Listing | propertyTitle, slug, purpose, product, isVerified, score |
| Pricing | price, pricePerSqft, rentFrequency, hidePrice |
| Specs | rooms, baths, area, plotArea, categoryName, categoryExternalID |
| Features | furnishingStatus, completionStatus, amenities, keywords, floorPlanID |
| Media | coverPhotoUrl, photoUrls (array), photoCount, videoCount, panoramaCount |
| Agent | agentName, agentSlug, agentExternalID, agentPhotoUrl, agentIsTruBroker, contactName, phoneMobile, phoneOffice, phoneWhatsapp |
| Agency | agencyName, agencyId, agencyExternalID, agencySlug, agencyLogoUrl, agencyTier |
| Geography | city, neighbourhood, lat, lng, locationPurposeTier |
| Timestamps | createdAt, updatedAt, reactivatedAt, scrapedAt |
Some fields are returned as
nullwhen the upstream listing doesn't have them populated (e.g.rentFrequencyisnullon for-sale listings,permitNumberisnullfor unverified or off-plan listings).
Example property record:
{"propertyId": 12345678,"externalID": "12345678","propertyTitle": "Stunning 2BR Apartment with Marina View","purpose": "for-sale","price": 1850000,"pricePerSqft": 1542.5,"rooms": 2,"baths": 3,"area": 1200,"categoryName": "Apartment","furnishingStatus": "furnished","completionStatus": "completed","isVerified": true,"permitNumber": "12345-67","photoCount": 24,"coverPhotoUrl": "https://images.bayut.com/...","photoUrls": ["https://images.bayut.com/...", "..."],"agentName": "Jane Doe","phoneMobile": "+9715XXXXXXXX","phoneWhatsapp": "+9715XXXXXXXX","agencyName": "Marina Real Estate","city": "Dubai","neighbourhood": "Dubai Marina","lat": 25.0819,"lng": 55.1367,"amenities": ["Central A/C", "Balcony", "Maids Room", "Shared Pool"],"scrapedAt": "2026-05-07T10:30:00.000Z"}
πΌ Use Cases & Examples
1. Build a UAE Property Search Tool
Input: Mode 1 β locationName: "", paginate
Output: Full location ID + name + slug database
Use: Populate location dropdowns, validate user input, build the autocomplete layer
2. Live Property Feed for a Marketplace
Input: Mode 2 β location_external_id: "5002", purpose: "for-sale"
Output: Every active for-sale listing in Dubai Marina with photos, prices, agents
Use: Power your own property aggregator or comparison site
3. Real-Estate Agent Lead Generation
Input: Mode 2 β filter by agency_external_ids to track competitor listings, or scrape an entire neighbourhood
Output: agentName + phoneMobile + phoneWhatsapp + listing count per agent
Use: Identify top-performing agents, build a contact list (respect local rules β see legal note)
4. Market Heat Map
Input: Mode 1 β locationName: "Dubai"
Output: All Dubai neighbourhoods with lat, lng, adCount
Use: Plot bubbles on Google Maps / Mapbox sized by listing volume β instant supply-side heat map
5. Investment Analysis (Yield Estimation)
Input: Mode 2 β same location twice: once purpose: "for-sale", once purpose: "for-rent"
Output: pricePerSqft for sale + monthly rents for the same area
Use: Compute gross rental yield per neighbourhood, spot under-priced vs over-priced areas
6. Permit Compliance Monitoring
Input: Mode 2 β scrape any city, filter by isVerified: false (via post-process)
Output: Listings with missing or invalid permitNumber
Use: Flag potentially non-compliant listings for regulators or aggregators
π Integration Examples
JavaScript/Node.js
const { ApifyClient } = require('apify-client');const client = new ApifyClient({ token: 'YOUR_TOKEN' });// Step 1: location lookupconst locRun = await client.actor('sian.agency/bayut-property-scraper').call({locationName: 'Dubai Marina',});const { items: locations } = await client.dataset(locRun.defaultDatasetId).listItems();const dubaiMarinaId = locations[0].externalID;// Step 2: property searchconst propRun = await client.actor('sian.agency/bayut-property-scraper').call({location_external_id: dubaiMarinaId,purpose: 'for-sale',min_price: '500000',max_price: '2000000',hitsPerPage: 25,});const { items: properties } = await client.dataset(propRun.defaultDatasetId).listItems();console.log(`Found ${properties.length} listings β first: ${properties[0].propertyTitle} @ AED ${properties[0].price}`);
Python
from apify_client import ApifyClientclient = ApifyClient('YOUR_TOKEN')# Step 1loc_run = client.actor('sian.agency/bayut-property-scraper').call(run_input={'locationName': 'Dubai Marina'})locations = list(client.dataset(loc_run['defaultDatasetId']).iterate_items())dubai_marina_id = locations[0]['externalID']# Step 2prop_run = client.actor('sian.agency/bayut-property-scraper').call(run_input={'location_external_id': dubai_marina_id,'purpose': 'for-rent','rent_frequency': 'yearly',})for p in client.dataset(prop_run['defaultDatasetId']).iterate_items():print(f"{p['propertyTitle']}: AED {p['price']}/yr β {p['rooms']}BR")
cURL
# Property search β Dubai Marina, for sale, 2BR, with videocurl -X POST 'https://api.apify.com/v2/acts/sian.agency/bayut-property-scraper/runs?token=YOUR_TOKEN' \-H 'Content-Type: application/json' \-d '{"location_external_id": "5002","purpose": "for-sale","rooms": "2","hasVideo": true,"hitsPerPage": 25}'
N8N Workflow
- Trigger: schedule daily / on-demand
- HTTP Request 1: call actor with
locationNameto resolve target areas - Loop: for each location, HTTP Request 2 with its
externalID+purpose - Action: write to Google Sheets, Airtable, Postgres, or hand off to a CRM
π Performance & Reliability
- Output per page: up to 25 location records (Mode 1) or up to 100 property listings (Mode 2, controlled by
hitsPerPage) - FREE tier: 5 records per run β enough to validate inputs and try the output shape
- PAID tier: unlimited records + bulk mode (
bulkLocationNames,bulkLocationExternalIds) - Coverage: any market reachable by realtyAPI's Bayut endpoint β UAE, Saudi Arabia, Egypt
- Timeout: up to 7 days
- Memory: 128 MB (lightweight, cost-efficient)
π° Pricing
View current pricing in Apify Console
FREE Tier (Testing & Validation)
- 5 records per run (works in both modes)
- Full feature access β same output quality as PAID
- No credit card required
PAID Tier (Production)
- Unlimited records per run
- Bulk mode: scrape multiple locations or location IDs in one run
- Priority processing
π― Start with FREE β upgrade when you're ready to go full scale!
β Frequently Asked Questions
Q: Which countries are covered? A: Bayut covers the UAE (Dubai, Abu Dhabi, Sharjah), Saudi Arabia, and Egypt. Use Mode 1 to discover any location in those markets, then Mode 2 to extract its listings.
Q: Do I need to run Mode 1 before Mode 2?
A: Only the first time. Once you have the location_external_id for the area you care about, save it β it doesn't change. After that, you can call Mode 2 directly.
Q: What's the difference between for-sale and for-rent?
A: purpose switches the upstream search. For-sale records carry completionStatus; for-rent records carry rentFrequency. The other fields are identical.
Q: Are agent phone numbers always included?
A: For most listings, yes β phoneMobile, phoneOffice, and phoneWhatsapp are populated when the agency provides them. Some listings (typically high-end or off-market) may hide contact info.
Q: What's permitNumber?
A: In the UAE, every legitimate property listing must carry a regulator-issued permit number (DLD/RERA in Dubai, ADREC in Abu Dhabi). It's null on listings that don't have one β useful for compliance monitoring.
Q: How do I paginate through all results?
A: For Mode 1, increment pageNumber until a page returns no results. For Mode 2, increment page (note: zero-indexed) β combine with hitsPerPage: 100 to minimise calls.
Q: Can I filter by amenities?
A: Yes via the boolean filters (hasFloorplan, hasPanorama, hasVideo) and indirectly via category_external_id. The richer amenities array is returned per listing for post-filtering (Central A/C, Balcony, Pool, Gym, etc.).
Q: Is it legal to scrape Bayut data? A: This actor extracts publicly available data β the same data visible to any visitor on Bayut. No private user data is extracted. See the disclaimer below.
π Troubleshooting
No results returned (Mode 1)
- Try a broader
locationName(e.g. "Dubai" instead of "Dubai Marina Creek") - Increase
pageNumberif you've already pulled the first page
No results returned (Mode 2)
- Confirm
purposeis set (for-rentorfor-sale) β it's required - Confirm the
location_external_idis valid β re-run Mode 1 to verify - Loosen filters: very tight price/area ranges or rare combinations of bedrooms + completionStatus may return zero matches
Run charges a record but the dataset looks empty
- Most likely a timeout or upstream error β check the run log; the
finallyblock still pushes a retry-helper record so you can resume
βοΈ Is it legal to scrape Bayut data?
This actor extracts publicly available property data β the same listings, agent contact details, and prices any visitor can see on Bayut. It does not access private user accounts or content behind authentication.
However, listings include personal data (agent contacts) which is protected by GDPR and the UAE Data Protection Law, plus equivalent regulations in Saudi Arabia and Egypt. Use the data responsibly: legitimate B2B research, price benchmarking, internal CRM enrichment. Do not use it for unsolicited bulk marketing without consent. If in doubt, consult your legal team.
Read more: Apify's blog post on the legality of web scraping
π€ Support
Join our active support community
- Questions, issues, or feature requests β open an issue
- Browse more tools β SIΓN Agency Store
- βοΈ hello@sian-agency.online
Built by SIΓN Agency | More Tools
β Enjoying this actor? Leave a 5-star review β it helps other real estate professionals find it!
βοΈ Disclaimer
This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Bayut or any of its subsidiaries. All trademarks mentioned are the property of their respective owners.