ZOOPLA | Buy | Rent | Sell | House Price | Agent | UPRN Scraper avatar

ZOOPLA | Buy | Rent | Sell | House Price | Agent | UPRN Scraper

Pricing

$25.00/month + usage

Go to Apify Store
ZOOPLA | Buy | Rent | Sell | House Price | Agent | UPRN Scraper

ZOOPLA | Buy | Rent | Sell | House Price | Agent | UPRN Scraper

Scrape Zoopla buy, rent, new homes, sold house prices, and estate agents. Search by town or postcode — no URL required. Full listing rows with UPRN price history, branch phone and address, optional agent emails, and an instant UK agent database when you skip the live crawl.

Pricing

$25.00/month + usage

Rating

5.0

(5)

Developer

Muhamed Didovic

Muhamed Didovic

Maintained by Community

Actor stats

2

Bookmarked

81

Total users

2

Monthly active users

2 days ago

Last modified

Share

Turn Zoopla.co.uk into structured UK property and agent rows. Type a town or postcode — no Zoopla URL required — or paste a search, listing, house-prices, or find-agents page.

You get listing details, UPRN-backed price history, estate-agent contacts, optional emails, and an instant UK agent database when you do not want a live crawl.

Why Use This Scraper?

  • Search by town, city, region, or postcode — London, NW3, Oxfordshire — without building a Zoopla URL
  • One actor for for-sale, to-rent, new homes, sold house prices, and estate agents
  • Full listing rows: price, beds, baths, tenure, EPC, floorplans, branch phone, UPRN
  • Optional full price history via UPRN
  • Optional agent emails (contactEmail + contactWebsite)
  • Instant agent database: pre-collected UK branches (phone, address, brand) with no proxy

Overview

Built for investors, agencies, lead-gen teams, and analysts who need Zoopla data as dataset rows — JSON or CSV.

Output shape follows the start type:

  • For sale / to rent / new homes / listing URLs → one row per property (GraphQL listing payload)
  • Sold / house-prices → one row per UPRN property on that page
  • Find-agents / searchType: agents → one row per branch
  • Instant agent database → one row per stored branch; no live Zoopla request

startUrls and locationQueries can be mixed in the same run. Location filters (beds, price, radius) apply only to location queries, not to pasted URLs.

Supported Inputs

Location queries (no URL)

FieldExampleResult
Town / cityLondon/for-sale/property/london/ (or rent / new-homes / sold / agents)
RegionYorkshire and the Humberhyphenated Zoopla slug
PostcodeNW3 or SW1A 1AAoutward or full postcode slug

Set searchType to for-sale (default), to-rent, new-homes, sold, or agents.

URL types

URL typePatternExample
Sale search/for-sale/property/{location}/https://www.zoopla.co.uk/for-sale/property/oxfordshire/?q=Oxfordshire
Rent search/to-rent/property/{location}/https://www.zoopla.co.uk/to-rent/property/manchester/
New homes/new-homes/property/{location}/https://www.zoopla.co.uk/new-homes/property/birmingham/
Listing detail/for-sale/details/{id}/https://www.zoopla.co.uk/for-sale/details/69477553/
House prices/house-prices/{location}/https://www.zoopla.co.uk/house-prices/north-east-england/
Agents/find-agents/{location}/https://www.zoopla.co.uk/find-agents/oxfordshire/
{
"locationQueries": ["London", "NW3"],
"searchType": "for-sale",
"minBeds": 2,
"maxPrice": 750000,
"maxItems": 50
}

Copy-pasteable startUrls

{
"startUrls": [
{ "url": "https://www.zoopla.co.uk/for-sale/property/oxfordshire/?q=Oxfordshire&search_source=for-sale" },
{ "url": "https://www.zoopla.co.uk/to-rent/property/manchester/" },
{ "url": "https://www.zoopla.co.uk/for-sale/details/69477553/" },
{ "url": "https://www.zoopla.co.uk/find-agents/oxfordshire/" },
{ "url": "https://www.zoopla.co.uk/house-prices/north-east-england/" }
]
}

Not supported

  • Commercial Zoopla pages (/for-sale/commercial/…) as a dedicated mode
  • Logged-in / My Zoopla pages
  • Automated Zoopla valuations by address (no estimates endpoint)
  • Hosts other than zoopla.co.uk

Use Cases

AudienceWhat they pull
Lead-gen / agenciesBranch phone, address, optional email; or the instant agent database
InvestorsFor-sale stock plus UPRN price history
LettingsTo-rent listings with furnished state and branch contacts
Comp analystsHouse-prices / sold rows by area
Data teamsMixed sale + rent + agent runs into one dataset

How It Works

