# SpareRoom Scraper (`automation-lab/spareroom-room-rental-listings`) Actor

Search public SpareRoom UK and US room rentals and export rents, availability, property, household, advertiser, photo, and canonical URL data.

- **URL**: https://apify.com/automation-lab/spareroom-room-rental-listings.md
- **Developed by:** [Stas Persiianenko](https://apify.com/automation-lab) (community)
- **Categories:** Real estate
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.46 / 1,000 item extracteds

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

Export current public SpareRoom UK and US room-rental listings into structured JSON, CSV, Excel, or XML. The Actor searches by location or follows supplied SpareRoom URLs, then returns stable listing identity, rent, availability, property and household details, public advertiser context, photos, and canonical URLs.

Use scheduled runs to capture comparable inventory snapshots and detect listings or advertised rents that changed between runs. The Actor does not send alerts itself; connect its dataset to your own monitoring or notification workflow.

### What can the SpareRoom scraper do?

- Search a UK or US city or area.
- Accept public search, location, and listing URLs.
- Follow result pagination up to `maxItems`.
- Enrich every result from its public detail page.
- Normalize GBP and USD rents.
- Deduplicate listings by stable SpareRoom ID.
- Export clean rows through Apify datasets and integrations.

### Who is it for?

Property analysts can compare advertised rents and availability across areas.
Housing teams can maintain a current room-inventory feed.
Researchers can study room types, deposits, amenities, and household composition.
Operations teams can schedule repeat snapshots and trigger downstream automation.
Developers can consume typed SpareRoom data without maintaining a page parser.

### Why use this Actor?

SpareRoom exposes useful information across both search cards and detail pages. This Actor joins those surfaces into one row per listing while preserving the canonical source URL. It supports both the UK and US storefronts, rejects unsupported domains, stops at the requested limit, and fails visibly if SpareRoom returns an unexpected page instead of silently producing an empty dataset.

### What data is extracted?

| Field | Meaning |
|---|---|
| `listingId` | Stable SpareRoom listing ID |
| `title`, `description` | Public listing text |
| `url` | Canonical public URL |
| `country`, `location` | Storefront and displayed area |
| `rent`, `currency`, `rentPeriod` | Normalized advertised rent |
| `roomType`, `availability` | Search-card room and availability summary |
| `availabilityDetails` | Availability and term labels |
| `extraCosts` | Deposit, bills, and other public costs |
| `amenities` | Furnishing and amenity labels |
| `currentHousehold` | Public household context |
| `householdPreferences` | Public new-flatmate preferences |
| `advertiserName`, `advertiserRole`, `advertiserVerified` | Public advertiser context |
| `imageUrl`, `imageUrls` | Public listing photos |
| `scrapedAt` | Snapshot timestamp |

Fields can be null when a listing does not display that value.

### How to get started

1. Open the Actor in Apify Console.
2. Enter a location and choose `UK` or `US`, or paste one or more SpareRoom URLs.
3. Set `maxItems` to the number of unique listings you need.
4. Keep **Include listing details** enabled for household, amenities, costs, and photos.
5. Click **Start**.
6. Open the Dataset tab and export the rows in your preferred format.

### Input parameters

| Input | Type | Default | Description |
|---|---|---:|---|
| `startUrls` | array | — | SpareRoom UK/US search, location, or listing URLs |
| `country` | string | `UK` | Storefront used for a location search |
| `location` | string | — | City or area, used when URLs are empty |
| `maxItems` | integer | `20` | Maximum unique listings, 1–5,000 |
| `includeDetails` | boolean | `true` | Fetch detail-page fields and photos |
| `useApifyProxy` | boolean | `false` | Use a geography-matched residential proxy |

Provide either `startUrls` or `location`. When URLs are supplied, their storefront determines each row's country.

### Example input

```json
{
  "country": "UK",
  "location": "London",
  "maxItems": 10,
  "includeDetails": true
}
```

US URL example:

```json
{
  "startUrls": [{ "url": "https://www.spareroom.com/rooms-for-rent/new_york" }],
  "maxItems": 10,
  "includeDetails": true
}
```

### Example output

```json
{
  "listingId": "12345678",
  "title": "Bright double room near the station",
  "url": "https://www.spareroom.co.uk/flatshare/london/ealing/12345678",
  "country": "UK",
  "location": "Ealing (W7)",
  "rent": 950,
  "currency": "GBP",
  "roomType": "Double room",
  "availability": "Available 15th Sep 2026",
  "advertiserName": "Sample advertiser",
  "advertiserVerified": true,
  "amenities": { "Furnishings": "Furnished" },
  "currentHousehold": { "Total # rooms": "4" },
  "scrapedAt": "2026-01-15T12:00:00.000Z"
}
```

### How much does it cost to extract SpareRoom listings?

The Actor uses pay-per-event pricing: one small start event per run and one item event per saved listing. The exact tier shown in Apify Console depends on your platform plan. At the BRONZE price of $0.00076 per item plus a $0.005 start, 10 records cost about $0.0126, 100 records about $0.081, and 1,000 records about $0.765. Proxy traffic and platform compute can also count toward your Apify account usage.

Disable `includeDetails` only when search-card fields are sufficient; this reduces requests but intentionally omits household, amenity, extra-cost, and full-photo fields.

### Monitoring inventory and rent changes

Schedule the Actor daily or weekly with the same input. Store each run's dataset, then join snapshots by `listingId`. Compare `rent`, `availability`, or presence between dates. A new ID indicates new observed inventory; a missing ID means it was not present in that bounded snapshot, not necessarily that SpareRoom formally removed it.

For alerts, connect a schedule to Make, Zapier, a webhook, Google Sheets, or your own data warehouse. Keep change detection downstream so you control retention and alert thresholds.

### Integrations and exports

Apify datasets export JSON, JSONL, CSV, Excel, XML, and RSS. Common patterns include:

- Append each run to Google Sheets.
- Load snapshots into BigQuery, Snowflake, or PostgreSQL.
- Trigger a webhook after a scheduled run.
- Use Make or Zapier to notify on downstream comparisons.
- Build a local rent dashboard keyed by location and listing ID.

### Run through the API with cURL

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/automation-lab~spareroom-room-rental-listings/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"country":"UK","location":"London","maxItems":10,"includeDetails":true}'
```

To wait and receive dataset items:

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/automation-lab~spareroom-room-rental-listings/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"country":"US","location":"New York","maxItems":10}'
```

