# Spitogatos Cyprus Scraper: Property Listings & Agent Phones (`fayoussef/spitogatos-cy-scraper`) Actor

Scrape property listings and estate agents from Spitogatos.com.cy in English or Greek. Paste any search, listing or agent URL, or search by town, price and property type, and get price, area, rooms, GPS, photos and the agency phone across Limassol, Nicosia, Larnaca, Paphos and Famagusta.

- **URL**: https://apify.com/fayoussef/spitogatos-cy-scraper.md
- **Developed by:** [youssef farhan](https://apify.com/fayoussef) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Spitogatos Cyprus Scraper: Extract Cyprus Property Listings, Prices & Agent Phones

> **What is the Spitogatos Cyprus Scraper?** It is an Apify Actor that extracts real estate listings and estate agents from **Spitogatos.com.cy**, in **English or Greek**. Each property comes back as one structured record with 80+ fields: asking price, price per square metre, area, rooms, floor, year built, energy class, GPS coordinates, full photo gallery, description and the agency's phone number. Export to JSON, CSV or Excel.

Scrape **Spitogatos.com.cy property listings** across **Limassol, Nicosia, Larnaca, Paphos and Famagusta**. Paste any Spitogatos Cyprus search, listing or agent URL, or skip the URL and search by town, price, size and property type the way the site's own search form does. Built for **estate agents, property investors, relocation consultants and proptech teams** working the Cyprus property market.

**Read this in another language:** [English (default)](#english) · [Ελληνικά / Greek](#greek-version)

***

### English

#### Key features

- **Every listing on Spitogatos.com.cy**: homes, apartments, villas, land plots and commercial property, for sale and for rent, across all five districts of Cyprus.
- **A phone number on every listing**: the named agent when the agency assigned one, the agency's own line otherwise. In a live test on a Limassol search, **48 of 48 listings came back with a phone number**.
- **English or Greek records**: paste an English (`/en/...`) or Greek URL and the data comes back in that language, or pick the language for a filter search.
- **No URL needed**: search by location, sale or rent, property type, price, area, rooms and features, or leave everything empty to list homes for sale across the whole island.
- **Estate agent directory**: scrape every agency in a district with its phones, contact person, listing counts and average prices.
- **GPS coordinates** for mapping and location analysis, where the agency published them.
- **Automatic pagination** and built-in handling of the site's bot protection.

#### What data does the Spitogatos Cyprus scraper extract?

**Listing**

- Listing URL and id, category and property type
- Full description (with the language it is written in)
- Photo URLs in high resolution
- Published and modified dates

**Price and size**

- Asking price in EUR and price per m²
- Living area, plot area, rooms, bathrooms, floor, year of construction, renovation year
- Energy class, heating, parking, garden, pool, view and the rest of the amenities the listing carries

**Location**

- District and area (for example `Limassol (Cyprus)`, `Parekklisia (Limassol)`)
- Latitude and longitude

**Contact**

- `contact_name`, `contact_telephone`, `contact_type` (`agent employee` or `agency`): the phone to actually call
- `agency_name`, `agency_telephone`, `agency_telephones`, `agency_contact_person`, `agency_area`, `agency_website`, `agency_url`
- `agentEmployee_firstName`, `agentEmployee_lastName`, `agentEmployee_telephone` when the agency named a person

#### Sample output

Trimmed to the interesting fields. A real record carries around 90 keys.

```json
{
  "url": "https://www.spitogatos.com.cy/en/20674937",
  "id": 20674937,
  "category": "house",
  "price": 950000,
  "sq_meters": 200,
  "geographiesByLevel_2_fullName": "Limassol (Cyprus)",
  "geographiesByLevel_4_fullName": "Parekklisia (Limassol)",
  "latitude": 34.746517,
  "longitude": 33.151756,
  "description": "Modern 3 Bedroom Villa + Maids room offers refined Mediterranean living...",
  "images": ["https://m1.spitogatos.gr/..._1600x1200.jpg"],
  "agent_id": 14108,
  "agency_name": "Smartmoveonline",
  "agency_telephone": "+35796555534",
  "agency_url": "https://www.spitogatos.com.cy/en/agent/smartmoveonline/14108",
  "contact_name": "Smartmoveonline",
  "contact_telephone": "+35796555534",
  "contact_type": "agency",
  "language": "en",
  "description_language": "en"
}
```

#### How to use it

There are two ways to tell the Actor what to scrape. **Start URLs always win**: fill them in and the filter section is ignored. Leave them empty and the Actor searches by filters instead.

##### 1. Start URLs

| What you paste | Example | What you get |
|---|---|---|
| Search results page (English) | `https://www.spitogatos.com.cy/en/for-sale/property/limassol` | Every listing on that search, page by page |
| Search results page (Greek) | `https://www.spitogatos.com.cy/enoikiaseis/katoikies/limassol` | The same, with records in Greek |
| Single listing | `https://www.spitogatos.com.cy/en/20674937` | That one listing |
| Agent directory | `https://www.spitogatos.com.cy/en/agents/limassol` or `/mesitika/limassol` | Every agency in the district |
| Agent profile | `https://www.spitogatos.com.cy/en/agent/smartmoveonline/14108` | That agency |

Tip: run your search on Spitogatos.com.cy first with all the filters you want, then paste the address bar URL.

```json
{
  "start_urls": [
    { "url": "https://www.spitogatos.com.cy/en/for-sale/property/limassol" },
    { "url": "https://www.spitogatos.com.cy/en/to-rent/property/nicosia" }
  ],
  "max_depth": 10
}
```

`max_depth` is how many result pages to walk per search URL (about 24 listings per page). Leave it empty to scrape every page.

##### 2. Search by filters (no URL needed)

```json
{
  "start_urls": [],
  "locations": ["Limassol"],
  "language": "en",
  "listing_type": "rent",
  "category": "residential",
  "property_types": "apartment",
  "price_max": 1500
}
```

| Field | What it does |
|---|---|
| `locations` | Places in Cyprus, in English or Greek (`Limassol`, `Λεμεσός`, `Germasogeia`). Leave empty for all of Cyprus. |
| `language` | `en` or `el`, the language of the returned records. |
| `listing_type` | `sale` or `rent`. |
| `category` | `residential`, `commercial`, `land`, `other`, `new_development`, `student_housing`. |
| `property_types` | One type from that category, for example `apartment`, `villa`, `plot`, `office`. |
| `price_min` / `price_max` | Price in EUR. For rentals, the monthly rent. |
| `area_min` / `area_max` | Living area in m². |
| `rooms_min` / `rooms_max`, `construction_year_min` / `construction_year_max`, `floor_min` / `floor_max` | Ranges. |
| `heating_controllers`, `heating_media`, `energy_class`, `amenities` | Feature filters. |
| `posted_within` / `updated_within` | `24hours`, `3days`, `1week`, `1month`, `3months`, `6months`, `1year`. |
| `sort_by` / `sort_order` | `rankingscore` or `price`, `desc` or `asc`. |

Good to know:

- **Several locations are searched together**, with no duplicates.
- **Only places in Cyprus are matched.** A name that exists only in Greece is reported in the log instead of silently searching Greece. For Greek listings use the [Spitogatos.gr Scraper](https://apify.com/fayoussef/spitogatos-scraper).
- **Each feature you add narrows the search**, so a long feature list on a small village can legitimately match nothing.

#### Pricing

The Actor is billed per result it returns: one listing or one agency is one result. The current rate is shown on this Actor's Store page. Paid runs include a residential proxy network, so there is no separate proxy traffic on your account. Free runs use Apify Proxy residential on your own account.

**Free plan:** runs scrape 1 result page from the first Start URL (about 24 listings), or the first 25 listings of a filter search. Subscribe to an [Apify plan](https://apify.com/pricing?fpr=youssef) to scrape every page.

#### FAQ

**What is Spitogatos.com.cy?**
Spitogatos.com.cy is the Cyprus edition of Spitogatos, one of the largest property portals in Greece and Cyprus, with homes, land and commercial property for sale and for rent.

**Does it return English or Greek data?**
Both. English URLs (`/en/...`) return English records and Greek URLs return Greek records. Many Cyprus listings are written in English only; in that case a Greek record still gets the English description, and `description_language` says so.

**Why do some listings have no GPS coordinates?**
Because the agency did not publish a location for them. The Actor returns what the listing carries.

**Why is `agentEmployee_telephone` empty on most listings?**
Agencies only fill it in when they assign a named person to a listing. Use `contact_telephone`, which falls back to the agency's own published phone, and check `contact_type` to see which one you got.

**Can I scrape estate agents only?**
Yes. Paste an agent directory URL such as `https://www.spitogatos.com.cy/en/agents/paphos` (or `/en/agents` for all of Cyprus).

**Can I schedule it to track new listings?**
Yes. Use Apify's scheduler with `posted_within` set to `24hours` or `1week`.

**Can I use it through the API or as an MCP server?**
Yes: `https://mcp.apify.com/actors/fayoussef/spitogatos-cy-scraper`. Full API docs: [docs.apify.com/api/v2](https://docs.apify.com/api/v2).

**Is scraping Spitogatos.com.cy legal?**
The Actor collects publicly available listing data. You are responsible for using it in line with the site's terms and applicable law, including GDPR for contact details.

#### Need a custom scraper?

Need another property portal, extra fields or a scheduled data feed? Visit [automationbyexperts.com](https://automationbyexperts.com) or write to youssefarhan24@gmail.com.

***

### Greek version

**Ελληνικά**

> **Τι είναι το Spitogatos Cyprus Scraper;** Ένα Apify Actor που εξάγει αγγελίες ακινήτων και μεσιτικά γραφεία από το **Spitogatos.com.cy**, στα **ελληνικά ή στα αγγλικά**. Κάθε ακίνητο επιστρέφεται ως μία δομημένη εγγραφή με 80+ πεδία: τιμή, τιμή ανά τ.μ., εμβαδόν, δωμάτια, όροφος, έτος κατασκευής, ενεργειακή κλάση, συντεταγμένες GPS, φωτογραφίες, περιγραφή και τηλέφωνο του γραφείου. Εξαγωγή σε JSON, CSV ή Excel.

Κάντε scraping αγγελιών από το Spitogatos.com.cy σε **Λεμεσό, Λευκωσία, Λάρνακα, Πάφο και Αμμόχωστο**. Επικολλήστε οποιοδήποτε URL αναζήτησης, αγγελίας ή μεσίτη, ή αναζητήστε με περιοχή, τιμή, εμβαδόν και τύπο ακινήτου, όπως στη φόρμα αναζήτησης του ίδιου του ιστότοπου.

#### Βασικά χαρακτηριστικά

- **Όλες οι αγγελίες του Spitogatos.com.cy**: κατοικίες, διαμερίσματα, βίλες, οικόπεδα και επαγγελματικοί χώροι, προς πώληση και ενοικίαση.
- **Τηλέφωνο σε κάθε αγγελία**: ο ονομαστικός συνεργάτης όπου υπάρχει, αλλιώς το τηλέφωνο του γραφείου. Σε δοκιμή στη Λεμεσό, **48 στις 48 αγγελίες είχαν τηλέφωνο**.
- **Ελληνικά ή αγγλικά**: ένα ελληνικό URL επιστρέφει ελληνικές εγγραφές, ένα `/en/` URL αγγλικές.
- **Χωρίς URL**: αναζήτηση με φίλτρα, ή κενά φίλτρα για κατοικίες προς πώληση σε όλη την Κύπρο.
- **Κατάλογος μεσιτών**: όλα τα γραφεία μιας επαρχίας με τηλέφωνα, υπεύθυνο και πλήθος αγγελιών.
- **Συντεταγμένες GPS** όπου τις έχει δημοσιεύσει το γραφείο.

#### Παραδείγματα URL

| Τι επικολλάτε | Παράδειγμα |
|---|---|
| Αναζήτηση (ελληνικά) | `https://www.spitogatos.com.cy/poliseis/katoikies/limassol` |
| Ενοικιάσεις (ελληνικά) | `https://www.spitogatos.com.cy/enoikiaseis/katoikies/nicosia` |
| Μία αγγελία | `https://www.spitogatos.com.cy/20674937` |
| Μεσίτες επαρχίας | `https://www.spitogatos.com.cy/mesitika/limassol` |
| Προφίλ μεσίτη | `https://www.spitogatos.com.cy/mesitiko/smartmoveonline/14108` |

#### Χρέωση

Η χρέωση γίνεται ανά αποτέλεσμα: μία αγγελία ή ένα γραφείο είναι ένα αποτέλεσμα. Η τρέχουσα τιμή εμφανίζεται στη σελίδα του Actor στο Apify Store. Στο δωρεάν πλάνο επιστρέφεται 1 σελίδα αποτελεσμάτων (περίπου 24 αγγελίες) ή οι πρώτες 25 αγγελίες μιας αναζήτησης με φίλτρα. Για όλες τις σελίδες, εγγραφείτε σε ένα [πλάνο Apify](https://apify.com/pricing?fpr=youssef).

#### Συχνές ερωτήσεις

**Γιατί κάποιες ελληνικές εγγραφές έχουν αγγλική περιγραφή;**
Πολλές αγγελίες στην Κύπρο γράφονται μόνο στα αγγλικά. Τότε η ελληνική εγγραφή παίρνει την αγγλική περιγραφή και το πεδίο `description_language` το δείχνει.

**Μπορώ να πάρω μόνο μεσίτες;**
Ναι. Επικολλήστε `https://www.spitogatos.com.cy/mesitika/paphos` ή `https://www.spitogatos.com.cy/mesitika` για όλη την Κύπρο.

**Θέλω και αγγελίες από την Ελλάδα.**
Χρησιμοποιήστε το [Spitogatos.gr Scraper](https://apify.com/fayoussef/spitogatos-scraper).

**Είναι νόμιμο;**
Το Actor συλλέγει δημόσια διαθέσιμα δεδομένα. Είστε υπεύθυνοι για τη χρήση τους σύμφωνα με τους όρους του ιστότοπου και τη νομοθεσία, συμπεριλαμβανομένου του GDPR για στοιχεία επικοινωνίας.

# Actor input Schema

## `start_urls` (type: `array`):

Spitogatos.com.cy pages to scrape, in English (/en/...) or Greek. Accepts search results pages such as https://www.spitogatos.com.cy/en/for-sale/property/limassol or https://www.spitogatos.com.cy/poliseis/katoikies/limassol, single listings such as https://www.spitogatos.com.cy/en/20674937, agent profiles, and agent directories such as https://www.spitogatos.com.cy/en/agents/limassol. Records come back in the language of the URL. This always takes priority: if you fill it in, the 'Search by filters' section below is ignored. To search by filters instead, remove every row here with the X button.

## `max_depth` (type: `integer`):

How many result pages to go through per search URL (about 24 listings each on a search page, up to 300 on a filter search). Leave empty to scrape every page.

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

Places in Cyprus to search, for example 'Limassol', 'Germasogeia' or 'Paphos'. English or Greek both work ('Λεμεσός'), and a partial name is enough. Add several to search them together. Leave empty to search all of Cyprus. Places in Greece are not matched here.

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

Language of the records a filter search returns: area names, category labels and descriptions where the agency wrote one. Start URLs ignore this and follow the language of the URL.

## `listing_type` (type: `string`):

Whether to look for properties for sale or for rent.

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

The broad kind of property. This has to agree with the Property type below: asking for an office under Home is rejected by the site. New development and Student housing are Home searches narrowed to those listings, so they take the Home property types.

## `property_types` (type: `string`):

One property type to look for. Pick a type that belongs to the Category chosen above, the category each one belongs to is shown in brackets. Leave empty for all types in that category.

## `price_min` (type: `integer`):

Lowest price to include. For rentals this is the monthly rent.

## `price_max` (type: `integer`):

Highest price to include. For rentals this is the monthly rent.

## `area_min` (type: `integer`):

Smallest living area to include, in square metres.

## `area_max` (type: `integer`):

Largest living area to include, in square metres.

## `rooms_min` (type: `integer`):

Fewest rooms to include. Ignored for the Land category, where it would match nothing.

## `rooms_max` (type: `integer`):

Most rooms to include. Ignored for the Land category, where it would match nothing.

## `construction_year_min` (type: `integer`):

Earliest construction year to include, for example 2010.

## `construction_year_max` (type: `integer`):

Latest construction year to include.

## `floor_min` (type: `string`):

Lowest floor to include. Ignored for the Land category.

## `floor_max` (type: `string`):

Highest floor to include. Ignored for the Land category.

## `heating_controllers` (type: `array`):

Keep only properties with heating, or with a particular heating arrangement.

## `heating_media` (type: `array`):

Which fuel or heating system the property uses.

## `energy_class` (type: `string`):

Keep only properties of this energy class or better.

## `amenities` (type: `array`):

Extra features the property must have. Each one you add narrows the result, and stacking many of them on a small area can easily match nothing.

## `posted_within` (type: `string`):

Keep only listings first published in this window.

## `updated_within` (type: `string`):

Keep only listings updated in this window.

## `sort_by` (type: `string`):

How the site should rank the results before they are collected.

## `sort_order` (type: `string`):

Whether the sort above runs from high to low or low to high.

## `proxyConfiguration` (type: `object`):

Optional override. Paid runs already include a residential proxy network and need nothing here. Free runs use Apify Proxy residential on your own account. Add your own proxy URLs only to force a specific proxy.

## Actor input object example

```json
{
  "start_urls": [
    {
      "url": "https://www.spitogatos.com.cy/en/for-sale/property/limassol"
    }
  ],
  "max_depth": 5,
  "locations": [],
  "language": "en",
  "listing_type": "sale",
  "category": "residential",
  "sort_by": "rankingscore",
  "sort_order": "desc",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

Scraped Cyprus property listings and estate agencies

# 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 = {
    "start_urls": [
        {
            "url": "https://www.spitogatos.com.cy/en/for-sale/property/limassol"
        }
    ],
    "max_depth": 5,
    "locations": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("fayoussef/spitogatos-cy-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 = {
    "start_urls": [{ "url": "https://www.spitogatos.com.cy/en/for-sale/property/limassol" }],
    "max_depth": 5,
    "locations": [],
}

# Run the Actor and wait for it to finish
run = client.actor("fayoussef/spitogatos-cy-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 '{
  "start_urls": [
    {
      "url": "https://www.spitogatos.com.cy/en/for-sale/property/limassol"
    }
  ],
  "max_depth": 5,
  "locations": []
}' |
apify call fayoussef/spitogatos-cy-scraper --silent --output-dataset

```

## MCP server setup

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