xe.gr Real Estate Scraper — Greece Property Listings avatar

xe.gr Real Estate Scraper — Greece Property Listings

Pricing

from $3.50 / 1,000 results

Go to Apify Store
xe.gr Real Estate Scraper — Greece Property Listings

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

Logiover

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

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.

Apify Actor


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

{
"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

ParameterTypeDefaultDescription
geoPlaceIdsstring[]requiredGoogle Place IDs (xe.gr's geo-filter primary key). Each ID is its own task.
areaSlugsstring[][]Optional URL slugs paired 1:1 with geoPlaceIds. Cosmetic — site resolves from place ID alone.
variationenumproperty-for-saleTransaction × item-type × building-type combo (see table below)
priceMin / priceMaxint0EUR range (0 = no bound)
sqmMin / sqmMaxint0m² range (0 = no bound)
bedroomsMin / bedroomsMaxint0Bedroom range (0 = no bound)
languageenumenen / el
maxListingsint200Total cap across all place tasks (0 = unlimited)
maxPagesPerTaskint10Pages per Place ID. Site caps at ~295 pages per filter set.
requestDelayint (ms)800Delay between page fetches
maxRetriesint3Retries on HTTP errors (rotates proxy IP)
proxyConfigurationobjectRESIDENTIAL+GRRESIDENTIAL recommended; datacenter usually OK at low volume.

Variations

VariationTransactionItem TypeBuilding Type
property-for-salebuyre_residence(any)
property-to-rentrentre_residence(any)
apartment-for-salebuyre_residenceapartment
apartment-to-rentrentre_residenceapartment
maisonette-for-salebuyre_residencemaisonette
maisonette-to-rentrentre_residencemaisonette
detached-house-for-salebuyre_residencedetached_house
detached-house-to-rentrentre_residencedetached_house
plots-of-land-for-salebuyre_land
plots-of-land-to-rentrentre_land
commercial-property-for-salebuyre_commercial
commercial-property-to-rentrentre_commercial
parking-spaces-for-salebuyre_parking
parking-spaces-to-rentrentre_parking
various-properties-for-salebuyre_various
various-properties-to-rentrentre_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

AreaPlace ID
AthensChIJ8UNwBh-9oRQR3Y1mdkU1Nic
ThessalonikiChIJ7eAoFPQ4qBQRqXTVuBXnugk
PiraeusChIJRzGst-u7oRQR9_0w_5XaINg
PatrasChIJLe0kpZk1XhMRoIy54iy9AAQ
LarissaChIJN86P3FaIWBMREMS54iy9AAM
KalamataChIJKXhLYpmwYRMRnl9ice2VH_w
ChalkidaChIJSxfWwksWoRQRBMk0e18KCzg
TrikalaChIJXy53IjMZWRMRwJ-54iy9AAQ
PeristeriChIJTazECEejoRQRYRYsuxSJ348
EgaleoChIJvUGcxaS8oRQRhQVsOC1EXzw
IlionChIJZfP8CqijoRQRoHm54iy9AAQ
PetroupoliChIJ46nkZnejoRQRhcY8oQ1xtI4
HaidariChIJIZwoz9W6oRQREHu54iy9AAQ
IlioupoliChIJ6QytjI69oRQRmVCWR9qyKrA
PangratiChIJy1stSUK9oRQRi9ObJcOmO20
GalatsiChIJLbYjnoSioRQRGDYRmwa6d6M
SalaminaChIJIY13tzSxoRQRB-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

  • 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 researchisMultipleListings: 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

VersionDateNotes
1.0.02026-05-04Initial release — direct HTML scraping, __NEXT_DATA__ JSON extraction with cheerio fallback, variation-driven URL construction, image-alt-derived enrichment.