# Spitogatos.gr Real Estate Scraper — Greece Properties (`logiover/spitogatos-gr-real-estate-scraper-greece-properties-data`) Actor

Scrape real estate listings from Spitogatos.gr — Greece's #1 property portal. Extract apartments, houses, land and commercial space by area, price, size and bedrooms. Returns price, €/m², lat/lng, agency, images and dates per property. Bypasses F5/Reese84 bot protection automatically.

- **URL**: https://apify.com/logiover/spitogatos-gr-real-estate-scraper-greece-properties-data.md
- **Developed by:** [Logiover](https://apify.com/logiover) (community)
- **Categories:** Real estate, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.50 / 1,000 results

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 a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.md):

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

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.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/platform/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

## Spitogatos.gr Real Estate Scraper

Extract property listings from **[Spitogatos.gr](https://www.spitogatos.gr)** — Greece's #1 real estate portal. Scrape apartments, houses, studios, commercial space and land by area, listing type, price range, surface area and bedroom count.

[![Apify Actor](https://img.shields.io/badge/Apify-Actor-blue)](https://apify.com)
[![Playwright](https://img.shields.io/badge/Engine-Playwright%20%2B%20JSON%20API-green)]()
[![Bot Protection](https://img.shields.io/badge/Bot%20Protection-F5%2FReese84-orange)]()

---

### How It Works

Spitogatos.gr is protected by **F5/Distil (Reese84)**, an enterprise behavioral bot defense. Plain HTTP requests — even with rotating residential proxies and matched TLS fingerprints — get a 2.7KB JS challenge page instead of data. This actor handles the challenge with a hybrid strategy:

1. Launch a real Chromium browser (headed via xvfb on Apify infra) through a sticky residential GR IP.
2. Navigate to a real listings page so the SPA fires its natural API calls and the F5 challenge resolves.
3. Generate behavioral signals (mouse movement, scroll, networkidle wait) so Reese84 issues a valid `reese84` session token.
4. Run all subsequent /n_api/v1 calls via `page.evaluate(fetch)` from inside the warmed page — same TLS fingerprint, same cookies, same IP, same behavioral profile. Every call sails through.
5. On block: rotate sticky IP, relaunch browser, re-warm.

The endpoint itself is straightforward — Spitogatos exposes a single search endpoint that powers both its map view and its results list:
GET /n_api/v1/properties/search-results-map
?listingType=&category=&areaIDs[]=&priceFrom=&priceTo=
&sqmFrom=&sqmTo=&bedroomsFrom=&bedroomsTo=
&sortBy=&sortOrder=&offset=

Each call returns up to ~300 properties grouped by geohash cluster. The actor flattens clusters, dedupes by `id`, and paginates `offset` until `maxListings` is reached or the area is exhausted.

---

### Input

```json
{
  "areaIDs": [100],
  "listingType": "rent",
  "category": "residential",
  "priceFrom": 500,
  "priceTo": 2000,
  "sqmFrom": 40,
  "sqmTo": 150,
  "bedroomsFrom": 1,
  "bedroomsTo": 3,
  "sortBy": "rankingscore",
  "sortOrder": "desc",
  "language": "en",
  "maxListings": 500,
  "maxOffsetPerTask": 2000,
  "offsetIncrement": 50,
  "requestDelay": 1500,
  "maxRetries": 4,
  "proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "GR" }
}
````

#### Parameters

| Parameter | Type | Default | Description |
|---|---|---|---|
| `areaIDs` | int\[] | `[100]` | Spitogatos numeric area IDs. Each runs as a separate task. |
| `listingType` | enum | `rent` | `rent` or `sale` |
| `category` | enum | `residential` | `residential` / `commercial` / `land` / `business` |
| `priceFrom` / `priceTo` | int | `0` | EUR range (0 = no bound) |
| `sqmFrom` / `sqmTo` | int | `0` | m² range (0 = no bound) |
| `bedroomsFrom` / `bedroomsTo` | int | `0` | Bedroom range (0 = no bound) |
| `sortBy` | enum | `rankingscore` | `rankingscore` / `price` / `sq_meters` / `modified` |
| `sortOrder` | enum | `desc` | `asc` / `desc` |
| `language` | enum | `en` | `en` / `el` (affects detailUrl only) |
| `maxListings` | int | `200` | Total cap across all area tasks (0 = unlimited) |
| `maxOffsetPerTask` | int | `1000` | Pagination depth per area |
| `offsetIncrement` | int | `50` | Step size per page |
| `requestDelay` | int (ms) | `1500` | Delay between API calls |
| `maxRetries` | int | `4` | Retries on block (rotates IP each retry) |
| `proxyConfiguration` | object | `RESIDENTIAL`+`GR` | **Must be RESIDENTIAL.** Datacenter IPs are blocked; GR country is forced by default for cleaner reputation. |

***

### Finding Area IDs

Open any area page on spitogatos.gr (e.g. `/en/to_rent-homes/glyfada`), open DevTools → Network → look for the `search-results-map` XHR. The `areaIDs[]` query parameter is the ID you want.

#### Common Area IDs

| Area | ID |
|---|---|
| Athens — Center | `100` |
| Athens — North | `5` |
| Athens — South | `6` |
| Athens — West | `4` |
| Athens — East | `7` |
| Piraeus | `8` |
| Thessaloniki — Center | `14` |
| Thessaloniki — East | `15` |
| Thessaloniki — West | `16` |
| Glyfada | `21` |
| Voula | `22` |
| Vouliagmeni | `23` |
| Kifisia | `73` |
| Marousi | `84` |
| Halandri | `60` |
| Nea Smyrni | `41` |
| Palaio Faliro | `40` |

(IDs are stable across the site. Always verify via DevTools for areas not listed above.)

***

### Output

Example record:

```json
{
  "adId": "19520564",
  "detailUrl": "https://www.spitogatos.gr/en/property/19520564",
  "title": "Kolonaki (Kolonaki - Lykavittos)",
  "price": 750,
  "currency": "EUR",
  "priceText": "€750",
  "pricePerSqm": 25,
  "priceReduced": false,
  "category": "house",
  "subtype": 1,
  "listingType": "rent",
  "sqMeters": 30,
  "rooms": 1,
  "bathrooms": 1,
  "kitchens": 1,
  "livingRooms": 1,
  "floorNumber": 9,
  "newDevelopment": false,
  "withinCityPlan": false,
  "geography": "Kolonaki (Kolonaki - Lykavittos)",
  "geocodeType": "offset",
  "latitude": 37.978008,
  "longitude": 23.749901,
  "modified": "2026-05-04 14:23:50",
  "uploaded": "2026-03-10 16:05:06",
  "firstPublishDate": "2026-03-10 16:17:54",
  "mainImageUrl": "https://m3.spitogatos.gr/347328308_300x220.jpg?v=20130730",
  "imageIds": [347328308, 347328270, 347328280],
  "images": [
    "https://m3.spitogatos.gr/347328308_300x220.jpg?v=20130730",
    "https://m3.spitogatos.gr/347328270_300x220.jpg?v=20130730"
  ],
  "imageCount": 25,
  "adTypeCode": "vip",
  "adTypeCodes": ["vip", "prime", "up"],
  "agentId": 19970,
  "agencyName": "Gastons Real Estate Athens",
  "searchAreaId": 100,
  "searchListingType": "rent",
  "searchCategory": "residential",
  "scrapedAt": "2026-05-04T12:59:35.001Z"
}
```

#### Notes

- **`geocodeType`**: `exact` = the lat/lng is the actual property location; `offset` = a randomized point in the same neighborhood (Spitogatos masks coords for some listings).
- **`description`** is empty in the listing API. Full descriptions live on the detail page (planned for v1.1).
- **Image URLs** are reconstructed from `imageIds` using the same CDN host as `mainImageURL` at `300x220`. Replace with `_900x600` or `_1280x960` for higher resolution.
- **`subtype`** is a numeric code: `1` = apartment, `2` = maisonette, `3` = building, `4` = loft, `5` = studio, `6` = detached house, `7` = villa (codes vary by `category`).
- **`listingType`** is derived from `buy_or_rent`: `1` → rent, `2` → sale.
- **The API returns up to ~300 properties per call** regardless of `offsetIncrement`. Most areas are fully covered in 1-3 calls.

***

### Use Cases

- **Market research** — rent prices by neighborhood, €/m² heatmaps, time-on-market trends
- **Investment analysis** — yield calculations from sale + rent data per area
- **Real estate analytics** — geo-cluster listings using lat/lng + filter `geocodeType: "exact"` for trustworthy coordinates
- **Agency monitoring** — filter by `agencyName` or `agentId` to track competitors' inventory
- **Price tracking** — re-run periodically and diff `price` / `priceReduced` / `pricePreReduction`
- **Lead generation** — find active agencies in a target area and category

***

### Cost & Performance

- **Architecture**: Playwright session warm-up (~30s once per run) + browser-context fetch for pagination.
- **Throughput**: ~200 listings in ~90 seconds at default settings (most of that is per-record dataset push, not network).
- **Memory**: 1024MB minimum (browser-bound). 2048MB recommended for runs >1000 listings.
- **Block rate**: <5% on Apify residential GR IPs; built-in retries handle blocks transparently with full session rotation.

***

### Limitations

- **Description, energy class, year built, parking, heating** require a detail-page visit and are not extracted in v1.0.
- **F5/Reese84** can throttle bursty access — if you hit persistent blocks, lower `maxRetries`, raise `requestDelay`, or split your job across runs.
- **Pagination ceiling** — Spitogatos's API returns up to ~300 listings per filter set per area. For exhaustive coverage of large areas, narrow with `priceFrom/priceTo`.

***

### Changelog

| Version | Date | Notes |
|---|---|---|
| 1.0.0 | 2026-05-04 | Initial release — Playwright + browser-context fetch to bypass F5/Reese84, sticky residential GR IP, area-based pagination, image URL reconstruction. |

# Actor input Schema

## `areaIDs` (type: `array`):

Spitogatos numeric area IDs. Each ID becomes its own task. Find an ID by opening any area page on spitogatos.gr and inspecting the search-results-map XHR's `areaIDs[]` query param. Common values: 100=Athens Center, 5=Athens North, 6=Athens South, 4=Athens West, 8=Piraeus, 14=Thessaloniki Center, 21=Glyfada, 73=Kifisia, 84=Marousi. See README for a fuller list.

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

`rent` for rentals, `sale` for properties for sale.

## `category` (type: `string`):

Property category. `residential` is the default and covers apartments+houses+studios.

## `priceFrom` (type: `integer`):

Minimum price filter in EUR. 0 = no minimum.

## `priceTo` (type: `integer`):

Maximum price filter in EUR. 0 = no maximum.

## `sqmFrom` (type: `integer`):

Minimum surface area in square meters. 0 = no minimum.

## `sqmTo` (type: `integer`):

Maximum surface area in square meters. 0 = no maximum.

## `bedroomsFrom` (type: `integer`):

Minimum number of bedrooms. 0 = no minimum.

## `bedroomsTo` (type: `integer`):

Maximum number of bedrooms. 0 = no maximum.

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

Sort field for results.

## `sortOrder` (type: `string`):

Ascending or descending.

## `language` (type: `string`):

URL language prefix. `en` = English, `el` = Greek. Affects detailUrl only — API response is the same.

## `maxListings` (type: `integer`):

Total listings cap across all area tasks. 0 = unlimited (capped by maxOffsetPerTask).

## `maxOffsetPerTask` (type: `integer`):

How deep to paginate per area. With offsetIncrement=50, value 1000 = up to 1000 results per area.

## `offsetIncrement` (type: `integer`):

How much `offset` advances per request. Site's natural page size is ~50.

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

Spitogatos is protected by DataDome — RESIDENTIAL proxy is strongly recommended. Datacenter IPs are usually blocked.

## `requestDelay` (type: `integer`):

Delay between sequential API calls. Higher = gentler on DataDome rate-limiting.

## `maxRetries` (type: `integer`):

Retries per request on 403/blank-body (rotates proxy IP each retry).

## Actor input object example

```json
{
  "areaIDs": [
    "100"
  ],
  "listingType": "rent",
  "category": "residential",
  "priceFrom": 0,
  "priceTo": 0,
  "sqmFrom": 0,
  "sqmTo": 0,
  "bedroomsFrom": 0,
  "bedroomsTo": 0,
  "sortBy": "rankingscore",
  "sortOrder": "desc",
  "language": "en",
  "maxListings": 200,
  "maxOffsetPerTask": 1000,
  "offsetIncrement": 50,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  },
  "requestDelay": 1500,
  "maxRetries": 4
}
```

# Actor output Schema

## `adId` (type: `string`):

Spitogatos numeric property ID

## `detailUrl` (type: `string`):

Property detail page URL

## `title` (type: `string`):

Listing title (geography fallback)

## `price` (type: `string`):

Numeric price in EUR

## `currency` (type: `string`):

Currency code (always EUR)

## `priceText` (type: `string`):

Formatted price text

## `pricePerSqm` (type: `string`):

Computed price per square meter

## `priceReduced` (type: `string`):

True if price was recently reduced

## `pricePreReduction` (type: `string`):

Previous price before reduction

## `priceChangePercentage` (type: `string`):

Percentage change vs pre-reduction

## `category` (type: `string`):

house / apartment / studio / land / commercial

## `subtype` (type: `string`):

Numeric subtype code

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

`rent` or `sale`

## `sqMeters` (type: `string`):

Surface area in square meters

## `rooms` (type: `string`):

Number of bedrooms

## `totalRooms` (type: `string`):

Total room count (incl. living/dining)

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

Number of bathrooms

## `kitchens` (type: `string`):

Number of kitchens

## `livingRooms` (type: `string`):

Number of living rooms

## `floorNumber` (type: `string`):

Floor number (0=ground)

## `newDevelopment` (type: `string`):

Brand new development

## `withinCityPlan` (type: `string`):

Property is within official city plan

## `agriculturalUse` (type: `string`):

Land has agricultural use designation

## `antiparoxi` (type: `string`):

Antiparoxi exchange flag

## `description` (type: `string`):

Listing description (often empty in API)

## `geography` (type: `string`):

Neighborhood (Parent Area)

## `geocodeType` (type: `string`):

`exact` or `offset`

## `latitude` (type: `string`):

Latitude (WGS84)

## `longitude` (type: `string`):

Longitude (WGS84)

## `modified` (type: `string`):

Last update timestamp

## `uploaded` (type: `string`):

First upload timestamp

## `firstPublishDate` (type: `string`):

First public publish timestamp

## `mainImageUrl` (type: `string`):

Main image (300x220)

## `imageIds` (type: `string`):

Raw imageIds array

## `images` (type: `string`):

Reconstructed image URLs (300x220)

## `imageCount` (type: `string`):

Total images

## `hasVTour` (type: `string`):

Has virtual tour

## `hasVideo` (type: `string`):

Has video

## `adTypeCode` (type: `string`):

Primary ad tier (vip/prime/up/regular)

## `adTypeCodes` (type: `string`):

All boost flags

## `agentId` (type: `string`):

Agency numeric ID

## `agencyName` (type: `string`):

Listing agency name

## `searchAreaId` (type: `string`):

Area ID used to find this property

## `searchListingType` (type: `string`):

rent/sale used in search

## `searchCategory` (type: `string`):

Category used in search

## `scrapedAt` (type: `string`):

ISO timestamp when scraped

# 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 = {
    "areaIDs": [
        "100"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("logiover/spitogatos-gr-real-estate-scraper-greece-properties-data").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 = {
    "areaIDs": ["100"],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("logiover/spitogatos-gr-real-estate-scraper-greece-properties-data").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 '{
  "areaIDs": [
    "100"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call logiover/spitogatos-gr-real-estate-scraper-greece-properties-data --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=logiover/spitogatos-gr-real-estate-scraper-greece-properties-data",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Spitogatos.gr Real Estate Scraper — Greece Properties",
        "description": "Scrape real estate listings from Spitogatos.gr — Greece's #1 property portal. Extract apartments, houses, land and commercial space by area, price, size and bedrooms. Returns price, €/m², lat/lng, agency, images and dates per property. Bypasses F5/Reese84 bot protection automatically.",
        "version": "0.0",
        "x-build-id": "EJkWUUTgE3JatnZ6d"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/logiover~spitogatos-gr-real-estate-scraper-greece-properties-data/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-logiover-spitogatos-gr-real-estate-scraper-greece-properties-data",
                "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/logiover~spitogatos-gr-real-estate-scraper-greece-properties-data/runs": {
            "post": {
                "operationId": "runs-sync-logiover-spitogatos-gr-real-estate-scraper-greece-properties-data",
                "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/logiover~spitogatos-gr-real-estate-scraper-greece-properties-data/run-sync": {
            "post": {
                "operationId": "run-sync-logiover-spitogatos-gr-real-estate-scraper-greece-properties-data",
                "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": {
                    "areaIDs": {
                        "title": "Area IDs",
                        "type": "array",
                        "description": "Spitogatos numeric area IDs. Each ID becomes its own task. Find an ID by opening any area page on spitogatos.gr and inspecting the search-results-map XHR's `areaIDs[]` query param. Common values: 100=Athens Center, 5=Athens North, 6=Athens South, 4=Athens West, 8=Piraeus, 14=Thessaloniki Center, 21=Glyfada, 73=Kifisia, 84=Marousi. See README for a fuller list.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "listingType": {
                        "title": "Listing Type",
                        "enum": [
                            "rent",
                            "sale"
                        ],
                        "type": "string",
                        "description": "`rent` for rentals, `sale` for properties for sale.",
                        "default": "rent"
                    },
                    "category": {
                        "title": "Category",
                        "enum": [
                            "residential",
                            "commercial",
                            "land",
                            "business"
                        ],
                        "type": "string",
                        "description": "Property category. `residential` is the default and covers apartments+houses+studios.",
                        "default": "residential"
                    },
                    "priceFrom": {
                        "title": "Min Price (EUR)",
                        "minimum": 0,
                        "maximum": 100000000,
                        "type": "integer",
                        "description": "Minimum price filter in EUR. 0 = no minimum.",
                        "default": 0
                    },
                    "priceTo": {
                        "title": "Max Price (EUR)",
                        "minimum": 0,
                        "maximum": 100000000,
                        "type": "integer",
                        "description": "Maximum price filter in EUR. 0 = no maximum.",
                        "default": 0
                    },
                    "sqmFrom": {
                        "title": "Min Surface (m²)",
                        "minimum": 0,
                        "maximum": 100000,
                        "type": "integer",
                        "description": "Minimum surface area in square meters. 0 = no minimum.",
                        "default": 0
                    },
                    "sqmTo": {
                        "title": "Max Surface (m²)",
                        "minimum": 0,
                        "maximum": 100000,
                        "type": "integer",
                        "description": "Maximum surface area in square meters. 0 = no maximum.",
                        "default": 0
                    },
                    "bedroomsFrom": {
                        "title": "Min Bedrooms",
                        "minimum": 0,
                        "maximum": 20,
                        "type": "integer",
                        "description": "Minimum number of bedrooms. 0 = no minimum.",
                        "default": 0
                    },
                    "bedroomsTo": {
                        "title": "Max Bedrooms",
                        "minimum": 0,
                        "maximum": 20,
                        "type": "integer",
                        "description": "Maximum number of bedrooms. 0 = no maximum.",
                        "default": 0
                    },
                    "sortBy": {
                        "title": "Sort By",
                        "enum": [
                            "rankingscore",
                            "price",
                            "sq_meters",
                            "modified"
                        ],
                        "type": "string",
                        "description": "Sort field for results.",
                        "default": "rankingscore"
                    },
                    "sortOrder": {
                        "title": "Sort Order",
                        "enum": [
                            "asc",
                            "desc"
                        ],
                        "type": "string",
                        "description": "Ascending or descending.",
                        "default": "desc"
                    },
                    "language": {
                        "title": "Language",
                        "enum": [
                            "en",
                            "el"
                        ],
                        "type": "string",
                        "description": "URL language prefix. `en` = English, `el` = Greek. Affects detailUrl only — API response is the same.",
                        "default": "en"
                    },
                    "maxListings": {
                        "title": "Max Listings",
                        "minimum": 0,
                        "maximum": 1000000,
                        "type": "integer",
                        "description": "Total listings cap across all area tasks. 0 = unlimited (capped by maxOffsetPerTask).",
                        "default": 200
                    },
                    "maxOffsetPerTask": {
                        "title": "Max Offset per Task",
                        "minimum": 50,
                        "maximum": 50000,
                        "type": "integer",
                        "description": "How deep to paginate per area. With offsetIncrement=50, value 1000 = up to 1000 results per area.",
                        "default": 1000
                    },
                    "offsetIncrement": {
                        "title": "Offset Increment",
                        "minimum": 10,
                        "maximum": 200,
                        "type": "integer",
                        "description": "How much `offset` advances per request. Site's natural page size is ~50.",
                        "default": 50
                    },
                    "proxyConfiguration": {
                        "title": "Proxy Configuration",
                        "type": "object",
                        "description": "Spitogatos is protected by DataDome — RESIDENTIAL proxy is strongly recommended. Datacenter IPs are usually blocked."
                    },
                    "requestDelay": {
                        "title": "Request Delay (ms)",
                        "minimum": 0,
                        "maximum": 30000,
                        "type": "integer",
                        "description": "Delay between sequential API calls. Higher = gentler on DataDome rate-limiting.",
                        "default": 1500
                    },
                    "maxRetries": {
                        "title": "Max Retries",
                        "minimum": 0,
                        "maximum": 10,
                        "type": "integer",
                        "description": "Retries per request on 403/blank-body (rotates proxy IP each retry).",
                        "default": 4
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
