Bayut KSA Property Scraper avatar

Bayut KSA Property Scraper

Pricing

from $2.20 / 1,000 property listings

Go to Apify Store
Bayut KSA Property Scraper

Bayut KSA Property Scraper

Extract property listings from Bayut.sa with optional full listing details and agent information.

Pricing

from $2.20 / 1,000 property listings

Rating

0.0

(0)

Developer

Data Scrapers

Data Scrapers

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Categories

Share

Bayut KSA Property Scraper creates a structured dataset of property listings collected from Bayut Saudi Arabia. Each dataset item is one listing and can include the listing id, purpose, price in SAR, rooms, baths, area, location path, cover image, and public URL. Query by purpose, city or neighbourhood, category, and property type, optionally add the listing page and the agent profile, limit results with maxItems, and retrieve records through the Apify Dataset API or export them as JSON, CSV, Excel, XML, or another supported format.

Bayut KSA Property Scraper — input to structured data

Dataset at a glance

PropertyValue
Sourcebayut.sa
Record unitOne property listing
Input methodspurpose, location, category, subCategory, and the other filters
Main identifiersexternalID and id
DeliveryApify Dataset and API
Export formatsJSON, CSV, Excel, XML, and other Apify dataset exports
Update modelFresh records per Actor run
Pricing$2.50 per 1,000 listings, $2.00 per 1,000 detail fetches, $1.50 per 1,000 agent profiles on the free plan

Coverage and available records

The Actor searches Bayut Saudi Arabia. purpose is for-sale or for-rent. location is a city, neighbourhood, or path. Set parentLocation when location is a neighbourhood and needs a parent city. Category is residential or commercial. subCategory is a property-type slug such as apartments or villas.

Other filters: completion status (all, ready, off-plan), rent frequency, furnishing, bedroom and bathroom bounds, area in square feet, and price in SAR. superHot limits the search to superhot for-sale listings.

maxPages defaults to 1. An empty value means all pages. maxItems defaults to 0, which means no item cap. The prefill is 100.

The search card includes title, Arabic title, price, rooms, baths, area, geography, location hierarchy, category, cover image, photo and video counts, agency, verification, and the public propertyUrl. The Actor also writes priceFormatted, propertyType, fullAddress, coverImageUrl, agencyName, and agencyUrl.

scrapePropertyDetails adds propertyDetails and amenities. scrapeAgentInformation adds agentInformation. Both are off by default. The saved Riyadh sample had both on. Phone numbers and an agent email were present on that listing. They are not copied into the example below.

Not currently collected: a sold-price history, or listings outside the filters you set.

Data dictionary

The table uses a saved for-sale apartment in Al Rimal, Riyadh. Area on that card is 86. Price is 550,000 SAR.

FieldTypeNullableDescriptionExample
idintegerNoInternal listing id. Also stored as objectID.1358011
externalIDstringNoPublic listing number. Best field for deduplication.88006942
propertyUrlstringNoEnglish listing URL built by the Actor.https://www.bayut.sa/en/property/details-88006942.html
purposestringNofor-sale or for-rent.for-sale
pricenumberYesPrice in SAR.550000.0
priceFormattedstringYesDisplay price.SAR 550,000
rentFrequencystring or nullYesRent period. Null on the saved sale.null
titlestringYesEnglish title.Apartment for sale in Al Rimal
title_l1stringYesArabic title.Arabic title string
roomsinteger or nullYesBedrooms.2
bathsinteger or nullYesBathrooms.2
areanumber or nullYesArea. The saved card is 86. The input filter unit is square feet.86.0
propertyTypestringYesType label added by the Actor.Apartment
fullAddressstringYesCity, area, and district joined by the Actor.Riyadh, East Riyadh, Al Rimal
geographyobjectYeslat and lng.24.90263, 46.83518
locationarrayNoHierarchy from country to district, each with id, name, name_l1, and slug.KSA, Riyadh, East Riyadh, Al Rimal
categoryarrayNoCategory path, residential then apartment on this card.Residential
furnishingStatusstring or nullYesFurnishing label.unfurnished
completionStatusstring or nullYesCompletion label.completed
statestringYesListing state.active
coverImageUrlstring or nullYesCover image URL.https://images.bayut.sa/thumbnails/...
photoCountintegerYesPhoto count.14
videoCountintegerYesVideo count.1
hasVideobooleanYesTrue when a video is present.true
agencyNamestring or nullYesAgency name.Agency name string
agencyUrlstring or nullYesAgency page URL.https://www.bayut.sa/en/companies/...
isVerifiedbooleanYesVerification flag from the card.true
hidePricebooleanYesTrue when the source hides the price.false
permitNumberstring or nullYesPermit number when present. Null on the saved card.null
referenceNumberstring or nullYesReference number. Null on the saved card.null
createdAtnumberYesSource timestamp as a Unix number.1790760790.0
updatedAtnumberYesSource update timestamp.1790760790.0

