# Spitogatos.gr Property Scraper (`memo23/spitogatos-scraper`) Actor

Scrape property listings from Spitogatos.gr — Greece's largest real estate portal. Sale or rent, any area, full details optional. JSON/CSV/Excel out.

- **URL**: https://apify.com/memo23/spitogatos-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** Real estate
- **Stats:** 19 total users, 18 monthly users, 94.4% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.20 / 1,000 listings

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.gr Property Scraper

Turn any Spitogatos.gr search into a clean dataset of Greek property listings.
Paste a search URL for sales or rentals, anywhere in Greece and with any filters, and get price, size, rooms, GPS coordinates, photos, and agency details. Turn on full details to add 180+ fields per listing, including street address, energy class, year built, amenities, and agency phone numbers.

### Why Use This Scraper?

- **Works with the URL you already have.** Set filters on Spitogatos.gr, copy the address bar, paste it in. English and Greek URLs both work.
- **Sale and rent, every property type.** Homes, apartments, land, commercial, in any area the site covers.
- **Full listing records on request.** `fetchFullDetails` opens each listing page and merges in the complete record: full description, all photos, energy class, year built, heating, parking, amenities, and agency contacts.
- **Handles the site's bot protection.** Spitogatos runs Imperva. The actor solves the challenge in a real browser, then scrapes over fast HTTP with its own sticky proxy sessions.
- **Price-drop data included.** `priceReduced`, `pricePreReduction`, and `priceChangePercentage` come with every row.
- **Export anywhere.** JSON, CSV, Excel, XML, or the Apify API.

### Overview

Spitogatos.gr is Greece's largest real estate portal, with tens of thousands of listings in Athens alone. This actor is for anyone who needs that inventory as data: investors comparing €/m² by neighborhood, agencies tracking competitors, analysts following rents, and proptech teams feeding a model.

Each dataset row is one listing. Without details, a row holds the fields Spitogatos shows on its search results page (about 40). With `fetchFullDetails` on, the same row is extended with the full listing record from the property page (about 180 fields). The site's own field names are kept, so values match what Spitogatos uses internally.

### Supported Inputs

| Input type | Example URL | Behavior |
|---|---|---|
| English search | `https://www.spitogatos.gr/en/for_sale-homes/athens-center` | Walks every results page (30 listings each) until `maxItems` |
| Greek search | `https://www.spitogatos.gr/pwliseis-katoikies/athina-kentro` | Same, using the Greek page format |
| Rentals | `https://www.spitogatos.gr/en/to_rent-homes/athens-center` | Same fields; `buy_or_rent` is `"1"` |
| Filtered search | `https://www.spitogatos.gr/en/for_sale-homes/athens-center/reduced_price` | Filters in the URL path are kept on every page |
| Start mid-way | `https://www.spitogatos.gr/en/for_sale-homes/athens-center/page_5` | Starts at page 5 and continues from there |

How to get a URL: open Spitogatos.gr, choose sale or rent, the area, and any filters, then copy the results page address.

Not supported: single listing URLs (`/property/...`, `/aggelia/...`), agency profile pages, and anything behind a Spitogatos login.

### Use Cases

| Who | What they do with it |
|---|---|
| Property investors | Compare asking prices and €/m² across Athens, Thessaloniki, and the islands |
| Real estate agencies | Track competitor inventory, pricing, and new listings in their area |
| Market analysts | Measure supply, rents, and price cuts over time with scheduled runs |
| Proptech and data teams | Feed valuation models with coordinates, size, age, and energy class |
| Lead generation | Build lists of active agencies with their listings and contact numbers |

### How It Works

![How the Spitogatos.gr Scraper works](https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/how-it-works-spitogatos.png)

1. You paste a Spitogatos search URL and set how many listings you want.
2. A headless browser opens the search once per proxy session to pass the Imperva check.
3. The actor fetches each results page over HTTP and reads the structured data embedded in the page.
4. With `fetchFullDetails` on, it opens each listing page the same way and merges the full record into the row.
5. Rows are saved to the dataset as they are scraped. Duplicate listings across pages are skipped.

### Input Configuration

| Field | Type | Default | Description |
|---|---|---|---|
| `startUrl` | string | (required) | Spitogatos.gr search results URL, English or Greek, with any filters |
| `maxItems` | integer | `100` | Maximum listings to save. Free plan: 5 per run |
| `fetchFullDetails` | boolean | `false` | Open each listing page and add the full record. One extra request per listing, so slower |
| `maxPages` | integer | `0` | Maximum results pages to fetch (30 listings each). `0` means no page limit |
| `proxy` | object | Apify Proxy (residential) | Proxy settings. Apify Proxy with no group chosen runs on residential IPs. Own proxies must keep one IP per URL |

Quick sample of Athens Center sales:

```json
{
  "startUrl": "https://www.spitogatos.gr/en/for_sale-homes/athens-center",
  "maxItems": 50
}
```

Full records for discounted listings:

```json
{
  "startUrl": "https://www.spitogatos.gr/en/for_sale-homes/athens-center/reduced_price",
  "maxItems": 200,
  "fetchFullDetails": true
}
```

