# Zoopla Scraper (`shahidirfan/zoopla-scraper`) Actor

Extract property listings, sales history, and rental data from Zoopla, the UK's leading real estate platform. Perfect for detailed market analysis and investment insights. To ensure seamless extraction and prevent blocking, the use of residential proxies is strongly recommended.

- **URL**: https://apify.com/shahidirfan/zoopla-scraper.md
- **Developed by:** [Shahid Irfan](https://apify.com/shahidirfan) (community)
- **Categories:** Real estate, Developer tools, Automation
- **Stats:** 45 total users, 11 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-usage

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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 Property Scraper

Extract comprehensive Zoopla property listing data at scale for research, monitoring, and analysis. Collect rich listing details including pricing, property features, listing metadata, and agent information in a clean structured dataset. Built for teams that need reliable UK property intelligence without manual copy-paste work.

### Features

- **Rich property records** — Collect detailed listing data including pricing, features, branch details, and listing links.
- **Clean output format** — Returns sanitized records with no null fields for easier downstream processing.
- **Pagination coverage** — Automatically moves through search result pages based on your target result count.
- **Single URL focus** — Run one search URL per job for consistent and predictable throughput.
- **UK proxy-ready** — Designed for reliable collection with UK residential proxy setup.
- **Analysis-friendly fields** — Includes normalized values such as `priceValue`, `beds`, `baths`, and `receptions`.

### Use Cases

#### Property Market Research
Track property supply, asking prices, and listing characteristics across areas. Build datasets for market trend analysis and reporting.

#### Investment Sourcing
Collect and compare listings to identify opportunities by location, size, and property type. Support faster screening and shortlist creation.

#### Competitor Monitoring
Monitor listing presentation, pricing movements, and branch activity in targeted regions. Use data snapshots for regular intelligence reviews.

#### Lead Enrichment
Capture listing-level context and branch details for outreach workflows. Combine results with your internal CRM or BI tools.

#### Data Pipelines and Dashboards
Feed clean listing data into analytics systems for recurring reports. Export to spreadsheet tools or automate to warehouse pipelines.

---

### Input Parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `startUrl` | String | No | `https://www.zoopla.co.uk/for-sale/property/london/?q=London&search_source=home&recent_search=true` | Single Zoopla search URL to scrape. |
| `results_wanted` | Integer | No | `20` | Maximum number of listings to collect. |
| `proxyConfiguration` | Object | No | UK residential preset | Proxy configuration for reliable collection. |

---

### Output Data

Each dataset item contains a cleaned property listing record.

| Field | Type | Description |
|-------|------|-------------|
| `listingId` | String | Unique Zoopla listing identifier. |
| `title` | String | Listing title. |
| `address` | String | Property address text. |
| `postalCode` | String | Extracted UK postcode when available. |
| `propertyType` | String | Property type label from listing data. |
| `price` | String | Formatted listing price text. |
| `priceUnformatted` | Number | Raw numeric price from listing data. |
| `priceValue` | Number | Normalized numeric price for analysis. |
| `priceCurrency` | String | Currency code. |
| `beds` | Number | Bedrooms count when available. |
| `baths` | Number | Bathrooms count when available. |
| `receptions` | Number | Reception/rooms count when available. |
| `summaryDescription` | String | Listing summary text. |
| `url` | String | Listing detail URL. |
| `detailUrl` | String | Listing detail URL (explicit field). |
| `contactUrl` | String | Listing contact page URL. |
| `branch` | Object | Branch details including name and phone. |
| `branchDetailsUrl` | String | Branch profile URL. |
| `tags` | Array | Listing tags (for example tenure/chain status). |
| `features` | Array | Structured feature badges from listing data. |
| `gallery` | Array | Gallery image identifiers. |
| `image` | Object | Main image metadata and responsive variants. |
| `searchContext` | Object | Run context such as page number and source URL. |
| `searchResultsMeta` | Object | Search-level metadata for the listing page. |
| `pagination` | Object | Pagination metadata for the source page. |
| `flags` | Object | Search flags returned with results. |
| `scrapedAt` | String | ISO timestamp for extraction time. |

---

### Usage Examples

#### Basic Extraction

Collect listings from one search URL.

```json
{
  "startUrl": "https://www.zoopla.co.uk/for-sale/property/london/?q=London&search_source=home&recent_search=true",
  "results_wanted": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"],
    "countryCode": "GB"
  }
}
````

#### Higher-Volume Collection

Increase the listing cap for broader monitoring.

```json
{
  "startUrl": "https://www.zoopla.co.uk/for-sale/property/birmingham/?q=Birmingham&search_source=home&recent_search=true",
  "results_wanted": 250,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"],
    "countryCode": "GB"
  }
}
```

***

### Sample Output

```json
{
  "listingId": "72405744",
  "title": "3 bed semi-detached house for sale",
  "address": "Redway Drive, Twickenham TW2",
  "postalCode": "TW2",
  "propertyType": "semi_detached",
  "price": "£850,000",
  "priceUnformatted": 850000,
  "priceValue": 850000,
  "priceCurrency": "GBP",
  "beds": 3,
  "baths": 1,
  "receptions": 2,
  "summaryDescription": "A three-bedroom semi-detached family home with two reception rooms, garage, and a generous driveway...",
  "url": "https://www.zoopla.co.uk/for-sale/details/72405744/",
  "detailUrl": "https://www.zoopla.co.uk/for-sale/details/72405744/",
  "contactUrl": "https://www.zoopla.co.uk/for-sale/contact/72405744/",
  "branch": {
    "branchId": 67453,
    "name": "Yopa",
    "phone": "01322 584475"
  },
  "branchDetailsUrl": "https://www.zoopla.co.uk/find-agents/branch/yopa-hinckley-67453/",
  "listingType": "featured",
  "scrapedAt": "2026-02-17T10:15:12.000Z"
}
```

***

### Tips for Best Results

#### Use Strong Search URLs

- Start from valid Zoopla search result pages.
- Keep URL filters aligned to your exact use case.
- Validate each URL manually before long runs.

#### Scale Gradually

- Start with a smaller `results_wanted` for validation.
- Increase volume after confirming field quality.
- Split very large jobs across multiple runs.

#### Keep Proxy Settings Consistent

- Use UK residential proxy settings for stable access.
- Avoid switching proxy profiles mid-workflow.
- Re-run failed jobs with the same proxy strategy.

#### Build Repeatable Monitoring

- Schedule runs at regular intervals.
- Store snapshots by run date for trend analysis.
- Compare normalized fields such as `priceValue` over time.

#### Proxy Configuration

Recommended proxy setup:

```json
{
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"],
    "countryCode": "GB"
  }
}
```

If UK residential proxies are not available in your account, the actor automatically falls back to alternative proxy strategies so runs can continue.

***

### Integrations

Connect your dataset with:

- **Google Sheets** — Share and review listing data with non-technical stakeholders.
- **Airtable** — Build searchable listing databases and internal workflows.
- **Looker Studio / BI tools** — Visualize market movements and trends.
- **Webhooks** — Push fresh records into your own systems automatically.
- **Make** — Automate enrichment and notification workflows.
- **Zapier** — Trigger actions when new listings match your criteria.

#### Export Formats

- **JSON** — Best for APIs, apps, and pipelines.
- **CSV** — Best for quick analysis in spreadsheets.
- **Excel** — Best for business reporting and sharing.
- **XML** — Best for systems requiring XML ingestion.

***

### Frequently Asked Questions

#### How many listings can I collect in one run?

You can set the `results_wanted` value based on your needs. Start smaller for testing, then increase for production runs.

#### Can I run multiple location searches at once?

Use one `startUrl` per run. For multiple locations, run separate jobs (manually or with a schedule/workflow).

#### Will the output include empty or null fields?

No. Output records are cleaned to remove null values automatically.

#### Are coordinates and impressions included?

No. Coordinate-related fields and impression arrays are removed from output records.

#### Why are some optional fields missing on certain listings?

Some listings do not publish every attribute. The actor returns only available non-null values.

#### Can I schedule this actor to run daily?

Yes. Use Apify schedules to run hourly, daily, or at any custom interval.

#### Which proxy setup should I use?

UK residential proxy configuration is recommended for best reliability.

***

### Support

For issues or feature requests, open a ticket through the Apify Console actor page.

#### Resources

- [Apify Documentation](https://docs.apify.com/)
- [Apify API Reference](https://docs.apify.com/api/v2)
- [Apify Schedules](https://docs.apify.com/platform/schedules)

***

### Legal Notice

This actor is intended for legitimate data collection and analysis workflows. You are responsible for complying with website terms, local regulations, and data-use requirements in your jurisdiction.

# Actor input Schema

## `startUrl` (type: `string`):

Zoopla search URL to scrape. Example: https://www.zoopla.co.uk/for-sale/property/london/

## `results_wanted` (type: `integer`):

Maximum number of property listings to collect. Pages are automatically calculated (28 listings per page).

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

Recommended: Use Apify RESIDENTIAL proxies for best results. If your selected country/group is unavailable, the actor will automatically try fallback proxy strategies.

## Actor input object example

```json
{
  "startUrl": "https://www.zoopla.co.uk/for-sale/property/london/?q=London&search_source=home&recent_search=true",
  "results_wanted": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `overview` (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 = {
    "startUrl": "https://www.zoopla.co.uk/for-sale/property/london/?q=London&search_source=home&recent_search=true",
    "results_wanted": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("shahidirfan/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 = {
    "startUrl": "https://www.zoopla.co.uk/for-sale/property/london/?q=London&search_source=home&recent_search=true",
    "results_wanted": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("shahidirfan/zoopla-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrl": "https://www.zoopla.co.uk/for-sale/property/london/?q=London&search_source=home&recent_search=true",
  "results_wanted": 20
}' |
apify call shahidirfan/zoopla-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=shahidirfan/zoopla-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Zoopla Scraper",
        "description": "Extract property listings, sales history, and rental data from Zoopla, the UK's leading real estate platform. Perfect for detailed market analysis and investment insights. To ensure seamless extraction and prevent blocking, the use of residential proxies is strongly recommended.",
        "version": "0.0",
        "x-build-id": "Z1izS7YGWDtlgLGs4"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/shahidirfan~zoopla-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-shahidirfan-zoopla-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/shahidirfan~zoopla-scraper/runs": {
            "post": {
                "operationId": "runs-sync-shahidirfan-zoopla-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/shahidirfan~zoopla-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-shahidirfan-zoopla-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "startUrl": {
                        "title": "Search URL",
                        "type": "string",
                        "description": "Zoopla search URL to scrape. Example: https://www.zoopla.co.uk/for-sale/property/london/"
                    },
                    "results_wanted": {
                        "title": "Maximum listings",
                        "type": "integer",
                        "description": "Maximum number of property listings to collect. Pages are automatically calculated (28 listings per page).",
                        "default": 20
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Recommended: Use Apify RESIDENTIAL proxies for best results. If your selected country/group is unavailable, the actor will automatically try fallback proxy strategies.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ]
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
