# XE.gr Property Scraper (`fayoussef/xe-gr-scraper`) Actor

Scrape Greek real estate listings from XE.gr: prices, size, rooms, GPS coordinates, amenities, photos and advertiser phone numbers. Works in every language XE.gr publishes: Greek, English, German, French and Spanish, both for the URLs you paste in and for the data you get back.

- **URL**: https://apify.com/fayoussef/xe-gr-scraper.md
- **Developed by:** [youssef farhan](https://apify.com/fayoussef) (community)
- **Categories:** Real estate, Developer tools, MCP servers
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.30 / 1,000 listing scrapeds

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

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

## What's an Apify Actor?

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

## How to integrate an Actor?

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

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

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

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

# README

**Scrape XE.gr property listings at scale.** This Actor extracts Greek real estate data from [XE.gr](https://www.xe.gr), Greece's largest property marketplace, and returns **60+ structured fields per listing**: asking price, price per square meter, floor area, bedrooms, energy class, amenities, exact address, GPS coordinates, **the advertiser's contact phone number**, agency details and full-resolution photo URLs, as JSON, CSV or Excel.

**Read this in another language:** [English (default)](#what-does-the-xegr-property-scraper-do) · [Ελληνικά / Greek](#ελληνικά--greek-version)

### What does the XE.gr Property Scraper do?

Paste any XE.gr search URL and this **XE.gr scraper** paginates through the results, opens every listing, and exports the complete record, including the **contact phone number** XE.gr hides behind its Show phone button. It handles **homes, commercial property, land and parking**, both **for rent and for sale**, anywhere in Greece, and works with **every language version XE.gr publishes**.

Because it runs on Apify you also get the REST API, scheduled runs, webhooks, integrations with Google Sheets, Slack, Zapier and Make, run monitoring, and residential proxy rotation, all without writing or maintaining any scraping code.

#### Every language XE.gr publishes

The Actor supports **all five language versions XE.gr offers: Greek (Ελληνικά), English, German (Deutsch), French (Français) and Spanish (Español)**, and it supports them on both sides:

- **Paste a URL in any of them.** `xe.gr/property/...` (Greek), `xe.gr/en/property/...`, `/de/`, `/fr/` and `/es/` are all accepted, and the Actor follows whichever one you gave it.
- **Get the data back in any of them.** Set **Output language** to pin every run to one language regardless of the URL you pasted, which keeps a scheduled dataset consistent. Leave it on **Auto** to follow your start URL.

Language changes the text XE.gr returns: property type, floor, condition, amenity names and page titles. Prices, sizes, coordinates, phone numbers and photos are identical in every language. Listing descriptions are the advertiser's own words and stay in whatever language they wrote them in, whichever version you pick.

### Why use the XE.gr scraper?

- **Real estate agencies** tracking competitor listings, asking prices and time on market across Athens, Thessaloniki and the islands.
- **Property investors** finding underpriced stock by comparing price per square meter within a neighbourhood.
- **Proptech startups** seeding a Greek property search, valuation or alerting product.
- **Market researchers and analysts** building rental yield and price trend datasets for the Greek housing market.
- **Relocation and golden visa consultants** assembling shortlists for clients by budget, area and energy class.
- **Data providers** feeding Greek supply into international property portals.

#### Is there an XE.gr API?

XE.gr publishes no public API for property data. This Actor is the practical **XE.gr API alternative**: you get the same listings as clean, versioned JSON over the Apify REST API, on a schedule you control.

### How to scrape XE.gr data

**The usual way.** Search on [XE.gr](https://www.xe.gr) exactly as you normally would: pick rent or buy, a location, and any filters. Copy the URL from your browser, paste it into **Start URLs**, click **Start**. Every filter you applied carries over automatically, so there is no query syntax to learn.

**No URL? Use option 2.** Leave Start URLs empty and open the **Search without a URL** section instead. Type a **Location** (Athens, Glyfada, Thessaloniki, Kolonaki, Greek spelling works too), choose **For rent** or **For sale**, and set whichever filters you need.

Either way, download the results as JSON, CSV, Excel, XML or JSONL, or pull them from the API.

### Input

The form has just four fields up front. Everything else is optional and tucked into sections. Full details are on the **Input** tab.

| Field | What it does |
|---|---|
| `startUrls` | Any XE.gr page: a results page, a map search with filters, an SEO location page, or a single listing. |
| `maxItems` | Stop after this many listings. Leave empty for everything the search returns. |
| `includeDetails` | On by default. Adds description, exact address, publication date and the full amenities list. Turn off for a faster, cheaper run. |
| `includePhone` | On by default. Adds the advertiser's contact phone numbers. Works on its own, so you can keep it on with `includeDetails` off. |

**Search without a URL (option 2).** Used only when Start URLs is empty.

| Field | What it does |
|---|---|
| `location` | City, area, suburb or region. Matched against XE.gr's own place search, and the match is written to the log. |
| `transactionType` | For rent, For sale, Auction or Land for flats. |
| `propertyCategory` | Homes, Commercial property, Land or Parking. |
| `minPrice`, `maxPrice` | Price range in euros. For rentals this is the monthly rent. |
| `minBedrooms`, `maxBedrooms`, `minBathrooms` | Room limits. |
| `searchTerm` | Free-text keyword, for example penthouse or seaview. |
| `propertyType` | Apartment, studio, maisonette, detached house, villa and more. |
| `minArea`, `maxArea` | Floor area range in square meters. |
| `minConstructionYear` | Only buildings built after this year. |
| `minEnergyClass` | Lowest acceptable energy rating, A+ down to G. |
| `amenities` | Must-have features: furnished, parking, garden, pool, elevator, pets allowed, short-term, student friendly, has photos. |
| `sortBy` | Which listings XE.gr picks first. Useful with `maxItems`, for example the 100 cheapest. |

**Run settings.**

| Field | What it does |
|---|---|
| `maxPages` | How many result pages to walk, 34 listings per page. Leave empty for all. |
| `language` | Output language: Auto, English, Greek, German, French or Spanish. |

```json
{
  "startUrls": [
    { "url": "https://www.xe.gr/en/property/results?transaction_name=buy&item_type=residence&minimum_price=200000" }
  ],
  "maxItems": 500,
  "includeDetails": true,
  "includePhone": true
}
```

Option 2, with Start URLs left empty:

```json
{
  "startUrls": [],
  "location": "Glyfada",
  "transactionType": "rent",
  "propertyCategory": "residence",
  "minPrice": 800,
  "maxPrice": 3000,
  "minBedrooms": 2,
  "propertyType": "apartment",
  "amenities": ["furnished", "parking"],
  "sortBy": "price_asc",
  "maxItems": 500
}
```

The two are alternatives, not layers: a Start URL already describes a complete search, so whenever you give one the option 2 fields are ignored and the run says so in the log.

### Output

One row per property. Download as JSON, HTML, CSV or Excel, or read it from the API.

```json
{
  "url": "https://www.xe.gr/en/property/d/property-to-rent/c2a62648-b5ba-43d4-aa9a-4a916ffabab1/agia-marina-3-500-85",
  "id": "c2a62648-b5ba-43d4-aa9a-4a916ffabab1",
  "title": "Detached house 85 sq.m.",
  "propertyTypeLabel": "Detached house",
  "transactionLabel": "Rent",
  "price": 3500,
  "priceCurrency": "EUR",
  "pricePerSqm": 41.18,
  "areaSqm": 85,
  "bedrooms": 2,
  "bathrooms": 2,
  "floor": "Ground floor",
  "energyClass": "B+",
  "heating": "Fully autonomous",
  "furnished": true,
  "address": "Agia Marina",
  "streetAddress": "Κριεζή 38, Αγ. Μαρίνα 194 00, Ελλάδα",
  "region": "East Attica Regional Unit",
  "latitude": 37.8277646,
  "longitude": 23.8437238,
  "description": "Furnished home for monthly rental on the Athens Riviera, with a private pool...",
  "datePosted": "2026-07-31T11:30:37Z",
  "phone": "+306944913973",
  "phones": ["+306944913973", "+302106998359"],
  "phonesText": "+306944913973, +302106998359",
  "phoneType": "MOBILE",
  "mobilePhone": "+306944913973",
  "landlinePhone": "+302106998359",
  "phoneCount": 2,
  "companyTitle": null,
  "isAgentListing": false,
  "amenities": ["Furnished", "Air conditioning", "Garden", "Pool", "Barbecue", "Alarm"],
  "mainImage": "https://blob.cdn.xe.gr/live/2026/07/31/....jpg",
  "images": ["https://blob.cdn.xe.gr/live/2026/07/31/....jpg"],
  "imageCount": 9
}
```

The Output tab ships four ready-made table views: **Overview** (what most people compare on), **Map and location** (coordinates and addresses for geo analysis), **Advertisers** (agency and market-share analysis) and **Contacts** (who to call about each property).

### Data fields

| Field | Description |
|---|---|
| `url`, `id` | Listing page and XE.gr's stable identifier |
| `title`, `propertyType`, `propertyTypeLabel`, `itemType` | What the property is |
| `transactionType`, `transactionLabel` | Rent, buy, auction or land for flats |
| `price`, `priceDisplay`, `priceHeadline` | Asking price or monthly rent in euros |
| `pricePerSqm`, `pricePerSqmDisplay` | Euros per square meter |
| `priceIsNegotiable` | Whether the advertiser marked the price negotiable |
| `areaSqm`, `areaDisplay` | Floor area |
| `bedrooms`, `bathrooms`, `wc` | Room counts |
| `levels`, `floor` | Which floors the property occupies |
| `constructionYear`, `renovationYear`, `condition` | Age and state |
| `energyClass` | Greek energy performance rating |
| `heating`, `heatingSource` | Heating autonomy and fuel |
| `furnished`, `petsAllowed`, `parkingSpots`, `availableFrom`, `view` | Rental-relevant attributes |
| `address`, `streetAddress`, `locality`, `region`, `country` | Location, down to the exact address where published |
| `latitude`, `longitude` | GPS coordinates |
| `description` | The advertiser's full listing text |
| `datePosted`, `publicationDate`, `listingAge` | When it went live |
| `companyTitle`, `isAgentListing`, `isCommercial`, `realtorId`, `realtorPageUrl`, `accountId` | Who is behind the listing |
| `phone`, `phoneType` | The number to call first, in international format, and whether it is a mobile or a landline |
| `mobilePhone`, `landlinePhone` | Split out separately, since advertisers often publish a mobile and an office landline |
| `phones`, `phonesText`, `phoneCount` | Every published number, as an array and as one comma-separated cell for spreadsheets |
| `phoneHidden`, `contactHoursFrom`, `contactHoursTo` | Whether the advertiser hid their number, and when they ask to be called |
| `amenities` | Every amenity present, by name |
| `characteristics` | All 50+ XE.gr attributes keyed by machine name, for filtering without string matching |
| `mainImage`, `images`, `imageCount`, `videos`, `virtualTours` | Media at the highest resolution available, with the first photo also as a single URL |
| `searchUrl`, `scrapedAt` | Provenance of the record |

### How much does it cost to scrape XE.gr?

You pay per result, so the cost scales with what you actually collect and there is nothing to estimate up front. Turning **Fetch full listing details** off roughly halves the work per listing when you only need price, size and location, and turning **Get the advertiser's phone number** off saves the phone charge. A listing whose advertiser hides their number is never charged for a phone.

Runs are fast: **300 listings with full details and phone numbers take about a minute**, and a 950-listing run finishes in roughly three. Paid plans include the residential network the Actor uses, so you spend none of your own proxy allowance.

**Free plan:** capped at 1 result page (about 34 listings) from the first URL, using Apify Proxy residential on your own account. [Subscribe to an Apify plan](https://apify.com/pricing?fpr=youssef) to unlock full pagination, all your start URLs and the included residential network.

### Tips for faster and cheaper runs

- **Narrow the search on XE.gr first.** XE.gr serves at most **295 result pages (about 10,000 listings)** per search, whatever the match count. To collect a large market, split it by area, price band or property type and pass several URLs. The Actor logs a warning when your search exceeds that ceiling.
- **Turn off full listing details** when you only need price, size, rooms, coordinates and photos. Those all come from the search results already. The phone option is separate, so you can leave it on and still get a fast, cheap run.
- **Set `maxItems`** for exploratory runs so you can inspect the shape of the data before committing to a full pull.
- **Schedule a daily run** on a narrow search and diff on `id` to build a new-listings feed.
- **Use `language`** to force one output language regardless of which URL you paste, which keeps a scheduled dataset consistent.

### Frequently asked questions

**What is XE.gr?**
XE.gr is Greece's largest classifieds site and the country's leading property marketplace, listing homes, commercial property, land and parking for sale and for rent.

**Does it work for both rentals and sales?**
Yes. Any XE.gr search URL works: rent, buy, auction or land for flats, and homes, commercial property, land or parking.

**Which languages does it support?**
All five that XE.gr itself publishes: Greek (Ελληνικά), English, German (Deutsch), French (Français) and Spanish (Español). That applies in both directions. You can paste a start URL from any of them, `xe.gr/property/...`, `/en/`, `/de/`, `/fr/` or `/es/`, and you can set `language` to force every run to return one specific language no matter which URL you pasted, or leave it on Auto to follow the URL.

Prices, sizes, coordinates, phone numbers and photos are the same in every language; what changes is the wording XE.gr returns for property type, floor, condition and amenities. Listing descriptions are the advertiser's own text and stay in whatever language they wrote.

**Can I scrape a single listing?**
Yes. Paste the listing page URL into Start URLs and you get that one record.

**How many listings can I get from one search?**
Up to about 10,000, because XE.gr stops paginating at 295 pages. Split larger markets into several narrower searches.

**Does it return phone numbers?**
Yes. XE.gr keeps advertiser phone numbers behind a **Show phone** click, and the Actor makes that same click for you, so every listing comes back with the numbers the advertiser published: `phone` for the main one in international format (+30...) and `phoneType` for mobile versus landline.

Advertisers often publish more than one, typically a mobile and an office landline, so those are split into `mobilePhone` and `landlinePhone`, with `phones` holding every number and `phonesText` holding them as one comma-separated cell for spreadsheets. Some advertisers choose to hide their number, and those listings come back with no phone and are not charged for one. You also get the agency name, agency profile URL and advertiser account ID.

**What output formats are available?**
JSON, CSV, Excel, XML and JSONL, from the dataset UI or the API.

**Does it support scheduling?**
Yes. Use Apify's scheduler to run daily or weekly and track new listings and price changes automatically.

**Can I call this from an AI agent?**
Yes. Call this Actor from an AI agent (Claude, ChatGPT, Cursor) via Apify MCP:

```
https://mcp.apify.com/actors/fayoussef/xe-gr-scraper
```

It is also available through the [Apify REST API](https://docs.apify.com/api/v2).

**Will a long run lose progress?**
No. Progress is checkpointed to the key-value store, so a migrated or restarted run resumes instead of re-scraping what it already pushed.

**Is it legal to scrape XE.gr?**
This Actor collects publicly available listing data. You are responsible for using that data in line with XE.gr's terms and applicable law, including GDPR where advertiser details are involved. Do not use it to build a competing database in breach of those terms.

### Support and custom work

Found a bug or need a field that is not extracted yet? Open a ticket on the **Issues** tab.

💼 Need a custom solution? Reach out at youssefarhan24@gmail.com
🌐 Got another site in mind? [Suggest it here](https://automationbyexperts.com/apify)

***

### Ελληνικά / Greek version

**Κάντε scraping αγγελιών ακινήτων από το XE.gr σε μεγάλη κλίμακα.** Αυτό το Actor εξάγει δεδομένα ελληνικών ακινήτων από το [XE.gr](https://www.xe.gr), τη μεγαλύτερη αγορά ακινήτων στην Ελλάδα, και επιστρέφει **60+ δομημένα πεδία ανά αγγελία**: τιμή, τιμή ανά τετραγωνικό μέτρο, εμβαδόν, υπνοδωμάτια, ενεργειακή κλάση, παροχές, ακριβή διεύθυνση, συντεταγμένες GPS, **το τηλέφωνο επικοινωνίας του διαφημιζόμενου**, στοιχεία μεσιτικού γραφείου και URL φωτογραφιών πλήρους ανάλυσης, σε μορφή JSON, CSV ή Excel.

#### Τι κάνει το XE.gr Property Scraper;

Επικολλήστε οποιοδήποτε URL αναζήτησης του XE.gr και το scraper περνάει από όλες τις σελίδες αποτελεσμάτων, ανοίγει κάθε αγγελία και εξάγει την πλήρη εγγραφή, μαζί με το **τηλέφωνο επικοινωνίας** που το XE.gr κρύβει πίσω από το κουμπί Εμφάνιση τηλεφώνου. Υποστηρίζει **κατοικίες, επαγγελματικά ακίνητα, οικόπεδα και θέσεις στάθμευσης**, τόσο **προς ενοικίαση όσο και προς πώληση**, σε όλη την Ελλάδα, και λειτουργεί σε **κάθε γλωσσική έκδοση που δημοσιεύει το XE.gr**.

Επειδή τρέχει στην Apify, έχετε επίσης REST API, προγραμματισμένες εκτελέσεις, webhooks, ενσωματώσεις με Google Sheets, Slack, Zapier και Make, παρακολούθηση εκτελέσεων και εναλλαγή residential proxy, χωρίς να γράψετε ή να συντηρήσετε κώδικα.

#### Όλες οι γλώσσες που δημοσιεύει το XE.gr

Το Actor υποστηρίζει **και τις πέντε γλωσσικές εκδόσεις του XE.gr: ελληνικά, αγγλικά, γερμανικά, γαλλικά και ισπανικά**, και μάλιστα και από τις δύο πλευρές:

- **Επικολλήστε URL σε οποιαδήποτε από αυτές.** Δεκτά είναι τα `xe.gr/property/...` (ελληνικά), `xe.gr/en/property/...`, `/de/`, `/fr/` και `/es/`, και το Actor ακολουθεί όποιο του δώσετε.
- **Πάρτε τα δεδομένα σε οποιαδήποτε από αυτές.** Ορίστε το **Output language** για να κλειδώσετε κάθε εκτέλεση σε μία γλώσσα, ανεξάρτητα από το URL που επικολλήσατε, ώστε ένα προγραμματισμένο dataset να μένει συνεπές. Αφήστε το σε **Auto** για να ακολουθεί το start URL σας.

Η γλώσσα αλλάζει το κείμενο που επιστρέφει το XE.gr: τύπο ακινήτου, όροφο, κατάσταση, ονόματα παροχών και τίτλους. Τιμές, εμβαδά, συντεταγμένες, τηλέφωνα και φωτογραφίες είναι ίδια σε κάθε γλώσσα.

#### Γιατί να το χρησιμοποιήσετε;

- **Μεσιτικά γραφεία** που παρακολουθούν αγγελίες ανταγωνιστών, τιμές ζήτησης και χρόνο παραμονής στην αγορά σε Αθήνα, Θεσσαλονίκη και τα νησιά.
- **Επενδυτές ακινήτων** που εντοπίζουν υποτιμημένα ακίνητα συγκρίνοντας την τιμή ανά τ.μ. μέσα στην ίδια γειτονιά.
- **Proptech startups** που χτίζουν πλατφόρμα αναζήτησης, εκτίμησης ή ειδοποιήσεων για ελληνικά ακίνητα.
- **Ερευνητές και αναλυτές** που δημιουργούν σύνολα δεδομένων για αποδόσεις ενοικίων και τάσεις τιμών.
- **Σύμβουλοι μετεγκατάστασης και golden visa** που ετοιμάζουν λίστες επιλογών ανά προϋπολογισμό, περιοχή και ενεργειακή κλάση.
- **Πάροχοι δεδομένων** που τροφοδοτούν διεθνείς πύλες ακινήτων με ελληνικά δεδομένα.

#### Υπάρχει API του XE.gr;

Το XE.gr δεν δημοσιεύει δημόσιο API για δεδομένα ακινήτων. Αυτό το Actor είναι η πρακτική **εναλλακτική ενός XE.gr API**: παίρνετε τις ίδιες αγγελίες σε καθαρό JSON μέσω του REST API της Apify, με το πρόγραμμα που ορίζετε εσείς.

#### Πώς να κάνετε scraping δεδομένων από το XE.gr

**Ο συνηθισμένος τρόπος.** Κάντε αναζήτηση στο [XE.gr](https://www.xe.gr) όπως θα κάνατε κανονικά, αντιγράψτε το URL από τον browser, επικολλήστε το στο **Start URLs** και πατήστε **Start**. Όλα τα φίλτρα που εφαρμόσατε μεταφέρονται αυτόματα, οπότε δεν χρειάζεται να μάθετε καμία σύνταξη ερωτημάτων.

**Χωρίς URL; Χρησιμοποιήστε την επιλογή 2.** Αφήστε το Start URLs κενό και ανοίξτε την ενότητα **Search without a URL**. Γράψτε μια **Τοποθεσία** (Αθήνα, Γλυφάδα, Θεσσαλονίκη, Κολωνάκι, δουλεύει και η ελληνική γραφή), επιλέξτε **ενοικίαση ή πώληση** και ορίστε όποια φίλτρα χρειάζεστε.

Και στις δύο περιπτώσεις, κατεβάστε τα αποτελέσματα σε JSON, CSV, Excel, XML ή JSONL, ή αντλήστε τα μέσω API.

#### Πεδία

**Κύρια φόρμα:** start URLs, μέγιστος αριθμός αγγελιών, πλήρη στοιχεία αγγελίας, τηλέφωνο διαφημιζόμενου.

**Αναζήτηση χωρίς URL (επιλογή 2):** τοποθεσία, ενοικίαση ή πώληση, κατηγορία ακινήτου, ελάχιστη και μέγιστη τιμή, ελάχιστα και μέγιστα υπνοδωμάτια, ελάχιστα μπάνια, λέξη-κλειδί, τύπος ακινήτου (διαμέρισμα, στούντιο, μεζονέτα, μονοκατοικία, βίλα και άλλα), εύρος εμβαδού, έτος κατασκευής, ελάχιστη ενεργειακή κλάση, υποχρεωτικές παροχές (επιπλωμένο, πάρκινγκ, κήπος, πισίνα, ασανσέρ, κατοικίδια, βραχυχρόνια μίσθωση, φοιτητικό, με φωτογραφίες) και σειρά ταξινόμησης.

**Ρυθμίσεις εκτέλεσης:** μέγιστες σελίδες και γλώσσα εξόδου.

Οι δύο τρόποι είναι εναλλακτικοί, όχι επάλληλοι: ένα Start URL περιγράφει ήδη μια πλήρη αναζήτηση, οπότε όταν δίνετε ένα, τα πεδία της επιλογής 2 αγνοούνται και το log το αναφέρει.

#### Ποια δεδομένα εξάγει;

**Αγγελία:** τίτλος, πλήρης περιγραφή, URL, τύπος ακινήτου, κατηγορία (πώληση ή ενοικίαση), ημερομηνία δημοσίευσης.

**Τιμολόγηση:** τιμή ζήτησης ή μηνιαίο μίσθωμα σε ευρώ, τιμή ανά τετραγωνικό μέτρο, ένδειξη διαπραγματεύσιμης τιμής.

**Χαρακτηριστικά:** τετραγωνικά μέτρα, υπνοδωμάτια, μπάνια, WC, όροφος, έτος κατασκευής, έτος ανακαίνισης, κατάσταση, ενεργειακή κλάση, θέρμανση και καύσιμο, επίπλωση, κατοικίδια, στάθμευση, διαθεσιμότητα, θέα, και πλήρης λίστα παροχών.

**Τοποθεσία:** περιοχή, πόλη, περιφερειακή ενότητα, χώρα, ακριβής διεύθυνση όπου δημοσιεύεται, συντεταγμένες GPS.

**Διαφημιζόμενος:** τηλέφωνο επικοινωνίας σε διεθνή μορφή (+30...), κινητό και σταθερό ξεχωριστά, όλα τα δημοσιευμένα τηλέφωνα σε πίνακα και σε ένα κελί, τύπος (κινητό ή σταθερό), ώρες επικοινωνίας, όνομα μεσιτικού γραφείου, URL προφίλ γραφείου, αναγνωριστικό λογαριασμού, ένδειξη αν πρόκειται για αγγελία ιδιώτη ή γραφείου.

**Πολυμέσα:** URL φωτογραφιών υψηλής ανάλυσης, βίντεο και εικονικές περιηγήσεις.

#### Πόσο κοστίζει;

Πληρώνετε ανά αποτέλεσμα, οπότε το κόστος ακολουθεί αυτό που πραγματικά συλλέγετε. Απενεργοποιώντας την επιλογή **Fetch full listing details** μειώνετε περίπου στο μισό τη δουλειά ανά αγγελία, όταν χρειάζεστε μόνο τιμή, εμβαδόν και τοποθεσία, ενώ απενεργοποιώντας το **Get the advertiser's phone number** γλιτώνετε τη χρέωση τηλεφώνου. Αγγελία που κρύβει το τηλέφωνό της δεν χρεώνεται ποτέ γι' αυτό.

Οι εκτελέσεις είναι γρήγορες: **300 αγγελίες με πλήρη στοιχεία και τηλέφωνα σε περίπου ένα λεπτό**, ενώ 950 αγγελίες ολοκληρώνονται σε περίπου τρία. Τα επί πληρωμή πλάνα περιλαμβάνουν το residential δίκτυο που χρησιμοποιεί το Actor, οπότε δεν ξοδεύετε δικό σας proxy.

**Δωρεάν πλάνο:** περιορισμός σε 1 σελίδα αποτελεσμάτων (περίπου 34 αγγελίες) από το πρώτο URL. [Εγγραφείτε σε πλάνο της Apify](https://apify.com/pricing?fpr=youssef) για πλήρη σελιδοποίηση, όλα τα start URLs και το ενσωματωμένο residential δίκτυο.

#### Συμβουλές

- **Περιορίστε πρώτα την αναζήτηση στο XE.gr.** Το XE.gr σερβίρει το πολύ **295 σελίδες αποτελεσμάτων (περίπου 10.000 αγγελίες)** ανά αναζήτηση. Για μεγάλες αγορές, χωρίστε τις ανά περιοχή, εύρος τιμής ή τύπο ακινήτου και δώστε πολλά URLs.
- **Απενεργοποιήστε τα πλήρη στοιχεία** όταν χρειάζεστε μόνο τιμή, εμβαδόν, δωμάτια, συντεταγμένες και φωτογραφίες. Η επιλογή τηλεφώνου είναι ανεξάρτητη, οπότε μπορεί να μείνει ενεργή.
- **Ορίστε `maxItems`** σε δοκιμαστικές εκτελέσεις για να δείτε τη μορφή των δεδομένων πριν από μια πλήρη άντληση.
- **Προγραμματίστε καθημερινή εκτέλεση** σε μια στοχευμένη αναζήτηση και συγκρίνετε με βάση το `id` για να φτιάξετε ροή νέων αγγελιών.

#### Συχνές ερωτήσεις

**Τι είναι το XE.gr;**
Το XE.gr είναι ο μεγαλύτερος ιστότοπος αγγελιών στην Ελλάδα και η κορυφαία αγορά ακινήτων της χώρας, με κατοικίες, επαγγελματικά ακίνητα, οικόπεδα και θέσεις στάθμευσης προς πώληση και ενοικίαση.

**Λειτουργεί για ενοικιάσεις και πωλήσεις;**
Ναι. Δουλεύει με οποιοδήποτε URL αναζήτησης του XE.gr: ενοικίαση, αγορά, πλειστηριασμό ή αντιπαροχή.

**Ποιες γλώσσες υποστηρίζει;**
Και τις πέντε που δημοσιεύει το ίδιο το XE.gr: ελληνικά, αγγλικά, γερμανικά, γαλλικά και ισπανικά, και από τις δύο πλευρές. Μπορείτε να επικολλήσετε start URL από οποιαδήποτε (`xe.gr/property/...`, `/en/`, `/de/`, `/fr/`, `/es/`) και να ορίσετε το `language` ώστε κάθε εκτέλεση να επιστρέφει μία συγκεκριμένη γλώσσα ανεξάρτητα από το URL, ή να το αφήσετε σε Auto για να ακολουθεί το URL. Οι περιγραφές των αγγελιών είναι κείμενο του διαφημιζόμενου και παραμένουν στη γλώσσα που τις έγραψε.

**Μπορώ να κάνω scraping μίας μόνο αγγελίας;**
Ναι. Επικολλήστε το URL της σελίδας της αγγελίας στο Start URLs.

**Πόσες αγγελίες παίρνω από μία αναζήτηση;**
Έως περίπου 10.000, επειδή το XE.gr σταματά τη σελιδοποίηση στις 295 σελίδες. Χωρίστε τις μεγαλύτερες αγορές σε στενότερες αναζητήσεις.

**Επιστρέφει τηλέφωνα;**
Ναι. Το XE.gr κρύβει τα τηλέφωνα πίσω από το κουμπί **Εμφάνιση τηλεφώνου** και το Actor κάνει αυτό ακριβώς το κλικ για εσάς: `phone` για το κύριο τηλέφωνο σε διεθνή μορφή (+30...) και `phoneType` για κινητό ή σταθερό. Πολλοί διαφημιζόμενοι δημοσιεύουν περισσότερα από ένα, συνήθως ένα κινητό και ένα σταθερό γραφείου, οπότε χωρίζονται σε `mobilePhone` και `landlinePhone`, ενώ το `phones` κρατά όλα τα νούμερα και το `phonesText` τα δίνει σε ένα κελί για υπολογιστικά φύλλα. Όσοι διαφημιζόμενοι επιλέγουν να κρύψουν το τηλέφωνό τους επιστρέφονται χωρίς τηλέφωνο και δεν χρεώνονται. Λαμβάνετε επίσης το όνομα του μεσιτικού γραφείου, το URL του προφίλ του και το αναγνωριστικό λογαριασμού.

**Υποστηρίζει προγραμματισμό εκτελέσεων;**
Ναι, μέσω του scheduler της Apify, για καθημερινή ή εβδομαδιαία παρακολούθηση νέων αγγελιών και μεταβολών τιμών.

**Μπορώ να το καλέσω από AI agent;**
Ναι, μέσω Apify MCP στο `https://mcp.apify.com/actors/fayoussef/xe-gr-scraper`, καθώς και μέσω του REST API της Apify.

**Χάνεται η πρόοδος σε μεγάλες εκτελέσεις;**
Όχι. Η πρόοδος αποθηκεύεται σε checkpoint, οπότε μια εκτέλεση που μετακινήθηκε ή ξεκίνησε ξανά συνεχίζει από εκεί που έμεινε.

**Είναι νόμιμο το scraping του XE.gr;**
Το Actor συλλέγει δημόσια διαθέσιμα δεδομένα αγγελιών. Είστε υπεύθυνοι για τη χρήση τους σύμφωνα με τους όρους του XE.gr και την ισχύουσα νομοθεσία, συμπεριλαμβανομένου του GDPR όπου εμπλέκονται στοιχεία διαφημιζομένων.

#### Υποστήριξη και προσαρμοσμένες λύσεις

Βρήκατε σφάλμα ή χρειάζεστε πεδίο που δεν εξάγεται; Ανοίξτε αίτημα στην καρτέλα **Issues**.

💼 Χρειάζεστε προσαρμοσμένη λύση; Επικοινωνήστε στο youssefarhan24@gmail.com
🌐 Έχετε άλλον ιστότοπο υπόψη; [Προτείνετέ τον εδώ](https://automationbyexperts.com/apify)

# Actor input Schema

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

Search on XE.gr as you normally would, then copy the URL from your browser and paste it here. Works with a results page, a map search with filters, an SEO location page, or a single listing page. Leave empty to build the search from the fields in Search without a URL instead.

## `maxItems` (type: `integer`):

Stop after this many listings. Leave empty to scrape everything the search returns.

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

Adds the description, the exact street address, the publication date and the complete amenities list by opening each listing. Turn this off for a faster, cheaper run that keeps only the search result fields.

## `includePhone` (type: `boolean`):

Adds the contact phone numbers published on each listing, owner or agency, exactly the ones XE.gr shows when you click Show phone. Works on its own, so you can keep this on and Fetch full listing details off. Listings whose advertiser hides their number simply come back with no phone.

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

City, area, suburb or region to search, for example Athens, Glyfada, Thessaloniki or Kolonaki. Greek spelling works too. The closest match on XE.gr is used and its full name is written to the log so you can check it.

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

Whether to collect rentals or properties for sale.

## `propertyCategory` (type: `string`):

The kind of property to search for.

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

Lowest asking price, or lowest monthly rent for rentals. Leave empty for no minimum.

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

Highest asking price, or highest monthly rent for rentals. Leave empty for no maximum.

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

Fewest bedrooms a property must have. Leave empty for any.

## `searchTerm` (type: `string`):

Optional free text matched against the listing, for example penthouse, seaview or renovated.

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

Narrow to one specific type. The options below are for Homes. For Commercial property, Land or Parking, leave this on Any and use the Category field, or set property\_type in Extra search parameters.

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

Smallest floor area to include.

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

Largest floor area to include.

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

Most bedrooms a property may have.

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

Fewest bathrooms a property must have.

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

Earliest construction year to include, for example 2010.

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

Lowest acceptable Greek energy performance rating.

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

Only return properties that have all of the selected features.

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

Order XE.gr picks results in. Matters when you cap the run with Maximum listings, because you get the top of this order, for example the 100 cheapest. Rows arrive in the dataset in whatever order they finish, so sort the dataset itself if you need the output ordered too.

## `maxPages` (type: `integer`):

How many result pages to go through, 34 listings per page. Leave empty for all of them. XE.gr itself serves at most 295 pages (about 10,000 listings) per search, so split very large searches by area or price.

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

Language of the text XE.gr returns: property type, floor, condition, amenity names and page titles. Prices, sizes, coordinates and photos are the same in every language. Auto follows your Start URL, or uses English when you search without one.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.xe.gr/en/property/results?transaction_name=rent&item_type=residence&country=GR&minimum_price=1000&minimum_bedrooms=1"
    }
  ],
  "maxItems": 100,
  "includeDetails": true,
  "includePhone": true,
  "location": "Athens",
  "transactionType": "rent",
  "propertyCategory": "residence",
  "propertyType": "any",
  "minEnergyClass": "any",
  "amenities": [],
  "sortBy": "any",
  "language": "auto"
}
```

# Actor output Schema

## `listings` (type: `string`):

Every scraped listing with price, price per square meter, size, rooms, floor, energy class, amenities, address, GPS coordinates, description and photo URLs. Switch between the Overview, Map and Advertisers views in the table.

# 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 = {
    "startUrls": [
        {
            "url": "https://www.xe.gr/en/property/results?transaction_name=rent&item_type=residence&country=GR&minimum_price=1000&minimum_bedrooms=1"
        }
    ],
    "maxItems": 100,
    "location": "Athens"
};

// Run the Actor and wait for it to finish
const run = await client.actor("fayoussef/xe-gr-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 = {
    "startUrls": [{ "url": "https://www.xe.gr/en/property/results?transaction_name=rent&item_type=residence&country=GR&minimum_price=1000&minimum_bedrooms=1" }],
    "maxItems": 100,
    "location": "Athens",
}

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

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

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

```

## CLI example

```bash
echo '{
  "startUrls": [
    {
      "url": "https://www.xe.gr/en/property/results?transaction_name=rent&item_type=residence&country=GR&minimum_price=1000&minimum_bedrooms=1"
    }
  ],
  "maxItems": 100,
  "location": "Athens"
}' |
apify call fayoussef/xe-gr-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/ferl1nz9avLEEUOSK/builds/l0tU2Rc2VQVvQ25aC/openapi.json