propertyDetails is the listing-page object when scrapePropertyDetails is true. amenities is then an array of amenity names. agentInformation is the agent profile when scrapeAgentInformation is true. phoneNumber can contain mobile, phone, and WhatsApp values. agentEmail is a string when the listing exposes one. Those contact fields are omitted from the example.

Example dataset record

Saved from purpose for-sale, location Riyadh, category residential, subCategory apartments, with details and agent information enabled. Contact names, phone numbers, and email are on the stored record and are not repeated here. location keeps the district level only.

{
"id": 1358011,
"externalID": "88006942",
"objectID": "1358011",
"purpose": "for-sale",
"price": 550000.0,
"priceFormatted": "SAR 550,000",
"rentFrequency": null,
"title": "**Apartment for Sale | Al Sadaf 27 Project | Al Rimal District**",
"rooms": 2,
"baths": 2,
"area": 86.0,
"propertyType": "Apartment",
"fullAddress": "Riyadh, East Riyadh, Al Rimal",
"geography": { "lat": 24.902634636864, "lng": 46.835184996003 },
"furnishingStatus": "unfurnished",
"completionStatus": "completed",
"state": "active",
"propertyUrl": "https://www.bayut.sa/en/property/details-88006942.html",
"coverImageUrl": "https://images.bayut.sa/thumbnails/9551980-800x600.webp",
"photoCount": 14,
"videoCount": 1,
"hasVideo": true,
"isVerified": true,
"hidePrice": false,
"permitNumber": null,
"referenceNumber": null
}

Query and input reference

InputTypeRequiredDefaultAccepted valuesDescription
purposestringNofor-salefor-sale, for-rentListing purpose.
locationstringNoRiyadhCity, neighbourhood, or pathSearch place.
parentLocationstringNoemptyParent city dropdown, or emptyRequired in the UI sense only for sub-areas.
categorystringNoresidentialresidential, commercialCategory.
subCategorystringNoapartmentsProperty-type slugs in the input schemaExample: apartments, villas, offices.
statusstringNoallall, ready, off-planCompletion filter.
rentFrequencystringNoNoneyearly, monthly, weekly, dailyRent listings only.
furnishingStatusstringNoNoneall, furnished, unfurnishedFurnishing filter.
roomsMinintegerNoNoneIntegerMinimum bedrooms.
roomsMaxintegerNoNoneIntegerMaximum bedrooms.
bathsMinintegerNoNoneIntegerMinimum bathrooms.
bathsMaxintegerNoNoneIntegerMaximum bathrooms.
areaMinintegerNoNoneSquare feetMinimum area.
areaMaxintegerNoNoneSquare feetMaximum area.
priceMinintegerNoNoneSARMinimum price.
priceMaxintegerNoNoneSARMaximum price.
superHotbooleanNofalsetrue or falseSuperhot for-sale listings only.
scrapePropertyDetailsbooleanNofalsetrue or falseCharge property-details.
scrapeAgentInformationbooleanNofalsetrue or falseCharge agent-information.
detailsConcurrencyintegerNo5IntegerParallel detail and agent requests.
maxPagesintegerNo1Positive integer, or empty for all pagesPage cap.
maxItemsintegerNo00 or a positive integerListing cap. 0 means no cap. Prefill 100.
proxyConfigurationobjectNoApify residential proxy, country SAApify proxy editorProxy for search, detail, and agent requests.

