# xe.gr Real Estate Scraper — Greece Property Listings (`logiover/xe-gr-real-estate-scraper-greece-property-data`) Actor

Scrape property listings from xe.gr — Greece's #1 classifieds portal (1.5M+ visitors, 500K+ ads). Extract apartments, houses, land, commercial, parking by area, price, size and bedrooms. Returns price, €/m², floors, year, location, agent and images per listing. Direct HTML — no browser, no anti-bot.

- **URL**: https://apify.com/logiover/xe-gr-real-estate-scraper-greece-property-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

## xe.gr Real Estate Scraper

Extract property listings from **[xe.gr](https://www.xe.gr)** — Greece's largest classifieds portal (1.5M+ visitors/month, 500K+ active listings). Scrape apartments, houses, land, commercial space and parking by area, transaction type, price, size and bedrooms.

[![Apify Actor](https://img.shields.io/badge/Apify-Actor-blue)](https://apify.com)
[![Direct HTML](https://img.shields.io/badge/Engine-HTML%20%2B%20cheerio-green)]()

---

### How It Works

xe.gr server-side renders all property listings (Next.js SSR). The actor fetches the search-results HTML directly via `got-scraping` and parses cards with `cheerio`. Two-tier extraction:

1. **`__NEXT_DATA__`** — if Next.js's embedded JSON blob is present, we walk it for listing objects (UUID + price). This yields the full structured record.
2. **Cheerio fallback** — otherwise, every `<a href="/property/d/...">` link is collected, deduped by UUID, and the surrounding card is parsed for price, €/m², m², floors, bedrooms (×N), bathrooms, year, location, image alt (renovated/furnished flags) and agent logo.
GET /{en|el}/property/results
?geo_place_id={ChIJ…}
&item_type={re_residence|re_commercial|re_land|re_parking|re_storage|re_various}
&transaction_name={buy|rent}
&variation={property-for-sale|apartment-for-sale|…}
&building_type_options[]={apartment|maisonette|detached_house}
&price_min=&price_max=&sqm_min=&sqm_max=&bedrooms_min=&bedrooms_max=
&page={N}

xe.gr currently does not deploy heavy bot defense (no DataDome/Reese84). Datacenter or RESIDENTIAL Apify Proxy with `country=GR` both work. RESIDENTIAL recommended for sustained scraping.

---

### Input

```json
{
  "geoPlaceIds": ["ChIJ8UNwBh-9oRQR3Y1mdkU1Nic"],
  "areaSlugs": ["athens"],
  "variation": "apartment-for-sale",
  "priceMin": 100000,
  "priceMax": 500000,
  "sqmMin": 50,
  "sqmMax": 150,
  "bedroomsMin": 1,
  "bedroomsMax": 3,
  "language": "en",
  "maxListings": 500,
  "maxPagesPerTask": 20,
  "requestDelay": 800,
  "maxRetries": 3,
  "proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "GR" }
}
````

#### Parameters

| Parameter | Type | Default | Description |
|---|---|---|---|
| `geoPlaceIds` | string\[] | required | Google Place IDs (xe.gr's geo-filter primary key). Each ID is its own task. |
| `areaSlugs` | string\[] | `[]` | Optional URL slugs paired 1:1 with `geoPlaceIds`. Cosmetic — site resolves from place ID alone. |
| `variation` | enum | `property-for-sale` | Transaction × item-type × building-type combo (see table below) |
| `priceMin` / `priceMax` | int | `0` | EUR range (0 = no bound) |
| `sqmMin` / `sqmMax` | int | `0` | m² range (0 = no bound) |
| `bedroomsMin` / `bedroomsMax` | int | `0` | Bedroom range (0 = no bound) |
| `language` | enum | `en` | `en` / `el` |
| `maxListings` | int | `200` | Total cap across all place tasks (0 = unlimited) |
| `maxPagesPerTask` | int | `10` | Pages per Place ID. Site caps at ~295 pages per filter set. |
| `requestDelay` | int (ms) | `800` | Delay between page fetches |
| `maxRetries` | int | `3` | Retries on HTTP errors (rotates proxy IP) |
| `proxyConfiguration` | object | `RESIDENTIAL`+`GR` | RESIDENTIAL recommended; datacenter usually OK at low volume. |

***

### Variations

| Variation | Transaction | Item Type | Building Type |
|---|---|---|---|
| `property-for-sale` | buy | re\_residence | (any) |
| `property-to-rent` | rent | re\_residence | (any) |
| `apartment-for-sale` | buy | re\_residence | apartment |
| `apartment-to-rent` | rent | re\_residence | apartment |
| `maisonette-for-sale` | buy | re\_residence | maisonette |
| `maisonette-to-rent` | rent | re\_residence | maisonette |
| `detached-house-for-sale` | buy | re\_residence | detached\_house |
| `detached-house-to-rent` | rent | re\_residence | detached\_house |
| `plots-of-land-for-sale` | buy | re\_land | — |
| `plots-of-land-to-rent` | rent | re\_land | — |
| `commercial-property-for-sale` | buy | re\_commercial | — |
| `commercial-property-to-rent` | rent | re\_commercial | — |
| `parking-spaces-for-sale` | buy | re\_parking | — |
| `parking-spaces-to-rent` | rent | re\_parking | — |
| `various-properties-for-sale` | buy | re\_various | — |
| `various-properties-to-rent` | rent | re\_various | — |

***

### Finding Google Place IDs

Open any area page on xe.gr (e.g. `/en/property/r/property-for-sale/ChIJ8UNwBh-9oRQR3Y1mdkU1Nic_athens`). The 27-character alphanumeric segment between `/r/{variation}/` and `_{slug}` is the Place ID.

#### Common Place IDs

| Area | Place ID |
|---|---|
| Athens | `ChIJ8UNwBh-9oRQR3Y1mdkU1Nic` |
| Thessaloniki | `ChIJ7eAoFPQ4qBQRqXTVuBXnugk` |
| Piraeus | `ChIJRzGst-u7oRQR9_0w_5XaINg` |
| Patras | `ChIJLe0kpZk1XhMRoIy54iy9AAQ` |
| Larissa | `ChIJN86P3FaIWBMREMS54iy9AAM` |
| Kalamata | `ChIJKXhLYpmwYRMRnl9ice2VH_w` |
| Chalkida | `ChIJSxfWwksWoRQRBMk0e18KCzg` |
| Trikala | `ChIJXy53IjMZWRMRwJ-54iy9AAQ` |
| Peristeri | `ChIJTazECEejoRQRYRYsuxSJ348` |
| Egaleo | `ChIJvUGcxaS8oRQRhQVsOC1EXzw` |
| Ilion | `ChIJZfP8CqijoRQRoHm54iy9AAQ` |
| Petroupoli | `ChIJ46nkZnejoRQRhcY8oQ1xtI4` |
| Haidari | `ChIJIZwoz9W6oRQREHu54iy9AAQ` |
| Ilioupoli | `ChIJ6QytjI69oRQRmVCWR9qyKrA` |
| Pangrati | `ChIJy1stSUK9oRQRi9ObJcOmO20` |
| Galatsi | `ChIJLbYjnoSioRQRGDYRmwa6d6M` |
| Salamina | `ChIJIY13tzSxoRQRB-Qnu6NZIf0` |

(Always verify via the URL bar for areas not listed above.)

***

### Output

Example record:

```json
{
  "adId": "a819be38-2d40-43fe-af96-daf38e54a8cd",
  "detailUrl": "https://www.xe.gr/en/property/d/property-for-sale/a819be38-2d40-43fe-af96-daf38e54a8cd/athens-acropolis-hill-1-150-000-163",
  "title": "Apartment 163 sq.m.",
  "propertyType": "Apartment",
  "transactionType": "buy",
  "itemType": "re_residence",
  "price": 1150000,
  "priceText": "€1,150,000",
  "currency": "EUR",
  "pricePerSqm": 7055,
  "sqMeters": 163,
  "bedrooms": 4,
  "bathrooms": 4,
  "yearBuilt": 1960,
  "floors": ["2nd", "3rd"],
  "isRenovated": true,
  "isFurnished": false,
  "location": "Athens (Acropolis Hill)",
  "city": "Athens",
  "area": "Acropolis Hill",
  "mainImageUrl": "https://blob.cdn.xe.gr/live/2026/03/09/df9a0b20-4239-45b7-ba1e-1ab13d027f52/df9a0b20-4239-45b7-ba1e-1ab13d027f52-source.jpg?width=640&height=480&format=jpg",
  "agentLogoUrl": "https://blob.cdn.xe.gr/live/2025/04/14/bfcecc23-2ff7-4f2c-a279-98dc0c722255/bfcecc23-2ff7-4f2c-a279-98dc0c722255-source.png?width=300&height=300&fit=inside",
  "agentName": null,
  "isMultipleListings": false,
  "postedRelative": "3 weeks ago",
  "searchGeoPlaceId": "ChIJ8UNwBh-9oRQR3Y1mdkU1Nic",
  "searchAreaSlug": "athens",
  "searchVariation": "apartment-for-sale",
  "searchTransactionType": "buy",
  "searchItemType": "re_residence",
  "searchBuildingType": "apartment",
  "scrapedAt": "2026-05-04T13:00:00.000Z"
}
```

#### Notes

- **`adId`** is the listing's stable UUID, sourced from the detail URL.
- **`floors`** is an array because xe.gr lists multi-floor units (maisonettes, lofts) as e.g. `["2nd", "3rd"]`. Single-floor units yield a one-element array.
- **`isRenovated` / `isFurnished`** come from the image alt text; absence means absent (mostly), not necessarily false.
- **`agentName`** is sometimes null — xe.gr usually only renders an agent logo, not a textual name on the card.
- **Detail-page enrichment** (full description, energy class, year built when missing, exact GPS, all images) is planned for v1.1.
- **Pagination ceiling**: xe.gr caps at ~295 pages per filter set. Narrow with `priceMin/priceMax` for full coverage of saturated areas.

***

### Use Cases

- **Market research** — €/m² heatmaps by neighborhood, listing density, time-on-market trends
- **Competitive analytics** — track competing agencies via `agentLogoUrl` cluster
- **Investment screening** — yield = rent / sale price ratios per area
- **Lead generation** — discover all active agencies in a target area+segment
- **Price tracking** — re-run periodically and diff against a prior dataset
- **De-duplication research** — `isMultipleListings: true` flags multi-agent same-property ads

***

### Cost & Performance

- **Architecture**: pure HTTP + HTML parse. No browser.
- **Throughput**: ~30-100 listings per page, ~1-2 pages/sec at default `requestDelay=800`. ≈200 listings in 10-20s.
- **Memory**: 256MB minimum.
- **Compute Units**: ~0.003 CU per 100 listings.

***

### Limitations

- **HTML parser is class-name-agnostic** (uses link selectors + text regex), so it survives minor markup changes — but if xe.gr's renderer dramatically restructures cards, the cheerio fallback may need tuning. The `__NEXT_DATA__` path is more durable.
- **Detail-page-only fields** (full description, energy class, exact GPS, all images, raw construction details) are not extracted in v1.0.
- **Filter parameter names** (`price_min`, `bedrooms_min`, etc.) follow xe.gr's URL convention as observed; if the site renames a parameter, that filter silently no-ops until updated.

***

### Changelog

| Version | Date | Notes |
|---|---|---|
| 1.0.0 | 2026-05-04 | Initial release — direct HTML scraping, `__NEXT_DATA__` JSON extraction with cheerio fallback, variation-driven URL construction, image-alt-derived enrichment. |

# Actor input Schema

## `geoPlaceIds` (type: `array`):

xe.gr uses Google Place IDs for geographical filtering. Each ID becomes its own task. Find one by opening any area page on xe.gr and copying the long alphanumeric segment from the URL — e.g. for /en/property/r/property-for-sale/ChIJ8UNwBh-9oRQR3Y1mdkU1Nic\_athens the place ID is `ChIJ8UNwBh-9oRQR3Y1mdkU1Nic`. Common IDs are listed in the README.

## `areaSlugs` (type: `array`):

Optional URL slugs paired 1:1 with `geoPlaceIds`, in the same order. Examples: 'athens', 'thessaloniki', 'patra'. Used in the URL for cleaner request URIs but not strictly required (xe.gr resolves listings from the place ID alone).

## `variation` (type: `string`):

Determines transaction type, item type and (for residential) building type. The actor maps this to `transaction_name`, `item_type` and `building_type_options[]` automatically.

## `priceMin` (type: `integer`):

Minimum price filter. 0 = no minimum.

## `priceMax` (type: `integer`):

Maximum price filter. 0 = no maximum.

## `sqmMin` (type: `integer`):

Minimum surface area. 0 = no minimum.

## `sqmMax` (type: `integer`):

Maximum surface area. 0 = no maximum.

## `bedroomsMin` (type: `integer`):

Minimum bedroom count. 0 = no minimum.

## `bedroomsMax` (type: `integer`):

Maximum bedroom count. 0 = no maximum.

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

URL language prefix. `en` = English, `el` = Greek.

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

Total cap across all area tasks (0 = unlimited).

## `maxPagesPerTask` (type: `integer`):

Pagination depth per Place ID. xe.gr returns ~30-100 listings per page. Site caps deep pagination around page 295.

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

Delay between sequential requests.

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

Retries per request on HTTP errors (rotates proxy IP).

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

Apify Proxy is recommended. xe.gr does not appear to deploy heavy bot defense; datacenter proxy is usually sufficient, but RESIDENTIAL with country=GR is safest for scale.

## Actor input object example

```json
{
  "geoPlaceIds": [
    "ChIJ8UNwBh-9oRQR3Y1mdkU1Nic"
  ],
  "areaSlugs": [
    "athens"
  ],
  "variation": "property-for-sale",
  "priceMin": 0,
  "priceMax": 0,
  "sqmMin": 0,
  "sqmMax": 0,
  "bedroomsMin": 0,
  "bedroomsMax": 0,
  "language": "en",
  "maxListings": 200,
  "maxPagesPerTask": 10,
  "requestDelay": 800,
  "maxRetries": 3,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "GR"
  }
}
```

# Actor output Schema

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

xe.gr UUID for the ad

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

Full URL to the ad page

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

Card title (type + size)

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

Apartment / Maisonette / Detached House / etc.

## `transactionType` (type: `string`):

`buy` or `rent`

## `itemType` (type: `string`):

re\_residence / re\_commercial / re\_land / etc.

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

Numeric price in EUR

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

Formatted price text from card

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

Always EUR

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

Price per square meter

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

Surface area

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

Bedroom count

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

Bathroom count

## `yearBuilt` (type: `string`):

Construction year

## `floors` (type: `string`):

Array of floor labels (1st / 2nd / Ground / …)

## `isRenovated` (type: `string`):

Listing is marked as renovated

## `isFurnished` (type: `string`):

Listing is marked as furnished

## `location` (type: `string`):

Full location string (City + Area)

## `city` (type: `string`):

Parsed city

## `area` (type: `string`):

Parsed neighborhood/area

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

Card image (640x480)

## `agentLogoUrl` (type: `string`):

Agent/agency logo image

## `agentName` (type: `string`):

Agent display name (when available)

## `isMultipleListings` (type: `string`):

True if same property is listed by ≥2 agents

## `postedRelative` (type: `string`):

Relative time as shown ('5 days ago' / …)

## `searchGeoPlaceId` (type: `string`):

Google Place ID used in search

## `searchAreaSlug` (type: `string`):

Area slug used in search

## `searchVariation` (type: `string`):

Variation slug used in search

## `searchTransactionType` (type: `string`):

Derived transaction\_name (buy/rent)

## `searchItemType` (type: `string`):

Derived item\_type

## `searchBuildingType` (type: `string`):

Derived building\_type\_options (when applicable)

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

ISO timestamp

# 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 = {
    "geoPlaceIds": [
        "ChIJ8UNwBh-9oRQR3Y1mdkU1Nic"
    ],
    "areaSlugs": [
        "athens"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "GR"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("logiover/xe-gr-real-estate-scraper-greece-property-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 = {
    "geoPlaceIds": ["ChIJ8UNwBh-9oRQR3Y1mdkU1Nic"],
    "areaSlugs": ["athens"],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "GR",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("logiover/xe-gr-real-estate-scraper-greece-property-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 '{
  "geoPlaceIds": [
    "ChIJ8UNwBh-9oRQR3Y1mdkU1Nic"
  ],
  "areaSlugs": [
    "athens"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "GR"
  }
}' |
apify call logiover/xe-gr-real-estate-scraper-greece-property-data --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "xe.gr Real Estate Scraper — Greece Property Listings",
        "description": "Scrape property listings from xe.gr — Greece's #1 classifieds portal (1.5M+ visitors, 500K+ ads). Extract apartments, houses, land, commercial, parking by area, price, size and bedrooms. Returns price, €/m², floors, year, location, agent and images per listing. Direct HTML — no browser, no anti-bot.",
        "version": "0.0",
        "x-build-id": "WFOYCP0cwuKIW8gsp"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/logiover~xe-gr-real-estate-scraper-greece-property-data/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-logiover-xe-gr-real-estate-scraper-greece-property-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~xe-gr-real-estate-scraper-greece-property-data/runs": {
            "post": {
                "operationId": "runs-sync-logiover-xe-gr-real-estate-scraper-greece-property-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~xe-gr-real-estate-scraper-greece-property-data/run-sync": {
            "post": {
                "operationId": "run-sync-logiover-xe-gr-real-estate-scraper-greece-property-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",
                "required": [
                    "geoPlaceIds"
                ],
                "properties": {
                    "geoPlaceIds": {
                        "title": "Google Place IDs",
                        "type": "array",
                        "description": "xe.gr uses Google Place IDs for geographical filtering. Each ID becomes its own task. Find one by opening any area page on xe.gr and copying the long alphanumeric segment from the URL — e.g. for /en/property/r/property-for-sale/ChIJ8UNwBh-9oRQR3Y1mdkU1Nic_athens the place ID is `ChIJ8UNwBh-9oRQR3Y1mdkU1Nic`. Common IDs are listed in the README.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "areaSlugs": {
                        "title": "Area Name Slugs (optional)",
                        "type": "array",
                        "description": "Optional URL slugs paired 1:1 with `geoPlaceIds`, in the same order. Examples: 'athens', 'thessaloniki', 'patra'. Used in the URL for cleaner request URIs but not strictly required (xe.gr resolves listings from the place ID alone).",
                        "items": {
                            "type": "string"
                        }
                    },
                    "variation": {
                        "title": "Listing Variation",
                        "enum": [
                            "property-for-sale",
                            "property-to-rent",
                            "apartment-for-sale",
                            "apartment-to-rent",
                            "maisonette-for-sale",
                            "maisonette-to-rent",
                            "detached-house-for-sale",
                            "detached-house-to-rent",
                            "plots-of-land-for-sale",
                            "plots-of-land-to-rent",
                            "commercial-property-for-sale",
                            "commercial-property-to-rent",
                            "parking-spaces-for-sale",
                            "parking-spaces-to-rent",
                            "various-properties-for-sale",
                            "various-properties-to-rent"
                        ],
                        "type": "string",
                        "description": "Determines transaction type, item type and (for residential) building type. The actor maps this to `transaction_name`, `item_type` and `building_type_options[]` automatically.",
                        "default": "property-for-sale"
                    },
                    "priceMin": {
                        "title": "Min Price (EUR)",
                        "minimum": 0,
                        "maximum": 100000000,
                        "type": "integer",
                        "description": "Minimum price filter. 0 = no minimum.",
                        "default": 0
                    },
                    "priceMax": {
                        "title": "Max Price (EUR)",
                        "minimum": 0,
                        "maximum": 100000000,
                        "type": "integer",
                        "description": "Maximum price filter. 0 = no maximum.",
                        "default": 0
                    },
                    "sqmMin": {
                        "title": "Min Surface (m²)",
                        "minimum": 0,
                        "maximum": 100000,
                        "type": "integer",
                        "description": "Minimum surface area. 0 = no minimum.",
                        "default": 0
                    },
                    "sqmMax": {
                        "title": "Max Surface (m²)",
                        "minimum": 0,
                        "maximum": 100000,
                        "type": "integer",
                        "description": "Maximum surface area. 0 = no maximum.",
                        "default": 0
                    },
                    "bedroomsMin": {
                        "title": "Min Bedrooms",
                        "minimum": 0,
                        "maximum": 20,
                        "type": "integer",
                        "description": "Minimum bedroom count. 0 = no minimum.",
                        "default": 0
                    },
                    "bedroomsMax": {
                        "title": "Max Bedrooms",
                        "minimum": 0,
                        "maximum": 20,
                        "type": "integer",
                        "description": "Maximum bedroom count. 0 = no maximum.",
                        "default": 0
                    },
                    "language": {
                        "title": "Language",
                        "enum": [
                            "en",
                            "el"
                        ],
                        "type": "string",
                        "description": "URL language prefix. `en` = English, `el` = Greek.",
                        "default": "en"
                    },
                    "maxListings": {
                        "title": "Max Listings",
                        "minimum": 0,
                        "maximum": 1000000,
                        "type": "integer",
                        "description": "Total cap across all area tasks (0 = unlimited).",
                        "default": 200
                    },
                    "maxPagesPerTask": {
                        "title": "Max Pages per Task",
                        "minimum": 1,
                        "maximum": 295,
                        "type": "integer",
                        "description": "Pagination depth per Place ID. xe.gr returns ~30-100 listings per page. Site caps deep pagination around page 295.",
                        "default": 10
                    },
                    "requestDelay": {
                        "title": "Request Delay (ms)",
                        "minimum": 0,
                        "maximum": 30000,
                        "type": "integer",
                        "description": "Delay between sequential requests.",
                        "default": 800
                    },
                    "maxRetries": {
                        "title": "Max Retries",
                        "minimum": 0,
                        "maximum": 10,
                        "type": "integer",
                        "description": "Retries per request on HTTP errors (rotates proxy IP).",
                        "default": 3
                    },
                    "proxyConfiguration": {
                        "title": "Proxy Configuration",
                        "type": "object",
                        "description": "Apify Proxy is recommended. xe.gr does not appear to deploy heavy bot defense; datacenter proxy is usually sufficient, but RESIDENTIAL with country=GR is safest for scale."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
