# Spotahome Scraper \[$0.85💰] | Rentals | Rooms | EU Prices (`ahmed_jasarevic/spotahome-scraper`) Actor

Scrapes mid-term rental listings from Spotahome.com (via their internal GraphQL API) and HousingAnywhere.com (via their Algolia search backend). Extracts title, monthly rent, bills-included flag, room type, address, photos, landlord type, availability. From $0.00085 per result.

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

## Pricing

from $0.82 / 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

## Spotahome Scraper

### Trust the reliability

Built on **reverse-engineered JSON APIs** — **no browser is needed** — so you get clean,
structured data fast, and the actor is cheap to run (HTTP-only `HttpCrawler`, 256 MB container).

- **Spotahome.com** → internal **GraphQL** marketplace API (`/marketplace/graphql`): `search` +
  `homecards` queries.
- **HousingAnywhere.com** → **Algolia** search backend (`appId Y8L112MIBF`, index
  `production_listings_rank_withOrpheus`) — plain JSON, no anti-bot wall.

Both surfaces return pure JSON, which keeps the actor fast, stable and readable. No ClickHouse,
no crawling overhead, no browser memory. Perfect for pipelines, dashboards and AI agents.

### Why renters, landlords, and real-estate platforms care

**Spotahome** and **HousingAnywhere** are the two biggest *mid-term rental* platforms in Europe:
furnished rooms, studios and apartments for **1–12 month stays**. HousingAnywhere alone markets
itself as *"Europe's largest mid-term rental platform"* and publishes a **quarterly International
Rent Index** (32nd edition, Q2 2026: **25 cities, 11 countries, 35,399 listings**).

Why the craze:

- **Expats & relocation** — corporate relocatees and digital nomads need furnished, verified
  rentals *before* they land, not unfurnished 12-month contracts.
- **Students** — the European PBSA (purpose-built student accommodation) market faces a serious
  deficit: **~2.2M extra students are expected by 2029/30**, while **completions run ~79% below
  demand** and an estimated **€466B investment** is needed. Students are pushed into the open
  rental market → that inventory is exactly what this actor scrapes.
