# XE Property Scraper (`sian.agency/xe-property-scraper`) Actor

Scrape xe.gr (Χρυσή Ευκαιρία) for Greek homes, commercial space, land and parking. Every row says whether a private owner or an agency placed the ad, with asking price, €/m², size, bedrooms, floor, energy class, GPS and photos. Sale and rent, in Greek or English.

- **URL**: https://apify.com/sian.agency/xe-property-scraper.md
- **Developed by:** [SIÁN OÜ](https://apify.com/sian.agency) (community)
- **Categories:** Real estate, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.76 / 1,000 property searches

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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## xe.gr Scraper (Χρυσή Ευκαιρία) - Greek Property, Owner or Agency 🏛️

[![Store SIÁN Agency](https://img.shields.io/badge/Store-SI%C3%81N%20Agency-1AE392)](https://apify.com/sian.agency?fpr=sian) [![Store Idealista](https://img.shields.io/badge/Store-Idealista%20Property-E60023)](https://apify.com/sian.agency/smart-idealista-scraper?fpr=sian) [![Store Rightmove](https://img.shields.io/badge/Store-Rightmove%20Property-00DEB6)](https://apify.com/sian.agency/rightmove-property-scraper?fpr=sian) [![Store WG-Gesucht](https://img.shields.io/badge/Store-WG--Gesucht%20Property-1AE392)](https://apify.com/sian.agency/wg-gesucht-property-scraper?fpr=sian)

#### 🎉 Every row says whether a private owner or an agency placed the advert, and you can search on it

##### For buyer's agents, relocation firms, market analysts and anyone tracking Greek property

***

### 🔎 What is the xe.gr Property Scraper — and when should you use it?

The **xe.gr Property Scraper** turns every live property advert on xe.gr (Χρυσή Ευκαιρία), Greece's biggest classifieds site into clean, structured rows you can filter, export and feed straight into a spreadsheet, database or AI agent. No account, no portal API key, no browser automation to maintain.

**Use it when you need:** Greek homes, commercial space, land or parking, for sale or to rent, returned as flat rows with the asking price, the price per square metre, size in square metres, bedrooms, bathrooms, floor, year built, energy class, GPS coordinates and every photo. Every row also says whether a private owner or an estate agency placed the advert, and that is filterable. xe.gr is a general classifieds brand rather than a dedicated portal, so Greek owners still advertise there directly, and the portal sells that same filter to its own visitors. Turning on the detail switch adds the street address, the seller's full advert text, the condition and up to sixty characteristics. Output comes back in Greek or in English, the same adverts either way.

**Use something else when:** the property is outside Greece. Use [Idealista Property Scraper](https://apify.com/sian.agency/smart-idealista-scraper?fpr=sian) for Spain, Italy and Portugal — the same Mediterranean buyer, a different market. Use [Rightmove Property Scraper](https://apify.com/sian.agency/rightmove-property-scraper?fpr=sian) for England, Scotland and Wales. Use [WG-Gesucht Property Scraper](https://apify.com/sian.agency/wg-gesucht-property-scraper?fpr=sian) for German flatshares and rentals, also mostly placed by the people who live there. This actor reads live adverts only, and Greece publishes no sold-price register at all, so no scraper of any Greek source can tell you what a property actually sold for. Every figure here is what the advertiser is asking. Advertiser phone numbers are deliberately not collected: they sit behind a reveal control and a large share of these adverts are placed by private individuals.

### 🤖 Use with AI agents

Already connected to the [Apify MCP server](https://mcp.apify.com)? Just ask for this Actor by name: sian.agency/xe-property-scraper

**Your agent can pay for its own runs.** This Actor is eligible for [agentic payments](https://docs.apify.com/platform/actors/publishing/monetize), so an agent can discover it, run it and settle the bill over [x402](https://www.x402.org/) (USDC on Base) or [Skyfire](https://www.skyfire.xyz/) — without an Apify account or API token of its own. Billing is the same either way: per successful row, never for errors.

Otherwise copy this prompt into Claude, ChatGPT, Cursor or any MCP-enabled assistant:

```text
I want Greek property market data from xe.gr, split by who placed the advert using the Apify Actor `sian.agency/xe-property-scraper`.

Use it when I need: Greek homes, commercial space, land or parking, for sale or to rent, returned as flat rows with the asking price, the price per square metre, size in square metres, bedrooms, bathrooms, floor, year built, energy class, GPS coordinates and every photo. Every row also says whether a private owner or an estate agency placed the advert, and that is filterable. xe.gr is a general classifieds brand rather than a dedicated portal, so Greek owners still advertise there directly, and the portal sells that same filter to its own visitors. Turning on the detail switch adds the street address, the seller's full advert text, the condition and up to sixty characteristics. Output comes back in Greek or in English, the same adverts either way.

Don't use it when: the property is outside Greece — use smart-idealista-scraper or rightmove-property-scraper or wg-gesucht-property-scraper instead.

How to call it: pick `transaction` (`rent` or `buy`) and `propertyKind` (`residence`, `commercial`, `land`, `parking`), and set `listedBy` to `owner`, `agency` or `any` — that last one is the reason to use this actor rather than a dedicated portal. Put plain Greek or English place names in `locations` (`Αθήνα`, `Thessaloniki`, `Γλυφάδα`, `Κολωνάκι`); they are resolved against xe.gr's own place index, and a name it does not know is reported rather than silently ignored. Leave `locations` empty to sweep all of Greece. Narrow the price and the size with `minPrice`, `maxPrice`, `minSizeSqm` and `maxSizeSqm`. Narrow the property itself with `minBedrooms`, `maxBedrooms`, `minBathrooms`, `minFloor`, `maxFloor`, `minConstructionYear`, `maxConstructionYear`, `minEnergyClass`, `maxEnergyClass` and `condition`. `keywords` searches the advert text, `addedInLastDays` bounds how recent it is, and ten `only*` switches cover furnished, pets, parking, lift, air conditioning, garden, pool, a view, photos and short-term lets. `propertyType` narrows to one type but only within its own kind — `apartment` and `maisonette` belong to `residence`, `office` and `store` to `commercial`, `plot` to `land`, and a mismatched pair is refused rather than quietly returning nothing. `outputLanguage` switches the text fields between `el` and `en` over the same adverts and the same ids. `includeDetails` opens each advert page for the street address and the full text at an extra charge per property. To expand adverts you already have, set `operation` to `detail` and pass `listingUrls`; to reuse a search you built on xe.gr, paste the address into `searchUrls`. One search returns at most 9,996 rows however large the market is, so slice a national sweep by area, price band or type.

Start with this input:
{
  "operation": "search",
  "transaction": "rent",
  "propertyKind": "residence",
  "listedBy": "owner",
  "locations": [
    "Γλυφάδα"
  ],
  "maxResults": 100
}

Ask me which Greek city or neighbourhood, whether they are buying or renting, and whether they want adverts placed by owners, by agencies, or both, then run the Actor and summarise the results as a table.
```

**Things you can ask your agent for:**

- *Find every apartment in Glyfada placed by a private owner rather than an agency, under 1,200 euro a month.*
- *What is the median asking price per square metre for homes for sale in Kolonaki, and how does it compare with Piraeus?*
- *List homes to rent in Thessaloniki added in the last day, in English, with the street address and the full advert text.*
- *Show me energy class D or worse houses for sale in Chania built before 1990, ranked by price per square metre.*
- *How has the share of Athens rentals placed by owners rather than agencies changed over the adverts posted this week?*

Machine-readable API, MCP config and OpenAPI definition for this Actor are published at [apify.com/sian.agency/xe-property-scraper.md](https://apify.com/sian.agency/xe-property-scraper.md).

### 📋 Overview

**xe.gr is a general classifieds brand rather than a property portal, and that is the whole point.** It is where Greek private owners still place their own adverts, alongside the agency stock. This Actor reads the portal's live property section and hands you every advert as a flat row, with the owner-or-agency marker on each one.

**Why professionals choose it:**

- ✅ **Owner or agency, on every row and in the search**: `listedBy` reads `owner` or `agency`, and you can ask for one or the other. About a third of the freshest rental adverts are owner-placed, against roughly one in ten on the sale side.
- 🎯 **36 filters that were each proved to work**: every control here was tested against xe.gr's own live result count before it was offered. Thirteen more that looked plausible were dropped because the portal ignores them.
- 🇬🇷 **Greek or English, same adverts**: the portal publishes both, so ids, prices, sizes and coordinates match exactly and only the display text changes.
- 💰 **$2.00 per 1,000 properties**, charged per row delivered and never for a failed one.
- 💎 **Zero infrastructure settings**: no proxy picker, no concurrency dial, no retry count. Nothing for you to get wrong.
- ✨ **Four property kinds in one Actor**: homes, commercial space, land and parking. Live today that is 32,200 homes to rent, 128,500 for sale, 61,700 commercial spaces to rent, 258,500 for sale and about 96,000 plots of land.

***

### ✨ Features

- 🙋 **Private-owner search (σπίτι χωρίς μεσίτη)**: the segment xe.gr sells as a paid feature to its own visitors. Agency-only is narrowed by the portal itself. Owner-only is selected from the results it publishes to everyone, and you are billed only for the rows kept.
- 🏘️ **Homes, commercial, land and parking**: four sections of the Greek market, one Actor, one row shape.
- 📊 **Price per square metre on every row**, alongside the asking price and the size in τ.μ.
- ⚡ **Energy class from both ends**: floor it at B for certified stock, cap it at C to find the properties a renovation buyer wants.
- 🧭 **GPS coordinates** on every advert, so results drop straight onto a map.
- 📸 **Full photo sets**, plus video and virtual-tour links where the seller published them.
- 🆕 **Recency filter**: "posted in the last N days" turns this into a cheap daily monitor. One day leaves about 970 live rentals, seven days about 3,980.
- 📄 **Detail option**: street address, the seller's full listing text, the condition and up to 62 characteristics.
- 🔗 **Paste an xe.gr search URL**: build the search in your browser, hand over the link, and it is read exactly as the portal wrote it.
- 📥 **Flat JSON rows**: export as CSV, Excel or JSON, or pull them over the API.

***

### 🎬 Quick Start

Pick an area, choose rent or sale, press Start. Rows land in the dataset as they are found, and a run report is written to the key-value store. Nothing else to configure.

```bash
curl -X POST "https://api.apify.com/v2/acts/sian.agency~xe-property-scraper/runs?token=YOUR_TOKEN" \
-H 'Content-Type: application/json' \
-d '{"operation":"search","transaction":"rent","propertyKind":"residence","locations":["Γλυφάδα"],"maxResults":100}'
```

***

### 🚀 Getting Started (3 Simple Steps)

#### Step 1: Name your areas

Type Greek place names in Greek or in English: Αθήνα, Thessaloniki, Γλυφάδα, Chania, Κολωνάκι. Each one is checked against xe.gr's own place index before the search runs, so a name the portal does not recognise comes back as a warning rather than an empty result. Leave the list empty to sweep the whole country.

#### Step 2: Choose what you are looking at

Rent or sale, and which kind of property. Then set "Placed by" if you want only private owners or only agencies.

#### Step 3: Press Start

Add price, size, room, energy or feature filters if you want them. Switch the output to English if your team does not read Greek.

**That's it. Within a minute or two you'll have:**

- Every matching advert as a spreadsheet row
- The owner-or-agency marker on each one
- A run report showing what was found and what it cost

***

### 📥 Input Configuration

| Field | Type | Required | Description |
|---|---|---|---|
| `operation` | string | No | `search` (default) or `detail` |
| `transaction` | string | No | `rent` or `buy` |
| `propertyKind` | string | No | `residence`, `commercial`, `land` or `parking` |
| `listedBy` | string | No | `any`, `owner` or `agency` |
| `locations` | array | No | Greek place names, Greek or English. Empty means all of Greece |
| `propertyType` | string | No | One type within the kind, e.g. `apartment`, `office`, `plot` |
| `maxResults` | integer | No | Stop after this many rows. Ceiling 9,996 per search |
| `includeDetails` | boolean | No | Add the street address, the full advert text and every characteristic |
| `minPrice` / `maxPrice` | integer | No | Euro bounds. Monthly rent on rentals, total price on sales |
| `minSizeSqm` / `maxSizeSqm` | integer | No | Interior floor area in square metres |
| `minBedrooms` / `maxBedrooms` | integer | No | Bedroom bounds, not total rooms |
| `minBathrooms` | integer | No | Minimum bathrooms |
| `minFloor` / `maxFloor` | integer | No | 0 is the ground floor. Leave at -1 for any |
| `minConstructionYear` / `maxConstructionYear` | integer | No | Four-digit year bounds |
| `minEnergyClass` / `maxEnergyClass` | string | No | A+ down to G, bounded from either end |
| `condition` | string | No | `newly_built`, `renovated`, `under_construction`, `needs_renovation` |
| `onlyFurnished`, `onlyPetsAllowed`, `onlyWithParking`, `onlyWithElevator`, `onlyWithAirConditioning`, `onlyWithGarden`, `onlyWithPool`, `onlyWithView`, `onlyWithPhotos`, `onlyShortTermAvailable` | boolean | No | Must-have switches, applied by xe.gr's own search |
| `keywords` | string | No | Free text matched inside the advert, in Greek or English |
| `addedInLastDays` | integer | No | Only adverts published within N days |
| `sortBy` | string | No | `created_desc`, `price_asc`, `price_desc`, or the portal's own ranking |
| `outputLanguage` | string | No | `el` or `en` |
| `listingUrls` | array | No | Advert URLs for the `detail` operation (full addresses — Apify checks the field is a list of URLs before the run starts) |
| `searchUrls` | array | No | Paste xe.gr result URLs instead of filling the form |

**Example — owner-placed rentals in Γλυφάδα and Βούλα, posted this week:**

```json
{
  "operation": "search",
  "transaction": "rent",
  "propertyKind": "residence",
  "listedBy": "owner",
  "locations": ["Γλυφάδα", "Βούλα"],
  "addedInLastDays": 7,
  "minPrice": 500,
  "maxResults": 200
}
```

**Example — Athens apartments for sale, in English, with the full advert text:**

```json
{
  "operation": "search",
  "transaction": "buy",
  "propertyKind": "residence",
  "propertyType": "apartment",
  "locations": ["Athens"],
  "minSizeSqm": 70,
  "outputLanguage": "en",
  "includeDetails": true,
  "maxResults": 100
}
```

**Example — poorly rated houses in Χανιά for a renovation buyer:**

```json
{
  "operation": "search",
  "transaction": "buy",
  "propertyKind": "residence",
  "propertyType": "detached_house",
  "locations": ["Χανιά"],
  "maxEnergyClass": "E",
  "maxConstructionYear": 1990,
  "maxResults": 200
}
```

***

### 📤 Output

Every row is flat JSON with **59 fields**. The most useful ones:

| Field | Type | Description |
|---|---|---|
| `listingId` | string | The advert's id on xe.gr, stable across languages |
| `propertyTitle` | string | The advert title as published |
| `propertyUrl` | string | Link back to the advert |
| `listedBy` | string | `owner` or `agency` |
| `agencyName` / `agencyId` | string | The agency and its profile id, on professional adverts |
| `priceEur` / `priceText` | number / string | Asking price, numeric and as shown |
| `pricePerSqmEur` | number | Price per square metre |
| `sizeSqm` | number | Interior floor area |
| `bedrooms` / `bathrooms` | integer | Room counts |
| `floorLabels` / `buildingFloors` | array / integer | Which floor, and how many the building has |
| `constructionYear` / `renovationYear` | integer | Year built and year renovated |
| `energyClass` / `conditionLabel` | string | Energy certificate band and condition |
| `area` / `areaParts` | string / array | Area as published, and its parts |
| `streetAddress` | string | Street address (detail option) |
| `latitude` / `longitude` | number | GPS coordinates |
| `advertText` | string | The seller's own listing text (detail option) |
| `characteristics` | object | Up to 62 attributes (detail option) |
| `photoUrls` / `videoUrls` / `virtualTourUrls` | array | Media on the advert |
| `listedAgoText` / `publishedDate` | string | How long ago it was posted, and the date |
| `language` | string | `el` or `en`, matching what you asked for |

**Example row:**

```json
{
  "listingId": "5e67c7ef-6f76-4c5b-bc85-3dcb421d0b3c",
  "propertyTitle": "Μεζονέτα 119 τ.μ.",
  "propertyUrl": "https://www.xe.gr/property/d/enoikiaseis-katoikion/5e67c7ef-6f76-4c5b-bc85-3dcb421d0b3c/glyfada-paniwnia-1950-119",
  "listedBy": "owner",
  "agencyName": null,
  "agencyId": null,
  "transactionType": "RENT",
  "propertyKind": "residence",
  "propertyType": "MAISONETTE",
  "priceEur": 1950,
  "priceText": "1.950 €",
  "pricePerSqmEur": 16.39,
  "sizeSqm": 119,
  "sizeText": "119 τ.μ.",
  "area": "Γλυφάδα (Πανιωνία)",
  "listedAgoText": "πριν από 2 ημέρες",
  "language": "el"
}
```

***

### 💼 Use Cases & Examples

#### 1. Owner-Placed Listings for Buyer's Agents

**Agents who want to reach a seller before anyone else signs them.**

**Input:** An area, "Placed by" set to private owners, posted in the last day, run each morning.
**Output:** Only the adverts a private individual placed, with the advert link on each row.
**Use:** Work a daily list of owners who have just come to market. xe.gr charges its own visitors for this segmentation, and none of the other xe.gr Actors on the Store offers it as a filter.

#### 2. Greek Property Search In English

**Relocation firms and international buyers whose clients read no Greek.**

**Input:** The same search with the output language set to English, and the detail option on.
**Output:** Piraeus (Neo Faliro), 53 sq.m., €170,000, 1 day ago, with the street address and the seller's text attached.
**Use:** Hand a client a readable shortlist. The ids and numbers match the Greek run exactly, so the two can be joined.

#### 3. Renovation And Yield Screening

**Investors and renovation buyers hunting undervalued stock.**

**Input:** Energy class capped at C or worse, built before 1980, under a chosen price per square metre.
**Output:** The weakest stock in the area, with size, floor, year built and coordinates.
**Use:** Rank candidates on €/m² against the rental asking prices in the same neighbourhood, then shortlist the ones that close the gap after works.

#### 4. Building A Greek Property Index

**Analysts and data teams tracking the market month to month.**

**Input:** Homes, commercial, land and parking sweeps on a schedule, joined on the advert id.
**Output:** Coordinates, price per square metre and the owner-or-agency flag on every row.
**Use:** Track asking prices by area and property kind. The owner share of new adverts is an indicator in its own right, and no other xe.gr Actor exposes it.

#### 5. Agency Market Share And Stock Tracking

**Proptech vendors and agency principals watching the competition.**

**Input:** An area, "Placed by" set to agencies, run weekly.
**Output:** Agency name and profile id on every professional advert.
**Use:** Count who is holding stock in a patch, how fast it turns over, and how the owner-placed share moves against it.

#### 6. Short-Let Competitive Supply

**Short-let operators and holiday-rental managers pricing a property.**

**Input:** Furnished rentals offered short-term, with photos and a view.
**Output:** The competing supply in the area, with monthly asking rent and size.
**Use:** See what comparable stock is asking before setting your own rate.

#### 7. Commercial And Land Sourcing

**Developers, retailers and site finders.**

**Input:** Commercial space or land, with a price band and a minimum size.
**Output:** Offices, shops, industrial and craft space, or plots and parcels, each with area and coordinates.
**Use:** Screen sites across several regions in one pass, then map the survivors.

***

### 🔗 Integration Examples

#### JavaScript / Node.js

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });

const run = await client.actor('sian.agency/xe-property-scraper').call({
  operation: 'search',
  transaction: 'rent',
  propertyKind: 'residence',
  listedBy: 'owner',
  locations: ['Γλυφάδα', 'Βούλα'],
  maxResults: 200,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items[0]);
```

#### Python

```python
from apify_client import ApifyClient
client = ApifyClient('YOUR_TOKEN')

run = client.actor('sian.agency/xe-property-scraper').call(run_input={
    'operation': 'search',
    'transaction': 'buy',
    'propertyKind': 'residence',
    'propertyType': 'apartment',
    'locations': ['Athens'],
    'outputLanguage': 'en',
    'maxResults': 100,
})

for item in client.dataset(run['defaultDatasetId']).iterate_items():
    print(item['propertyTitle'], item['priceEur'], item['listedBy'])
```

#### cURL

```bash
curl -X POST 'https://api.apify.com/v2/acts/sian.agency~xe-property-scraper/runs?token=YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"operation":"search","transaction":"rent","propertyKind":"residence","listedBy":"owner","locations":["Θεσσαλονίκη"],"maxResults":100}'
```

#### Automation Workflows (N8N / Zapier / Make)

1. **Trigger**: a daily schedule
2. **HTTP Request**: call the Actor with `addedInLastDays: 1` and `listedBy: "owner"`
3. **Process**: filter the returned rows on your own criteria
4. **Action**: append to Google Sheets, push to a CRM, or send a Slack alert

***

### 📊 Performance & Pricing

#### FREE Tier (Try It Now)

- **25 properties** per run, with every field and every filter
- No credit card needed
- Enough to check the data is what you need

#### PAID Tier (Production Ready)

- **Unlimited** properties per run
- Pay per successful row. Errors are never charged
- 34 properties per request, up to 9,996 rows in one search

💰 **$2.00 per 1,000 properties**, and less on the higher plans. Expanding a property to its street address, full text and every characteristic costs $3.00 per 1,000 on top, and only when you ask for it. Each run also carries a $0.005 start fee per gigabyte of memory.

🔗 [View current pricing](https://apify.com/sian.agency/xe-property-scraper?fpr=sian)

***

### ❓ Frequently Asked Questions

**Q: Do I need an xe.gr account or an API key?**
A: No. Give it an area and press Start.

**Q: Can I get only the properties advertised by owners, not agencies?**
A: Yes, and it is the main reason to use this Actor. Set "Placed by" to private owners. Agencies-only is narrowed by xe.gr itself; the owner side is not offered to visitors, so the run reads the result set and keeps the owner adverts. You are billed for the rows kept, never for the ones discarded.

**Q: How does it know an owner placed the advert?**
A: xe.gr marks it on the advert. Owner adverts carry no agency name and are labelled Ιδιώτης on the page, while agency adverts carry the company name and its profile id. Both were checked against live advert pages before the field shipped.

**Q: Does it give me sold prices?**
A: No, and no source can. Greece has no public sold-price register and xe.gr publishes live adverts only, so every figure here is what a seller is asking.

**Q: Does it collect phone numbers?**
A: No, by choice. Contact details sit behind a reveal control, and a large share of these adverts are placed by private individuals. You get the agency name and profile id on professional adverts, and the advert URL on every row.

**Q: Why do I only get about 10,000 rows on a big search?**
A: xe.gr stops paginating at 294 pages of 34 rows, whatever total it reports. Split the search by area, price band or property type and run each slice. The run log says when it has hit the ceiling.

**Q: Is the output Greek or English?**
A: Your choice, and it is the same inventory either way. The portal publishes both, so the ids, prices, sizes and coordinates match exactly and only the display text changes. The seller's own advert text is whatever the seller wrote.

**Q: Why are some properties priced at €10?**
A: Those are placeholder adverts on the portal, not a parsing error. Set a minimum price to remove them, particularly when you sort cheapest first.

**Q: Can I paste a search I built on the site?**
A: Yes. Build it in your browser, copy the address bar into the xe.gr search URLs field, and the run reads exactly that search. Nothing is re-interpreted.

**Q: What output formats are available?**
A: JSON, CSV and Excel. Export straight from the dataset, or pull the rows over the API.

***

### 🐛 Troubleshooting

**"No properties matched"**

- The filters are too narrow. Greek stock skews old and largely uncertified, so an energy floor of B or a construction-year floor of 2015 cuts very hard.
- Check that the property type belongs to the kind you chose. Offices belong to commercial space and plots to land; the run tells you when the pair does not fit.

**An area was reported as unknown**

- Use the name as Greeks or the portal write it: Γλυφάδα, Θεσσαλονίκη, Chania, Kolonaki. Both alphabets resolve.
- If a neighbourhood will not resolve, use the town or city that contains it, or paste an xe.gr search URL instead.

**Rows are missing the street address or the advert text**

- Those live on the advert's own page. Switch on the detail option.

**Fewer rows than I asked for**

- The search genuinely has fewer live adverts than your limit. The run log prints the matching total before it starts paging.
- On the FREE tier every run stops at 25 rows.
- Owner-only searches return a subset of the pages read, so a strict owner filter on a thin area returns few rows by design.

**A run says the site is temporarily unavailable**

- xe.gr limits how fast anyone can read it. The Actor paces itself and retries. If a run still ends short, start it again shortly afterwards.

***

### ⚖️ Is it legal to scrape data?

Our actors are ethical and do not extract any private user data, such as email addresses, gender, or location. They only extract what the user has chosen to share publicly. We therefore believe that our actors, when used for ethical purposes by Apify users, are safe.

However, you should be aware that your results could contain personal data. Personal data is protected by the **GDPR** in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.

You can also read Apify's blog post on the [legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

***

### 🤝 Support

**Join our active support community**

- For issues or questions, open an issue on the actor's [Issues tab](https://apify.com/sian.agency/xe-property-scraper/issues)
- Check the [SIÁN Agency Store](https://apify.com/sian.agency?fpr=sian) for more automation tools
- 📧 <apify@sian-agency.online>

***

xe.gr and Χρυσή Ευκαιρία are trademarks of Χρυσή Ευκαιρία Μ.Α.Ε. This actor is not affiliated with, endorsed by or sponsored by them, and reads only publicly available adverts.

**Built by [SIÁN Agency](https://www.sian-agency.online)** | **[More Tools](https://apify.com/sian.agency?fpr=sian)**

# Changelog

This Actor's version history is a separate document: https://apify.com/sian.agency/xe-property-scraper/changelog.md

# Actor input Schema

## `operation` (type: `string`):

Pick one per run. Property Search sweeps a result set and returns one row per advert; Property Detail expands adverts you already have URLs for. Turning on the detail switch inside a search does both in one pass.

## `transaction` (type: `string`):

Whether to read the rent side of xe.gr or the sale side. Live today: 32,200 homes to rent and 128,500 for sale, 61,700 commercial spaces to rent and 258,500 for sale, 96,000 plots of land for sale.

## `propertyKind` (type: `string`):

xe.gr splits its property section four ways and they do not overlap. Homes covers apartments, maisonettes, detached houses and villas; Commercial covers offices, shops, industrial and craft space; Land covers plots and parcels.

## `listedBy` (type: `string`):

The reason to scrape xe.gr rather than a dedicated portal: it is where Greek private owners still advertise directly. About a third of the freshest rental adverts are placed by an owner rather than an agency, against roughly one in ten on the sale side. Agencies only is filtered by xe.gr itself. Private owners only is not offered to visitors, so the run reads the result set and keeps the owner adverts — you are billed only for the rows you keep, never for the ones discarded.

## `locations` (type: `array`):

Greek place names, in Greek or in English — Αθήνα, Thessaloniki, Γλυφάδα, Chania, Κολωνάκι. Each is resolved against xe.gr's own place index before the search runs, so a name the portal does not know is reported rather than silently ignored. Leave empty to sweep the whole of Greece.

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

The first nine types apply to Homes, the next four to Commercial space, the last three to Land. Picking a type that does not belong to the kind you chose returns nothing, so the run checks the pair first and tells you. Leave empty for every type.

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

Stop after this many rows. xe.gr serves 34 per page and refuses to paginate past 9,996 rows in any one result set, so that is the ceiling — to go deeper, split the search by area or price band and run it again.

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

Open each advert's own page to add the street address, the seller's full text, the energy class, the condition and up to 62 characteristics, plus the complete photo, video and virtual-tour set. One extra request per property, and it bills the Property Detail event on top of the search row.

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

Monthly rent for rentals, total asking price for sales. Leave at 0 for no floor. Worth setting: xe.gr carries placeholder adverts priced at €10, and a floor is the cleanest way past them.

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

Leave at 0 for no ceiling.

## `minSizeSqm` (type: `integer`):

Interior floor area in square metres — τετραγωνικά μέτρα, τ.μ. on the site. Leave at 0 for no floor.

## `maxSizeSqm` (type: `integer`):

Leave at 0 for no ceiling.

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

Bedrooms, not total rooms. Leave at 0 for any.

## `maxBedrooms` (type: `integer`):

Leave at 0 for any. Set to 1 for studios and one-bedroom flats (γκαρσονιέρα).

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

Leave at 0 for any.

## `minFloor` (type: `integer`):

0 is the ground floor (ισόγειο), 1 is the first floor above it. Leave at -1 to accept any floor, including basements.

## `maxFloor` (type: `integer`):

Leave at -1 for no ceiling. Set both to 0 to see only ground-floor property.

## `minConstructionYear` (type: `integer`):

Four-digit year. Leave at 0 for any age. Greek stock skews old — a floor of 2015 leaves about 2,300 of the 32,200 live rentals.

## `maxConstructionYear` (type: `integer`):

Leave at 0 for no ceiling.

## `minEnergyClass` (type: `string`):

The Greek energy certificate (ενεργειακή κλάση), A+ down to G. Only about 1,700 of the 32,200 live rentals are certified A+ — most Greek stock is unrated or low, so a strict floor cuts hard.

## `maxEnergyClass` (type: `string`):

Useful the other way round: cap at C or below to find the poorly rated stock that a renovation buyer wants.

## `condition` (type: `string`):

Newly built is xe.gr's own νεόδμητα filter and covers about 2,150 live rentals; renovated covers 12,600.

## `onlyFurnished` (type: `boolean`):

Only adverts marked furnished (επιπλωμένο) — 13,500 of the 32,200 live rentals.

## `onlyPetsAllowed` (type: `boolean`):

Only adverts that accept pets — 4,200 live rentals, and one of the hardest things to find in Greece.

## `onlyWithParking` (type: `boolean`):

Only adverts with a parking space (θέση στάθμευσης) — 7,270 live rentals.

## `onlyWithElevator` (type: `boolean`):

Only adverts in a building with a lift (ασανσέρ) — 12,200 live rentals. Worth pairing with a high floor filter.

## `onlyWithAirConditioning` (type: `boolean`):

Only adverts with air conditioning (κλιματισμός) — 20,100 live rentals.

## `onlyWithGarden` (type: `boolean`):

Only adverts with a garden (κήπος) — 6,920 live rentals.

## `onlyWithPool` (type: `boolean`):

Only adverts with a pool (πισίνα) — 1,070 live rentals, most of them coastal.

## `onlyWithView` (type: `boolean`):

Only adverts that claim a view (θέα) — 6,250 live rentals.

## `onlyWithPhotos` (type: `boolean`):

Only adverts carrying photographs — 30,300 of 32,200. The quiet one: it removes the thinnest adverts at almost no cost to the result count.

## `onlyShortTermAvailable` (type: `boolean`):

Only adverts offered for short stays (βραχυχρόνια μίσθωση) — 1,656 live rentals. Rent side only.

## `keywords` (type: `string`):

Free text searched inside the adverts, in Greek or English — γκαρσονιέρα, πισίνα, ρετιρέ, loft. xe.gr runs this server-side against the listing text, so it narrows the sweep rather than filtering afterwards.

## `addedInLastDays` (type: `integer`):

Only adverts published within this many days. 1 leaves about 970 live rentals, 7 leaves 3,980, 30 leaves 8,580. Leave at 0 for every advert regardless of age.

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

Order matters more than it looks: a search is capped at 9,996 rows, so on a large result set the order decides which 9,996 you get. Newest first is the right default for monitoring; cheapest first surfaces the €10 placeholder adverts, so pair it with a price floor.

## `outputLanguage` (type: `string`):

xe.gr publishes the same adverts in both languages and the run reads whichever you pick — Πειραιάς (Νέο Φάληρο) or Piraeus (Neo Faliro), 53 τ.μ. or 53 sq.m., πριν από 1 ημέρα or 1 day ago. Same adverts, same ids, same numbers: the numeric price, size and coordinates are identical either way, so only the human-readable text moves. The seller's own listing text is whatever the seller wrote and is not translated.

## `listingUrls` (type: `array`):

Used by the Property Detail operation: xe.gr advert URLs to expand, e.g. https://www.xe.gr/property/d/enoikiaseis-katoikion/5e67c7ef-6f76-4c5b-bc85-3dcb421d0b3c/glyfada-paniwnia-1950-119. The bare advert id works too.

## `searchUrls` (type: `array`):

Paste result URLs from xe.gr instead of filling the form — build the search you want in your browser, copy the address, drop it here. Everything already in the URL is kept exactly as the portal wrote it, and the filters above are ignored for that URL. Both https://www.xe.gr/property/results?… and the category pages under /property/r/ work.

## Actor input object example

```json
{
  "operation": "search",
  "transaction": "rent",
  "propertyKind": "residence",
  "listedBy": "any",
  "locations": [
    "Γλυφάδα"
  ],
  "propertyType": "",
  "maxResults": 50,
  "includeDetails": false,
  "minPrice": 0,
  "maxPrice": 0,
  "minSizeSqm": 0,
  "maxSizeSqm": 0,
  "minBedrooms": 0,
  "maxBedrooms": 0,
  "minBathrooms": 0,
  "minFloor": -1,
  "maxFloor": -1,
  "minConstructionYear": 0,
  "maxConstructionYear": 0,
  "minEnergyClass": "",
  "maxEnergyClass": "",
  "condition": "",
  "onlyFurnished": false,
  "onlyPetsAllowed": false,
  "onlyWithParking": false,
  "onlyWithElevator": false,
  "onlyWithAirConditioning": false,
  "onlyWithGarden": false,
  "onlyWithPool": false,
  "onlyWithView": false,
  "onlyWithPhotos": false,
  "onlyShortTermAvailable": false,
  "keywords": "",
  "addedInLastDays": 0,
  "sortBy": "created_desc",
  "outputLanguage": "el",
  "listingUrls": [],
  "searchUrls": []
}
```

# Actor output Schema

## `xeGrProperties` (type: `string`):

Every property this run returned.

## `scrapingSummary` (type: `string`):

HTML summary showing successful and failed results with key metrics

# 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 = {
    "operation": "search",
    "transaction": "rent",
    "propertyKind": "residence",
    "listedBy": "any",
    "locations": [
        "Γλυφάδα"
    ],
    "propertyType": "",
    "maxResults": 50,
    "includeDetails": false,
    "minPrice": 0,
    "maxPrice": 0,
    "minSizeSqm": 0,
    "maxSizeSqm": 0,
    "minBedrooms": 0,
    "maxBedrooms": 0,
    "minBathrooms": 0,
    "minFloor": -1,
    "maxFloor": -1,
    "minConstructionYear": 0,
    "maxConstructionYear": 0,
    "minEnergyClass": "",
    "maxEnergyClass": "",
    "condition": "",
    "onlyFurnished": false,
    "onlyPetsAllowed": false,
    "onlyWithParking": false,
    "onlyWithElevator": false,
    "onlyWithAirConditioning": false,
    "onlyWithGarden": false,
    "onlyWithPool": false,
    "onlyWithView": false,
    "onlyWithPhotos": false,
    "onlyShortTermAvailable": false,
    "keywords": "",
    "addedInLastDays": 0,
    "sortBy": "created_desc",
    "outputLanguage": "el",
    "listingUrls": [],
    "searchUrls": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("sian.agency/xe-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 = {
    "operation": "search",
    "transaction": "rent",
    "propertyKind": "residence",
    "listedBy": "any",
    "locations": ["Γλυφάδα"],
    "propertyType": "",
    "maxResults": 50,
    "includeDetails": False,
    "minPrice": 0,
    "maxPrice": 0,
    "minSizeSqm": 0,
    "maxSizeSqm": 0,
    "minBedrooms": 0,
    "maxBedrooms": 0,
    "minBathrooms": 0,
    "minFloor": -1,
    "maxFloor": -1,
    "minConstructionYear": 0,
    "maxConstructionYear": 0,
    "minEnergyClass": "",
    "maxEnergyClass": "",
    "condition": "",
    "onlyFurnished": False,
    "onlyPetsAllowed": False,
    "onlyWithParking": False,
    "onlyWithElevator": False,
    "onlyWithAirConditioning": False,
    "onlyWithGarden": False,
    "onlyWithPool": False,
    "onlyWithView": False,
    "onlyWithPhotos": False,
    "onlyShortTermAvailable": False,
    "keywords": "",
    "addedInLastDays": 0,
    "sortBy": "created_desc",
    "outputLanguage": "el",
    "listingUrls": [],
    "searchUrls": [],
}

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

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

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

```

## CLI example

```bash
echo '{
  "operation": "search",
  "transaction": "rent",
  "propertyKind": "residence",
  "listedBy": "any",
  "locations": [
    "Γλυφάδα"
  ],
  "propertyType": "",
  "maxResults": 50,
  "includeDetails": false,
  "minPrice": 0,
  "maxPrice": 0,
  "minSizeSqm": 0,
  "maxSizeSqm": 0,
  "minBedrooms": 0,
  "maxBedrooms": 0,
  "minBathrooms": 0,
  "minFloor": -1,
  "maxFloor": -1,
  "minConstructionYear": 0,
  "maxConstructionYear": 0,
  "minEnergyClass": "",
  "maxEnergyClass": "",
  "condition": "",
  "onlyFurnished": false,
  "onlyPetsAllowed": false,
  "onlyWithParking": false,
  "onlyWithElevator": false,
  "onlyWithAirConditioning": false,
  "onlyWithGarden": false,
  "onlyWithPool": false,
  "onlyWithView": false,
  "onlyWithPhotos": false,
  "onlyShortTermAvailable": false,
  "keywords": "",
  "addedInLastDays": 0,
  "sortBy": "created_desc",
  "outputLanguage": "el",
  "listingUrls": [],
  "searchUrls": []
}' |
apify call sian.agency/xe-property-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,sian.agency/xe-property-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/6gWwhkhapZVJ3gfIg/builds/fRBcxGBurZbM1Xcy1/openapi.json
