xe.gr Real Estate Scraper — Greece Property Listings
Pricing
from $3.50 / 1,000 results
xe.gr Real Estate Scraper — Greece Property Listings
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.
Pricing
from $3.50 / 1,000 results
Rating
0.0
(0)
Developer
Logiover
Actor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
xe.gr Real Estate Scraper
Extract property listings from 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.
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:
__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.- 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
{"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:
{"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
adIdis the listing's stable UUID, sourced from the detail URL.floorsis 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/isFurnishedcome from the image alt text; absence means absent (mostly), not necessarily false.agentNameis 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/priceMaxfor 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
agentLogoUrlcluster - 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: trueflags 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. |