- **Real-estate platforms & investors** — tracking where prices are rising *month by month* (e.g.
  the top cities in HousingAnywhere's rent index) is market intelligence listing sites and search
  products monetize.

If you need demand-side signals for student housing, expat relocation research, or price
comparisons across EU cities — this actor gives you the **live marketplace data**, not an index.

### Why scrapers instead of direct API

- **Spotahome** has **no self-serve public API** for reading marketplace listings. The actor uses
  the *same internal GraphQL JSON endpoint that powers spotahome.com search*, reverse-engineered
  from the site's JS bundles.
- **HousingAnywhere** has a partner-facing API (`developers.housinganywhere.com`), but it is an
  **integration API for property managers to publish inventory** — it requires API-key approval and
  is *not* onboarding new public-API partners. There is **no self-serve read API** for the
  marketplace. The actor reads the marketplace through its **Algolia search backend** — the exact
  JSON index housinganywhere.com itself queries.

Net: no API key, no approval, no rate-limit contract, no monthly subscription — **pay per result**.

### Step-by-step

1. Create a free [Apify](https://apify.com) account.
2. Open the **Spotahome Scraper** and click **Try for free** (or **Start**).
3. Set your input — the defaults already cover the top European markets:
   - **Spotahome cities**: `madrid, barcelona, berlin, paris, milan, rome, lisbon, amsterdam`
   - **HousingAnywhere countries**: `Germany, Spain, France, Italy, Netherlands, Portugal, Belgium`
   - **Max items**: `100`
4. Click **Start** and wait a few seconds.
5. Preview results in the **Overview** tab and export to **JSON, CSV or XLSX**.

> 💡 **Free plan caveat**: free users are capped at **10 items** per run. To scrape more, add a
> credit card (you are charged per result, only for what you use).

### Input parameters

| Parameter | Type | Default | Description |
|---|---|---|---|
| `cities` | `array` | 8 default cities | Spotahome city slugs, e.g. `madrid`, `barcelona`, `berlin`, `paris`, `milan`, `rome`, `london`, `lisbon`, `amsterdam`. Empty → default list. |
| `countries` | `array` | 7 default countries | HousingAnywhere country names, e.g. `Germany`, `Spain`, `France`, `Italy`, `Netherlands`, `Portugal`, `Belgium`. Empty → all countries. |
| `maxItems` | `integer` | `100` | Maximum number of listings across both platforms (1–100 000). Free cap: 10. |
| `proxy` | `object` | Apify proxy off | Optional proxy configuration (Apify proxy / custom proxy URLs). |

### Features

- Scrapes **two platforms with one input** — Spotahome *and* HousingAnywhere.
- **Verified** mid-term listings: furnished rooms, studios, apartments & houses.
- Extracts **~45 fields** per listing, fully normalized across both sources.
- **Photos** as absolute URLs, **availability windows**, **landlord scoring** and **instant
  booking** flags.
- **No browser** — fast, cheap, hard to block (HTTP-only).
- **From-scratch, documented code** — TypeScript, `HttpCrawler`, `got-scraping`.
- **Dataset preview** with an `overview` table view.

### 💰 Pay-per-result (competitive pricing)

**PAY\_PER\_EVENT** model — you are billed **only for results**, no monthly subscription:

| Metric | Price |
|---|---|
| Per result | **$0.00085** |
| Per Actor Start | $0.00005 |

Example: **10,000 listings ≈ $8.50**. That makes mid-term rental data a rounding error in any
budget — and a killer line-item to resell inside dashboards and lead-gen products.

### Output

One normalized listing per dataset item. Fields (subset): `source`, `listingId`, `title`,
`monthlyRent`, `currency`, `billsIncluded` / `estimatedBills`, `roomType`, `propertyType`,
`address`, `street`, `postalCode`, `city`, `country`, `neighborhood`, `area` (lat/lng), `photos`,
`landlordType`, `landlordId`, `landlordName`, `landlordScore`, `landlordTotalBookings`,
`availability { from, to }`, `listingUrl`, `description`, `minimumStayMonths`,
`maximumStayMonths`, `contractType`, `depositPolicy`, `couplesAllowed`, `propertySizeSqm`,
`bedroomCount`, `numberOfBedrooms`, `numberOfBathrooms`, `areaSqm`, `roomAreaSqm`,
`isInstantBooking`, `noSecurityDeposit`, `hasDepositProtection`, `allowsPermanentContract`,
`isZeroRisk`, `isExcellentAdvertiser`, `ratingAverage`, `scrapedAt`.

Example row:

```json
{
  "source": "spotahome",
  "listingId": "30112345",
  "title": "Bright Studio near Gran Vía",
  "monthlyRent": 1150,
  "currency": "EUR",
  "billsIncluded": "1:200",
  "roomType": "studio",
  "city": "Madrid",
  "availability": { "from": "2026-10-01", "to": null },
  "listingUrl": "https://www.spotahome.com/...",
  "area": { "lat": 40.42, "lng": -3.70 }
}
```

### Key use cases

- **Lead generation & relocation agencies** — fresh verified listings for expat and student moves.
- **Price intelligence** — monthly rent monitoring and comparisons across EU cities (the same data
  behind HousingAnywhere's International Rent Index).
- **Market research** — student housing deficits, expat demand, furnished-rental supply analysis.
- **Sales & marketing enrichment** — enrich rental portals, newsletters, and moving cost tools.
- **AI agents & RAG pipelines** — real estate chatbots and relocation assistants fed live rental
  data.

### FAQ

#### Does the actor provide official APIs?

No. Spotahome has no self-serve public data API, and HousingAnywhere's partner API is for property
managers publishing inventory, not for reading marketplace listings. This actor reads the *same*
JSON endpoints the websites use (Spotahome GraphQL + HousingAnywhere Algolia).

#### Which cities are supported?

Spotahome: `madrid`, `barcelona`, `berlin`, `paris`, `milan`, `rome`, `london`, `lisbon`,
`amsterdam` (92+ cities supported by the platform). HousingAnywhere: `Germany`, `Spain`, `France`,
`Italy`, `Netherlands`, `Portugal`, `Belgium` (25+ index cities).

#### Why $0.00085 per result instead of a subscription?

We pass on the cost of running on cheap HTTP crawlers with no browser overhead. You pay for
results, not for hours.

#### Do I need a proxy?

No. Requests are plain JSON to the platform's own API endpoints, designed for the websites'
own traffic.

#### Which platforms does the Rent Index dataset cover?

HousingAnywhere's quarterly index covers 25 cities in 11 countries from ~35,399 furnished
rooms/studios — the same universe this actor scrapes live.

#### Can I scrape both platforms in one run?

Yes — one input, both sources, with a `source` field on every listing.

### Limitations

- **Spotahome `country`** is always `null` (the GraphQL API does not return it) — use `city`.
- **HousingAnywhere `postalCode`** is always `null` (not exposed by its backend).
- Availability `to` may be `null` for open-ended (minimum-stay) listings; HousingAnywhere keeps
  its `9999-...` sentinel for indefinite dates and this actor converts it to `null`.
- Data depends on the publisher — mid-term rental inventory changes quickly; run on a schedule for
  longitudinal monitoring.
- **Scraping third-party sites** must comply with their ToS and local laws — see disclaimer.

### Related Actors

- [Airbnb Scraper](https://apify.com/tri_angle/airbnb-scraper) — the most-used Airbnb actor on
  Apify (16,900+ users); short-term vacation rentals.
- [Booking Scraper](https://apify.com/voyager/booking-scraper) — hotel and short-stay rates from
  Booking.com.
- [HousingAnywhere Scraper](https://apify.com/crawlerbros/housinganywhere-scraper) — focused on
  HousingAnywhere listings.
- [hometogo-scraper](https://apify.com/ahmed_jasarevic/hometogo-scraper) — metasearch-style
  short-term vacation rental data.
- [loopnet-scraper](https://apify.com/ahmed_jasarevic/loopnet-scraper) — US & UK commercial real
  estate listings.

### Legal & Compliance Disclaimer

**Important:** This actor is a scraping tool and is not affiliated with, endorsed by, or connected
to Spotahome.com or HousingAnywhere.com. You are solely responsible for complying with the terms of
service of the target websites, applicable data-protection laws (e.g., GDPR), and your local
regulations before scraping. Data from marketplaces may include personal information of landlords —
handle it accordingly. The authors are not liable for any misuse.

### SEO Keywords

`spotahome scraper`, `housinganywhere scraper`, `mid term rental data`, `mid-term rental listings`,
`european rental prices data`, `rental price comparison europe`, `rental price monitoring`,
`student housing data`, `student accommodation data`, `expat housing data`, `relocation housing
data`, `furnished apartment rental data`, `room rental data spain`, `apartment rental database`,
`bills included rentals`, `housinganywhere alternative data`, `housinganywhere api alternative`,
`rental price index europe`, `monthly rent data furnished`, `madrid rental prices data`,
`berlin student accommodation data`, `amsterdam expat housing data`, `barcelona rental market
data`, `milan rooms for rent data`, `lisbon relocation housing data`, `paris mid term apartment
data`

# Actor input Schema

## `cities` (type: `array`):

City slugs to scrape on Spotahome.com (e.g. madrid, barcelona, berlin, paris, milan, rome, london, lisbon, amsterdam). Leave empty to use the default list.

## `countries` (type: `array`):

Country names to scrape on HousingAnywhere.com (e.g. Germany, Spain, France, Italy, Netherlands, Portugal, Belgium). Leave empty to scrape all countries.

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

Maximum number of listings to scrape across both platforms. Free users are capped at 10.

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

Select proxies to be used by your crawler.

## Actor input object example

```json
{
  "cities": [
    "madrid",
    "barcelona",
    "berlin",
    "paris",
    "milan",
    "rome",
    "lisbon",
    "amsterdam"
  ],
  "countries": [
    "Germany",
    "Spain",
    "France",
    "Italy",
    "Netherlands",
    "Portugal",
    "Belgium"
  ],
  "maxItems": 100,
  "proxy": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `listings` (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 = {
    "cities": [
        "madrid",
        "barcelona",
        "berlin",
        "paris",
        "milan",
        "rome",
        "lisbon",
        "amsterdam"
    ],
    "countries": [
        "Germany",
        "Spain",
        "France",
        "Italy",
        "Netherlands",
        "Portugal",
        "Belgium"
    ],
    "proxy": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("ahmed_jasarevic/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 = {
    "cities": [
        "madrid",
        "barcelona",
        "berlin",
        "paris",
        "milan",
        "rome",
        "lisbon",
        "amsterdam",
    ],
    "countries": [
        "Germany",
        "Spain",
        "France",
        "Italy",
        "Netherlands",
        "Portugal",
        "Belgium",
    ],
    "proxy": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("ahmed_jasarevic/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 '{
  "cities": [
    "madrid",
    "barcelona",
    "berlin",
    "paris",
    "milan",
    "rome",
    "lisbon",
    "amsterdam"
  ],
  "countries": [
    "Germany",
    "Spain",
    "France",
    "Italy",
    "Netherlands",
    "Portugal",
    "Belgium"
  ],
  "proxy": {
    "useApifyProxy": false
  }
}' |
apify call ahmed_jasarevic/spotahome-scraper --silent --output-dataset

```

## MCP server setup

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