Rentals, first 10 pages only:

```json
{
  "startUrl": "https://www.spitogatos.gr/en/to_rent-homes/athens-center",
  "maxItems": 1000,
  "maxPages": 10
}
```

### Output Overview

One row per listing. Every row has `id` (the listing code Spitogatos shows on the page) and `url` (the listing page). Search-level fields cover price, price-drop data, size, rooms, floor, coordinates, area name, main photo, ad tier, dates, and the agency (`reAgent`).

With `fetchFullDetails`, the row also gets the full property record: `streetAddress` when the publisher shares it, the complete `description`, `images` in four sizes, `energyClass`, `year_of_construction`, `pricePerSqMeters`, heating, parking, and dozens of amenity flags, plus `propertyPublisher` with phone numbers and website.

Amenity flags use Spitogatos' own values: `"1"` yes, `"0"` no, `null` not stated. Some fields (`energyClass`, `heatingMedium`, `floorType`) are numeric codes as used by the site.

### Output Samples

Real row from a `fetchFullDetails` run on `https://www.spitogatos.gr/en/for_sale-homes/athens-center/reduced_price`, trimmed to the main fields:

```json
{
  "id": 20789038,
  "url": "https://www.spitogatos.gr/en/property/1120789038",
  "category": "house",
  "buy_or_rent": "0",
  "price": 155000,
  "priceReduced": true,
  "pricePreReduction": 162000,
  "priceChangePercentage": 4,
  "pricePerSqMeters": 2123.29,
  "sq_meters": 73,
  "rooms": 2,
  "no_of_bathrooms": 1,
  "floorNumber": 7,
  "year_of_construction": 1978,
  "energyClass": 5,
  "geography": "Kolonos (Kolonos - Kolokynthous)",
  "latitude": 37.997017,
  "longitude": 23.714556,
  "description": "KOLONOS | FULLY RENOVATED AND FURNISHED 73 SQ.M. | 2 BEDROOMS | €155.000 ...",
  "images": [
    {
      "id": 367994308,
      "medium": "https://m2.spitogatos.gr/367994308_300x220.jpg?v=20130730",
      "large": "https://m2.spitogatos.gr/367994308_900x675.jpg?v=20130730",
      "xlarge": "https://m2.spitogatos.gr/367994308_1600x1200.jpg?v=20130730",
      "description": "Interiors"
    }
  ],
  "elevator": "1",
  "balcony": "1",
  "propertyPublisher": {
    "isAgent": true,
    "name": "A4group Real Estate & Investments",
    "profilePath": "/find-agents/A-group-Real-Estate-Investments/661",
    "phones": [{ "phone": "+302111195294", "name": null }],
    "websiteUrl": "http://www.A4group.gr"
  },
  "firstPublishDate": "2026-09-07",
  "modified": "2026-10-02"
}
```

### Key Output Fields

**Identity:** `id`, `url`, `category`, `subtype`, `buy_or_rent`, `adType_code`

**Price:** `price`, `priceReduced`, `pricePreReduction`, `priceChangePercentage`, `pricePerSqMeters` (details), `negotiablePrice` (details), `commonExpenses` (details)

**Size and layout:** `sq_meters`, `rooms`, `no_of_bathrooms`, `no_of_WC`, `kitchens`, `livingRooms`, `floorNumber`, `levels`

**Location:** `geography`, `latitude`, `longitude`, `geocodeType`, `streetAddress` (details), `geographiesByLevel` (details)

**Building:** `year_of_construction`, `renovationYear`, `energyClass`, `heatingMedium`, `elevator`, `garage`, `storage`, `balcony`, `view`, `furnished`, and more amenity flags (details)

**Media:** `mainImageURL`, `imageIds`, `images` (details), `hasVTour`, `vTourUrl`, `hasVideo`, `youtubeVideoId`

**Publisher:** `reAgent` (agency name, logo, profile, phones), `propertyPublisher` (details: name, phones, website)

**Dates:** `firstPublishDate`, `uploaded`, `modified`

### FAQ

**Which URLs can I use?**
Any Spitogatos.gr search results page, English or Greek, sale or rent, with any filters. Single listing pages are not supported as start URLs.

**Do I need full details?**
No. Search fields cover price, size, rooms, coordinates, and agency. Turn on `fetchFullDetails` when you need the address, full description, all photos, building data, or phone numbers. It makes one extra request per listing.

**Why is `streetAddress` empty on some rows?**
The publisher chose not to show it. The actor returns what Spitogatos shows.

**Why does `maxItems` stop at 5?**
The free plan is capped at 5 listings per run. Paid plans use your `maxItems`.

**What does `buy_or_rent` mean?**
`"0"` is a sale, `"1"` a rental.

**Can I use my own proxies?**
Yes. Each proxy URL should keep the same IP (a sticky session). URLs that switch IP on every request get blocked by Imperva.

**How fast is it?**
Search-only runs move at roughly one results page (30 listings) every few seconds. With full details, expect about 30 listings every 20 seconds.

**Does it scrape anything behind a login?**
No. Only public listing pages.

### Support

