# Spitogatos Scraper - Greek Property Listings (`sian.agency/spitogatos-property-scraper`) Actor

Scrape Spitogatos.gr, Greece's largest property portal: asking price, price per square metre, size, rooms, floor, energy class, year built, GPS, every photo and the listing agency's phone numbers. Sale and rent, all of Greece. JSON, CSV or Excel.

- **URL**: https://apify.com/sian.agency/spitogatos-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, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.06 / 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

## Spitogatos Scraper - Greek Property Listings & Agents 🏛️

[![SIÁN Agency Store](https://img.shields.io/badge/Store-SI%C3%81N%20Agency-1AE392)](https://apify.com/sian.agency?fpr=sian) [![Immobiliare Property Scraper](https://img.shields.io/badge/Store-Immobiliare%20Property-0B3C5D)](https://apify.com/sian.agency/immobiliare-property-scraper?fpr=sian) [![Daft Property Scraper](https://img.shields.io/badge/Store-Daft%20Property-00A05B)](https://apify.com/sian.agency/daft-property-scraper?fpr=sian) [![Fotocasa Property Scraper](https://img.shields.io/badge/Store-Fotocasa%20Property-E30613)](https://apify.com/sian.agency/fotocasa-property-scraper?fpr=sian)

#### 🎉 Every live advert on Greece's biggest property portal — 30 properties per request, from $1.20 per 1,000 rows

##### Built for Greek market analysts, estate agencies, retrofit installers and anyone pricing Athens property

***

### 🔎 What is the Spitogatos Scraper — and when should you use it?

The **Spitogatos Scraper** turns every live property advert on Spitogatos.gr, Greece's biggest property 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 or land for sale or to rent, returned as flat rows with asking price, price per square metre, size, rooms, decoded floor, GPS coordinates and photos. Full detail adds the street address, the Greek ΠΕΑ energy class as a letter grade, the construction year, the heating system and its fuel, the flooring and window materials and around 130 amenity attributes. Every row carries the listing agency, and agency contact adds its phone numbers, office address and website. Greek text comes back intact, and place names can be returned in Greek or in the portal's own English transliteration.

**Use something else when:** the property is outside Greece. Use [Immobiliare.it Scraper](https://apify.com/sian.agency/immobiliare-property-scraper?fpr=sian) for Italy — the sister portal of Spitogatos inside the same group. Use [Daft.ie Scraper](https://apify.com/sian.agency/daft-property-scraper?fpr=sian) for Ireland, with BER energy ratings, Eircodes and agent contacts. Use [Fotocasa Scraper](https://apify.com/sian.agency/fotocasa-property-scraper?fpr=sian) for Spain, for sale and to rent, with prices per square metre. This actor reads live adverts only. Greece publishes no sold-price register, so transaction history is not available from any source here; the closest signal is `priceReducedOnly`, which returns properties whose asking price has been cut along with the previous price. Cyprus is a separate site and is out of scope.

### 🤖 Use with AI agents

Already connected to the [Apify MCP server](https://mcp.apify.com)? Just ask for this Actor by name: sian.agency/spitogatos-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 Spitogatos.gr using the Apify Actor `sian.agency/spitogatos-property-scraper`.

Use it when I need: Greek homes, commercial space or land for sale or to rent, returned as flat rows with asking price, price per square metre, size, rooms, decoded floor, GPS coordinates and photos. Full detail adds the street address, the Greek ΠΕΑ energy class as a letter grade, the construction year, the heating system and its fuel, the flooring and window materials and around 130 amenity attributes. Every row carries the listing agency, and agency contact adds its phone numbers, office address and website. Greek text comes back intact, and place names can be returned in Greek or in the portal's own English transliteration.

Don't use it when: the property is outside Greece — use immobiliare-property-scraper or daft-property-scraper or fotocasa-property-scraper instead.

How to call it: give `locations` a list of place names in Greek or English (`Athens`, `Θεσσαλονίκη`, `Kolonaki`, `Glyfada`, `Chania`) and pick `listingType` (`sale` or `rent`) and `category` (`residential`, `commercial`, `land`, `other`). Narrow with `minPrice`, `maxPrice`, `minAreaSqm`, `maxAreaSqm`, `minRooms`, `maxRooms`, `minFloor`, `maxFloor`, `minYearBuilt`, `maxYearBuilt`, `energyClassAtLeast`, `listedWithin`, `updatedWithin`, `priceReducedOnly` and `features`. `propertyTypes` must belong to the `category` you picked or the run is refused rather than silently unfiltered. `includeDetails` adds the street address, energy class and full photo set for an extra charge per property; `includeAgentContact` adds agency phone numbers and bills once per unique agency. To expand properties you already have, set `operation` to `detail` and pass `listingUrls`; to reuse a search you built on spitogatos.gr, paste the link into `searchUrls`.

Start with this input:
{
  "operation": "search",
  "locations": [
    "Kolonaki"
  ],
  "listingType": "sale",
  "category": "residential",
  "propertyTypes": [
    "apartment"
  ],
  "minPrice": 200000,
  "maxResults": 100
}

Ask me which Greek city, island or neighbourhood, and whether they are buying or renting, then run the Actor and summarise the results as a table.
```

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

- *What is the median asking price per square metre for apartments in Kolonaki, and how does it compare with Glyfada?*
- *Find every A-rated apartment for sale in Thessaloniki under 300,000 euro and give me the agency phone numbers.*
- *Track new rentals added in Athens Centre in the last 24 hours and tell me the average monthly rent by neighbourhood.*
- *List pre-1980 apartments in Piraeus rated D or worse, with their size and the selling agency, for a retrofit campaign.*
- *Show me properties on Crete whose asking price has been cut, with the old price and the size of the cut.*

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

### 📋 Overview

**Greece's property market runs through one website, and that website publishes no API.** This Actor reads the portal's public listings directly and hands you every live advert as flat rows. Sale and rent, homes and commercial space and land, anywhere from Evros to Crete.

**Why professionals choose it:**

- ✅ **The fields Greek buyers actually ask for**: asking price, price per square metre, floor area, rooms, the ΠΕΑ energy class as a letter grade, construction year, heating system and its fuel.
- ⚡ **30 properties per request, with no pagination ceiling.** A search matching 29,658 properties still answers at row 29,700, so a whole city fits inside one run.
- 🎯 **Places by name, in Greek or English**: Athens, Θεσσαλονίκη, Kolonaki, Glyfada, Chania. Whichever place the portal matched is printed in the log and stamped on every row, so a near-match is visible rather than silent.
- 🎛️ **24 filters, every one applied before the rows are counted.** Floor range, energy class, construction year, price cuts and 19 must-have features all narrow the search at source, so you pay for the properties you asked for.
- 💰 **From $1.20 per 1,000 properties**, charged per delivered row and never for a failed one.
- 🇬🇷 **Greek survives the whole trip.** Descriptions and place names arrive exactly as the portal holds them, and one switch turns Αθήνα - Κέντρο into Athens - Center.

***

### ✨ Features

- 🏘️ **Four asset classes in one Actor**: homes, commercial property, land and the odd categories such as parking spaces and air rights.
- ⚡ **ΠΕΑ energy class both as filter and field**: ask for "C or better" and the search narrows before it runs; the grade lands on the row as A+ through G.
- 🪜 **Floors decoded, never raw.** The portal stores floors as codes where 10 means the fifth storey. A fifth-floor flat arrives as 5.
- 📞 **Agency phone numbers, office address, website and contact name**, looked up once per agency and reused across the run.
- 🧭 **GPS coordinates on every property**, so results drop straight onto a map.
- 📉 **Price cuts as their own filter**, returning the previous asking price and the size of the reduction on each row.
- 🆕 **Recency windows from 24 hours to a year**, on first listing date or last update, which turns a scheduled run into a cheap daily monitor.
- 🔗 **Paste a Spitogatos search link.** Build the search on the site, hand over the finished URL, and every filter on it is read back and reused.
- 📸 **Full photo sets, street address and around 130 amenity attributes** when you switch on the detail add-on.
- 📊 **Flat rows, 70 fields**: export as CSV, Excel or JSON, or pull them over the API.

***

### 🎬 Quick Start

Name a place, pick sale or rent, press Start. Rows land in the dataset as they are found, and a run report is written to the key-value store with the counts and what they cost. Nothing else needs configuring.

```bash
curl -X POST "https://api.apify.com/v2/acts/sian.agency~spitogatos-property-scraper/runs?token=YOUR_TOKEN" \
-H 'Content-Type: application/json' \
-d '{"operation":"search","locations":["Athens"],"listingType":"sale","category":"residential","maxResults":100}'
```

***

### 🚀 Getting Started (3 Simple Steps)

#### Step 1: Name your places

Type them the way you would type them into the site's own search box, in Greek or in English. A region, a city, a district or a single neighbourhood all resolve: Athens, Θεσσαλονίκη, Kolonaki, Glyfada, Mykonos. One search runs per place.

#### Step 2: Choose sale or rent, and the asset class

For sale is the larger pool nationwide. Homes is the default asset class; commercial, land and other property are one dropdown away.

#### Step 3: Press Start

Add price, size, room, floor, energy or feature filters if you want them. Switch on the detail add-on for street addresses and full photo sets, or agency phone numbers if you are building a contact list.

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

- Every matching property as a spreadsheet row
- Price per square metre calculated on each one
- A run report showing what was found, what failed and what it cost

***

### 📥 Input Configuration

| Field | Type | Required | Description |
|---|---|---|---|
| `operation` | string | No | `search` (default) or `detail` |
| `locations` | array | No | Place names in Greek or English. One search runs per place |
| `listingType` | string | No | `sale` (default) or `rent` |
| `category` | string | No | `residential`, `commercial`, `land` or `other` |
| `propertyTypes` | array | No | Narrow to particular types. They must belong to the asset class above |
| `maxResults` | integer | No | Whole-run budget: stop after this many properties across every place |
| `searchUrls` | array | No | Paste finished Spitogatos search links instead of filling the fields |
| `listingUrls` | array | No | Full Spitogatos property links, for the detail operation |
| `minPrice` / `maxPrice` | integer | No | Price bounds in euro, per month on rentals. 0 means no bound |
| `minAreaSqm` / `maxAreaSqm` | integer | No | Floor-area bounds in square metres |
| `minRooms` / `maxRooms` | integer | No | Room bounds. Bedrooms on homes, rooms on commercial property |
| `minFloor` / `maxFloor` | string | No | Floor range, from basement up to 50th and above |
| `minYearBuilt` / `maxYearBuilt` | integer | No | Construction-year bounds |
| `energyClassAtLeast` | string | No | ΠΕΑ class or better, e.g. `c` returns C, B, B+, A and A+ |
| `listedWithin` | string | No | Only adverts first published inside the window, from `24hours` to `1year` |
| `updatedWithin` | string | No | Only adverts the advertiser has touched inside the window |
| `priceReducedOnly` | boolean | No | Only properties whose asking price has been cut |
| `features` | array | No | Must-have list: lift, parking, garden, pool, penthouse, auction and 13 more |
| `sortBy` | string | No | Best match, most recently updated, cheapest first or dearest first |
| `includeDetails` | boolean | No | Add street address, energy class, heating, every photo and ~130 attributes |
| `includeAgentContact` | boolean | No | Add the listing agency's phone numbers, address, website and contact name |
| `language` | string | No | `el` (default) or `en` for place names |

**Example: three-bedroom apartments in central Athens between €200k and €400k:**

```json
{
  "operation": "search",
  "locations": ["Athens"],
  "listingType": "sale",
  "category": "residential",
  "propertyTypes": ["apartment"],
  "minPrice": 200000,
  "maxPrice": 400000,
  "minRooms": 3,
  "maxResults": 300
}
```

**Example: pre-1980 stock rated D or worse, for retrofit targeting:**

```json
{
  "operation": "search",
  "locations": ["Θεσσαλονίκη", "Πάτρα"],
  "listingType": "sale",
  "maxYearBuilt": 1980,
  "includeDetails": true,
  "includeAgentContact": true,
  "maxResults": 200
}
```

**Example: rentals added in the last day on three islands, with agency phones:**

```json
{
  "operation": "search",
  "locations": ["Mykonos", "Santorini", "Chania"],
  "listingType": "rent",
  "listedWithin": "24hours",
  "includeAgentContact": true,
  "language": "en",
  "maxResults": 150
}
```

**Example: expand adverts you already have:**

```json
{
  "operation": "detail",
  "listingUrls": ["https://www.spitogatos.gr/aggelia/1113403816"]
}
```

***

### 📤 Output

Every row is flat JSON with **70 fields**. The ones people use most:

| Field | Type | Description |
|---|---|---|
| `propertyTitle` | string | Type, size and area, as the portal describes the advert |
| `propertyUrl` | string | Working link back to the advert on Spitogatos |
| `price` / `pricePerSqm` | integer / number | Asking price in euro, and price per square metre |
| `priceReduced` / `pricePreReduction` | boolean / integer | Whether the price was cut, and what it was before |
| `areaSqm` / `rooms` / `bathrooms` | integer | Floor area and room counts |
| `floor` | string | Decoded storey, e.g. `5`, `ground_floor`, `basement` |
| `energyClass` | string | ΠΕΑ grade from `A+` to `G` (detail add-on) |
| `yearBuilt` / `underConstruction` | integer / boolean | Construction year, or the flag for property still being built |
| `heatingType` / `heatingMedium` | string | Autonomous or central, and the fuel it burns (detail add-on) |
| `floorMaterial` / `windowFrames` / `glazing` | string | Flooring, frames and glazing (detail add-on) |
| `latitude` / `longitude` | number | GPS coordinates |
| `streetAddress` / `region` / `municipality` | string | Address breakdown (detail add-on) |
| `imageUrls` / `imageCount` | array / integer | Every photo on the advert |
| `agencyName` / `agencyUrl` | string | Listing agency and its profile page |
| `agencyPhones` / `agencyAddress` / `agencyWebsite` | array / string | Agency contact block |
| `features` | array | Amenities the advertiser ticked (detail add-on) |

**Example row: an expanded Koukaki apartment:**

```json
{
  "listingId": 13403816,
  "propertyUrl": "https://www.spitogatos.gr/aggelia/1113403816",
  "propertyTitle": "apartment · 108 m² · Κουκάκι - Παιδική Χαρά (Κουκάκι - Μακρυγιάννη)",
  "listingType": "sale",
  "category": "residential",
  "propertyType": "apartment",
  "price": 425000,
  "currency": "EUR",
  "pricePerSqm": 3935.19,
  "areaSqm": 108,
  "rooms": 3,
  "bathrooms": 1,
  "floor": "5",
  "yearBuilt": 2025,
  "energyClass": "A",
  "heatingType": "autonomous",
  "heatingMedium": "natural gas",
  "floorMaterial": "wood",
  "windowFrames": "aluminium",
  "glazing": "Double",
  "streetAddress": "Καλλιρρόης, 80, Αθήνα Ελλάδα, 11741",
  "region": "Αττική",
  "municipality": "Αθήνα - Κέντρο",
  "neighbourhood": "Κουκάκι - Παιδική Χαρά",
  "latitude": 37.961319,
  "longitude": 23.719601,
  "imageCount": 10,
  "features": ["lift", "air conditioning", "storage room", "parking", "solar water heater", "EV charging"],
  "elevator": true,
  "parking": true,
  "newDevelopment": true,
  "agencyName": "ΕΥΓΕΙΟΣ - GOODLAND Ε.Π.Ε.",
  "agencyPhones": ["+306976989952", "+306980848075"],
  "publishedAt": "2026-07-06",
  "updatedAt": "2026-09-06"
}
```

#### Coverage

The whole of Greece, down to whichever neighbourhood the portal itself indexes. Both sides of the market and all four asset classes. Sold prices and transaction history are **not** available: Spitogatos publishes live adverts only, and Greece keeps no public sold-price register to join against. The nearest signal is the price-cuts filter, which returns the old price alongside the new one. Cyprus lives on a separate site and is out of scope.

***

### 💼 Use Cases & Examples

#### 1. Greek Property Market Analysis

**Analysts and economists tracking asking prices across Greek regions.**

**Input:** A region or a list of cities, run weekly on the for-sale side.
**Output:** Every live advert with asking price, floor area and price per square metre.
**Use:** Build a regional price index and watch it move. Price cuts are their own filter, with the previous price and the size of the reduction on the row, which is as close to a transaction signal as Greece publishes.

#### 2. Estate Agency Lead Lists

**Sales teams selling software, photography or portal services to Greek agencies.**

**Input:** An area and a price band, with agency phone numbers switched on.
**Output:** Agency name, phone numbers, office address, website and contact name.
**Use:** Build a call list of the agencies actually carrying stock in a patch. Each agency is looked up once and billed once, however many of its properties you pull.

#### 3. Athens and Island Rental Yield Modelling

**Investors and short-let operators pricing a neighbourhood.**

**Input:** The same neighbourhood swept twice, once for sale and once to rent.
**Output:** Price per square metre on both sides, with GPS on every row.
**Use:** Derive gross yield without a second data source. Koukaki, Chania and Mykonos can be isolated down to the neighbourhood rather than the island.

#### 4. Renovation and Energy-Upgrade Targeting

**Insulation, heat-pump and window installers looking for the right housing stock.**

**Input:** A city with the construction-year ceiling set to 1980 and the detail add-on on.
**Output:** Older stock with its ΠΕΑ grade, heating system, window frames and glazing.
**Use:** Find the properties Greece's Εξοικονομώ retrofit grants are aimed at, then reach the agency selling them.

#### 5. Golden-Visa and Relocation Sourcing

**Relocation advisers and buyer's agents building client shortlists.**

**Input:** A minimum price and a set of places.
**Output:** Qualifying properties with coordinates, size, energy class and photos.
**Use:** Drop results straight onto a map or into a CRM, and compare towns side by side on price per square metre.

#### 6. Daily New-Listing Monitoring

**Agencies and portals that need to see new supply first.**

**Input:** First listed within the last 24 hours, scheduled daily.
**Output:** Only what came onto the market since yesterday.
**Use:** Track new supply without re-buying the whole city every morning.

#### 7. Commercial and Land Sourcing

**Developers, franchise operators and site finders.**

**Input:** The commercial or land asset class, nationwide, with size and price bounds.
**Output:** Offices, shops, warehouses, hotels, plots and parcels with size, price and the listing agency.
**Use:** Watch available space and asking prices across Greece in a single pass.

***

### 🔗 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/spitogatos-property-scraper').call({
  operation: 'search',
  locations: ['Athens', 'Thessaloniki'],
  listingType: 'sale',
  category: 'residential',
  minRooms: 3,
  maxResults: 300,
});

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/spitogatos-property-scraper').call(run_input={
    'operation': 'search',
    'locations': ['Χανιά'],
    'listingType': 'rent',
    'includeAgentContact': True,
    'language': 'en',
    'maxResults': 150,
})

for item in client.dataset(run['defaultDatasetId']).iterate_items():
    print(item['propertyTitle'], item['price'], item.get('pricePerSqm'))
```

#### cURL

```bash
curl -X POST 'https://api.apify.com/v2/acts/sian.agency~spitogatos-property-scraper/runs?token=YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"operation":"search","locations":["Glyfada"],"listingType":"sale","energyClassAtLeast":"b","maxResults":100}'
```

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

1. **Trigger**: a daily schedule
2. **HTTP Request**: call the Actor with the first-listed window set to 24 hours
3. **Process**: filter the returned rows on your own criteria
4. **Action**: append to Google Sheets, push into a CRM, or fire a Slack alert

***

### 📊 Performance & Pricing

#### FREE Tier (Try It Now)

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

#### PAID Tier (Production Ready)

- **Unlimited** properties per run
- Charged per successful row. Failed items are never billed
- 30 properties per request with no pagination ceiling, so a whole city is one run

💰 **From $1.20 per 1,000 properties** on paid Apify plans. Expanding a property to its street address, energy class and full photo set costs $3.50 per 1,000 on top, and only when you ask for it. Agency contact details are $2.00 per 1,000 **unique agencies**, so fifty flats from one office cost one lookup. Starting a run costs $0.005.

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

***

### ❓ Frequently Asked Questions

**Q: Do I need a Spitogatos account or an API key?**
A: No. Give it a place name and press Start.

**Q: How many properties can I get?**
A: FREE tier: 25 per run. PAID tier: unlimited. There is no pagination ceiling, so a search matching 29,658 properties still answers at row 29,700.

**Q: Can I get sold prices?**
A: No. Spitogatos publishes live adverts only, and Greece has no public sold-price register. The nearest available signal is the price-cuts filter, which returns properties whose asking price has been reduced, along with the previous price and the size of the cut.

**Q: Does it cover Cyprus?**
A: No. Cypriot listings live on a separate site with a separate index. This Actor covers Greece.

**Q: Will Greek text come out readable?**
A: Yes. Descriptions, place names and agency names are returned exactly as the portal holds them. If you would rather have Latin place names, set the place-name language to English and Αθήνα - Κέντρο becomes Athens - Center. Advert descriptions stay in whatever language the advertiser wrote them.

**Q: How do I write a place name?**
A: However you would type it into the site's own search box, in Greek or English: Athens, Θεσσαλονίκη, Kolonaki, Glyfada, Chania. Names are resolved against the portal's own place index, which prefers a near match to no match at all. The place it settled on is printed in the run log and written to every row in the searched-place field, so you can always see what was actually searched.

**Q: What does the detail add-on give me?**
A: The street address, energy class, construction year, heating system and its fuel, floor and window materials, glazing, common expenses and availability date. You also get the complete photo set instead of the cover image, plus around 130 amenity attributes the advertiser filled in.

**Q: How is the agency contact charge counted?**
A: Once per unique agency in the run, never once per property. Fifty flats from the same agency cost one lookup. Privately advertised properties have no agency and are never billed for one, and nor is a lookup that returns no contact details. Property Detail rows already carry the agency phones at no extra charge.

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

***

### 🐛 Troubleshooting

**The results are from the wrong place**

- Check the searched-place field on the rows and the line in the run log. The portal's place index prefers a near match to no match, so a loose term such as "Greece" lands somewhere specific rather than everywhere.
- Use the name as the site itself writes it, in Greek or English: Θεσσαλονίκη or Thessaloniki, Κολωνάκι or Kolonaki.
- For an exact area, build the search on spitogatos.gr and paste the finished link into the search-URLs field. Every filter on the link is read back from it.

**No properties matched**

- The filters are too narrow. Widen the price band or drop the energy-class minimum first, since those two cut hardest.
- Check the asset class: a "Homes" search with a warehouse property type selected will be refused rather than silently ignored.

**A property type was refused**

- Property types belong to one asset class each. Office, shop and warehouse only work under Commercial; plot and parcel only under Land.

**Fewer rows than I asked for**

- The place 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.

**Energy class, year built or street address came back empty**

- Those live on the property's own record. Switch on the detail add-on and they appear on every row.

**No agency phone numbers on the rows**

- Switch on the agency phone numbers option. Search rows carry the agency name and profile link without it.
- Privately advertised properties have no agency at all, so there is nothing to attach.

**A run says "please retry in a few minutes"**

- The portal occasionally challenges a burst of visitors. The Actor already retries; if a run still finishes 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/spitogatos-property-scraper/issues)
- Check the [SIÁN Agency Store](https://apify.com/sian.agency?fpr=sian) for more automation tools
- 📧 <apify@sian-agency.online>

***

Spitogatos is a trademark of Real Web S.A. This actor is not affiliated with, endorsed by, or sponsored by Spitogatos.

**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/spitogatos-property-scraper/changelog.md

# Actor input Schema

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

Pick one operation per run. Property Search returns 30 rows per call and is where the value is; Property Detail expands one advert and is priced as an add-on.

## `site` (type: `string`):

Which marketplace to query.

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

Places to search, in Greek or English: Athens, Θεσσαλονίκη, Κολωνάκι, Glyfada, Chania, Mykonos. Each name is resolved against Spitogatos's own place index, so a region, a city, a district or a single neighbourhood all work. The place actually matched is printed in the log and stamped on every row as searchLocation, so a near-match is visible rather than silent. One search runs per place.

## `listingType` (type: `string`):

Which side of the market to search. For sale is by far the larger pool nationwide.

## `category` (type: `string`):

Homes covers apartments, maisonettes, detached houses and villas. Commercial covers offices, shops, warehouses and hotels. Land covers plots and parcels. Other property covers parking spaces, air rights and prefabricated units. The property types below must belong to the class you pick here.

## `propertyTypes` (type: `array`):

Narrow to particular kinds of property. Leave empty to take every type in the asset class you chose. Each entry is labelled with the class it belongs to — picking a Commercial type while the asset class is Homes is refused rather than silently ignored.

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

Stop after this many properties across all places. Each call returns 30 rows, so the run stops at the first call that crosses your limit.

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

Paste finished Spitogatos search links instead of filling the fields above, e.g. https://www.spitogatos.gr/pwliseis-diamerismata/athina-kentro. Every filter on the link is read from the portal's own reply, so you can build the search on the site and hand the result over. Given here, these replace the place and filter fields.

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

Used by the Property Detail operation: Spitogatos property links to expand, e.g. https://www.spitogatos.gr/aggelia/1113403816. Full links only. Apify validates this field before the run starts and rejects anything that is not a URL, so a bare advert number is refused by the platform, not by this actor.

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

Lowest asking price to include. For rentals this is euro per month. 0 means no lower bound.

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

Highest asking price to include. For rentals this is euro per month. 0 means no upper bound.

## `minAreaSqm` (type: `integer`):

Smallest floor area to include, in square metres. 0 means no lower bound.

## `maxAreaSqm` (type: `integer`):

Largest floor area to include, in square metres. 0 means no upper bound.

## `minRooms` (type: `integer`):

Fewest rooms to include. On homes this counts bedrooms; on commercial property it counts rooms. 0 means no lower bound.

## `maxRooms` (type: `integer`):

Most rooms to include. 0 means no upper bound.

## `minFloor` (type: `string`):

Only properties on this floor or higher. Spitogatos offers these steps and no others, so 11th to 14th is reached by choosing 10th and filtering the results yourself.

## `maxFloor` (type: `string`):

Only properties on this floor or lower. Ground floor is the usual choice for shops and for buyers who want no stairs.

## `minYearBuilt` (type: `integer`):

Earliest construction year to include. 0 means no lower bound. Properties still under construction carry no year and are excluded once you set this.

## `maxYearBuilt` (type: `integer`):

Latest construction year to include. 0 means no upper bound. Useful for finding pre-1980 stock that qualifies for Greek renovation grants.

## `energyClassAtLeast` (type: `string`):

Only properties rated at least this well on Greece's ΠΕΑ energy certificate scale. Exempt and pending certificates are excluded once this is set.

## `listedWithin` (type: `string`):

Only adverts first published inside this window. Set it to the last 24 hours and schedule the run daily to pay for new supply only.

## `updatedWithin` (type: `string`):

Only adverts the advertiser has touched inside this window. A stale advert is often a stale price, so this is the cleaner filter for a live-market snapshot.

## `priceReducedOnly` (type: `boolean`):

Return only properties whose asking price has been cut, with the old price and the size of the cut on every row. This is the closest signal Spitogatos publishes to a motivated seller.

## `features` (type: `array`):

Every property returned must have all of these. Each one was checked against the live portal and changes the result count, so nothing here is decorative. Auction applies to sales only.

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

Best match is the portal's own ranking and is right for a one-off sweep. Most recently updated is what you want for monitoring.

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

Open each property's own record to add the street address, energy class, construction year, heating system, floor and window materials, the full photo set and around 130 amenity attributes. Costs one extra request per property and bills the Property Detail event on top of the search row.

## `includeAgentContact` (type: `boolean`):

Attach the listing agency's phone numbers, office address, website and contact name to every row. Each agency is looked up once and reused across the whole run, and the Agency Contact event is billed once per unique agency — not per property, and never when the lookup returns no contact details. Property Detail rows already carry the agency's phones, so this costs nothing extra there.

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

Greek returns place names as Greeks write them: Αθήνα - Κέντρο, Κουκάκι. English returns the portal's own transliteration: Athens - Center, Koukaki. Descriptions are written by advertisers and stay in whatever language they wrote them in.

## Actor input object example

```json
{
  "operation": "search",
  "site": "GR",
  "locations": [
    "Athens",
    "Thessaloniki"
  ],
  "listingType": "sale",
  "category": "residential",
  "propertyTypes": [],
  "maxResults": 100,
  "searchUrls": [],
  "listingUrls": [],
  "minPrice": 0,
  "maxPrice": 0,
  "minAreaSqm": 0,
  "maxAreaSqm": 0,
  "minRooms": 0,
  "maxRooms": 0,
  "minFloor": "",
  "maxFloor": "",
  "minYearBuilt": 0,
  "maxYearBuilt": 0,
  "energyClassAtLeast": "",
  "listedWithin": "",
  "updatedWithin": "",
  "priceReducedOnly": false,
  "features": [],
  "sortBy": "best_match",
  "includeDetails": false,
  "includeAgentContact": false,
  "language": "el"
}
```

# Actor output Schema

## `spitogatosGrProperties` (type: `string`):

Every propertie 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",
    "site": "GR",
    "locations": [
        "Athens",
        "Thessaloniki"
    ],
    "listingType": "sale",
    "category": "residential",
    "propertyTypes": [],
    "maxResults": 100,
    "searchUrls": [],
    "listingUrls": [],
    "minPrice": 0,
    "maxPrice": 0,
    "minAreaSqm": 0,
    "maxAreaSqm": 0,
    "minRooms": 0,
    "maxRooms": 0,
    "minFloor": "",
    "maxFloor": "",
    "minYearBuilt": 0,
    "maxYearBuilt": 0,
    "energyClassAtLeast": "",
    "listedWithin": "",
    "updatedWithin": "",
    "priceReducedOnly": false,
    "features": [],
    "sortBy": "best_match",
    "includeDetails": false,
    "includeAgentContact": false,
    "language": "el"
};

// Run the Actor and wait for it to finish
const run = await client.actor("sian.agency/spitogatos-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",
    "site": "GR",
    "locations": [
        "Athens",
        "Thessaloniki",
    ],
    "listingType": "sale",
    "category": "residential",
    "propertyTypes": [],
    "maxResults": 100,
    "searchUrls": [],
    "listingUrls": [],
    "minPrice": 0,
    "maxPrice": 0,
    "minAreaSqm": 0,
    "maxAreaSqm": 0,
    "minRooms": 0,
    "maxRooms": 0,
    "minFloor": "",
    "maxFloor": "",
    "minYearBuilt": 0,
    "maxYearBuilt": 0,
    "energyClassAtLeast": "",
    "listedWithin": "",
    "updatedWithin": "",
    "priceReducedOnly": False,
    "features": [],
    "sortBy": "best_match",
    "includeDetails": False,
    "includeAgentContact": False,
    "language": "el",
}

# Run the Actor and wait for it to finish
run = client.actor("sian.agency/spitogatos-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",
  "site": "GR",
  "locations": [
    "Athens",
    "Thessaloniki"
  ],
  "listingType": "sale",
  "category": "residential",
  "propertyTypes": [],
  "maxResults": 100,
  "searchUrls": [],
  "listingUrls": [],
  "minPrice": 0,
  "maxPrice": 0,
  "minAreaSqm": 0,
  "maxAreaSqm": 0,
  "minRooms": 0,
  "maxRooms": 0,
  "minFloor": "",
  "maxFloor": "",
  "minYearBuilt": 0,
  "maxYearBuilt": 0,
  "energyClassAtLeast": "",
  "listedWithin": "",
  "updatedWithin": "",
  "priceReducedOnly": false,
  "features": [],
  "sortBy": "best_match",
  "includeDetails": false,
  "includeAgentContact": false,
  "language": "el"
}' |
apify call sian.agency/spitogatos-property-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,sian.agency/spitogatos-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/cmQF8fZIwyntL8xwB/builds/Ww17JIaI1gjlwaixJ/openapi.json
