Zoopla Scraper - Property Listings, Sold Prices & Monitoring
Pricing
from $1.00 / 1,000 property results
Zoopla Scraper - Property Listings, Sold Prices & Monitoring
Scrape UK property from Zoopla: for sale, to rent and Land Registry sold prices. Search by place with filters or paste links. Optional full detail adds EPC, floor plans, tenure, price history, stations and agent phone. Incremental mode for change monitoring.
Pricing
from $1.00 / 1,000 property results
Rating
0.0
(0)
Developer
Abot API
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
Zoopla UK Property Scraper
Pull UK property data from Zoopla at scale: properties for sale, properties to rent, and Land Registry sold prices. Search by place name with the same filters the site itself offers, or paste Zoopla links you already have.
Turn on Fetch full listing details and every record also carries what only a listing's own page shows: EPC rating and EPC graph images, floor plan images, tenure, council tax band, service charge, ground rent, UPRN, price history, nearest stations with distances, EV charge points, virtual tours, brochures and the agent's phone number.
What you get
| Three channels | For sale, To rent, Sold prices (Land Registry records with UPRN, sold price and sold date) |
| Two modes | Search by place with filters, or paste Zoopla links |
| Filters | Price range, bedrooms, bathrooms, property type, radius, added-to-site window, keyword, sort order, chain free, auction, shared ownership, retirement, reduced price, include under offer, include let agreed, furnishing, rent shown per week or month, pets allowed, bills included, sold-within window |
| Up to 80+ fields | Listing level plus the full detail set |
| Recurring monitoring | Incremental mode returns only what changed since your last run |
| Resume | Continue an interrupted crawl without paying for rows you already have |
| Exports | Send results straight into Notion, Linear, Airtable or Apify via MCP connectors |
Quick start
Search by place
{"mode": "search","locations": ["London", "Manchester"],"channels": ["for-sale"],"minPrice": 200000,"maxPrice": 500000,"minBeds": 2,"propertySubTypes": ["flats"],"includeDetails": true,"maxItems": 50}
Places can be a city (Manchester), a postcode area (SW19), or a district written the way you
would say it (Islington, London).
Paste links
{"mode": "url","startUrls": ["https://www.zoopla.co.uk/for-sale/property/london/islington/","https://www.zoopla.co.uk/house-prices/london/islington/","https://www.zoopla.co.uk/for-sale/details/73365838/"],"includeDetails": true}
A results page returns its listings, a house-prices page returns sold records, and a single listing link returns that one property with full detail. A page number in a pasted address is used as the starting page.
Sold prices
{"mode": "search","locations": ["Islington, London"],"channels": ["sold"],"soldPeriodMonths": "12","maxItems": 100}
Input reference
Mode
| Field | Description |
|---|---|
mode | search to look places up by name, or url to scrape links you paste. |
Search mode (only read when mode is search)
| Field | Description |
|---|---|
locations | One or more UK places. Each is searched on every channel you pick. |
channels | Any of for-sale, to-rent, sold. |
minPrice / maxPrice | Price bounds in GBP. For rentals these are read together with priceFrequency. |
minBeds / maxBeds / minBaths | Room count bounds. |
propertySubTypes | Detached, semi-detached, terraced, flats, bungalows, farms and land, park homes, offices, retail, hospitality, industrial. On the sold channel Zoopla accepts one type, so the first is used. |
radius | Widen the search around the place, from This area only up to 40 miles. |
addedSince | Last 24 hours, 3 days, 7 days or 14 days. |
keywords | Free-text keyword, for example garden. |
sortBy | Recommended, newest, highest price, lowest price, most reduced. |
chainFreeOnly, auctionOnly, sharedOwnershipOnly, retirementOnly, reducedPriceOnly, includeUnderOffer | For-sale switches. |
includeLetAgreed, furnishedState, priceFrequency, petsAllowed, billsIncluded | To-rent switches. |
soldPeriodMonths | How far back to look on the sold channel. |
Filters are applied by Zoopla itself as part of the search, so the result counts you get back match what the site shows for the same search.
URL mode (only read when mode is url)
| Field | Description |
|---|---|
startUrls | Zoopla results pages, house-prices pages, listing pages, or bare listing ids. |
Filters from the search section are not applied in URL mode: whatever filters your pasted address already carries are used exactly as pasted.
Output and limits (read in both modes)
| Field | Description |
|---|---|
includeDetails | Add the full detail set to every record. Billed as a per-listing surcharge. No effect on the sold channel, which publishes no per-property detail. |
maxItems | Cap on records for the whole run. 0 means unlimited. |
maxPages | Cap on result pages per place and channel. Empty or 0 covers every result page Zoopla offers, which is at most 40 per search. |
Resume and recurring updates
| Field | Description |
|---|---|
resumeFromRunId | Continue one interrupted run without returning or paying for rows it already collected. |
incrementalMode | For scheduled runs. Later runs return only NEW, UPDATED and REAPPEARED records. |
stateKey | Name a monitoring campaign, or deliberately share state between runs. |
emitUnchanged / emitExpired | Off by default. Each returns, and bills, extra rows. |
Output
One flat record per property. Listing-level fields are always present; the rest arrive when
includeDetails is on.
{"listingId": "10000001","listingType": "sale","channel": "for-sale","url": "https://www.zoopla.co.uk/for-sale/details/10000001/","title": "2 bed terraced house for sale","address": "Example Court, Sample Way, London N1","price": 600000,"priceLabel": "£600,000","currency": "GBP","bedrooms": 2,"bathrooms": 2,"receptionRooms": 1,"propertyType": "terraced","sizeSqft": 875,"tenure": "share_of_freehold","epcRating": "C","epcImages": ["https://lid.zoocdn.com/1024/768/example-epc.png"],"floorPlanImages": ["https://lid.zoocdn.com/1024/768/example-floorplan.jpg"],"councilTaxBand": "E","serviceCharge": "£2,836 per year","chainFree": true,"uprn": "0000000000","postcode": "N1 1AA","latitude": 51.57,"longitude": -0.12,"nearestStations": [{ "name": "Example Park", "miles": 0.3 }],"features": ["Two double bedrooms", "Parking", "Vaulted ceilings"],"priceHistory": [],"images": ["https://lid.zoocdn.com/1024/768/example-photo.png"],"branchName": "Example Estates","branchPhone": "01000 000000","branchUrl": "https://www.zoopla.co.uk/find-agents/branch/example-estates-1/","publishedOn": "2026-09-04T10:01:22","detailScraped": true,"scrapedAt": "2026-09-04T11:00:00Z"}
The sample above uses invented values. Real runs return the real agent, address and contact details published on the listing.
Sold records use the same table with a different set filled in: uprn, address, postcode,
latitude, longitude, lastSoldPrice, lastSoldDate, bedrooms, bathrooms,
receptionRooms, propertyType, tenure, floorAreaSqM.
Field groups
- Identity
listingId,uprn,url,listingType,channel,listingStatus,listingCondition - Price
price,priceLabel,priceQualifier,currency,priceDrop,rentFrequencyLabel,priceHistory,lastSoldPrice,lastSoldDate - Property
title,address,displayAddress,summaryDescription,description,bedrooms,bathrooms,receptionRooms,propertyType,propertySubType,sizeSqft,floorAreaSqM,tenure,features,highlights,tags,smartTags,buyerIncentives - Compliance and costs
epcRating,hasEpc,epcImages,hasFloorplan,floorPlanImages,councilTaxBand,serviceCharge,groundRent,commonholdDetails,materialInformation,additionalInformation,broadband,parkingInfo,accessibility - Status flags
chainFree,underOffer,isRetirementHome,isSharedOwnership,furnishedState,availableFrom,statusFlag,isPremium - Location
postcode,outcode,incode,postTownName,countyAreaName,regionName,countryCode,latitude,longitude,nearestStations,evChargingStations - Media
imageUrl,images,imageCount,floorPlanCount,videoCount,virtualTours,brochures - Agent
branchName,branchId,branchPhone,branchLettingsPhone,branchCommercialPhone,branchLogoUrl,branchUrl,isDeveloper,contactUrl - Run metadata
publishedOn,searchMode,sourceUrl,detailScraped,scrapedAt - Incremental mode only
changeType,changedFields,firstSeenAt,lastSeenAt
Recurring monitoring
Set incrementalMode to true and schedule the run. The first run returns everything as NEW.
Every later run returns only what actually changed:
changeType | Meaning |
|---|---|
NEW | Seen for the first time on this search. |
UPDATED | Something real changed. changedFields names exactly what. |
REAPPEARED | Came back after disappearing. |
UNCHANGED | Returned only if you switch emitUnchanged on. |
EXPIRED | Returned only if you switch emitExpired on, and only after a run that scanned the whole tracked search. |
Advertising placement and relative-age badges ("Just added", "Reduced today") are deliberately kept out of change detection, so a listing is never reported as updated just because a week went by.
State is kept separately for each combination of places, channels, filters and detail setting, so
two different searches never mix. Use stateKey to name a campaign or to deliberately share state.
Send results into your apps (MCP connectors)
Results can be pushed straight into the tools you already use, without any glue code.
- Authorize a connector under Apify, Settings, API & Integrations.
- Select it in
mcpConnectors. - For Notion, also set
notionParentPageUrlto the page new item pages should be created under. - Use
maxNotifyListingsto cap how many items are written per connector per run. It does not affect the dataset.
Supported: Notion, Linear, Airtable and Apify. Leave mcpConnectors empty to skip this entirely;
it never changes the dataset output.
Pricing
You are charged for what the run produces:
- Property result for each record returned.
- Full listing detail once per property, only when
includeDetailsis on and the listing page was actually read. A listing that could not be read is returned at listing level and is not charged the surcharge. - Actor start once per run.
Turning includeDetails off gives a fast, cheap listing-level pull with no surcharge at all.
Notes and limits
- Zoopla serves at most 40 result pages per search, about 1000 records. To go deeper, split the search: narrow by price band, bedroom count, property type, or search smaller places.
- Premium listings are pinned to the top of the first page whatever sort order you pick. This is Zoopla's own behaviour, not the actor's.
- Sold price records come from the house-prices section and have no listing page, so
includeDetailsdoes nothing for them. - A run that cannot read any pages fails loudly with a connection message instead of quietly returning an empty dataset.
- Only public information published on Zoopla is collected. Use it in line with Zoopla's terms and applicable law, including UK GDPR where records include an agent's contact details.