# Spotahome Mid-Term Rentals Scraper (`crawlerbros/spotahome-scraper`) Actor

Scrape Spotahome.com - the mid/long-term furnished rental marketplace covering 92 cities across Europe, the UAE and Turkey. Search rooms, apartments, studios and residences by city, price, bedrooms and move-in date, or fetch specific listing URLs.

- **URL**: https://apify.com/crawlerbros/spotahome-scraper.md
- **Developed by:** [Crawler Bros](https://apify.com/crawlerbros) (community)
- **Categories:** Real estate, Travel, Automation
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#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 Mid-Term Rentals Scraper

Scrape [Spotahome.com](https://www.spotahome.com) — the mid/long-term furnished rental marketplace covering 92 cities across Europe, the UAE and Turkey. Search rooms, apartments, studios and co-living residences by city, filter by price and bedrooms, or fetch specific listing URLs. Every listing is video-verified by Spotahome before going live.

### What this actor does

- **Two modes:** `search` (city + property-type + bedrooms browsing) and `byUrls` (fetch specific listing URLs you already have)
- **92 cities:** every Spotahome market across Spain, Italy, France, Germany, the UK, Ireland, Benelux, the Nordics, Poland, the Baltics, Austria, Switzerland, Portugal, Greece, Turkey, Malta, Cyprus, Hungary, Slovenia and the UAE
- **4 property types:** rooms (shared flats), apartments (whole units), studios, residences (co-living/student housing)
- **Bedroom filter:** for apartments, browse by exact bedroom count (1, 2, 3, 3+)
- **Price range filter:** min/max monthly rent in the city's local currency (EUR for most cities, local currency for a few non-Eurozone markets — see FAQ), applied server-side on Spotahome's own search
- **Bathroom filter:** exact bathroom count (1, 2, 3+)
- **Move-in date range:** only browse listings available from/to specific dates
- **No-deposit filter:** only listings that skip the security deposit
- **Instant-booking filter:** only listings that can be booked immediately without landlord approval
- **Verified filter:** only listings Spotahome has physically verified
- **Full detail enrichment (optional):** exact address, GPS coordinates, bedroom/bathroom counts, floor size, occupancy limits, pets/smoking policy, full amenity list, lease-length terms, and the complete photo gallery — extracted from each listing's own structured data
- **Empty fields are omitted** — every record only contains fields Spotahome actually published for that listing

### Output per listing

- `id`, `title`, `description`, `propertyType`
- `price`, `currencySymbol`, `currencyCode`, `priceValidUntil`, `isAvailable`
- `leaseMinMonths`, `leaseMaxMonths`
- `addressStreet`, `addressCity`, `addressPostalCode`, `addressCountry`, `cityName`, `countryName`
- `latitude`, `longitude`
- `bedrooms`, `bathrooms`, `floorSizeSqm`, `occupancyMin`, `occupancyMax`
- `petsAllowed`, `smokingAllowed`, `amenities[]`
- `rating`, `reviewCount`
- `availableFrom`, `tags[]` (from the search card, e.g. `CHECKED`, `BILLS INCLUDED`, `UP TO 5% OFF`)
- `imageUrl`, `imageUrls[]`, `imageCount`
- `sourceUrl` — the canonical Spotahome.com listing page
- `recordType: "listing"`, `scrapedAt`

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | select | `search` | `search` / `byUrls` |
| `city` | select | `barcelona` | One of 92 cities (mode=search) |
| `propertyType` | select | `all` | `all` / `rooms` / `apartments` / `studios` / `residences` (mode=search) |
| `bedrooms` | select | `any` | `any` / `1` / `2` / `3` / `3more` — only applies when `propertyType=apartments` |
| `minPrice` | int | – | Only browse listings priced at or above this, in the city's local currency (usually EUR, see FAQ); server-side filter |
| `maxPrice` | int | – | Only browse listings priced at or below this, in the city's local currency (usually EUR, see FAQ); server-side filter |
| `bathrooms` | select | `any` | `any` / `1` / `2` / `3` — exact bathroom count; server-side filter |
| `moveInFrom` | string | – | Only browse listings available to move into on/after this date (`YYYY-MM-DD`) |
| `moveInTo` | string | – | Only browse listings available to move into on/before this date (`YYYY-MM-DD`) |
| `noDeposit` | bool | `false` | Only keep listings that don't require a security deposit |
| `instantBooking` | bool | `false` | Only keep listings that can be booked instantly, no landlord approval wait; server-side filter |
| `verifiedOnly` | bool | `false` | Only keep listings Spotahome has physically verified; server-side filter |
| `minBedrooms` | int | – | Drop listings with fewer bedrooms than this (needs `includeDetails=true`) |
| `startUrls` | array | – | Direct Spotahome.com listing URLs (mode=byUrls) |
| `includeDetails` | bool | `false` | Fetch each listing's detail page for address, coordinates, amenities, lease terms, full gallery |
| `maxItems` | int | `30` | Hard cap on emitted records (1–2000) |

#### Example: rooms in Barcelona under €700/month

```json
{
  "mode": "search",
  "city": "barcelona",
  "propertyType": "rooms",
  "maxPrice": 700,
  "maxItems": 50
}
```

#### Example: 2-bedroom apartments in Madrid, full details

```json
{
  "mode": "search",
  "city": "madrid",
  "propertyType": "apartments",
  "bedrooms": "2",
  "maxItems": 30,
  "includeDetails": true
}
```

#### Example: rooms in Barcelona, €400-700/mo, no deposit, move in from September

```json
{
  "mode": "search",
  "city": "barcelona",
  "propertyType": "rooms",
  "minPrice": 400,
  "maxPrice": 700,
  "noDeposit": true,
  "moveInFrom": "2026-09-01",
  "maxItems": 50
}
```

#### Example: fetch specific listing URLs

```json
{
  "mode": "byUrls",
  "startUrls": ["https://www.spotahome.com/barcelona/for-rent:rooms/1003961"]
}
```

### Use cases

- **Relocation / expat housing search** — pull all rooms or apartments in a target city into a spreadsheet
- **Market research** — track mid-term rental prices across European cities
- **Corporate housing sourcing** — screen furnished apartments with specific bedroom counts and amenities
- **Real estate analytics** — compare price-per-city or price-per-neighborhood trends
- **Content aggregation** — feed a relocation or rental-comparison platform

### Limitations

- **Bedroom filtering is exact-count and apartments-only.** Spotahome's own site only exposes a bedroom-count filter for the `apartments` property type; rooms/studios/residences don't have a bedroom filter on the site itself.
- **`minPrice`/`maxPrice`/`bathrooms`/`moveInFrom`/`moveInTo`/`noDeposit`/`instantBooking`/`verifiedOnly` are real server-side filters** applied directly on Spotahome's own search (not a client-side post-filter), so narrow ranges stay fast and don't need a higher `maxItems` to find matches.
- **`minBedrooms` (search mode) requires `includeDetails=true`.** Bedroom counts for search-card results other than the `apartments` bedroom-count filter are only available from each listing's detail page.
- **Amenity/feature filtering isn't exposed.** Spotahome's search supports an internal `features[]` filter (wifi, elevator, balcony, etc.) but its full valid value list isn't part of any public API contract, so exposing it risked shipping silently-wrong values; the full amenity list is still available per-listing via `includeDetails=true`.

### FAQ

**What's Spotahome?**  A European mid/long-term rental marketplace (minimum stays typically 1+ months) where every property is professionally photographed and video-verified before listing — popular for relocations, remote work, and student housing.

**Which currency are prices in?**  Euro (EUR) for the large majority of covered markets. A handful of non-Eurozone cities are priced in their local currency instead: London/Manchester/Edinburgh/Glasgow/Nottingham (GBP), Zurich (CHF), Copenhagen (DKK), Stockholm (SEK), Prague (CZK), Budapest (HUF), the Polish cities — Warsaw, Kraków, Gdańsk, Katowice, Lublin, Poznań, Wrocław, Łódź (PLN), Istanbul (TRY), and Dubai (AED). Each record's `currencyCode`/`currencySymbol` fields always reflect the actual listing currency.

**What's the difference between a "room" and a "studio"?**  A room is a private bedroom in a shared flat (other tenants share common areas); a studio is a self-contained unit with no flatmates.

**Why is `includeDetails` off by default?**  The search page already returns price, property type, availability date, rating and tags — enough for a quick browse. Turning on `includeDetails` fetches each listing's own page for the exact address, coordinates, bedroom/bathroom counts, floor size, full amenity list and lease terms — more complete but roughly 2x slower.

**How many listings can I pull at once?**  Up to 2000 per run.

**Are all 92 cities equally well covered?**  No — inventory varies enormously (Barcelona and Madrid have thousands of listings; smaller cities may have only a handful). The actor returns whatever is currently live.

# Actor input Schema

## `mode` (type: `string`):

What to fetch.

## `city` (type: `string`):

Which of Spotahome's 92 cities to browse.

## `propertyType` (type: `string`):

Type of accommodation to browse.

## `bedrooms` (type: `string`):

Restrict apartment listings to a specific bedroom count. Only applies when propertyType=apartments.

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

Only browse listings priced at or above this, in the selected city's local currency (EUR for most cities; GBP/CHF/DKK/SEK/CZK/HUF/PLN/TRY/AED for a few non-Eurozone cities — see README). Applied server-side on Spotahome's own search (not just a post-filter), so narrow ranges stay fast.

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

Only browse listings priced at or below this, in the selected city's local currency (EUR for most cities; GBP/CHF/DKK/SEK/CZK/HUF/PLN/TRY/AED for a few non-Eurozone cities — see README). Applied server-side on Spotahome's own search (not just a post-filter), so narrow ranges stay fast.

## `bathrooms` (type: `string`):

Restrict results to listings with this exact bathroom count.

## `moveInFrom` (type: `string`):

Only browse listings available to move into on or after this date (YYYY-MM-DD).

## `moveInTo` (type: `string`):

Only browse listings available to move into on or before this date (YYYY-MM-DD).

## `noDeposit` (type: `boolean`):

Only keep listings that don't require a security deposit.

## `instantBooking` (type: `boolean`):

Only keep listings that can be booked instantly (no landlord approval wait). Applied server-side on Spotahome's own search.

## `verifiedOnly` (type: `boolean`):

Only keep listings Spotahome has physically verified. Applied server-side on Spotahome's own search.

## `minBedrooms` (type: `integer`):

Drop listings with fewer bedrooms than this. Only meaningful with includeDetails=true (bedroom count comes from the listing's detail page).

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

Direct Spotahome.com listing URLs to fetch, e.g. `https://www.spotahome.com/barcelona/for-rent:rooms/1003961`.

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

When on, fetches each listing's detail page for extra fields (address, coordinates, bedrooms/bathrooms, amenities, lease terms, full photo gallery). Slower but far more complete.

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

Hard cap on emitted records.

## Actor input object example

```json
{
  "mode": "search",
  "city": "barcelona",
  "propertyType": "rooms",
  "bedrooms": "any",
  "bathrooms": "any",
  "noDeposit": false,
  "instantBooking": false,
  "verifiedOnly": false,
  "startUrls": [],
  "includeDetails": false,
  "maxItems": 30
}
```

# Actor output Schema

## `listings` (type: `string`):

Dataset containing all scraped Spotahome.com listings.

# 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 = {
    "mode": "search",
    "city": "barcelona",
    "propertyType": "rooms",
    "bedrooms": "any",
    "bathrooms": "any",
    "noDeposit": false,
    "instantBooking": false,
    "verifiedOnly": false,
    "startUrls": [],
    "includeDetails": false,
    "maxItems": 30
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawlerbros/spotahome-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 = {
    "mode": "search",
    "city": "barcelona",
    "propertyType": "rooms",
    "bedrooms": "any",
    "bathrooms": "any",
    "noDeposit": False,
    "instantBooking": False,
    "verifiedOnly": False,
    "startUrls": [],
    "includeDetails": False,
    "maxItems": 30,
}

# Run the Actor and wait for it to finish
run = client.actor("crawlerbros/spotahome-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 '{
  "mode": "search",
  "city": "barcelona",
  "propertyType": "rooms",
  "bedrooms": "any",
  "bathrooms": "any",
  "noDeposit": false,
  "instantBooking": false,
  "verifiedOnly": false,
  "startUrls": [],
  "includeDetails": false,
  "maxItems": 30
}' |
apify call crawlerbros/spotahome-scraper --silent --output-dataset

```

## MCP server setup

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