# Zoopla Scraper - UK Real Estate Listings (`igolaizola/zoopla-scraper`) Actor

UK real estate listings scraper for Zoopla.co.uk. Search towns, areas, and postcodes for sale or rent, then export prices, photos, floor area, agents, features, coordinates, and details to JSON, CSV, Excel, or API workflows. Built for research, lead generation, and housing analytics.

- **URL**: https://apify.com/igolaizola/zoopla-scraper.md
- **Developed by:** [Iñigo Garcia Olaizola](https://apify.com/igolaizola) (community)
- **Categories:** Real estate, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

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

## Zoopla Scraper — UK Real Estate Listings for Sale & Rent

Extract Zoopla property listings across the UK by town, area, or postcode. Download prices, addresses, photos, agent details, features, and map coordinates for property research, market analysis, and lead generation.

### 🤖 What does Zoopla Scraper do?

- Search **for-sale** and **rental** listings.
- Collect listing prices, full addresses, availability, images, agent information, and property features.
- Choose sale or rental listings, then export the dataset as JSON, CSV, or Excel.

**Great for:** estate-agent research, rental monitoring, investment analysis, and UK housing datasets.

> SEO keywords: **Zoopla scraper**, **UK property listings**, **Zoopla property data**, **real estate scraper**.

### 💡 Why use it?

- 📈 **Track local pricing** — compare active listings in a town or postcode.
- 🎯 **Find property opportunities** — build focused lists for sales, rentals, or investment research.
- 🗺️ **Map the market** — use included coordinates alongside prices and listing details.

### 🚀 Quick Start

1. Add a location or postcode in `query`, or provide a latitude and longitude for a radius search.
2. Choose `sale` or `rent` in `operation`.
3. Choose the price, bedroom, home-type, and lifestyle filters that matter to you.
4. Run the actor and download the dataset from Apify.

#### Run from Apify

Open the actor in Apify Console, enter your location and filters, then click **Start**. Results appear in the default dataset and can be exported as JSON, CSV, or Excel.

### 📝 Input Parameters

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `query` | Text | No | UK town, city, area, or postcode; optional when using coordinates. |
| `locationType` | Choice | No | Optional location category filter: area, post town, county area, or alias. |
| `latitude` / `longitude` | Number | No | Center point for a radius search. Provide both values; coordinate search takes precedence over `query`. |
| `distanceMiles` | Number | No | Radius around the coordinate point in miles (default **20**). |
| `fetchDetails` | Toggle | No | Fetch additional listing description, pricing, media, floor-area, location, and history data; adds one request per listing. |
| `operation` | Choice | Yes | Buy a home or rent a home. |
| `maxItems` | Number | Yes | Maximum listings; use `0` for all available pages. |
| `sort` | Choice | No | Newest listings, price high to low, or price low to high. |
| `listedWithin` | Choice | No | Homes listed in the last 24 hours, 3, 7, or 14 days. |
| `minPrice` / `maxPrice` | Number | No | Your price range. |
| `minBeds` / `maxBeds` | Number | No | Your bedroom range. |
| `minBaths` / `maxBaths` | Number | No | Your bathroom range. |
| `homeTypes` | List | No | House, flat or apartment, detached, semi-detached, terraced, bungalow, or maisonette. |
| `furnishing` | Choice | No | Furnished, unfurnished, or part furnished. |
| `keywords` | Text | No | Words such as “garden” or “parking”. |
| `searchRadiusMiles` | Choice | No | Search from 1 to 40 miles around the location. |
| `tenure` | Choice | No | Freehold or leasehold. |
| `minimumFloorAreaSqft` | Number | No | Minimum floor area in square feet. |
| `newHomes` / `reducedPriceOnly` | Toggle | No | Limit to new homes or price-reduced homes. |
| `includeSold` / `includeRented` | Toggle | No | Include homes no longer active when available. |
| `includeRetirementHomes` / `includeSharedAccommodation` / `includeSharedOwnership` | Toggle | No | Include these specialist home types. |
| `billsIncluded` / `petsAllowed` | Toggle | No | Rental preferences. |
| `isAuction` / `isStudentAccommodation` | Toggle | No | Auction or student accommodation. |

**London homes for sale**

```json
{"query":"London","operation":"sale","maxItems":50,"sort":"newest"}
```

**Manchester rental market**

```json
{"query":"Manchester","operation":"rent","maxItems":100,"furnishing":"furnished","petsAllowed":true}
```

**Filtered London flats**

```json
{"query":"London","locationType":"countyArea","operation":"sale","maxItems":50,"minPrice":500000,"minBeds":2,"homeTypes":["flat"],"reducedPriceOnly":true,"sort":"newest"}
```

**Coordinate radius search**

```json
{"latitude":51.5074,"longitude":-0.1278,"distanceMiles":5,"operation":"sale","maxItems":50}
```

Set `fetchDetails` to `true` when you need expanded listing data. Expanded data is stored under `_details` and requires one additional request per listing.

### 📊 Output / Results

- **listingId** *(string)* — listing identifier.
- **title**, **address**, **price**, **priceTitle** — listing headline, location, and price details.
- **availableFrom**, **sizeSqft**, **imageUrl**, **gallery** — availability, size, and media.
- **branch** — estate agent name, phone number, logo, and ID.
- **features**, **highlights**, **tags** — advertised property details.
- **latitude**, **longitude**, **searchUrl** — mapping and search context.

```json
{"listingId":"12345678","title":"2 bedroom flat for sale","address":"Canary Wharf, London","price":"£625,000","sizeSqft":742,"imageUrl":"https://lid.zoocdn.com/example.jpg","branch":{"name":"Example Estate Agents","phone":"020 1234 5678"},"latitude":51.505,"longitude":-0.02}
```

### ⚖️ Legal & Ethical Considerations

- Follow Zoopla’s terms and applicable law.
- Use public listing data responsibly and respect privacy and data-protection obligations.
- Keep request volumes reasonable.
- Do not use collected contact details for unsolicited or unlawful marketing.
- This independent actor is not affiliated with or endorsed by Zoopla.

### 🛟 Support

Need help with a run, a custom field, or an export? Contact [support](https://igolaizola.com/#contact).

### ❓ FAQ

**Which locations can I search?**

Use a UK town, city, area, or postcode. The default example searches London. Alternatively provide both `latitude` and `longitude` to search around a point; the default coordinate radius is 20 miles.

**Can I search both homes for sale and rentals?**

Yes. Set `operation` to **Buy a home** or **Rent a home**.

**How do I limit the number of records?**

Set `maxItems` to the number you need. Use `0` to continue through available result pages.

**Are prices and addresses included?**

Yes. Each record includes the available price, address, images, agent details, features, and coordinates.

# Actor input Schema

## `query` (type: `string`):

Enter a UK town, city, area, or postcode. You may leave this blank when latitude and longitude are provided.

## `locationType` (type: `string`):

Optionally filter matching locations by category. Leave blank to choose the first match.

## `operation` (type: `string`):

Choose whether to find homes for sale or to rent.

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

Maximum listings to collect. Use 0 to continue through all available pages.

## `sort` (type: `string`):

Choose how matching listings are ordered.

## `listedWithin` (type: `string`):

Limit results to homes added recently.

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

Only include homes at or above this price.

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

Only include homes at or below this price.

## `minBeds` (type: `integer`):

Only include homes with at least this many bedrooms.

## `maxBeds` (type: `integer`):

Only include homes with no more than this many bedrooms.

## `minBaths` (type: `integer`):

Only include homes with at least this many bathrooms.

## `maxBaths` (type: `integer`):

Only include homes with no more than this many bathrooms.

## `homeTypes` (type: `array`):

Enter one or more home types: House, Flat or apartment, Detached house, Semi-detached house, Terraced house, Bungalow, or Maisonette.

## `furnishing` (type: `string`):

Choose a furnishing preference for rental listings.

## `keywords` (type: `string`):

Only include listings containing these words, such as garden or parking.

## `searchRadiusMiles` (type: `string`):

Choose how far from the selected location to search.

## `tenure` (type: `string`):

Choose the ownership type for homes for sale.

## `minimumFloorAreaSqft` (type: `integer`):

Only include homes with at least this floor area in square feet.

## `newHomes` (type: `boolean`):

Only include newly built homes.

## `reducedPriceOnly` (type: `boolean`):

Only include listings showing a price reduction.

## `includeSold` (type: `boolean`):

Include sold homes when available.

## `includeRented` (type: `boolean`):

Include already rented homes when available.

## `includeRetirementHomes` (type: `boolean`):

Include homes marketed for retirement living.

## `includeSharedAccommodation` (type: `boolean`):

Include shared living accommodation.

## `includeSharedOwnership` (type: `boolean`):

Include shared-ownership homes.

## `billsIncluded` (type: `boolean`):

Only include rentals where bills are included.

## `petsAllowed` (type: `boolean`):

Only include pet-friendly rentals.

## `isAuction` (type: `boolean`):

Only include homes offered for auction.

## `isStudentAccommodation` (type: `boolean`):

Only include student accommodation.

## `latitude` (type: `number`):

Center latitude for a radius search. Provide this together with longitude.

## `longitude` (type: `number`):

Center longitude for a radius search. Provide this together with latitude.

## `distanceMiles` (type: `integer`):

Radius around the coordinate point in miles.

## `fetchDetails` (type: `boolean`):

Fetch additional description, pricing, media, floor-area, location, and listing-history data for each result. This adds one request per listing.

## Actor input object example

```json
{
  "query": "London",
  "locationType": "",
  "operation": "sale",
  "maxItems": 50,
  "sort": "newest",
  "listedWithin": "",
  "furnishing": "",
  "searchRadiusMiles": "",
  "tenure": "any",
  "newHomes": false,
  "reducedPriceOnly": false,
  "includeSold": false,
  "includeRented": false,
  "includeRetirementHomes": false,
  "includeSharedAccommodation": false,
  "includeSharedOwnership": false,
  "billsIncluded": false,
  "petsAllowed": false,
  "isAuction": false,
  "isStudentAccommodation": false,
  "distanceMiles": 20,
  "fetchDetails": 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 = {
    "query": "London"
};

// Run the Actor and wait for it to finish
const run = await client.actor("igolaizola/zoopla-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 = { "query": "London" }

# Run the Actor and wait for it to finish
run = client.actor("igolaizola/zoopla-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 '{
  "query": "London"
}' |
apify call igolaizola/zoopla-scraper --silent --output-dataset

```

## MCP server setup

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