Minimal request:

{
"purpose": "for-sale",
"location": "Riyadh",
"category": "residential",
"subCategory": "apartments",
"maxPages": 1,
"maxItems": 5
}

With details and agent profiles:

{
"purpose": "for-sale",
"location": "Riyadh",
"subCategory": "apartments",
"maxItems": 5,
"scrapePropertyDetails": true,
"scrapeAgentInformation": true
}

Retrieve the data through the API

  1. Start datascrapers/bayut-sa-scraper with the JSON input.
  2. Wait until the run finishes, or call the synchronous dataset endpoint.
  3. Read items from the run's default dataset.
  4. Paginate with dataset offset and limit, or export from the Apify console.
from apify_client import ApifyClient
client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("datascrapers/bayut-sa-scraper").call(
run_input={
"purpose": "for-sale",
"location": "Riyadh",
"category": "residential",
"subCategory": "apartments",
"maxItems": 5,
}
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["externalID"], item["fullAddress"], item["price"])

Other languages are listed on the Actor's API tab. This is the Apify Actor API, not a Bayut API.

Data quality and record handling

  • One dataset item is one listing. The property event is charged for that listing.
  • Deduplicate on externalID. id and objectID are the same internal number on the saved card.
  • propertyUrl is built from externalID. fullAddress is built from the location names.
  • createdAt and updatedAt are Unix timestamps from the source, not ISO strings.
  • area on the saved card is 86. The input area filters are documented as square feet. Do not assume the card unit without checking the listing.
  • propertyDetails and amenities are absent unless detail scraping succeeds. agentInformation is absent unless the agent request succeeds.
  • A failed detail or agent request does not remove the search card.
  • Phone numbers and email are present only when the source listing includes them.

Pricing and cost examples

The price file charges three events. Amounts are per 1,000 events. The free-plan rates are $2.50 for property, $2.00 for property-details, and $1.50 for agent-information.

EventFreeBronzeSilverGoldPlatinum and Diamond
property$2.50$2.40$2.30$2.20$2.20
property-details$2.00$1.90$1.80$1.70$1.70
agent-information$1.50$1.40$1.30$1.20$1.20

Platinum and Diamond are not listed in the file. They use the Gold rate. The file sets platform usage as not charged to the user. Figures below use the free-plan rates and assume every selected listing is enriched.

ListingsCards onlyCards and detailsCards, details, and agent profiles
1,000$2.50$4.50$6.00
10,000$25.00$45.00$60.00

Limitations and responsible data use

  • Results follow the public Bayut search you configure. maxPages defaults to 1.
  • Neighbourhood searches need parentLocation when the location is not a city.
  • Prices, photos, and verification flags change on the source. This is not a historical archive.
  • Phone numbers, email, and agent names are contact data. Use them in line with the privacy rules that apply to your project.
  • You are responsible for complying with Bayut's terms and applicable law.

Dataset questions

What does one dataset item represent?

One Bayut Saudi Arabia listing. Detail and agent fields are added only when those options succeed.

Which field should I use as a unique identifier?

Use externalID. It is the number in propertyUrl.

Are fields nullable or conditional?

Yes. Rent frequency, permit number, and reference number were null on the saved sale. propertyDetails, amenities, and agentInformation depend on the two scrape options.

Can I retrieve the records as CSV or JSON?

Yes. Export the default dataset as JSON, CSV, Excel, XML, or another Apify format.

How do I paginate large datasets?

Set maxItems and maxPages. Read the dataset with limit and offset. maxItems of 0 removes the item cap.

Does the Actor return historical data?

No. createdAt is the source timestamp on the current listing, not a history of price changes.

What counts as a billable result?

Each listing charges property at $0.0025 on the free plan. Each successful detail fetch charges property-details at $0.002. Each successful agent profile charges agent-information at $0.0015.

Data Scrapers support

Need an additional field, record type, or export workflow? Contact Data Scrapers at stardustspotlight@gmail.com. Include a sample source URL, required fields, expected record volume, and preferred delivery format.