Zoopla Scraper - Property Listings, Sold Prices & Monitoring avatar

Zoopla Scraper - Property Listings, Sold Prices & Monitoring

Pricing

from $1.00 / 1,000 property results

Go to Apify Store
Zoopla Scraper - Property Listings, Sold Prices & Monitoring

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

Abot API

Maintained by Community

Actor 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 channelsFor sale, To rent, Sold prices (Land Registry records with UPRN, sold price and sold date)
Two modesSearch by place with filters, or paste Zoopla links
FiltersPrice 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+ fieldsListing level plus the full detail set
Recurring monitoringIncremental mode returns only what changed since your last run
ResumeContinue an interrupted crawl without paying for rows you already have
ExportsSend 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).

{
"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

FieldDescription
modesearch to look places up by name, or url to scrape links you paste.

Search mode (only read when mode is search)

FieldDescription
locationsOne or more UK places. Each is searched on every channel you pick.
channelsAny of for-sale, to-rent, sold.
minPrice / maxPricePrice bounds in GBP. For rentals these are read together with priceFrequency.
minBeds / maxBeds / minBathsRoom count bounds.
propertySubTypesDetached, 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.
radiusWiden the search around the place, from This area only up to 40 miles.
addedSinceLast 24 hours, 3 days, 7 days or 14 days.
keywordsFree-text keyword, for example garden.
sortByRecommended, newest, highest price, lowest price, most reduced.
chainFreeOnly, auctionOnly, sharedOwnershipOnly, retirementOnly, reducedPriceOnly, includeUnderOfferFor-sale switches.
includeLetAgreed, furnishedState, priceFrequency, petsAllowed, billsIncludedTo-rent switches.
soldPeriodMonthsHow 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)

FieldDescription
startUrlsZoopla 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)

FieldDescription
includeDetailsAdd 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.
maxItemsCap on records for the whole run. 0 means unlimited.
maxPagesCap 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

FieldDescription
resumeFromRunIdContinue one interrupted run without returning or paying for rows it already collected.
incrementalModeFor scheduled runs. Later runs return only NEW, UPDATED and REAPPEARED records.
stateKeyName a monitoring campaign, or deliberately share state between runs.
emitUnchanged / emitExpiredOff 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:

changeTypeMeaning
NEWSeen for the first time on this search.
UPDATEDSomething real changed. changedFields names exactly what.
REAPPEAREDCame back after disappearing.
UNCHANGEDReturned only if you switch emitUnchanged on.
EXPIREDReturned 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.

  1. Authorize a connector under Apify, Settings, API & Integrations.
  2. Select it in mcpConnectors.
  3. For Notion, also set notionParentPageUrl to the page new item pages should be created under.
  4. Use maxNotifyListings to 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 includeDetails is 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 includeDetails does 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.