# Spotahome Property Scraper - Deduplication Ability (`confidential_gnat/spotahome-property-scraper`) Actor

Scrape Spotahome rental property listings across Europe — price, currency, full address, coordinates, bedrooms, occupancy, amenities, rating and images. Automatic duplicate removal, exact per-URL item limits, JSON/CSV/Excel export and API access.

- **URL**: https://apify.com/confidential\_gnat/spotahome-property-scraper.md
- **Developed by:** [ActorFlow](https://apify.com/confidential_gnat) (community)
- **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

## Spotahome Property Scraper

**Scrape rental property listings from Spotahome** (spotahome.com) — mid- and long-term rooms, studios and apartments across Europe. Each record carries the title, description, property type, monthly **price** and currency, full address with **latitude/longitude**, bedroom and occupancy counts, amenities, rating and image URLs. Paste a city URL, press **Start**, and export the results as JSON, CSV or Excel — or call the whole thing as an **API** from Python, JavaScript or cURL.

**Target website:** [spotahome.com](https://www.spotahome.com)

### ✨ Features of this Spotahome property scraper

- **Property data extraction** — title, description, type, price, currency, availability, full address, coordinates, bedrooms, max occupancy, pet and smoking rules, amenities, rating, images and listing date.
- **Automatic duplicate removal** — the same property is never scraped or billed twice. Spotahome's paginated city pages repeat listings between pages, so every property URL is normalised (tracking parameters and fragments stripped) and checked against an in-run registry before it is queued. One property, one dataset record.
- **Exact item limits** — `maxItems` is enforced per start URL against deduplicated properties, so asking for 50 properties returns 50 distinct properties, not 50 queue entries that collapse into fewer rows.
- **Cross-run caching** — set a cache project name and properties already scraped in an earlier run are skipped, so a daily run collects only what is new.
- **Pagination support** — walks Spotahome's city listing pages automatically until the item limit for that start URL is reached, then stops instead of crawling the whole city.
- **Automatic URL detection** — city listing URLs and direct property URLs are told apart automatically, so you can mix both in Start URLs without labelling them.
- **Whole-site mode** — one toggle crawls Spotahome's main city listing pages instead of a hand-picked URL list.
- **Proxy support** — optional Apify proxy configuration; datacenter and residential are both supported.
- **No browser required** — runs on plain HTTP requests rather than a headless browser, which makes runs fast and cheap.

### 🚀 How to scrape Spotahome property listings in 5 steps

1. [Sign up](https://apify.com/sign-up) for a free Apify account — includes **$5 monthly credit**.
2. Open the actor page and click **Try for free**.
3. Fill in the **Input** fields (at least one start URL is required).
4. Click **Start** and wait for the run to complete.
5. Download results from the **Output** tab in JSON, CSV, or Excel format.

You can also run this actor via the [Apify API](https://docs.apify.com/api/v2) or integrate it directly into your workflows using [Zapier](https://zapier.com/apps/apify), [Make](https://www.make.com/), or [n8n](https://n8n.io/).

### 💰 Pricing

Runs are billed through your Apify plan based on the compute units they consume; the actor page shows the current pricing.

- New Apify accounts include **$5 of free monthly credit**.
- Because it uses plain HTTP requests rather than a headless browser, it costs significantly less to run than browser-based property scrapers.
- Proxies are disabled by default, and leaving them off keeps runs cheapest.
- Duplicate listings are filtered before they are queued, so you are not billed for fetching the same property twice.

### 🔧 Input configuration

| Field | Type | Required | Default | Description |
| ----- | ---- | -------- | ------- | ----------- |
| `startUrls` | array | ✅ | `[{"url": "https://www.spotahome.com/barcelona"}]` | Spotahome city listing URLs or direct property URLs. The type of each URL is detected automatically. |
| `maxItems` | integer | — | `3` | Maximum number of distinct properties to scrape for each start URL. |
| `scrapeWholeSite` | boolean | — | `false` | Ignore Start URLs and crawl Spotahome's main city listing pages instead. |
| `cacheProjectName` | string | — | — | Optional. When set, properties already scraped under this project name in a previous run are skipped instead of being scraped again. |
| `proxyConfiguration` | object | — | `{"useApifyProxy": false}` | Spotahome responds fine without a proxy. Enable datacenter proxies first if you start seeing blocks, and residential only if datacenter still fails. |

**Supported URL types:**

- **City listing pages** — `https://www.spotahome.com/barcelona`, and paginated search pages such as `https://www.spotahome.com/s/barcelona/page:2`.
- **Property pages** — `https://www.spotahome.com/{city}/for-rent:{type}/{id}`, e.g. `https://www.spotahome.com/barcelona/for-rent:apartments/1180373`.

### 📦 Spotahome scraper output data

Output is a structured JSON dataset (exportable to CSV, Excel, XML and RSS) with one record per distinct property, containing `url`, `propertyId`, `title`, `description`, `propertyType`, `price`, `currency`, `availability`, `city`, `country`, `streetAddress`, `postalCode`, `latitude`, `longitude`, `numberOfRooms`, `numberOfBedrooms`, `maxOccupancy`, `petsAllowed`, `smokingAllowed`, `amenities`, `rating`, `reviewCount`, `images` and `datePosted`.

The dataset has one view, **Overview**, a compact table of each property's title, city, type, price, currency, bedrooms, rating and URL.

**Sample output:**

```json
{
  "url": "https://www.spotahome.com/barcelona/for-rent:rooms/1694442",
  "propertyId": "1694442",
  "title": "Room in a shared 1-bedroom apartment for rent in el Raval, bills included",
  "description": "Room for rent in a furnished apartment with balcony, equipped kitchen, near Sant Antoni metro station, el Raval, Barcelona. Spotahome verified. (ref: 1694442)",
  "propertyType": "Room",
  "price": 650,
  "currency": "EUR",
  "availability": "https://schema.org/InStock",
  "city": "Barcelona",
  "country": "ES",
  "streetAddress": "Ronda de Sant Antoni",
  "postalCode": "08001",
  "latitude": 41.3796253,
  "longitude": 2.16393598,
  "numberOfRooms": null,
  "numberOfBedrooms": 1,
  "maxOccupancy": 1,
  "petsAllowed": false,
  "smokingAllowed": true,
  "amenities": [
    "Furnished",
    "Elevator"
  ],
  "rating": null,
  "reviewCount": null,
  "images": [
    "https://photos.spotahome.com/fsobscale_1600_900_nonverified_ur_15_50/59d33abdf33745ff4280b54c1d4026f0102945bda1b62ee21acc2daa.webp",
    "https://photos.spotahome.com/fsobscale_1600_900_nonverified_ur_15_50/c94cf34b68aa458f335a9eee4c9879f416519e15f247a7d89ebc1e6d.webp"
  ],
  "datePosted": "2026-09-08T16:00:00+0000"
}
```

### 🐍 How to scrape Spotahome with Python, JavaScript or the API

Run the actor programmatically with the official Apify clients. Replace `<YOUR_API_TOKEN>` with the token from your [Apify Console](https://console.apify.com/account/integrations).

**Python** (`pip install apify-client`):

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")

run = client.actor("<username>/spotahome-property-scraper").call(run_input={
    "startUrls": [{"url": "https://www.spotahome.com/barcelona"}],
    "maxItems": 50,
    "proxyConfiguration": {"useApifyProxy": False},
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

**JavaScript** (`npm install apify-client`):

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });

const run = await client.actor('<username>/spotahome-property-scraper').call({
    startUrls: [{ url: 'https://www.spotahome.com/barcelona' }],
    maxItems: 50,
    proxyConfiguration: { useApifyProxy: false },
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

**cURL** — start a run and wait for the dataset:

```bash
curl -X POST "https://api.apify.com/v2/acts/<username>~spotahome-property-scraper/run-sync-get-dataset-items?token=<YOUR_API_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{
    "startUrls": [{"url": "https://www.spotahome.com/barcelona"}],
    "maxItems": 50,
    "proxyConfiguration": {"useApifyProxy": false}
  }'
```

### 💡 What you can use Spotahome property data for

- Tracking rental prices across European cities over time
- Benchmarking a property portfolio against comparable listings
- Relocation, student-housing and corporate-housing research
- Market supply analysis by city, property type or price band
- Mapping listings by coordinates for neighbourhood-level pricing
- Feeding property dashboards, alerting tools and internal search

Rental market analysts, relocation services, student-housing operators and property investors typically use this data, across the real estate, PropTech, travel and hospitality, and market research industries.

### ⚠️ Limitations & known issues

- **Live inventory changes constantly** — running the same city URL twice may return a different set of properties as listings are booked and new ones are added.
- **Some fields are listing-dependent** — `rating`, `reviewCount`, `numberOfRooms` and `datePosted` are `null` when Spotahome does not publish them for that property.
- **Login-required content** — the actor does not log in, so anything visible only to a signed-in user or after a booking request is out of scope.

### ❓ Frequently asked questions

#### Can I scrape Spotahome legally?

This actor only collects data that is already publicly visible on Spotahome listing pages — it does not log in, contact landlords, or access account-only areas. Scraping publicly available data is generally considered lawful (see *hiQ Labs v. LinkedIn* as precedent). You remain responsible for complying with Spotahome's Terms of Service and with applicable privacy law such as GDPR if listing data contains personal information.

#### Does this Spotahome scraper return duplicate listings?

No. Spotahome's paginated city pages repeat the same property across pages, so every property URL is normalised — tracking query parameters and fragments removed — and checked against an in-run registry before it is queued. Each property produces exactly one dataset record per run, and duplicates are filtered before they are fetched rather than after, so they cost nothing.

#### How many properties can I scrape from one URL?

`maxItems` sets the limit per start URL and counts distinct properties, so `maxItems: 50` against a city URL returns 50 different properties. The actor follows pagination until that limit is reached and then stops, rather than crawling the entire city. Pass several city URLs in Start URLs and each gets its own independent budget.

#### Do I need a proxy to scrape spotahome.com?

No. Spotahome responds reliably to direct requests, so proxies are disabled by default and runs stay cheap. If you start seeing blocks, enable datacenter proxies first, and only fall back to residential if datacenter still fails.

#### How do I scrape Spotahome with Python?

Install the Apify client with `pip install apify-client`, then call the actor with your API token and read the dataset — the full Python example is in the section above. JavaScript and cURL examples are there too.

#### Can I run this Spotahome scraper on a schedule?

Yes. Use [Apify Schedules](https://docs.apify.com/platform/schedules) to run it hourly, daily or weekly. Pair it with the **Cache project name** input and each scheduled run skips properties it already collected previously, so you only collect new listings.

#### What output formats are supported?

JSON, CSV, Excel, XML and RSS, either from the **Output** tab or through the Apify API.

### 🔗 Other actors you may find useful

- 🏘️ **[Rightmove Scraper Updated](https://apify.com/confidential_gnat/rightmove-scraper-updated)** — Scrapes property data from Rightmove, the UK's largest property portal.
- ✅ **[Rightmove Listing Availability Checker](https://apify.com/confidential_gnat/rightmove-listing-availability-checker)** — Takes a list of Rightmove listing URLs and verifies whether each one is still active or has been removed, returning the URL, availability status and relevant metadata.
- 🎓 **[AmberStudent Accommodation Scraper](https://apify.com/confidential_gnat/amberstudent-accomodation-scraper)** — Scrapes AmberStudent student accommodation listings — pricing, availability, photos, amenities, location and reviews — from city, area or individual property pages. **$1.5/1000 results**.
- ⛪ **[Church Finder Scraper](https://apify.com/confidential_gnat/churchfinder-scraper)** — Scrapes church listings and profiles from Church Finder, extracting name, denomination, address, phone number, service times, ratings and reviews from city search pages or individual church URLs. **Free**.
- ⚖️ **[Austria Ediktsdatei Scraper](https://apify.com/confidential_gnat/austria-ediktsdatei-scraper)** — Scrapes Austrian judicial auction listings (Gerichtliche Versteigerungen) from edikte.justiz.gv.at, including property details, dates, valuations and PDF documents.

### 💬 Support & contact

If you encounter any issues or have questions, please [open an issue](https://apify.com/confidential_gnat/spotahome-property-scraper/issues/open).

You can also find more of our actors on the [Apify Store](https://apify.com/confidential_gnat).

# Actor input Schema

## `startUrls` (type: `array`):

Spotahome city listing URLs or direct property URLs. The type of each URL is detected automatically.

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

Maximum number of properties to scrape for each start URL.

## `scrapeWholeSite` (type: `boolean`):

Ignore Start URLs and crawl Spotahome's main city listing pages instead.

## `cacheProjectName` (type: `string`):

Optional. When set, properties already scraped under this project name in a previous run are skipped instead of being scraped again.

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

Spotahome responds fine without a proxy. Enable datacenter proxies first if you start seeing blocks, and residential only if datacenter still fails.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.spotahome.com/barcelona"
    }
  ],
  "maxItems": 3,
  "scrapeWholeSite": false,
  "proxyConfiguration": {
    "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 = {
    "startUrls": [
        {
            "url": "https://www.spotahome.com/barcelona"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("confidential_gnat/spotahome-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 = { "startUrls": [{ "url": "https://www.spotahome.com/barcelona" }] }

# Run the Actor and wait for it to finish
run = client.actor("confidential_gnat/spotahome-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 '{
  "startUrls": [
    {
      "url": "https://www.spotahome.com/barcelona"
    }
  ]
}' |
apify call confidential_gnat/spotahome-property-scraper --silent --output-dataset

```

## MCP server setup

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