# Aqarmap KSA Property Scraper (`fatihtahta/aqarmap-saudi-arabia-property-scraper`) Actor

Collect structured public property listing records from sa.aqar.fm through CleanedWeb. Start with a search location and an optional result limit. Records are saved to the default dataset for review, export, and downstream workflows.

- **URL**: https://apify.com/fatihtahta/aqarmap-saudi-arabia-property-scraper.md
- **Developed by:** [Fatih Tahta](https://apify.com/fatihtahta) (community)
- **Categories:** Real estate, Lead generation, Agents
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.70 / 1,000 property 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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use 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

## Aqarmap KSA Property Scraper

A thin Apify actor shell connecting `sa.aqar.fm` to the CleanedWeb source package
`aqarmap_ksa_property_scraper`.

This repo is not the scraper engine. It handles platform packaging: public
input validation, actor metadata, README/schema polish, calling CleanedWeb, and
saving returned listing records or user-facing artifacts. Source-specific
request construction, pagination, parsing, enrichment, normalization, proxy
routing, browser strategy, maps, and report generation live in
`/Users/fatihtahta/allrepos/cleanedweb-com` under
`cleanedweb/sources/<source_id>/`.

### Runtime Flow

```text
Apify input
-> src/models.py validates property type, location, filters, and limit
-> src/cleanedweb_client.py calls CleanedWeb source-run API
-> CleanedWeb executes cleanedweb/sources/<source_id>/
-> this actor saves returned records to the default dataset
-> this actor saves returned maps/reports/artifacts to the key-value store
````

Actor logs should stay calm and public: Start, Prep, Work, Save, Done. Keep
headers, cookies, proxy strategy, retries, debug internals, and blocked-response
details in CleanedWeb telemetry.

### Project Layout

- `src/main.py`: Apify entrypoint.
- `src/models.py`: public real-estate input and CleanedWeb response models.
- `src/cleanedweb_client.py`: source-run API client.
- `src/output.py`: dataset and key-value store saving.
- `src/crawler.py`: thin runtime orchestration.
- `.actor/`: Apify packaging, public input, dataset/output/KVS schemas.
- `scripts/register_apify_actor.py`: create/register the Apify actor and add
  missing CleanedWeb env vars without overwriting existing actor env vars.
- `scripts/check_dataset.py`: local dataset sanity checker.

Do not add target parsers, request builders, pagination loops, proxy ladders, or
browser automation to this repo. Add those to `cleanedweb/sources/<source_id>/`.

### Public Inputs

- `property_type`: one target-supported listing category. Defaults to `all`;
  options cover Aqar's sale, rent, and furnished-booking routes.
- `location_city`
- `location_direction`
- `location_district`
- single-select filters for family type, payment frequency, bedrooms, living
  rooms, bathrooms, floor, property age, usage type, street direction, minimum
  street width, apartment count, and store count
- `furnished`: a boolean checkbox
- `amenities`: a multi-select of Aqar-supported property features
- optional minimum/maximum price, price-per-square-metre, and area ranges
- `limit`

The actor shows clear property-type labels while CleanedWeb owns the matching
Aqar route, category ID, listing mode, pagination, and record interpretation.
For example, `apartment_for_rent` maps to Aqar's apartment rental route and
`power_stations_for_sale` maps to its power-station sale route.
Filter availability differs by property type. CleanedWeb validates the selected
combination against Aqar's category-specific search controls and returns a clear
error instead of silently dropping an unsupported filter.

Keep the public input panel focused on user-facing listing scope and output
volume. Broker URL, token, proxy routing, retries, cookies, sessions, and
strategy choices are environment/configuration concerns, not public input
fields.

### CleanedWeb Configuration

Use [`cleanedweb.env.example`](cleanedweb.env.example) as the local reference.
Required values:

| Variable | Purpose |
| --- | --- |
| `CLEANEDWEB_SOURCE_ID` | Source package id, matching `cleanedweb/sources/<source_id>/`. |
| `CLEANEDWEB_API_URL` or `CLEANEDWEB_BROKER_URL` | CleanedWeb source-run service base URL. |
| `CLEANEDWEB_API_TOKEN` or `CLEANEDWEB_BROKER_TOKEN` | Bearer token for CleanedWeb. |
| `CLEANEDWEB_ACTOR_SLUG` | Stable shell slug for telemetry and registry grouping. |
| `CLEANEDWEB_ACTOR_ID` | Stable platform-neutral shell id. |
| `CLEANEDWEB_PLATFORM` | Usually `apify` for this template. |

Optional Apify identity:

- `CLEANEDWEB_PLATFORM_ACTOR_ID`
- `CLEANEDWEB_PLATFORM_ACTOR_SLUG`
- `CLEANEDWEB_ACTOR_RUN_ID`
- `CLEANEDWEB_PLATFORM_RUN_ID`

Never expose CleanedWeb credentials or strategy controls in
`.actor/input_schema.json`, public README sections, dataset rows, or logs.

### Register The Apify Actor

After replacing placeholders in `.actor/actor.json`, run:

```bash
python scripts/register_apify_actor.py --dry-run
python scripts/register_apify_actor.py --apply
```

When this repo is cloned from the delegated template, replace the inherited
template remote before registration. The actor shell needs its own cloud GitHub
repo; do not push back into `delegated-actor-template-*`.

```bash
git remote remove origin 2>/dev/null || true
gh repo create Fatiht8a/<actor-repo-slug> --private
git remote add origin git@github.com:Fatiht8a/<actor-repo-slug>.git
git push -u origin main
git remote get-url origin
git remote -v
git status --short --branch
git ls-remote --heads origin main
```

If the GitHub repo already exists:

```bash
git remote remove origin 2>/dev/null || true
git remote add origin git@github.com:Fatiht8a/<actor-repo-slug>.git
git push -u origin main
git remote get-url origin
git remote -v
git status --short --branch
git ls-remote --heads origin main
```

The helper:

- finds or creates the Apify actor
- connects the Apify actor version to this Git repo as `sourceType=GIT_REPO`
- writes non-secret CleanedWeb identity into `.actor/actor.json` metadata
- provisions missing CleanedWeb env vars on the Apify actor
- preserves existing actor env vars by default
- sends `CLEANEDWEB_BROKER_TOKEN` as a secret

The helper uses `git config --get remote.origin.url` by default. Pass
`--git-repo-url` only for a target-specific SSH Git URL such as
`git@github.com:Fatiht8a/<actor-repo-slug>.git`. It rejects HTTPS, local
filesystem remotes, and delegated-template remotes because private actor shells
need Apify deploy-key access. For private repositories, add Apify's deployment
key to the GitHub repo deploy keys with read access, or report that as the
remaining blocker.

Do not run registration until `git ls-remote --heads origin main` returns a
`refs/heads/main` line. Otherwise the cloud repo is not synced yet and Apify
will not build the local actor shell you just edited.

When catalog metadata is known, also update the central registry:

```bash
python scripts/register_apify_actor.py --apply \
  --cleanedweb-root /Users/fatihtahta/allrepos/cleanedweb-com \
  --primary-source-domain example.com \
  --vertical property_listing \
  --primary-record-type property \
  --record-type property \
  --target-schema real_estate_property
```

Leave unknown catalog fields out instead of guessing.

### Local Development

Install dependencies:

```bash
pip install -r requirements.txt -r requirements-dev.txt
```

Run checks:

```bash
apify validate-schema
ruff check .
mypy src
pytest
```

For runtime smokes, point the actor at a reachable CleanedWeb source-run service
and inspect both the default dataset and any key-value store artifacts:

```bash
export CLEANEDWEB_API_URL='https://broker.cleanedweb.com'
export CLEANEDWEB_API_TOKEN='<private-cleanedweb-token>'
export CLEANEDWEB_SOURCE_ID='<source_id>'
export CLEANEDWEB_ACTOR_SLUG='<actor-slug>'
export CLEANEDWEB_ACTOR_ID='<actor-slug>'
export CLEANEDWEB_PLATFORM='apify'

apify run --purge --input '{"property_type":"apartment_for_rent","location_city":"riyadh","location_direction":"South of Riyadh","family_type":"family","bedrooms":"2","amenities":["air_conditioned","maid_room"],"min_price":3000,"max_price":4000,"limit":5}'
python scripts/check_dataset.py --min-items 0
```

If a source run fails, debug from CleanedWeb with narrow filters first:

```bash
curl -sS "$CLEANEDWEB_BROKER_URL/v1/telemetry/fetch-attempts?actor=<actor-slug>&platformRunId=<run-id>&limit=50" \
  -H "Authorization: Bearer $CLEANEDWEB_BROKER_TOKEN"

curl -sS "$CLEANEDWEB_BROKER_URL/v1/telemetry/fetch-attempts?traceId=<trace-id>&limit=10" \
  -H "Authorization: Bearer $CLEANEDWEB_BROKER_TOKEN"
```

Do not treat a successful process exit as proof. Inspect saved records and
artifacts.

# Actor input Schema

## `property_type` (type: `string`):

Choose exactly one target-supported sale, rent, or booking category.

## `location_city` (type: `string`):

Select the city used as the first location level.

## `location_direction` (type: `string`):

For Riyadh or Jeddah, enter a source direction such as South of Riyadh. Leave empty for a city-wide search.

## `location_district` (type: `string`):

Enter the district name as shown by Aqar, such as Badr or Ar Rihab.

## `family_type` (type: `string`):

Choose listings intended for single tenants or families.

## `payment_frequency` (type: `string`):

Choose the accepted rental payment schedule when supported.

## `bedrooms` (type: `string`):

Require one target-supported bedroom count.

## `living_rooms` (type: `string`):

Require one target-supported living-room count.

## `bathrooms` (type: `string`):

Require one target-supported bathroom count.

## `floor` (type: `string`):

Choose the listing floor when supported by the property type.

## `property_age` (type: `string`):

Choose one age value from Aqar's search filter.

## `usage_type` (type: `string`):

Choose residential or commercial usage when the selected property type supports it.

## `street_direction` (type: `string`):

Choose the property's frontage direction or street count.

## `minimum_street_width` (type: `string`):

Choose the minimum street width in meters.

## `apartments` (type: `string`):

Choose the required apartment count for applicable property types.

## `stores` (type: `string`):

Choose one target-supported store-count option.

## `furnished` (type: `boolean`):

Turn on to require furnished listings when supported.

## `amenities` (type: `array`):

Select one or more required Aqar features. Every selected feature is applied to the search.

## `min_price` (type: `number`):

Optional minimum source price.

## `max_price` (type: `number`):

Optional maximum source price.

## `min_meter_price` (type: `number`):

Optional minimum price per square meter.

## `max_meter_price` (type: `number`):

Optional maximum price per square meter.

## `min_area` (type: `number`):

Optional minimum property area.

## `max_area` (type: `number`):

Optional maximum property area.

## `limit` (type: `integer`):

Optional limit on how many results to save for the search. Leave empty to collect as many as are available.

## Actor input object example

```json
{
  "property_type": "all",
  "furnished": false
}
```

# Actor output Schema

## `results` (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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("fatihtahta/aqarmap-saudi-arabia-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("fatihtahta/aqarmap-saudi-arabia-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 '{}' |
apify call fatihtahta/aqarmap-saudi-arabia-property-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Aqarmap KSA Property Scraper",
        "description": "Collect structured public property listing records from sa.aqar.fm through CleanedWeb. Start with a search location and an optional result limit. Records are saved to the default dataset for review, export, and downstream workflows.",
        "version": "0.1",
        "x-build-id": "6BeOuRYi6mLdaRfH8"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/fatihtahta~aqarmap-saudi-arabia-property-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-fatihtahta-aqarmap-saudi-arabia-property-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/fatihtahta~aqarmap-saudi-arabia-property-scraper/runs": {
            "post": {
                "operationId": "runs-sync-fatihtahta-aqarmap-saudi-arabia-property-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/fatihtahta~aqarmap-saudi-arabia-property-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-fatihtahta-aqarmap-saudi-arabia-property-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "property_type": {
                        "title": "Property type",
                        "enum": [
                            "all",
                            "apartment_for_rent",
                            "land_for_sale",
                            "villa_for_sale",
                            "big_flat_for_rent",
                            "villa_for_rent",
                            "apartment_for_sale",
                            "building_for_sale",
                            "store_for_rent",
                            "small_house_for_sale",
                            "lounge_for_sale",
                            "small_house_for_rent",
                            "farm_for_sale",
                            "lounge_for_rent",
                            "office_for_rent",
                            "land_for_rent",
                            "building_for_rent",
                            "warehouse_for_rent",
                            "tent_for_rent",
                            "room_for_rent",
                            "store_for_sale",
                            "flat_for_sale",
                            "chalet_for_rent",
                            "apartments_for_booking",
                            "villas_for_booking",
                            "studios_for_booking",
                            "chalets_for_booking",
                            "tents_for_booking",
                            "farms_for_booking",
                            "halls_for_booking",
                            "warehouses_for_sale",
                            "kiosks_for_sale",
                            "kiosks_for_rent",
                            "cinemas_for_sale",
                            "cinemas_for_rent",
                            "parking_for_sale",
                            "parking_for_rent",
                            "banks_atms_for_sale",
                            "banks_atms_for_rent",
                            "factories_for_sale",
                            "factories_for_rent",
                            "hospitals_health_centers_for_sale",
                            "hospitals_health_centers_for_rent",
                            "power_stations_for_sale",
                            "power_stations_for_rent",
                            "communication_towers_for_sale",
                            "communication_towers_for_rent",
                            "rooms_for_sale",
                            "complexes_for_sale",
                            "complexes_for_rent",
                            "towers_for_sale",
                            "towers_for_rent",
                            "offices_for_sale",
                            "hotels_for_sale",
                            "hotels_for_rent",
                            "workshops_for_sale",
                            "workshops_for_rent",
                            "schools_for_sale",
                            "schools_for_rent",
                            "stations_for_sale",
                            "stations_for_rent",
                            "farms_for_rent"
                        ],
                        "type": "string",
                        "description": "Choose exactly one target-supported sale, rent, or booking category.",
                        "default": "all"
                    },
                    "location_city": {
                        "title": "City",
                        "enum": [
                            "riyadh",
                            "jeddah",
                            "dammam",
                            "al-khobar",
                            "medina",
                            "mecca",
                            "buraydah",
                            "abha",
                            "al-hofuf",
                            "taif",
                            "jazan",
                            "khamis-mushait",
                            "al-muzahimiyah",
                            "al-kharj",
                            "unayzah",
                            "hail",
                            "dhahran",
                            "al-bukayriyah",
                            "ad-diriyah",
                            "al-jubail",
                            "al-majmaah",
                            "tabuk",
                            "hafr-al-batin",
                            "thadiq",
                            "shaqra",
                            "ahad-rufaidah",
                            "al-bahah",
                            "thuwal",
                            "al-quwaiiyah",
                            "abu-arish",
                            "riyadh-al-khabra",
                            "az-zulfi",
                            "buqayq",
                            "al-badayea",
                            "king-abdullah-economic-city",
                            "al-duwadimi",
                            "ar-rass",
                            "al-henakiyah",
                            "muhayil",
                            "arar",
                            "safwa",
                            "rabigh",
                            "nairyah",
                            "al-hayathem",
                            "almajaridah",
                            "baqaa",
                            "al-qunfudhah",
                            "baish",
                            "an-nabhaniyah",
                            "sabya",
                            "alshinana",
                            "howtat-bani-tamim",
                            "al-mithnab",
                            "al-ghazalah",
                            "najran",
                            "saihat",
                            "khafji",
                            "al-ghat",
                            "bisha",
                            "al-jumum",
                            "yanbu",
                            "turbah",
                            "sakaka",
                            "ad-dilam",
                            "rumah",
                            "al-qatif",
                            "ahad-al-masarihah",
                            "ash-shimasiyah",
                            "afif",
                            "samtah",
                            "ras-tanura",
                            "billasmar",
                            "dumah-al-jandal",
                            "al-lith",
                            "tayma",
                            "al-ula",
                            "tarout",
                            "as-sulayyil",
                            "al-kamil",
                            "mahd-adh-dhahab",
                            "sharorah",
                            "al-`uyun",
                            "al-hariq",
                            "duba",
                            "tathleeth",
                            "rafha",
                            "ranyah",
                            "al-wajh",
                            "anak",
                            "umluj",
                            "al-khurma",
                            "al-qurayyat",
                            "turaif",
                            "badr",
                            "khaybar"
                        ],
                        "type": "string",
                        "description": "Select the city used as the first location level."
                    },
                    "location_direction": {
                        "title": "Direction or City Area",
                        "type": "string",
                        "description": "For Riyadh or Jeddah, enter a source direction such as South of Riyadh. Leave empty for a city-wide search."
                    },
                    "location_district": {
                        "title": "District",
                        "type": "string",
                        "description": "Enter the district name as shown by Aqar, such as Badr or Ar Rihab."
                    },
                    "family_type": {
                        "title": "Tenant category",
                        "enum": [
                            "single",
                            "family"
                        ],
                        "type": "string",
                        "description": "Choose listings intended for single tenants or families."
                    },
                    "payment_frequency": {
                        "title": "Payment frequency",
                        "enum": [
                            "yearly",
                            "semi_annual",
                            "quarterly",
                            "monthly"
                        ],
                        "type": "string",
                        "description": "Choose the accepted rental payment schedule when supported."
                    },
                    "bedrooms": {
                        "title": "Bedrooms",
                        "enum": [
                            "1",
                            "2",
                            "3",
                            "4",
                            "5_plus"
                        ],
                        "type": "string",
                        "description": "Require one target-supported bedroom count."
                    },
                    "living_rooms": {
                        "title": "Living rooms",
                        "enum": [
                            "1",
                            "2",
                            "3",
                            "4",
                            "5_plus"
                        ],
                        "type": "string",
                        "description": "Require one target-supported living-room count."
                    },
                    "bathrooms": {
                        "title": "Bathrooms / WC",
                        "enum": [
                            "1",
                            "2",
                            "3",
                            "4_plus"
                        ],
                        "type": "string",
                        "description": "Require one target-supported bathroom count."
                    },
                    "floor": {
                        "title": "Floor",
                        "enum": [
                            "ground",
                            "upper_ground",
                            "2",
                            "3",
                            "4",
                            "5",
                            "6",
                            "7",
                            "8",
                            "9",
                            "10",
                            "11",
                            "12",
                            "13",
                            "14",
                            "15",
                            "16",
                            "17",
                            "18",
                            "19",
                            "20_plus"
                        ],
                        "type": "string",
                        "description": "Choose the listing floor when supported by the property type."
                    },
                    "property_age": {
                        "title": "Property age",
                        "enum": [
                            "new",
                            "2_years",
                            "3_years",
                            "4_years",
                            "5_years",
                            "6_years",
                            "7_years",
                            "8_years",
                            "9_years",
                            "10_years",
                            "11_years",
                            "12_years",
                            "13_years",
                            "14_years",
                            "15_years",
                            "15_plus_years"
                        ],
                        "type": "string",
                        "description": "Choose one age value from Aqar's search filter."
                    },
                    "usage_type": {
                        "title": "Property usage",
                        "enum": [
                            "residential",
                            "commercial"
                        ],
                        "type": "string",
                        "description": "Choose residential or commercial usage when the selected property type supports it."
                    },
                    "street_direction": {
                        "title": "Street direction",
                        "enum": [
                            "north",
                            "east",
                            "west",
                            "south",
                            "northeast",
                            "southeast",
                            "southwest",
                            "northwest",
                            "three_streets",
                            "four_streets"
                        ],
                        "type": "string",
                        "description": "Choose the property's frontage direction or street count."
                    },
                    "minimum_street_width": {
                        "title": "Minimum street width",
                        "enum": [
                            "5",
                            "10",
                            "15",
                            "20",
                            "25",
                            "30",
                            "35",
                            "40",
                            "45",
                            "50"
                        ],
                        "type": "string",
                        "description": "Choose the minimum street width in meters."
                    },
                    "apartments": {
                        "title": "Apartments in building",
                        "enum": [
                            "none",
                            "1",
                            "2",
                            "3",
                            "4",
                            "5",
                            "6",
                            "7",
                            "8",
                            "9",
                            "10",
                            "11",
                            "12",
                            "13",
                            "14",
                            "15",
                            "16",
                            "17",
                            "18",
                            "19",
                            "20",
                            "21",
                            "22",
                            "23",
                            "24",
                            "25",
                            "26",
                            "27",
                            "28",
                            "29",
                            "30_plus"
                        ],
                        "type": "string",
                        "description": "Choose the required apartment count for applicable property types."
                    },
                    "stores": {
                        "title": "Stores",
                        "enum": [
                            "1",
                            "2",
                            "3",
                            "4",
                            "5_plus"
                        ],
                        "type": "string",
                        "description": "Choose one target-supported store-count option."
                    },
                    "furnished": {
                        "title": "Furnished only",
                        "type": "boolean",
                        "description": "Turn on to require furnished listings when supported.",
                        "default": false
                    },
                    "amenities": {
                        "title": "Amenities and features",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Select one or more required Aqar features. Every selected feature is applied to the search.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "car_entrance",
                                "air_conditioned",
                                "special_entrance",
                                "two_entrances",
                                "private_roof",
                                "in_villa",
                                "stairs",
                                "driver_room",
                                "maid_room",
                                "pool",
                                "kitchen",
                                "basement",
                                "duplex",
                                "tent",
                                "family_section",
                                "football_pitch",
                                "volleyball_court",
                                "playground"
                            ],
                            "enumTitles": [
                                "Car entrance",
                                "Air conditioned",
                                "Special entrance",
                                "Two entrances",
                                "Private roof",
                                "In villa",
                                "Stairs",
                                "Driver room",
                                "Maid room",
                                "Pool",
                                "Kitchen",
                                "Basement",
                                "Duplex",
                                "Tent",
                                "Family section",
                                "Football pitch",
                                "Volleyball court",
                                "Playground"
                            ]
                        }
                    },
                    "min_price": {
                        "title": "Minimum price (SAR)",
                        "minimum": 100,
                        "maximum": 100000000,
                        "type": "number",
                        "description": "Optional minimum source price."
                    },
                    "max_price": {
                        "title": "Maximum price (SAR)",
                        "minimum": 100,
                        "maximum": 100000000,
                        "type": "number",
                        "description": "Optional maximum source price."
                    },
                    "min_meter_price": {
                        "title": "Minimum meter price (SAR)",
                        "minimum": 100,
                        "maximum": 100000000,
                        "type": "number",
                        "description": "Optional minimum price per square meter."
                    },
                    "max_meter_price": {
                        "title": "Maximum meter price (SAR)",
                        "minimum": 100,
                        "maximum": 100000000,
                        "type": "number",
                        "description": "Optional maximum price per square meter."
                    },
                    "min_area": {
                        "title": "Minimum area (m²)",
                        "minimum": 100,
                        "maximum": 100000000,
                        "type": "number",
                        "description": "Optional minimum property area."
                    },
                    "max_area": {
                        "title": "Maximum area (m²)",
                        "minimum": 100,
                        "maximum": 100000000,
                        "type": "number",
                        "description": "Optional maximum property area."
                    },
                    "limit": {
                        "title": "Maximum results",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Optional limit on how many results to save for the search. Leave empty to collect as many as are available."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