### JavaScript API example

```js
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/spareroom-room-rental-listings').call({
  country: 'UK', location: 'London', maxItems: 10, includeDetails: true,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### Python API example

```python
from apify_client import ApifyClient
client = ApifyClient(token="YOUR_APIFY_TOKEN")
run = client.actor("automation-lab/spareroom-room-rental-listings").call(
    run_input={"country": "UK", "location": "London", "maxItems": 10}
)
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(items)
```

### Use with Apify MCP

#### Claude Desktop, Cursor, and VS Code setup

Add the Actor to Claude Code:

```bash
claude mcp add --transport http apify \
  "https://mcp.apify.com?tools=automation-lab/spareroom-room-rental-listings"
```

Desktop/editor configuration:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=automation-lab/spareroom-room-rental-listings"
    }
  }
}
```

Example prompts:

- “Collect 20 current SpareRoom listings in London with household details.”
- “Export current SpareRoom New York rooms and their USD rents.”
- “Run my saved London input and return canonical listing URLs.”

### Reliability, retries, and proxy use

The Actor uses server-rendered public pages and bounded transient retries. It validates HTTP status and recognizable SpareRoom content. Unsupported domains and malformed limits fail before extraction. Direct access is the economical default. Enable `useApifyProxy` if your environment needs a residential route; the Actor selects GB or US geography from `country`.

An expected no-result location completes with an empty dataset. An unexpected challenge or response shape raises an error rather than pretending no listings exist.

### Legality and responsible use

Only publicly displayed fields are collected. The Actor does not log in, reveal hidden contact details, send messages, assess whether a listing is legitimate or safe, or guarantee that an advertiser or property is genuine. Respect SpareRoom's terms, applicable law, privacy rights, and reasonable request volumes. Do not use the output for discrimination, harassment, spam, or decisions that require independent verification.

Listings can change between page requests. `maxItems` limits accepted unique rows, and supplied URLs are processed in order. Public display names and household descriptions may contain user-authored text; treat them as untrusted data.

### Troubleshooting

**Why did I get no results?**
Check that the location exists on the selected storefront. Try a known public location URL and inspect the run log.

**Why are detail objects empty?**
Keep `includeDetails` enabled. Some listings omit individual sections, so their objects may still be empty.

**Why did the run fail on a URL?**
Only public `spareroom.co.uk` and `spareroom.com` URLs are accepted. SpareRoom challenge or error pages are treated as upstream failures.

**Should I enable the proxy?**
Use the direct default first. Enable it only when direct access is unavailable, because residential traffic adds cost.

### FAQ

**Does this Actor use the SpareRoom app or a private SpareRoom API?**
No. It parses public web inventory and detail pages.

**Can it monitor rent changes?**
It produces timestamped, stable-ID snapshots. Schedule repeat runs and compare datasets downstream.

**Does it contact advertisers?**
No. It returns only public advertiser context displayed on the listing.

**Does it cover both UK and US SpareRoom?**
Yes. Use `UK`/`US` location search or supply URLs from either supported storefront.

**Is every field always present?**
No. SpareRoom listings vary; unavailable values are null or empty objects.

### Related Actors

Explore other public rental and property data Actors from [automation-lab on Apify](https://apify.com/automation-lab). Choose a source-specific Actor when your workflow also needs inventory from another marketplace.

### Support

If a valid public SpareRoom input fails, open an issue from the Actor page with the run URL and non-sensitive input. Do not include private account data or credentials.

# Actor input Schema

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

Public SpareRoom search, location, or listing URLs. UK and US URLs can be combined.

## `country` (type: `string`):

Storefront used when building a search from location.

## `location` (type: `string`):

City or area to search when startUrls is empty, for example London or New York.

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

Maximum unique listing records saved across all pages and URLs.

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

Visit each listing to collect availability, costs, amenities, household, photos, and advertiser context.

## `useApifyProxy` (type: `boolean`):

Route requests through an Apify residential proxy in the selected country. Enable only if direct access is unavailable.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.spareroom.co.uk/flatshare/london"
    }
  ],
  "country": "UK",
  "maxItems": 20,
  "includeDetails": true,
  "useApifyProxy": false
}
```

# Actor output Schema

## `overview` (type: `string`):

Normalized listing identity, rent, availability, location, household, advertiser, photo, and canonical URL data.

# 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.spareroom.co.uk/flatshare/london"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/spareroom-room-rental-listings").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.spareroom.co.uk/flatshare/london" }] }

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/spareroom-room-rental-listings").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.spareroom.co.uk/flatshare/london"
    }
  ]
}' |
apify call automation-lab/spareroom-room-rental-listings --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,automation-lab/spareroom-room-rental-listings"
        }
    }
}

```

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/BTqFte0l2xh00P3aU/builds/99XbkyC1yYz3Oei73/openapi.json
