Zoopla Scraper — UK Property Listings
DeprecatedPricing
from $3.08 / 1,000 listing rows
Zoopla Scraper — UK Property Listings
DeprecatedScrape UK property listings from Zoopla (for-sale or to-rent) — price, address, bedrooms, agent phone, floor plan, EPC, photos, full description. Export to JSON or CSV. We handle the blocks so your dataset stays clean.
Pricing
from $3.08 / 1,000 listing rows
Rating
0.0
(0)
Developer
DevilScrapes
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
5 days ago
Last modified
Categories
Features
Share
🎯 What this scrapes
Give this Actor a UK location and a listing type and it returns structured Zoopla property rows — price, address, bedrooms, bathrooms, floor area, tenure, EPC rating, key features, agent details, photos, and (optionally) the full listing description and floor plan straight from each property's detail page.
- Searches Zoopla for the location + listing type you give it, with optional price and minimum-bedroom filters.
- Collects up to your configured cap of listing rows from the search results.
- Optionally visits each listing's detail page for the fuller field set — full description, floor plan URL, EPC graph, and full agent phone.
- Emits one row per property to the default dataset.
Zoopla is the UK's #2 property portal, and its listing pages are the closest thing to a canonical source for a huge share of the UK's for-sale and to-rent inventory. This is the Zoopla twin of our Rightmove scraper, built to the same field depth so the two feel like a matched product line.
🔥 Features
- 🛡️ We clear the JS-execution gate Zoopla puts in front of raw HTTP requests — a hardened browser layer renders the page like a real visitor instead of bouncing off a challenge screen.
- 🌐 We rotate proxy sessions through Apify Proxy — a fresh exit IP and session on every block.
- 🧭 Built-in UK geo-splash guard — every fetched page is checked for genuine UK Zoopla markers (currency symbol, canonical domain) before its data is trusted, so a bad proxy exit never silently returns wrong-country data.
- 🧱 We back off when the target pushes back. Partial successes surface with a clear status message — we never silently return an empty dataset.
- 🎯 Per-listing fault isolation — one bad listing is logged and skipped; it never fails the whole run.
- 🧊 Pydantic v2 input + output validation — every row is a typed, schema-enforced record; nullable fields are always
null, never silently dropped. - 💰 Pay-Per-Event pricing — you're charged per listing row written to your dataset, not per page fetched.
💡 Use cases
- Market research — track UK listing supply, pricing, and inventory mix by area over time.
- Estate agent competitor monitoring — see what other agents have listed in your patch, at what price, and with what features.
- Investment screening — filter for-sale or to-rent inventory by area, price, and bedroom count for deal sourcing.
- Proptech / analytics pipelines — feed structured listing data into a warehouse or model without maintaining your own scraper.
⚙️ How to use it
- Click Try for free at the top of the page.
- Enter a UK
searchLocation(city, district, postcode prefix, or region) and picklistingType(for-saleorto-rent). - Optionally set
maxPriceGbp,minBedrooms, and whether to enrich each row from the detail page (enrichDetails). - Click Start. Output streams into the run's dataset.
- Export from Storage → Dataset as JSON, CSV, or Excel — or fetch via the API.
📥 Input
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
searchLocation | string | yes | "London" | Free-form UK location — city, district, postcode prefix, or region. |
listingType | string | no | "for-sale" | for-sale or to-rent. |
maxPriceGbp | integer | no | null | Upper price filter. GBP total for for-sale; GBP/month for to-rent. |
minBedrooms | integer | no | null | Minimum bedrooms (1-10). |
maxProperties | integer | no | 50 | Hard cap on dataset rows (1-500). |
enrichDetails | boolean | no | true | Fetch each property's detail page for full description, floor plan, EPC, and full agent phone. |
countryCode | string | no | "GB" | Pinned to GB in v1 — the declared expectation the geo-splash guard checks against. |
proxyConfiguration | object | no | {"useApifyProxy": true} | Apify Proxy spec. |
Example input
{"searchLocation": "London","listingType": "for-sale","maxProperties": 5,"enrichDetails": true,"countryCode": "GB","proxyConfiguration": {"useApifyProxy": true}}
📤 Output
Every row is one dataset item — one Zoopla listing.
| Field | Type | Notes |
|---|---|---|
listing_id | string | Zoopla's own listing identifier. |
zoopla_url | string | Canonical Zoopla listing detail-page URL. |
address | string | null | Display address. |
postcode | string | null | UK postcode, when exposed separately. |
latitude | float | null | Listing latitude, where public. |
longitude | float | null | Listing longitude, where public. |
price_gbp | integer | null | Headline price in GBP. |
price_qualifier | string | null | Price qualifier text, e.g. "Offers in Excess of". |
price_frequency | string | null | Rent period, e.g. "pcm", or "not specified" for sales. |
listing_type | string | for-sale or to-rent. |
property_type | string | null | e.g. "Flat", "Detached house". |
bedrooms | integer | null | Bedroom count. |
bathrooms | integer | null | Bathroom count. |
sqft | integer | null | Floor area in square feet, when published. |
tenure | string | null | e.g. "Leasehold", "Freehold". |
epc_rating | string | null | Energy Performance Certificate rating letter. |
epc_graph_url | string | null | EPC graph image URL (detail-page field). |
description | string | null | Full listing description (detail-page field). |
key_features | array | Bulleted key-feature strings. |
listing_added_date | string | null | ISO-8601 timestamp, when exposed. |
agent_name | string | null | Listing agent or branch name. |
agent_phone | string | null | Full agent phone (detail-page field). |
agent_url | string | null | Agent branch page URL. |
photo_urls | array | Listing photo URLs. |
floor_plan_url | string | null | Floor plan image URL (detail-page field). |
country_code | string | Constant "GB" for v1. |
scraped_at | string | ISO-8601 UTC timestamp. |
Nullable fields are null, never omitted, when Zoopla doesn't expose them publicly or enrichDetails was false.
Example output
{"listing_id": "68912345","zoopla_url": "https://www.zoopla.co.uk/for-sale/details/68912345/","address": "Gainsford Road, Walthamstow, London","postcode": "E17 6ZL","latitude": 51.587363,"longitude": -0.027555,"price_gbp": 300000,"price_qualifier": "Offers in Excess of","price_frequency": "not specified","listing_type": "for-sale","property_type": "Flat","bedrooms": 1,"bathrooms": 1,"sqft": 443,"tenure": "Leasehold","epc_rating": "C","epc_graph_url": "https://lc.zoocdn.com/.../epc.png","description": "Set on the quiet side ...","key_features": ["One Bedroom", "Rear Garden"],"listing_added_date": "2026-07-19T10:24:23Z","agent_name": "Foxtons, Walthamstow","agent_phone": "020 3910 6244","agent_url": "https://www.zoopla.co.uk/find-agents/branch/foxtons-walthamstow-.../","photo_urls": ["https://lc.zoocdn.com/..."],"floor_plan_url": "https://lc.zoocdn.com/.../floorplan.png","country_code": "GB","scraped_at": "2026-08-13T10:00:00+00:00"}
💰 Pricing
Pay-Per-Event — you pay only when these events fire:
| Event | USD | What it is |
|---|---|---|
actor-start | $0.20 | One-off warm-up charge per run. |
result-row | $0.0035 | Per listing row written to your dataset. |
Example: 1 000 results at the rates above ≈ $3.70. No subscription, no minimum, no card to start — Apify gives every new account $5 of free credit.
🚧 Limitations
v0 covers search-by-location and optional detail-page enrichment only — no sold-price history (Zoopla's separate "house prices" vertical), no map/polygon search (location is a free-text string, not lat/lng bounds), and no OCR of the EPC graph image (we surface the URL instead of rendering it).
❓ FAQ
Is this legal?
We only fetch content Zoopla makes publicly available on its search and listing pages. Respect Zoopla's terms of service before using output commercially.
Why is a field null?
Detail-page fields (epc_graph_url, description, agent_phone, floor_plan_url) are null when enrichDetails is false, or when Zoopla doesn't expose that field publicly for a given listing.
Do I need my own proxy?
No — Apify Proxy is wired in by default.
Why did I get fewer rows than maxProperties?
Zoopla's search pagination for a given location/filter combination can return fewer results than the cap, and any listing that fails to parse is skipped rather than failing the run — check the run's status message for a breakdown.
💬 Your feedback
Spotted a bug, hit a weird edge case, or need a new field? Open an issue on the Actor's Issues tab on Apify Console — we ship fixes weekly and we read every report.