How the Zoopla Scraper works

  1. Resolve starts. Location queries become Zoopla search URLs. Pasted URLs are kept. Placeholder crawlee.dev / example.com URLs are dropped.
  2. Route. Sale/rent/new-homes go through Zoopla's mobile search API, then listing details. House-prices and find-agents use those page types.
  3. Enrich (optional). includeWholePriceHistory loads UPRN history. enrichEmails looks up a public agent email.
  4. Cap. maxItems is claimed before each dataset push so you are not billed past the limit.
  5. Instant DB shortcut. instantDatabase (or a dbBranchName filter) serves stored UK branches and exits — no crawl.

Location slugs follow Zoopla's own pattern: lowercase, hyphenated, &and. Yorkshire and the Humber becomes yorkshire-and-the-humber. A full postcode such as SW1A 1AA becomes sw1a-1aa. If Zoopla's autocomplete would pick a more specific area than the slug, paste the URL from the site instead.

Input Configuration

FieldTypeDefaultDescription
locationQueriesstring[]Town, city, region, or postcode. One per line.
searchTypeenumfor-salefor-sale, to-rent, new-homes, sold, agents. Ignored for pasted URLs.
minBeds / maxBedsintegerBedroom range for location listing searches.
minPrice / maxPriceintegerGBP asking price or monthly rent for location listing searches.
radiusMilesintegerMiles around the location. Listing searches only.
startUrlsarrayZoopla URLs. Optional if locationQueries is set.
includeWholePriceHistorybooleantrueFetch UPRN price history on listings that have a UPRN.
enrichEmailsbooleanfalseBest-effort public agent email + website.
instantDatabasebooleanfalseServe stored agent branches and exit.
dbBranchNamestringInstant-DB: name contains (e.g. Foxtons).
dbHasPhone / dbHasEmailbooleanfalseInstant-DB: keep only rows with phone / email.
maxItemsinteger100Max rows pushed. Always set this.
maxConcurrencyinteger10Parallel pages.
minConcurrencyinteger1Floor for parallel pages.
maxRequestRetriesinteger100Retries per failed request.
proxyobjectResidentialNot used in instant-DB mode.

Either locationQueries or Zoopla startUrls is required, unless you are in instant-database mode.

Example — town search, no URL

{
"locationQueries": ["Manchester"],
"searchType": "to-rent",
"minBeds": 1,
"maxPrice": 1500,
"maxItems": 50
}
{
"startUrls": [
{ "url": "https://www.zoopla.co.uk/for-sale/property/london/?q=London" }
],
"enrichEmails": true,
"includeWholePriceHistory": true,
"maxItems": 25
}

Example — instant agent database

{
"instantDatabase": true,
"dbHasPhone": true,
"dbBranchName": "Savills",
"maxItems": 200
}

Output Overview

Listing runs push Zoopla's listing-detail object: identifiers, pricing, room counts, branch, location (including uprn when Zoopla has it), NTS (tenure, council tax), media, and optional propertyHistory / contactEmail.

Agent and instant-DB runs push branch-shaped rows. Sold runs push the house-prices property object plus the search-card basicInfo.

Output Samples

Sale listing (trimmed; start: location query / for-sale URL):

{
"listingId": "69488533",
"title": "5 bed detached house for sale",
"publicationStatus": "Live",
"pricing": {
"qualifier": "guide_price",
"internalValue": 705000,
"valueLabel": "£705,000",
"currencyCode": "GBP"
},
"counts": { "numBedrooms": 5, "numBathrooms": 3, "numLivingRooms": 2 },
"branch": {
"branchId": "106691",
"name": "Savills - Summertown New Homes",
"phone": "01865 680232",
"address": "256 Banbury Road, Oxford",
"postcode": "OX2 7DE"
},
"analyticsTaxonomy": {
"displayAddress": "The Fairfax, Heyford Fields, Heyford Park, Upper Heyford, Bicester OX25",
"outcode": "OX25",
"propertyType": "detached",
"tenure": "freehold"
},
"location": { "uprn": "100061180044" },
"contactEmail": "oxford@example.com",
"contactWebsite": "https://www.savills.co.uk"
}

contactEmail / contactWebsite appear only when enrichEmails is on and a public address is found.

Instant-DB branch (start: instantDatabase):

{
"branch_id": "106691",
"branch_name": "Savills - Summertown New Homes",
"phone": "01865 680232",
"email": null,
"website": null,
"address": "256 Banbury Road, Oxford",
"postcode": "OX2 7DE",
"member_type": "agent"
}

Key Output Fields

Listing

  • listingId, title, publicationStatus, detailedDescription
  • pricing.internalValue, pricing.valueLabel, pricing.qualifier
  • counts.numBedrooms, counts.numBathrooms, counts.numLivingRooms

