Zoopla UK Property Listings Scraper
Pricing
from $0.70 / 1,000 listing scrapeds
Zoopla UK Property Listings Scraper
Zoopla UK property for sale or to rent by town, county or postcode. Newest first or most price-reduced first: price, reductions, date listed, beds, baths, tenure, floor area, coordinates, agent. Built for new-listing and price-drop alerts.
Pricing
from $0.70 / 1,000 listing scrapeds
Rating
0.0
(0)
Developer
Superslow Sloth
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
5 days ago
Last modified
Categories
Share
Returns UK property listings from Zoopla, for sale or to rent, as one flat row per property: the asking price, any price reduction, the date it was listed, bedrooms and bathrooms, tenure, floor area, coordinates and the agent.
Built for new-listing and price-drop alerts. Run it on a schedule with
sort = newest_listings (or addedWithin = 24_hours) and you have a feed of what
came on the market since the last run; run it with sort = most_reduced and you
have the properties whose price just fell, with the amount, the percentage and
the date of the cut.
Small input, no nested objects, no HTML. Its input mirrors the
Rightmove Property Scraper from the same account, so the same locations,
channel, price, bedroom, radius and sort settings work on both portals.
Input
| field | meaning |
|---|---|
locations | One per line: a town, county, outcode or postcode (Bristol, Oxfordshire, BS8, BS8 1AA). A part of a larger area uses a slash: London/Islington, Bristol/Clifton. |
channel | buy (default) or rent |
sort | newest_listings (default), most_reduced, lowest_price, highest_price, or Zoopla's own default |
addedWithin | Only properties first listed in the last 24 hours, 3, 7, 14 or 30 days |
minPrice, maxPrice | In pounds; per month when renting. Any whole number |
minBedrooms, maxBedrooms | 0 selects studios |
radius | Miles beyond the area: 0.25, 0.5, 1, 3, 5, 10, 15, 20, 30 or 40 |
propertyTypes | houses, flats, bungalows |
newHomes | Sales only: include (default), exclude, only |
includeSSTC | Sales only: include sold-subject-to-contract and under-offer stock |
maxItems | Budget for the whole run, in listings. Default 100 |
maxPages | Pages per area. Default and ceiling 40 |
requestIntervalSecs | Pause between pages. Default 1 |
proxyConfiguration | Residential Apify proxy, on by default; see limits |
Every filter is a value Zoopla was seen to honour. Zoopla quietly ignores a value it does not know (a radius of 7 miles, a "listed within 2 hours"), so a typo would return the unfiltered search at full price; this actor offers only the values that changed the result set and refuses the rest before a request is spent.
Output
One item per property:
| field | meaning |
|---|---|
id | Zoopla's listing id: the number in the listing URL. What a repeated run joins on |
url | The listing on zoopla.co.uk, absolute |
title, display_address | Zoopla's headline (3 bed end terrace house for sale) and the address as printed |
transaction_type, channel | buy/rent, and the part of Zoopla it lives in: for-sale, to-rent or new-homes |
price, price_currency | Asking price in whole pounds; per month on a rental |
price_frequency | monthly on a rental, null on a sale |
price_display, price_qualifier | The price as printed (£410,000, £1,200 pcm) and Guide price, Offers over, Offers in region of, From |
rent_per_week_display | Rentals: Zoopla's weekly equivalent as printed, e.g. £276.92 pw |
price_reduced | true only when Zoopla gives a reduction figure |
price_reduction_amount, price_reduction_percent, price_reduced_on | The latest cut: whole pounds, percent of the previous price, ISO date |
published_on | ISO date the listing first went live |
listing_flag | Zoopla's badge: Just added or Back to market |
available_from | Rentals: immediately or an ISO date |
bedrooms, bathrooms, reception_rooms | Counts. 0 bedrooms is a real answer on a studio |
property_type | Zoopla's slug: flat, semi_detached, terraced, detached, end_terrace, town_house, bungalow, land... |
tenure, tags | Freehold/Leasehold/Share of Freehold when tagged, and every tag (Chain free, New home, Auction, Shared ownership, Retirement, Pets allowed) |
floor_area_sqft, floor_area_source | Square feet, and where Zoopla got it - see below |
latitude, longitude | Zoopla's coordinates for the property |
summary, image_url, image_count, floorplan_count | Zoopla's truncated blurb and lead photo, and how many photos and floorplans the listing has |
agent_name, agent_phone, agent_url, agent_logo_url, agent_branch_id | The marketing agent or developer |
featured_type, under_offer | featured/weekly_featured for a slot an agent paid for; whether the property is under offer |
search_location | The area slug this row came from |
Where the fields come from
Each Zoopla results page carries its listings in a schema.org ItemList
(28 products per page): id, price, address, coordinates, bedrooms, bathrooms and
floor area. That is the source for those fields. Zoopla's own page also embeds the
listing cards it draws the visible page from, which hold what the ItemList
leaves out: the price qualifier, reductions, the date listed, the badge, tags and
the agent. They are joined to the ItemList by listing id. A listing whose card is
missing from a page is still delivered, with those fields null.
Nulls, not zeros
A missing value is null, never 0. Land and parking have no bedroom count, and
a quarter of listings have no floor area. price_reduced is null, not false,
on a row whose card was missing, because false would claim a measurement.
floor_area_sqft is often an estimate
Of 812 listings with a floor area, 461 took it from comparable homes' energy
certificates (comparables_epc) and 8 from a survey of comparables
(comparables_survey). Only structured_data (the agent stated it),
floorplan_derived and text_derived are the listing's own figure. Filter on
floor_area_source before using the number as a fact about the property.
A reduction is only a reduction when there is a figure
Zoopla puts a price-history block on listings that were never cut; it says when
the price was first set and nothing else. Those rows have price_reduced = false.
price_reduction_percent is the cut as a percentage of the price before it
(a £130,000 flat cut by £120,000 reads 48.0).
Limits worth knowing before you run it
- 1,000 listings per area, always. Zoopla serves 25 results per page and 40
pages, then answers a 404. London reports "50,000" results, which is Zoopla's
clip rather than a count. The run log lists the areas that stopped at the limit
(
stopped at Zoopla's page limit); for more, give several narrower areas, or addaddedWithin, a price band or a radius. A page also carries 3 paid "featured" listings on top of its 25, so a full walk returns a few more than the area's count. - Residential proxy only. Zoopla sits behind Cloudflare. Measured 2026-10-20 a datacenter proxy was answered 403 "Just a moment..." on 5 of 5 requests, while residential exits were served on 10 of 11 over 32 minutes. A single address is also challenged after enough requests (roughly 80 pages in under an hour drew HTTP 429, and the limit cleared within a minute). The actor uses a real Chrome TLS fingerprint, treats a challenge as a refusal of the address (a 403 or 429, or a 200 holding the challenge page), switches to a fresh exit and retries. A page is about 0.5 MB, so residential bandwidth is the main cost of a run.
- A search with no matches returns nothing, not its neighbours. When Zoopla finds no match it shows properties near the area instead. The actor reads the match count and does not emit or charge for those.
- An unknown place is a failure. Zoopla answers it with its search page and
HTTP 200; the run log reports
Zoopla does not recognise that place. Some names resolve to nothing in a URL path:St Albansand the ambiguousSt Ivesboth returned "No results found", which the run reports as. Use the outcode (Zoopla did not accept the searchAL1) when a name fails. - Duplicates across pages and areas are skipped, and not charged. A featured listing can reappear in its own position on a later page; it is delivered once.
- Zoopla can change its page at any time. The data is read from the page's embedded JSON, which is not a published API.
Pricing
Pay per event: a small charge when the run starts, plus one charge per listing delivered. Skipped duplicates and nearby results are not charged, and a run that returns nothing charges only the start event.