- For issues or feature requests, please use the [Issues](https://console.apify.com/actors/iKhtdqUhpgFErJoNV/issues) section of this actor.
- If you need customization or have questions, contact the author:
  - Author's website: <https://muhamed-didovic.github.io/>
  - Email: <muhamed.didovic@gmail.com>

### Additional Services

- Request customization or a whole dataset: <muhamed.didovic@gmail.com>
- If you need anything else scraped, or this actor customized, email: <muhamed.didovic@gmail.com>
- For API services of this scraper (no Apify fee, just usage fee for the API), contact: <muhamed.didovic@gmail.com>

### Explore More Scrapers

More real estate scrapers (Idealista, Immobiliare, ImmobilienScout24, Immoweb, Funda, and others) are on [memo23's Apify profile](https://apify.com/memo23).

### 🤖 For AI Agents & LLM Apps

Compact reference for AI agents calling this actor via the [Apify MCP server](https://mcp.apify.com) or the Apify API (actor: `memo23/spitogatos-scraper`).

**Purpose:** Greek property listings (sale or rent) from a Spitogatos.gr search URL, optionally with the full per-listing record.

**Minimal input:**

```json
{ "startUrl": "https://www.spitogatos.gr/en/for_sale-homes/athens-center", "maxItems": 30 }
```

**Output:** one dataset row per listing: id, url, category, buy_or_rent, price, priceReduced, pricePreReduction, priceChangePercentage, sq_meters, rooms, no_of_bathrooms, floorNumber, geography, latitude, longitude, mainImageURL, adType_code, reAgent {agencyName, phones, agentProfilePath}, firstPublishDate, modified. With fetchFullDetails: streetAddress, description, images \[{medium, large, xlarge}], energyClass, year_of_construction, pricePerSqMeters, amenity flags, propertyPublisher {name, phones, websiteUrl}.

**Behaviors an agent should know:**

- Always set `maxItems`; a city search can hold 30,000+ listings.
- `startUrl` must be a search results URL; filters live in the URL path. Listing URLs are rejected.
- `fetchFullDetails` adds one request per listing (about 3x slower).
- Free plan: 5 listings per run.
- `buy_or_rent`: "0" sale, "1" rent. Amenity flags are "1"/"0"/null strings.
- Leave `proxy` at its default unless you have sticky-session proxies.

### ⚠️ Disclaimer

This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Spitogatos.gr, its operator (Spitogatos Network), or any of its affiliates. All trademarks mentioned are the property of their respective owners.

The scraper accesses only publicly available property listing pages, with no authenticated endpoints, paid features, or content behind the Spitogatos.gr login. Listings can include publisher names and phone numbers; users are responsible for making sure their use complies with Spitogatos.gr's Terms of Service, applicable data-protection law (GDPR and Greek data-protection rules), and any contractual obligations of their own organization.

### SEO Keywords

spitogatos scraper, scrape spitogatos, spitogatos.gr scraper, spitogatos API, Apify spitogatos, greece real estate scraper, greek property scraper, property listings scraper, real estate data extraction, athens property prices, thessaloniki real estate data, greece rental listings, price per square meter greece, real estate market analysis, property price tracking, real estate agency leads greece, greek housing market data, greece property investment data, proptech data greece, golden visa property data

# Actor input Schema

## `startUrl` (type: `string`):

A Spitogatos.gr search results URL copied from your browser: sale or rent, Greek or English, with any area and filters applied on the site (filters such as reduced_price are part of the URL path). Example: https://www.spitogatos.gr/en/for_sale-homes/athens-center

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

Maximum number of listings to save. Free plan: 5 per run.

## `fetchFullDetails` (type: `boolean`):

Open each listing's page to add the full record: street address, full description, all photos, energy class, year built, heating, parking, amenities, and agency contact details. One extra request per listing, so runs are slower. Charged as an extra event per listing that gets details.

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

Maximum search-result pages to fetch (30 listings per page). 0 = no page limit; maxItems still applies.

## `proxy` (type: `object`):

Spitogatos is protected by Imperva. The actor solves the challenge in a browser, then scrapes with several sticky proxy sessions (one IP each). Apify Proxy (default) handles this and uses residential IPs when no group is chosen, since the site rejects most datacenter IPs. With your own proxies, give URLs that keep the same IP per URL; a URL that changes IP on every request will be blocked.

## Actor input object example

```json
{
  "startUrl": "https://www.spitogatos.gr/en/for_sale-homes/athens-center",
  "maxItems": 100,
  "fetchFullDetails": false,
  "maxPages": 0,
  "proxy": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

The scraped property listings in the default dataset.

# 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 = {
    "startUrl": "https://www.spitogatos.gr/en/for_sale-homes/athens-center",
    "proxy": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/spitogatos-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 = {
    "startUrl": "https://www.spitogatos.gr/en/for_sale-homes/athens-center",
    "proxy": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("memo23/spitogatos-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 '{
  "startUrl": "https://www.spitogatos.gr/en/for_sale-homes/athens-center",
  "proxy": {
    "useApifyProxy": true
  }
}' |
apify call memo23/spitogatos-scraper --silent --output-dataset

```

## MCP server setup

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