Location and identity

  • analyticsTaxonomy.displayAddress, outcode, incode, postTownName
  • location.uprn — used for price history when present

Agent on a listing

  • branch.name, branch.phone, branch.address, branch.postcode, branch.branchId
  • contactEmail, contactWebsite, emailEnrichment — only with enrichEmails

Compliance / media

  • ntsInfo (tenure, council tax band), derivedEPC, listingUris.detail
  • Floorplans / images live on the listing payload when Zoopla sends them

Instant DB

  • branch_id, branch_name, phone, email, website, address, postcode

FAQ

Do I need a Zoopla URL?

No. Set locationQueries to a town or postcode and pick searchType. Paste URLs only when you already have a filtered Zoopla link.

Can I mix locations and URLs?

Yes. Real Zoopla startUrls run first, then each location query.

What does searchType: sold return?

House-prices pages, then a detail row per UPRN. Not the same shape as a live for-sale listing.

Are emails always filled?

No. Zoopla does not publish agent emails on the listing. Enrichment discovers a public site from the branch name and scrapes it. Many branches have no public email.

What is the instant agent database?

A stored set of UK Zoopla branches harvested from previous runs. Toggle instantDatabase (or set dbBranchName) to read it without hitting Zoopla. Coverage grows over time; it is not a live directory dump of every UK branch.

Does price history always come back?

Only when the listing has a uprn and includeWholePriceHistory is true. New builds often have no UPRN yet.

Can I mix sale and rent in one run?

Yes — paste both URL types, or run two location queries in two runs with different searchType. One searchType applies to all location queries in that run.

Private or paid Zoopla content?

No. Public pages only. No My Zoopla, saved searches, or login-gated tools.

How do I stop a huge London run?

Set maxItems. Detail requests already queued are not pushed once the cap is hit.

Support

Found a bug or want a field added? Open an issue on the Issues tab or email muhamed.didovic@gmail.com.

Website: https://muhamed-didovic.github.io/

Additional Services

Custom export shape, a one-off UK dataset, or a scheduled monitor: muhamed.didovic@gmail.com. Same address for API access billed on usage only.

Explore More Scrapers

🤖 For AI Agents & LLM Apps

Compact reference for AI agents calling this actor via the Apify MCP server or the Apify API (actor: memo23/zoopla-scraper).

Purpose: Scrapes Zoopla.co.uk sale, rent, new-home, sold-price, and estate-agent pages into one dataset row per listing or branch. Accepts town/postcode queries or Zoopla URLs. Optional UPRN price history, agent emails, and an instant stored agent database.

Minimal input:

{
"locationQueries": ["London"],
"searchType": "for-sale",
"maxItems": 25
}

Output: one row per listing or branch — listingId, title, pricing {internalValue, valueLabel, currencyCode}, counts {numBedrooms, numBathrooms}, branch {name, phone, address, postcode}, location.uprn, analyticsTaxonomy.displayAddress, optional contactEmail, contactWebsite. Instant-DB rows use branch_id, branch_name, phone, email, address.

Behaviors an agent should know:

  • Always set maxItems. Default is 100; a city-wide uncapped search can be tens of thousands of rows.
  • locationQueries + searchType build Zoopla URLs. startUrls are used as-is and can be mixed with location queries.
  • instantDatabase: true (or a non-empty dbBranchName) skips the crawl and returns stored agent branches.
  • enrichEmails is best-effort and often empty. includeWholePriceHistory needs a UPRN.
  • Billing: rental $25/mo until 2026-09-29, then PPE — $0.005 start + $0.002 per dataset row. Instant-DB rows are still dataset items. A contact-email add-on is wired in code; it bills only after that event is priced on the actor.
  • Public Zoopla pages only. No commercial-mode input, no address-to-valuation endpoint.

⚠️ Disclaimer

This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Zoopla Limited, ZPG Limited, or any of their subsidiaries. All trademarks mentioned are the property of their respective owners.

The scraper accesses only publicly available Zoopla.co.uk pages — no authenticated endpoints, paid features, or content behind the Zoopla login wall. Users are responsible for ensuring their use complies with zoopla.co.uk's Terms of Service, applicable data-protection law (GDPR, CCPA, etc.), and any contractual obligations of their own organisation.

SEO Keywords

Zoopla scraper, scrape Zoopla, Zoopla API, zoopla.co.uk scraper, Apify Zoopla, Zoopla property scraper, Zoopla sold prices, Zoopla house prices scraper, Zoopla estate agent scraper, UK property listings scraper, UPRN property data, estate agent emails UK, UK sold house prices, Rightmove alternative scraper, UK real estate lead gen, Zoopla to-rent scraper, Zoopla for-sale scraper, UK property market data