# Aqar Scraper — Saudi Arabia Property Data & API (`haketa/aqar-saudi-property-scraper`) Actor

Scrape Aqar Saudi Arabia sale and rental listings with SAR prices, property details, GPS, photos, descriptions, seller and broker contacts, REGA advertising licenses, features and listing activity across Riyadh, Jeddah and the Kingdom.

- **URL**: https://apify.com/haketa/aqar-saudi-property-scraper.md
- **Developed by:** [Haketa](https://apify.com/haketa) (community)
- **Categories:** Real estate, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.50 / 1,000 overview listings

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## 🏠 Aqar Scraper — Saudi Arabia Property Data & API

#### Saudi sale and rental listings with prices, GPS, photos, REGA licenses and broker contacts

[![Saudi Arabia](https://img.shields.io/badge/Market-Saudi_Arabia-006C35?style=for-the-badge)](https://sa.aqar.fm)
![Property Data](https://img.shields.io/badge/Data-Property_Listings-2563EB?style=for-the-badge)
![Lead Data](https://img.shields.io/badge/Includes-Broker_Contacts-F97316?style=for-the-badge)
![API Ready](https://img.shields.io/badge/Export-JSON_CSV_Excel-7C3AED?style=for-the-badge)

Collect structured public property listings from Aqar across Riyadh, Jeddah, Makkah, Madinah and other major Saudi cities. Export clean records with SAR prices, area, rooms, coordinates, descriptions, media, seller information and official REGA advertising-license details.

No browser setup, cookies or external API account is required.

***

### ✨ What you get

| Data group | Included fields |
|---|---|
| 💰 Pricing | SAR price, display price, rent period, price per m², declared price, installment value |
| 🏘️ Property | Type, area, deed area, bedrooms, bathrooms, living rooms, age and floor |
| 📍 Location | City and district in English and Arabic, address, direction and GPS coordinates |
| 📞 Leads | Seller or agent name, public phone, brokerage and seller type |
| ✅ REGA | License status, advertising-license number, verification URL and expiry |
| 🖼️ Media | Main image, complete photo list, image count and videos |
| 📝 Content | Full description, specifications, utilities and property features |
| 📈 Activity | Views, favorites, promoted status, published and updated dates |
| 🧾 Advanced | Deed, plan and parcel numbers plus optional original source data |

Every row represents one unique Aqar property listing and is ready for JSON, CSV, Excel, XML, webhooks and API integrations.

In pay-per-event runs, every saved row triggers the automatic overview dataset event. Rows successfully enriched with `includeDetails: true` also trigger one `detail-listing` enrichment event. Failed detail requests remain overview records and are not charged as detail results.

***

### 🚀 Start in three steps

1. Select one or more Saudi cities.
2. Choose sale, rent or all listings and optionally select a property type.
3. Set the result limit and click **Start**.

The default input produces a ready Riyadh dataset with rich details and contact information.

#### Quick example

```json
{
  "cities": ["riyadh", "jeddah"],
  "listingType": "sale",
  "propertyType": "villa",
  "maxResults": 200,
  "includeDetails": true
}
```

***

### 🎯 Use cases

#### 📊 Saudi property market research

Compare asking prices, price per square meter, property supply and listing activity across cities and districts.

#### 📞 Real estate lead generation

Build prospect lists from public seller, responsible employee and brokerage information. Filter or group records by city, property type, agency or REGA status.

#### 💡 Competitive pricing

Benchmark villas, apartments, land and commercial properties with comparable area, rooms, district and listing type.

#### 🏗️ Development opportunity discovery

Analyze land, buildings, farms and commercial inventory using area, frontage, street width, coordinates and planning fields.

#### ✅ Compliance and license review

Collect official advertisement-license numbers, verification links, license expiry dates and declared prices for review workflows.

#### 🔔 Listing monitoring

Schedule recurring runs and compare listing IDs, prices, update times and availability to identify new or changed inventory.

#### 🗺️ Property mapping

Load latitude and longitude into GIS software, maps, BI tools or territory-planning applications.

#### 🤖 PropTech and AI applications

Feed normalized Saudi property data into valuation models, search products, recommendation systems, CRMs and AI agents.

***

### 📥 Input

| Field | Default | Description |
|---|---:|---|
| `cities` | Riyadh | One or more supported Saudi cities |
| `customCities` | empty | Any Saudi city name in English or Arabic |
| `cityIds` | empty | Numeric Aqar city IDs, such as `21` for Riyadh |
| `listingType` | `all` | `all`, `sale` or `rent` |
| `propertyType` | `all` | Residential, commercial, house, chalet, rest house and camp categories |
| `startUrls` | empty | Custom Aqar search or individual listing URLs |
| `listingIds` | empty | Exact listing IDs for bulk detail collection |
| `maxResults` | `200` | Maximum unique properties; `0` means no result limit |
| `maxPagesPerSearch` | `10` | Search depth; approximately 20 listings per page |
| `includeDetails` | `true` | Full description, photos, contacts, licenses and activity |
| `includeRawData` | `false` | Complete original listing object for advanced users |
| `minPrice` / `maxPrice` | `0` | Optional SAR price range |
| `minArea` / `maxArea` | `0` | Optional area range in square meters |
| `regaLicensedOnly` | `false` | Keep only explicitly REGA-licensed listings |
| `minBedrooms` / `minBathrooms` | `0` | Optional minimum room counts |
| `minLivingRooms` | `0` | Optional minimum living-room count |
| `furnished` | `any` | All, furnished only or unfurnished only |
| `sortBy` / `sortDirection` | newest / descending | Sort by publish/update date, price, area, price per m² or views |
| `maxConcurrency` | `10` | Parallel detail requests |
| `proxyConfiguration` | off | Optional proxy for unusual access failures |

#### Supported cities

- Riyadh
- Jeddah
- Makkah
- Madinah
- Dammam
- Al Khobar
- Taif
- Abha
- Tabuk
- Buraydah

Use `customCities` for any other city in English or Arabic, or `cityIds` when you already know Aqar's numeric city ID.

#### Supported property categories

- Apartments
- Villas
- Houses
- Land
- Floors
- Buildings
- Offices
- Stores
- Warehouses
- Farms
- Rooms
- Chalets
- Rest houses
- Camps

Keep **All properties** selected when maximum result volume is the priority.

***

### 📤 Output example

```json
{
  "listingId": "6781382",
  "url": "https://sa.aqar.fm/en/flat-for-sale/riyadh/...-6781382",
  "propertyTitle": "Floor for Sale in Riyadh Badr",
  "listingType": "sale",
  "propertyType": "floor",
  "priceSar": 599000,
  "pricePerSqm": 3565.48,
  "areaSqm": 168,
  "bedrooms": 5,
  "bathrooms": 2,
  "city": "Riyadh",
  "cityArabic": "الرياض",
  "district": "Badr",
  "districtArabic": "حي بدر",
  "latitude": 24.501442,
  "longitude": 46.730402,
  "sellerName": "Public listing contact",
  "sellerPhone": "05XXXXXXXX",
  "agencyName": "Public brokerage name",
  "regaLicensed": true,
  "regaLicenseNumber": "7201047375",
  "images": ["https://images.aqar.fm/...jpg"],
  "features": ["Water", "Electricity", "Special Entrance"],
  "views": 1805,
  "publishedAt": "2026-07-19T18:21:19.000Z"
}
```

Fields appear when the source listing provides them. Private or hidden contact information is never inferred.

***

### 💼 Ready-made workflows

#### Collect rentals across three cities

```json
{
  "cities": ["riyadh", "jeddah", "dammam"],
  "listingType": "rent",
  "propertyType": "apartment",
  "maxResults": 1000,
  "includeDetails": true
}
```

#### Find REGA-licensed villas for sale

```json
{
  "cities": ["riyadh", "jeddah"],
  "listingType": "sale",
  "propertyType": "villa",
  "regaLicensedOnly": true,
  "minPrice": 1000000,
  "maxPrice": 5000000,
  "maxResults": 500
}
```

#### Fast market snapshot without details

```json
{
  "cities": ["riyadh"],
  "listingType": "all",
  "propertyType": "all",
  "maxResults": 200,
  "includeDetails": false
}
```

#### Process individual listings

```json
{
  "cities": [],
  "startUrls": [
    { "url": "https://sa.aqar.fm/en/villa-for-sale/riyadh/example-1234567" }
  ],
  "includeDetails": true,
  "maxResults": 10
}
```

#### Bulk details from listing IDs

```json
{
  "listingIds": ["6651360", "6781382"],
  "includeDetails": true,
  "maxResults": 100
}
```

When `listingIds` is the only location source, the Actor skips city search automatically.

#### Filter and sort family homes

```json
{
  "customCities": ["Jeddah"],
  "listingType": "rent",
  "propertyType": "house",
  "minBedrooms": 3,
  "minBathrooms": 2,
  "minLivingRooms": 1,
  "furnished": "any",
  "sortBy": "price",
  "sortDirection": "asc",
  "maxResults": 200
}
```

***

### ⚡ Speed and cost tips

- Leave concurrency at `10` for the best speed and reliability balance.
- Disable `includeRawData` unless you need every original field.
- Disable `includeDetails` for rapid price-and-location market snapshots.
- Keep rich details enabled when contact, description, license and complete media fields matter.
- Use `maxResults` to control dataset size and spending.
- Avoid enabling a proxy unless direct access starts returning errors.

The Actor uses lightweight HTTP extraction rather than a headless browser, keeping memory and compute costs low.

***

### 🔌 API usage

#### Start an Actor run

```bash
curl -X POST "https://api.apify.com/v2/acts/YOUR_ACTOR_ID/runs?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "cities": ["riyadh"],
    "listingType": "all",
    "maxResults": 100,
    "includeDetails": true
  }'
```

#### Run synchronously and return the dataset

```bash
curl -X POST "https://api.apify.com/v2/acts/YOUR_ACTOR_ID/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"cities":["jeddah"],"listingType":"rent","maxResults":50}'
```

Results can also be consumed through Python, JavaScript, MCP, Make, Zapier, webhooks and scheduled Apify runs.

***

### ❓ FAQ

#### Does it cover both sale and rent?

Yes. Select sale, rent or all listings in the input form.

#### Does it return contact information?

When publicly included in a listing, the Actor returns the seller, broker or responsible employee name, phone and agency.

#### Are REGA licenses included?

Yes. Rich-detail mode returns the license status, number, verification URL and expiry when published.

#### Can I scrape a district not listed in the city menu?

Yes. Open the desired filtered search on Aqar and paste its URL into `startUrls`.

#### Why is a field missing?

Aqar listings vary by property type and advertiser. The Actor returns fields that are present without inventing missing values.

#### Can I export to Excel?

Yes. Apify datasets can be downloaded as JSON, CSV, Excel, XML, RSS and JSONL.

#### Does it require an external API subscription?

No. It runs entirely inside your Apify account and does not require a separate paid data provider.

***

### ⚖️ Responsible use

Use the Actor only for lawful purposes and process contact and location data according to Saudi regulations, applicable privacy laws and Aqar's terms. Do not use the results for spam, harassment, discrimination or unauthorized republication.

You are responsible for your collection frequency, retention policy and downstream use of the exported data.

***

### 💬 Support

If a listing format changes or an expected public field is missing, open an Actor issue with the run ID and a reproducible public URL. Do not include private credentials or non-public personal data.

Choose your cities, click **Start**, and turn Saudi property listings into a structured dataset in minutes. 🚀

# Actor input Schema

## `cities` (type: `array`):

Choose one or more Saudi cities. More cities produce more listings and broader market coverage.

## `customCities` (type: `array`):

Optional. Enter any Saudi city in English or Arabic, one per line. The Actor resolves it against Aqar's current city catalog.

## `cityIds` (type: `array`):

Optional. Add numeric Aqar city IDs, one per line. Examples: 21 for Riyadh and 66 for Jeddah.

## `listingType` (type: `string`):

Collect all properties, sale listings only, or rentals only.

## `propertyType` (type: `string`):

Select a specific property category or keep All properties for the largest dataset.

## `startUrls` (type: `array`):

Optional. Paste Aqar search pages or individual property URLs. These are processed in addition to the city search above.

## `listingIds` (type: `array`):

Optional. Paste Aqar listing IDs, one per line, to retrieve those exact properties with full details.

## `maxResults` (type: `integer`):

Total number of unique properties to save. Set to 0 for no result limit.

## `maxPagesPerSearch` (type: `integer`):

Each search page normally contains about 20 listings. Increase this for deeper market coverage.

## `includeDetails` (type: `boolean`):

Visit each listing for full description, all photos, seller or responsible employee phone, REGA license, detailed features and activity metrics.

## `includeRawData` (type: `boolean`):

Add the complete source listing object for advanced analysis. Leave off for a smaller, cleaner dataset.

## `minPrice` (type: `integer`):

Keep listings at or above this price. Use 0 for no minimum.

## `maxPrice` (type: `integer`):

Keep listings at or below this price. Use 0 for no maximum.

## `minArea` (type: `integer`):

Keep properties with at least this area. Use 0 for no minimum.

## `maxArea` (type: `integer`):

Keep properties with at most this area. Use 0 for no maximum.

## `regaLicensedOnly` (type: `boolean`):

Keep only listings explicitly marked as licensed by Saudi Arabia's Real Estate General Authority.

## `minBedrooms` (type: `integer`):

Keep properties with at least this many bedrooms. Use 0 for no minimum.

## `minBathrooms` (type: `integer`):

Keep properties with at least this many bathrooms. Use 0 for no minimum.

## `minLivingRooms` (type: `integer`):

Keep properties with at least this many living rooms. Use 0 for no minimum.

## `furnished` (type: `string`):

Keep all properties, furnished properties only, or unfurnished properties only.

## `sortBy` (type: `string`):

Choose how the final dataset is ordered after all filters and detail enrichment are applied.

## `sortDirection` (type: `string`):

Newest/highest first or oldest/lowest first.

## `maxConcurrency` (type: `integer`):

Controls speed when detail enrichment is enabled. The default balances speed and reliability.

## `proxyConfiguration` (type: `object`):

Optional Apify Proxy. Direct requests work by default; enable this only if your runs experience access errors.

## Actor input object example

```json
{
  "cities": [
    "riyadh"
  ],
  "customCities": [],
  "cityIds": [],
  "listingType": "all",
  "propertyType": "all",
  "startUrls": [],
  "listingIds": [],
  "maxResults": 20,
  "maxPagesPerSearch": 1,
  "includeDetails": true,
  "includeRawData": false,
  "minPrice": 0,
  "maxPrice": 0,
  "minArea": 0,
  "maxArea": 0,
  "regaLicensedOnly": false,
  "minBedrooms": 0,
  "minBathrooms": 0,
  "minLivingRooms": 0,
  "furnished": "any",
  "sortBy": "create_time",
  "sortDirection": "desc",
  "maxConcurrency": 8,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

## `summary` (type: `string`):

No description

## `errors` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "cities": [
        "riyadh"
    ],
    "customCities": [],
    "cityIds": [],
    "startUrls": [],
    "listingIds": [],
    "maxResults": 20,
    "maxPagesPerSearch": 1,
    "includeDetails": true,
    "maxConcurrency": 8
};

// Run the Actor and wait for it to finish
const run = await client.actor("haketa/aqar-saudi-property-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "cities": ["riyadh"],
    "customCities": [],
    "cityIds": [],
    "startUrls": [],
    "listingIds": [],
    "maxResults": 20,
    "maxPagesPerSearch": 1,
    "includeDetails": True,
    "maxConcurrency": 8,
}

# Run the Actor and wait for it to finish
run = client.actor("haketa/aqar-saudi-property-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "cities": [
    "riyadh"
  ],
  "customCities": [],
  "cityIds": [],
  "startUrls": [],
  "listingIds": [],
  "maxResults": 20,
  "maxPagesPerSearch": 1,
  "includeDetails": true,
  "maxConcurrency": 8
}' |
apify call haketa/aqar-saudi-property-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=haketa/aqar-saudi-property-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/goLmfiTym43dBRDxY/builds/i4GsU3s8qa4eiWhG7/openapi.json
