# Spitogatos Scraper \[$1/1K💰] | Greece Property | €/m² (`ahmed_jasarevic/spitogatos-gr-scraper`) Actor

Extract property listings from Spitogatos.gr, Greece’s leading portal — price and €/m², surface, rooms, floor, energy class, location and GPS, agency contacts and photos — as structured JSON. Built for Greek real-estate market research and lead generation. $1 per 1,000 listings.

- **URL**: https://apify.com/ahmed_jasarevic/spitogatos-gr-scraper.md
- **Developed by:** [Ahmed Jasarevic](https://apify.com/ahmed_jasarevic) (community)
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.90 / 1,000 results

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 Scraper — Greece Property Listings

Extract property listings from Spitogatos.gr, Greece's #1 real-estate portal — price and €/m², surface area, rooms, floor, year built, energy class, location hierarchy and GPS, seller type, agency name and phone, and the full photo gallery — as structured JSON, from $1 per 1,000 listings.

**Built for:**

- Greek and Cypriot real-estate agency market research
- Foreign-buyer and golden-visa property analysis
- Property fund and short-let yield analysis in Athens and Thessaloniki
- Real-estate lead generation from agency contacts
- Building a structured Greece property database

### Scrape Greek Property Listings Without An API

Paste any Spitogatos.gr search-result URL and the actor keeps every filter you set on the site — listing type, category, area, price and surface range, sort order — then paginates through the results. Areas can also be targeted directly by Spitogatos geography ID (`100` Athens Center, `4933` Thessaloniki Center, `21` Glyfada, `73` Kifisia and so on). Each row is one property with `price`, `pricePerSqm`, `areaSqm` and coordinate fields already numeric, so you can rank areas by €/m² immediately.

### How It Works

![How the Spitogatos Scraper works: internal JSON searches become property rows with EUR prices, energy class, agency phones and galleries.](https://api.apify.com/v2/key-value-stores/oeuA0kLOyhbRM4fzt/records/how-it-works-spitogatos-gr-scraper)

The Actor skips the bot-challenge HTML and calls the Laravel JSON API behind the Nuxt frontend through Apify's browser-impersonating `impit` client. Autocomplete resolves area slugs to geography IDs; search and detail endpoints return 30 listings per page and full records.

Each row covers one property with EUR price and price per square meter, area, rooms, floor, build year, energy class, location hierarchy, coordinates, seller and agency contacts, and the full gallery.

Spitogatos serves a bot-challenge page ("Pardon Our Interruption") to browser-like GET requests from datacenter IPs, so this actor skips the HTML and reads the Laravel JSON API its own Nuxt frontend calls, over plain HTTP:

| Purpose | Request | Notes |
| --- | --- | --- |
| Search / pagination | `POST spitogatos.gr/n_api/v1/properties/search-results` | 30 listings per page; the API exposes pagination for each filter set. |
| Listing detail | `POST spitogatos.gr/n_api/v1/properties/{id}` | Full record: energy class, year built, agency phones, complete photo gallery. |
| Area lookup | `POST spitogatos.gr/n_api/v1/geographies/autocomplete` | Turns an area slug from a pasted URL into a Spitogatos `geographyId`. |

Requests go through `impit`, Apify's browser-impersonating HTTP client, with a Chrome TLS fingerprint — no browser process is launched, and the actor runs comfortably on 256 MB of memory. If Spitogatos changes these routes, the constants live in `src/main.ts`.

### Input Parameters

| Field | Type | Required | Default | Notes |
| --- | --- | --- | --- | --- |
| `searchUrls` | array | No | `[]` | Spitogatos search-result URLs. The URL defines listing type, category, area, price/surface filters and sort order; the fields below fill in anything the URL leaves unspecified. `maxItems` is shared across all URLs. |
| `areaIDs` | array | No | `["100","4933"]` | Spitogatos geography IDs, used only when `searchUrls` is empty. Common IDs: `100` Athens Center, `5` Athens North, `6` Athens South, `8` Piraeus, `4933` Thessaloniki Center, `21` Glyfada, `73`/`215` Kifisia, `84`/`111` Marousi. |
| `listingType` | string | No | `sale` | `sale` or `rent`. |
| `category` | string | No | `residential` | `residential`, `commercial` or `land`. |
| `priceFrom` / `priceTo` | integer | No | — | Optional price range in EUR. |
| `sizeFrom` / `sizeTo` | integer | No | — | Optional surface range in m². |
| `sortBy` | string | No | `datemodified` | `datemodified`, `rankingscore`, `price`, `pricepersqmeters` or `size`. |
| `maxItems` | integer | No | `50` | Number of listings to return (hard cap 5000). |
| `includeDetails` | boolean | No | `true` | Fetch each listing's detail record for energy class, year built, phones and the full gallery. Disable for a faster, cheaper summary-only run. |
| `proxy` | object | No | off | Standard Apify proxy picker; direct connection works for the JSON API, enable proxy for large/high-frequency runs. |

**Finding more area IDs:** open any area page on spitogatos.gr and read the URL, or call the public autocomplete endpoint (`POST /n_api/v1/geographies/autocomplete` with `{"term":"Θεσσαλονίκη"}`) and use the returned `geographyId` values.

### Output Fields

| Field | Description |
| --- | --- |
| `id`, `url`, `source`, `scrapedAt` | Listing ID, public detail URL, source tag and ISO timestamp |
| `listingType`, `category`, `propertyType`, `title` | Sale/rent, category, normalised property type and composed title |
| `price`, `currency`, `pricePerSqm`, `areaSqm` | Numeric price, currency (EUR), price per m² and surface in m² |
| `rooms`, `totalRooms`, `bathrooms`, `wc`, `kitchens` | Room and fixture counts |
| `floor`, `floorNumber`, `levels` | Floor label and numeric floor |
| `yearBuilt`, `constructionStatus`, `renovationYear`, `energyClass` | Construction year, pre-sale flag, renovation year and energy class (detail mode) |
| `location`, `locationHierarchy`, `address`, `latitude`, `longitude`, `geocodeType` | Location hierarchy, street address (detail mode) and coordinates |
| `sellerType`, `agencyName`, `agencyPhone`, `phones`, `agencyProfileUrl`, `agencyWebsite`, `agencyLogo`, `agencyAddress`, `agentName` | Private/agent split plus agency and agent contact data |
| `photos`, `mainImage`, `imageCount`, `hasVideo`, `hasVTour` | Image gallery and media flags |
| `description`, `listingDate`, `modifiedDate`, `newDevelopment`, `adType` | Description text, listing/update dates and attribute flags |

**View:** the Output tab has a **Property listings** table (ID, URL, type, property, price, €/m², m², rooms, floor, year, energy class, location, seller, agency, phone, listed).

### Example Input

```json
{
  "searchUrls": ["https://www.spitogatos.gr/en/for_sale-homes/athens-center"],
  "listingType": "sale",
  "category": "residential",
  "priceFrom": 150000,
  "priceTo": 300000,
  "sortBy": "pricepersqmeters",
  "maxItems": 100,
  "includeDetails": true
}
```

Area-ID run:

```json
{
  "areaIDs": ["100", "4933"],
  "listingType": "rent",
  "category": "residential",
  "maxItems": 50
}
```

### Example Output

```json
{
  "id": 21106654,
  "url": "https://www.spitogatos.gr/en/property/2121106654",
  "listingType": "rent",
  "category": "house",
  "propertyType": "Apartment",
  "price": 680,
  "currency": "EUR",
  "pricePerSqm": 17,
  "areaSqm": 40,
  "rooms": 1,
  "bathrooms": 1,
  "floor": "1st floor",
  "yearBuilt": 1970,
  "energyClass": "D",
  "location": "Σεπόλια (Αθήνα - Κέντρο)",
  "locationHierarchy": ["Αθήνα - Κέντρο", "Σεπόλια - Σκουζέ", "Σεπόλια"],
  "latitude": 38.005497,
  "longitude": 23.715994,
  "sellerType": "agent",
  "agencyName": "TZELI HOME",
  "agencyPhone": "+302110014573",
  "photos": ["https://m1.spitogatos.gr/..._1600x1200.jpg"],
  "imageCount": 25,
  "listingDate": "2026-10-19T00:00:00.000Z",
  "source": "spitogatos.gr",
  "scrapedAt": "2026-10-20T09:00:00.000Z"
}
```

### Automate Greece Property Monitoring With Schedules & Webhooks

- **Daily new-listing watch:** schedule `sortBy: datemodified` for your target areas and diff consecutive runs on `id` to see what was listed, re-priced or withdrawn.
- **€/m² area tracking:** schedule a weekly run per area with `sortBy: pricepersqmeters` and build a price-per-m² time series per neighbourhood.
- **Golden-visa and foreign-buyer shortlists:** filter `priceFrom`/`priceTo` and `category: residential`, then webhook the dataset into a CRM.
- **Agency lead monitoring:** keep `includeDetails: true` to collect agency names, phones and profile URLs for outreach lists. Recurring runs also improve this actor's Store recommendation signals.

### Related Actors

- [Spitogatos.gr Scraper — Greece Real Estate Listings](https://apify.com/swerve/spitogatos-scraper) — the largest Spitogatos actor in this cluster; the closest everyday alternative.
- [Spitogatos.gr Real Estate Scraper — Greece Properties Data](https://apify.com/logiover/spitogatos-gr-real-estate-scraper-greece-properties-data) — Spitogatos coverage with price, €/m² and agency data.
- [xe.gr Real Estate Scraper — Greece Property Data](https://apify.com/logiover/xe-gr-real-estate-scraper-greece-property-data) — Greece's #2 portal, same Real Web group as Spitogatos; pair it for national coverage.
- [Indomio.gr Scraper — Greek Property Listings & Agency Data](https://apify.com/saregaa/indomiogr-scraper) — another Greek portal with agency discovery modes.
- [Spitogatos Scraper](https://apify.com/azzouzana/spitogatos-scraper) — lightweight Spitogatos listing extraction.

### Frequently Asked Questions

#### Why use this actor instead of the official API?

Spitogatos.gr does not offer a public developer API for listings. Its `/n_api/v1` routes are the internal API its own frontend calls, and that is exactly what this actor reads — over plain HTTP, no browser, no login, no API key. Spitogatos does sell a paid data product (Spitogatos Insights) and its owner Real Web runs an API for **advertisers/integrators to manage their own listings** on xe.gr, but neither is a public read API for market-wide listing data. This actor is the practical route for research, valuation and lead-generation datasets.

#### What are the alternatives to scraping Spitogatos?

1. **xe.gr** — Greece's #2 portal (~3.6M monthly visits vs Spitogatos' ~5.2M) and a sibling brand under the same owner, Real Web SA, so its listing schema is consistent; several Apify actors cover it.
2. **Indomio.gr** — another Greek portal, part of the same wider network.
3. **Third-party property-data APIs** that wrap Spitogatos/xe.gr — a paid dependency but a stable contract.
4. **Agency-provided or licensed data** for institutional users.
5. **Scraping the public pages**, which is what this actor does at about a tenth of a cent per listing.

#### Is there a free Spitogatos API?

No. There is no free and no documented public Spitogatos read API. This actor reads the same internal JSON the site's own frontend uses; the free Apify plan returns a 10-listing preview and paid plans get the full run up to `maxItems`.

#### How do I target a specific city or neighbourhood?

Two ways: paste a Spitogatos search URL into `searchUrls` (every filter in the URL is honoured, including multi-area URLs), or pass Spitogatos geography IDs in `areaIDs` — `100` Athens Center, `5` Athens North, `6` Athens South, `8` Piraeus, `4933` Thessaloniki Center, `21` Glyfada, `73`/`215` Kifisia, `84`/`111` Marousi. Get more IDs from the site's area autocomplete endpoint.

#### Can I get rental and sale listings together?

`listingType` applies per run — run `sale` and `rent` separately and combine the datasets; both write the same schema, so rows union cleanly. `category` further selects residential, commercial or land.

#### How much data can I get in one run?

`maxItems` is hard-capped at 5000 and shared across all `searchUrls`. The API returns up to 30 listings per page and paginates deeply per filter set, so for saturated areas split the work with price and surface ranges (`priceFrom`/`priceTo`, `sizeFrom`/`sizeTo`) to reach complete inventory.

#### Do I need a proxy?

Not for typical runs — the JSON API accepts direct requests through a browser-impersonating HTTP client. Enable Apify Proxy for large or high-frequency scheduled runs.

### For AI Agents & LLM Apps

**Purpose:** returns Spitogatos.gr (Greece #1 property portal) sale/rent listings for given search URLs or area IDs — one row per property with numeric price, €/m², surface, rooms, floor, year, energy class, location hierarchy, GPS, seller type and agency contact.

**Minimal input:**

```json
{ "areaIDs": ["100"], "listingType": "sale", "maxItems": 20 }
```

**Summary-only variant (no detail requests, cheapest):**

```json
{ "areaIDs": ["100", "4933"], "listingType": "rent", "maxItems": 200, "includeDetails": false }
```

**Output fields:** id, url, listingType, category, propertyType, title, price, currency, pricePerSqm, areaSqm, rooms, totalRooms, bathrooms, wc, kitchens, floor, floorNumber, levels, yearBuilt, constructionStatus, renovationYear, energyClass, location, locationHierarchy, address, latitude, longitude, geocodeType, sellerType, agencyName, agencyPhone, phones, agencyProfileUrl, agencyWebsite, agentName, photos, mainImage, imageCount, hasVideo, hasVTour, description, listingDate, modifiedDate, newDevelopment, adType, source, scrapedAt.

**Behaviors an agent should know:**

- **`searchUrls` takes priority**: when it is non-empty, `areaIDs`, `listingType`, `category`, price/surface ranges and `sortBy` only fill in values the URL does not specify.
- `maxItems` is **shared across all search URLs**, not per URL.
- `includeDetails: false` removes `energyClass`, `yearBuilt`, agency phones and the full gallery — those fields stay `null`/empty.
- Property-subtype URLs (e.g. apartments-only) are accepted but the subtype restriction is **not** applied; the actor logs a warning and searches the whole category.
- When a URL contains no location, the whole of Greece is searched.
- Free accounts get a 10-listing preview regardless of `maxItems`.

**Billing:** pay-per-event — `result` $0.001 per listing, `listing-detail` $0.001 per enriched listing, plus an Actor start event; free accounts get a 10-listing preview.

### Legal & Compliance Disclaimer

This actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Spitogatos.gr or its owner Real Web SA. It reads only publicly reachable listing data through the site's own internal JSON API — no login, no account access, and no CAPTCHA solving. Agency names and phone numbers are business contact details published on the listings and should not be used for unsolicited commercial outreach in violation of applicable law. Users are responsible for their own compliance with Spitogatos' Terms of Service, `robots.txt` and applicable data-protection law — including the GDPR where listings or contact data relate to identifiable persons — when storing, redistributing or automating access to the collected data.

### SEO Keywords

spitogatos scraper, spitogatos api, spitogatos api alternative, greece real estate scraper, greek property data, greece property listings, athens property data, thessaloniki apartments, greek real estate api, spitogatos dataset, property price per sqm greece, greece golden visa property data, athens apartment prices, greece rental listings, xe gr alternative, greek property market data, real estate lead generation greece, greece property database, spitogatos export, athens property prices per m2, greek real estate market research, property listings csv greece, greece short term rental data, greek property portal scraper

# Actor input Schema

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

Paste Spitogatos.gr search-result URLs, one per search. The URL defines the listing type, category, area, price/surface filters and sort order; the fields below are used only for values the URL does not specify. If a URL has no location, the whole of Greece is searched. Max listings is shared across all URLs. Example: https://www.spitogatos.gr/en/for_sale-homes/athens-center

## `areaIDs` (type: `array`):

Spitogatos geography IDs to search. Used only when Search URLs is empty. Common IDs: 100 = Athens Center, 5 = Athens North, 6 = Athens South, 8 = Piraeus, 14/4933 = Thessaloniki Center, 21 = Glyfada, 73/215 = Kifisia, 84/111 = Marousi. Get more IDs from the site's area autocomplete or any area page URL.

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

Search for properties for sale or for rent.

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

Property category.

## `priceFrom` (type: `integer`):

Optional minimum price in EUR.

## `priceTo` (type: `integer`):

Optional maximum price in EUR.

## `sizeFrom` (type: `integer`):

Optional minimum surface in square meters.

## `sizeTo` (type: `integer`):

Optional maximum surface in square meters.

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

Order of results returned by Spitogatos.

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

Maximum number of property listings to return. Hard-capped at 5000 per run.

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

Fetch each listing's detail record to include energy class, year built, agency phone numbers and the full photo gallery. Disable to only collect the search-result fields (faster and cheaper).

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

Select proxies to be used by your crawler.

## Actor input object example

```json
{
  "searchUrls": [],
  "areaIDs": [
    "100",
    "4933"
  ],
  "listingType": "sale",
  "category": "residential",
  "sortBy": "datemodified",
  "maxItems": 50,
  "includeDetails": true,
  "proxy": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

No description

# 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 = {
    "areaIDs": [
        "100",
        "4933"
    ],
    "proxy": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("ahmed_jasarevic/spitogatos-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 = {
    "areaIDs": [
        "100",
        "4933",
    ],
    "proxy": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("ahmed_jasarevic/spitogatos-gr-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 '{
  "areaIDs": [
    "100",
    "4933"
  ],
  "proxy": {
    "useApifyProxy": false
  }
}' |
apify call ahmed_jasarevic/spitogatos-gr-scraper --silent --output-dataset

```

## MCP server setup

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