# SpareRoom Scraper — UK Rooms & Flatshare Data (`haketa/spareroom-scraper`) Actor

SpareRoom scraper for the UK's largest room rental & flatshare site. Extract rooms by location: rent (pcm/pw), room type, availability, term, bills, furnishings, household & tenant preferences, advertiser role (landlord/agent/flatmate) and photos. Export JSON, CSV, Excel.

- **URL**: https://apify.com/haketa/spareroom-scraper.md
- **Developed by:** [Haketa](https://apify.com/haketa) (community)
- **Categories:** Real estate, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

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

## SpareRoom Scraper 🏠

Extract room and flatshare listings from **SpareRoom — the UK's largest room rental site** — at scale, without an account or API key. Search any town, city or area and get clean JSON, CSV or Excel: **rents, room types, availability, bills, furnishings, household details, tenant preferences, advertiser info (landlord / agent / flatmate) and photos.**

Whether you track the UK rental market, build a lettings dataset, generate landlord/agent leads, or help tenants find rooms faster, this scraper turns SpareRoom into a spreadsheet in minutes.

***

### 🔑 What this scraper does

- 🔎 **Search by location** — `london`, `manchester`, `bristol`, `edinburgh`, any UK place.
- 💷 **Rents with period** — per calendar month (pcm) or per week (pw), normalised for easy filtering.
- 🛏️ **Room & property detail** — room type, property type (flat / house), rooms in property, availability date.
- 👤 **Advertiser intelligence** — landlord (live-in / live-out), letting agent, current/former flatmate — ideal for lead generation.
- 🧾 **Full ad details (optional)** — description, every room's rent, minimum/maximum term, bills-included, furnishings, deposit, household (ages & genders), tenant preferences (couples / smoking / pets), amenities (wifi, parking, garden) and photos.
- ✅ **Verified & freshness flags** — verified ads, "new today", days since posted, photo count.
- ⚡ **Fast, cheap & reliable** — no browser needed, and detail mode is inexpensive.

***

### 📋 Example output

Every listing becomes one record. Detail fields appear when **Scrape Detail Pages** is enabled:

```json
{
  "id": "18250113",
  "url": "https://www.spareroom.co.uk/flatshare/flatshare_detail.pl?flatshare_id=18250113",
  "title": "Double room in a lovely flat in Edmonton",
  "listingType": "offered",
  "rent": 850,
  "rentPeriod": "pcm",
  "location": "Edmonton (N9)",
  "neighbourhood": "Edmonton",
  "postcode": "N9",
  "propertyType": "flat",
  "roomsInProperty": 6,
  "advertiserRole": "live out landlord",
  "status": "new today",
  "daysOld": 0,
  "availableNow": true,
  "verified": true,
  "photos": 7,
  "shortDescription": "Spacious double room in a two-bed flat...",
  "description": "Quiet, professional house on Cornwallis Road, N9...",
  "roomOptions": [
    { "rent": 850, "period": "pcm", "status": "available" },
    { "rent": 1150, "period": "pcm", "status": "available" }
  ],
  "availability": "Available now",
  "minimumTerm": "12 months",
  "maximumTerm": "None",
  "billsIncluded": "Yes",
  "furnishings": "Furnished",
  "totalRooms": "6",
  "householdGender": "2 Females, 1 Male",
  "couplesOk": "No",
  "smokingOk": "No",
  "petsOk": "No",
  "minAge": "30",
  "wifi": "Yes",
  "parking": "Yes",
  "photoUrls": ["https://photos2.spareroom.co.uk/images/flatshare/listings/large/..."],
  "scrapedAt": "2026-09-06T15:00:00.000Z"
}
```

***

### 🗂️ Fields you get

| Field | Description |
|---|---|
| `id`, `url` | Listing ID and canonical URL |
| `title`, `shortDescription` | Ad title and summary |
| `listingType` | `offered` (room to rent) or `wanted` (person looking) |
| `rent`, `rentPeriod` | Rent amount and period (`pcm` / `pw`), normalised |
| `location`, `neighbourhood`, `postcode` | Where the room is |
| `propertyType`, `roomsInProperty` | Flat / house and number of rooms |
| `advertiserRole` | Landlord (live-in / live-out), agent, current/former flatmate — key for lead gen |
| `status`, `daysOld`, `availableNow` | Freshness and availability |
| `verified`, `photos`, `hasVideo` | Verified ad flag, photo count, video flag |
| `description` | Full ad description *(detail mode)* |
| `roomOptions` | Each room's rent, period and status *(detail mode)* |
| `availability`, `minimumTerm`, `maximumTerm` | When and how long *(detail mode)* |
| `billsIncluded`, `furnishings`, `deposit`, `totalRooms` | Tenancy basics *(detail mode)* |
| `householdGender`, `householdOccupation`, `minAge`, `maxAge` | Who lives there *(detail mode)* |
| `couplesOk`, `smokingOk`, `petsOk`, `referencesRequired` | Tenant preferences *(detail mode)* |
| `wifi`, `parking`, `garden`, `livingRoom`, `flatmates` | Amenities & household *(detail mode)* |
| `photoUrls` | Photo URLs *(detail mode)* |

***

### 🚀 How to use

1. Click **Try for free**.
2. Enter one or more **Locations** (e.g. `london`, `manchester`) — or paste full SpareRoom search URLs into **Start URLs**.
3. (Optional) Choose **Listing Type** (rooms offered / wanted) and a **rent range**.
4. (Optional) Turn on **Scrape Detail Pages** for descriptions, per-room rents, household, bills, preferences and photos.
5. Set **Max Items** and run. Export as JSON, CSV, Excel, or pull via API.

#### Example input

```json
{
  "searchLocations": ["london", "manchester"],
  "listingType": "offered",
  "minRent": 500,
  "maxRent": 1200,
  "scrapeDetails": true,
  "maxItems": 500,
  "maxPagesPerSearch": 20
}
```

Prefer a pre-filtered search? Copy the URL from your browser into **Start URLs**:

```json
{
  "startUrls": ["https://www.spareroom.co.uk/flatshare/bristol/"],
  "scrapeDetails": true,
  "maxItems": 1000
}
```

***

### 💡 Popular use cases

#### 🏠 Rental market research

Track room rents by city, area and postcode over time. Benchmark pcm/pw prices, measure supply per location, and spot where rooms are cheapest or most expensive.

#### 🎯 Landlord & agent lead generation

Filter by advertiser role to build lists of **letting agents** and **landlords** advertising rooms — with location, property type and posting freshness. Perfect for lettings services, insurers, furniture and utility providers targeting the rental market.

#### 📈 Property investment & HMO analysis

Analyse per-room rents against property size (rooms in property) to estimate gross yields on HMOs and buy-to-let. Find high-yield postcodes and monitor availability.

#### 🧭 Relocation & tenant tools

Power a room-finding app or relocation service: aggregate live rooms across cities with rent, availability and household fit (gender, age, couples/pets/smoking preferences).

#### 📊 PropTech & data products

Feed a rental dataset into dashboards, pricing models or AI assistants. Combine with other sources for a full picture of the UK shared-living market.

***

### 🎛️ Filters explained

- **Locations** — one or more places as they appear in SpareRoom URLs (`london`, `manchester`, `leeds`…). Each is searched separately.
- **Listing Type** — *Rooms offered* (ads with a room to rent) or *Rooms wanted* (people looking for a room).
- **Min / Max Rent (£/month)** — keep only listings within your budget (compared on the normalised monthly rent).
- **Scrape Detail Pages** — opens each ad for the richest record (description, per-room rents, term, bills, furnishings, household, preferences, amenities, photos). Slower but inexpensive.
- **Max Items / Max Pages per Search** — control run size. Each result page holds about 10 listings.

***

### ❓ FAQ

**Do I need a SpareRoom account or API key?**
No. Just enter a location and run.

**Can I get both rooms offered and rooms wanted?**
Yes — choose with the **Listing Type** filter. Each record also carries its own `listingType`.

**Can I scrape a specific area or a filtered search?**
Yes — paste the URL from your browser into **Start URLs**; the scraper paginates through it.

**How many listings can I get?**
As many as you like. Set **Max Items** to `0` for unlimited, or cap it to control run time.

**Is the data complete without detail mode?**
The listing view already includes title, rent, location, postcode, property type, advertiser role, availability, verified flag and photo count. Turn on **Scrape Detail Pages** to add descriptions, per-room rents, household, bills, preferences and photos.

**What formats can I export?**
JSON, CSV, Excel, HTML table, RSS and via the Apify API. Connect to Make, Zapier, Google Sheets, webhooks or an MCP server.

**How do I keep data fresh?**
Use Apify **Schedules** to run hourly, daily or weekly and keep your dataset up to date.

***

### 🔌 Integrations

Results are stored in a standard Apify dataset, so you can:

- Export to **JSON, CSV, Excel, HTML, RSS**.
- Pull data through the **Apify API** or client libraries.
- Connect to **Make, Zapier, Google Sheets, Slack, webhooks** and more.
- Use it from an **MCP server** in your AI agent / LLM workflow.
- Chain it into your own Actors and pipelines.

***

### 📇 Tips for best results

- Start with a small **Max Items** to preview the data, then scale up.
- Combine **Locations** with **rent** filters to build tightly targeted datasets.
- Enable **Scrape Detail Pages** for household, bills and preference data — it's fast and inexpensive here.
- Keep the default **Datacenter** proxy; it's fast and low-cost for this site.

***

### ⚖️ Legal & responsible use

This scraper collects **publicly available** information only — the same listings any visitor can see on SpareRoom without logging in. It does **not** access private messages, contact phone numbers behind logins, or anything requiring authentication.

You are responsible for how you use the collected data. Please:

- Respect SpareRoom's Terms of Service and applicable laws (including UK GDPR).
- Use any personal data lawfully and only for legitimate purposes.
- Scrape responsibly and avoid excessive request rates.

This tool is provided for lawful purposes such as market research, analytics and business intelligence. It is not affiliated with, endorsed by, or connected to SpareRoom.

# Actor input Schema

## `searchLocations` (type: `array`):

Places to search, as they appear in SpareRoom URLs, e.g. 'london', 'manchester', 'bristol', 'edinburgh'. Each is searched separately. Leave empty if you use Start URLs instead.

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

Optional. Paste full SpareRoom search URLs (with your own filters applied) to scrape them directly, e.g. 'https://www.spareroom.co.uk/flatshare/manchester/'. When provided, the Locations and filters below are ignored for these URLs.

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

'Rooms offered' = ads from people/landlords with a room to rent. 'Rooms wanted' = ads from people looking for a room.

## `minRent` (type: `integer`):

Only listings at or above this monthly rent (per calendar month).

## `maxRent` (type: `integer`):

Only listings at or below this monthly rent (per calendar month).

## `scrapeDetails` (type: `boolean`):

Open each ad for the full description, all room rents, availability, minimum/maximum term, bills-included, furnishings, total rooms, current household (ages/genders), tenant preferences (couples/smoking/pets), amenities and advertiser details. Slower but far richer.

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

Maximum number of listings to collect across all searches. 0 = unlimited.

## `maxPagesPerSearch` (type: `integer`):

How many result pages to scrape per location / URL. Each page has about 10 listings.

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

Apify Proxy (Datacenter) is enabled by default and works out of the box — keep it. Residential is not recommended and is billed per GB without improving reliability here.

## Actor input object example

```json
{
  "searchLocations": [
    "london"
  ],
  "startUrls": [],
  "listingType": "offered",
  "scrapeDetails": false,
  "maxItems": 100,
  "maxPagesPerSearch": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `dataset` (type: `string`):

Open to view, filter and export all scraped listings from this run (JSON, CSV, Excel).

# 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 = {
    "searchLocations": [
        "london"
    ],
    "startUrls": [],
    "scrapeDetails": false,
    "maxItems": 100,
    "maxPagesPerSearch": 10,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("haketa/spareroom-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 = {
    "searchLocations": ["london"],
    "startUrls": [],
    "scrapeDetails": False,
    "maxItems": 100,
    "maxPagesPerSearch": 10,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("haketa/spareroom-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 '{
  "searchLocations": [
    "london"
  ],
  "startUrls": [],
  "scrapeDetails": false,
  "maxItems": 100,
  "maxPagesPerSearch": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call haketa/spareroom-scraper --silent --output-dataset

```

## MCP server setup

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