Zoopla Uk Property Scraper with Contacts & Features avatar

Zoopla Uk Property Scraper with Contacts & Features

Pricing

from $0.70 / 1,000 property listings

Go to Apify Store
Zoopla Uk Property Scraper with Contacts & Features

Zoopla Uk Property Scraper with Contacts & Features

Extract structured Zoopla UK sale and rental listings with asking prices, full descriptions, property specs, photos, floor plans, coordinates, agency details and public phone numbers. Built for market research, comps, inventory monitoring, CRM enrichment, BI and AI workflows.

Pricing

from $0.70 / 1,000 property listings

Rating

0.0

(0)

Developer

Fatih Tahta

Fatih Tahta

Maintained by Community

Actor stats

1

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

Zoopla UK Property Scraper

Slug: fatihtahta/zoopla-uk-property-scraper

Overview

Zoopla UK Property Scraper collects public UK sale and rental listings with structured identity, location, asking-price, property, availability, media and advertiser fields. Zoopla is a major UK property portal whose public listings are useful for property discovery, asking-price research, inventory monitoring and market segmentation. The actor supports location-driven searches, direct individual Zoopla listing URLs and a documented set of sale, rental and shared property filters. Optional enrichment can add richer listing details and additional public contact information when available. Runs are repeatable, configurable and suitable for scheduled monitoring as well as one-time research. Results are delivered as structured dataset records for review, export, ETL pipelines, BI dashboards, AI-agent workflows and downstream processing. The actor is designed for dependable recurring acquisition of publicly visible listing data while keeping source availability, optional-field variability and point-in-time status clear.

What Makes This Actor Different

  • Pipeline-ready property records: every row uses a documented property_listing envelope with stable identity and nested source_context, entity, location, pricing, property, listing, media, contact_details, relationships and attributes groups.
  • Buy and rent modes with mode-specific filters: choose one listing mode, then apply common filters plus supported sale-only or rental-only criteria without mixing incompatible controls.
  • Direct listing collection: provide one or more individual Zoopla property-detail URLs when you already know exactly which listings to collect.
  • Optional detail and contact enrichment: request richer descriptions, specifications, material information, media and advertiser context, plus an additional public phone number when Zoopla makes one available.
  • Coverage-aware collection: maximize_coverage can collect deeper within the same selected criteria when a broad search reports more matches than are normally visible at once. It does not relax the selected location or filters.
  • Operational run receipts: RUN-SUMMARY, RUN-SUMMARY.html and results-map provide saved counts, completion state, coverage status, enrichment outcomes, coordinate coverage, warnings and map readiness outside the listing dataset.
  • Map-ready review: coordinate-capable listings are placed on an interactive map, while invalid or missing coordinates are counted rather than silently represented as valid points.
  • Agent-friendly handoff: optional user-authorized MCP connectors receive a concise run summary and available Apify output links after the dataset and run artifacts are ready; the full listing dataset remains the primary output.

Who Should Use This Actor

  • Real estate investors and analysts: assemble scoped public listing sets for asking-price comparisons, property-mix analysis and analyst review without treating listing prices as valuations.
  • Brokerages and agency operations teams: monitor public inventory, location segments, listing status, advertiser visibility and contact-ready records for internal workflows.
  • Market research and analytics teams: create repeatable snapshots by geography, property type, price band, publication window or keyword for dashboards and reporting.
  • Proptech and data engineering teams: ingest schema-aware property records into warehouses, CRMs, search indexes, applications and enrichment pipelines.
  • AI agents and workflow automations: generate a valid scoped input, collect records, inspect the run receipt and route normalized listings to research or review steps.
  • Lead enrichment teams: add current public listing, agency and phone attributes to existing records when the relevant fields are publicly available.
  • Monitoring and operations teams: schedule recurring runs and compare stable listing identifiers, asking prices, statuses and selected property attributes over time.

Common Use Cases

  • Market intelligence: monitor public sale or rental supply, asking prices, property types, locations, listing statuses and advertiser mix.
  • Comparable-listing research: collect listings for a specific geography, price band, bedroom range, property type or keyword.
  • New-listing monitoring: use a publication window and repeatable input to review recently added public inventory.
  • Price and status change detection: compare repeated exports by record_id, then inspect asking-price, status and history fields that are available in both runs.
  • CRM and catalog enrichment: attach public listing, property, agency, media and contact attributes to internal records.
  • Geographic review: use coordinates and the interactive map to inspect the distribution of saved listings.
  • Recurring reporting: schedule the same search for dashboard refreshes, inventory snapshots, alerts and operational reports.
  • Agentic property research: let an internal agent define a supported segment, collect it, verify the run summary and hand records to analysis or human review.

Real-World Questions This Data Can Answer

  • Which public Zoopla listings match a UK location, buy or rent mode, price band, property type, bedroom range or keyword?
  • What asking prices and rental frequencies are displayed for the selected segment at run time?
  • Which saved listings are marked available, chain free, shared ownership, retirement, auction-related or otherwise status-qualified when those fields are published?
  • Which property types, bedroom counts, regions and agencies are most visible in this scoped result set?
  • Which records contain richer descriptions, floor plans, EPC information, material information or public contact phones?
  • Which listings have usable coordinates for geographic review and mapping?
  • Which listings appear new, repriced or status-changed when this run is compared with an earlier internal snapshot?
  • Did the run reach its requested limit, use deeper matching coverage or finish with skipped or partial outcomes?

Quick Start

  1. Choose deal_type as buy or rent.
  2. Enter one focused UK location, or provide individual Zoopla listing-detail URLs in url.
  3. Add only the filters relevant to the selected listing mode and start with a small limit, such as 10 or 25.
  4. Run the actor in Apify Console and inspect the first dataset records.
  5. Review RUN-SUMMARY and results-map, then increase the limit, enable enrichment or schedule the input once the output fits your workflow.

Input Parameters

Inputs define one sale or rental collection scope, optional enrichment, a maximum output count and optional post-run summary delivery.

ParameterTypeDescriptionDefault
deal_typesingle selectListing mode: buy or rent. Determines which mode-specific filters are valid.buy
locationstringUK city, postcode, neighborhood, county or market, such as South London, Birmingham or SW1A.
urlstring arrayIndividual Zoopla /for-sale/details/.../, /to-rent/details/.../ or /new-homes/details/.../ URLs. Search-result URLs are not accepted.Empty
radiussingle selectDistance around the selected location in miles: 0, 0.25, 0.5, 1, 3, 5, 10, 15, 20, 30 or 40. 0 means the selected area only.
min_bedroomsingle selectMinimum bedrooms from 0 through 10; 0 includes studios.
max_bedroomsingle selectMaximum bedrooms from 0 through 10; 0 means studios only.
min_bathroomsingle selectMinimum bathrooms from 1 through 10.
max_bathroomsingle selectMaximum bathrooms from 1 through 10.
min_priceintegerMinimum asking price in GBP. Rent searches use Zoopla's monthly rent scale.
max_priceintegerMaximum asking price in GBP. Rent searches use Zoopla's monthly rent scale.
property_typestring arrayAny of semi-detached, detached, terraced, bungalow, park-home, flats or farms-land.Empty
retirement_homesingle selectinclude, exclude or only retirement-home listings.
featuresstring arrayAny supported feature: period-property, cottage, modern, ev-charging, utility-room, basement, conservatory, home-office, en-suite, bathtub, patio, kitchen-island or needs-modernisation.Empty
publication_datesingle selectListings added within 24-hours, 3-days, 7-days, 14-days or 30-days.
keywordstringFree-text listing keyword, such as balcony, parking or air conditioning.
rental_house_sharesingle selectFor rent mode: include, exclude or only shared accommodation.
rental_student_accommodationsingle selectFor rent mode: include, exclude or only student accommodation.
rental_availabilitysingle selectFor rent mode: now, one-month, three-months, six-months or twelve-months.
furnishmentsingle selectFor rent mode: furnished, part-furnished or unfurnished.
include_let_agreedbooleanInclude rental listings marked let or let agreed.false
sale_new_build_homesingle selectFor buy mode: include, exclude or only new-build homes.
sale_shared_ownershipsingle selectFor buy mode: include, exclude or only shared-ownership listings.
sale_owner_typestring arrayFor buy mode: any of leasehold, freehold or share-of-freehold.Empty
sale_property_statusstring arrayFor buy mode: any of chain-free, reduced-price or under-offer-or-sold-stc.Empty
sale_low_deposit_mortgagebooleanRequire a supported low-deposit mortgage incentive on buy listings.false
enrich_databooleanAdd richer public listing details to query-driven results. Individual url inputs always read their detail pages.true
get_contactbooleanAdd an additional public agent or agency phone number when available. This works independently of enrich_data.false
maximize_coveragebooleanFor requested limits of at least 1,100, collect deeper within the same selected criteria when the source reports more matching listings than are normally visible.false
limitintegerMaximum number of listing records to save; minimum 1. Leave empty to continue through the available selected scope.
mcpConnectorsMCP connector arrayUser-authorized Apify connectors that can receive a concise post-run summary and available dataset, report and map links. Full listing rows are not sent.Empty

Choosing Inputs

Use location when you want a readable, reusable search built from the documented fields. Keep one main geography per run when city, neighborhood or postcode comparisons need clean segmentation. Use url when you already know the individual listings to collect. Each URL is fetched directly as one property and does not create or modify a search.

Choose buy or rent before adding filters. Price values represent sale asking prices in buy mode and Zoopla's monthly rent scale in rent mode. Bedrooms, bathrooms, radius, property type, publication date, keyword, retirement status and features can narrow either mode; rental and sale controls apply only to their matching mode. Narrower criteria produce more targeted datasets, while fewer filters support broader discovery.

Start with a small limit and inspect a few records before increasing collection size. Use enrich_data when descriptions, material information, specifications and expanded media matter; use get_contact when an additional public phone is useful. Keep maximize_coverage for broad, high-volume searches where deeper matching collection matters more than the shortest exploratory run. It preserves the selected criteria and respects limit, but it can increase run time.

Input Recipes

  • Validation run: choose one location and deal type, keep optional filters empty and set limit to 10. Inspect identity, pricing, location and property groups before scaling.
  • Targeted rental search: use rent, one location, a monthly price range, bedroom range, property type, availability and furnishing state. Enable contact collection only if phone data is needed.
  • Targeted sale segment: use buy, one location, sale price range, property type, tenure and a supported sale status such as chain free or reduced price.
  • Known listing set: paste individual Zoopla detail URLs into url to collect those properties directly without running a search.
  • Maximum matching coverage: use a broad location or high-volume segment, set a limit of at least 1,100 and enable maximize_coverage to collect deeper within the same criteria.
  • Recurring monitoring: save one validated input, run it on a schedule and compare record_id, asking price, listing status and available history fields between exports.

Example Inputs

Targeted sale listings in South London

{
"deal_type": "buy",
"location": "South London",
"min_price": 300000,
"max_price": 750000,
"property_type": ["flats", "terraced"],
"publication_date": "7-days",
"limit": 25
}

Enriched furnished rentals in Birmingham

{
"deal_type": "rent",
"location": "Birmingham",
"min_bedroom": "2",
"rental_availability": "three-months",
"furnishment": "furnished",
"enrich_data": true,
"get_contact": true,
"limit": 25
}

Individual Zoopla listing URLs

{
"url": [
"https://www.zoopla.co.uk/for-sale/details/70000001/",
"https://www.zoopla.co.uk/new-homes/details/70000002/"
],
"get_contact": false,
"limit": 2
}

Output

Output destination

The actor writes results to an Apify dataset as JSON records. The dataset is designed for direct consumption by analytics tools, ETL pipelines, AI agents, and downstream APIs with minimal post-processing.

The current public dataset contains one record family: property_listing. Run-level summaries, the HTML report and the interactive map are separate key-value-store artifacts rather than dataset rows.

Record envelope and stable identifiers

Every record requires record_type, record_id, url, source_context and entity. The recommended idempotency key is the composite source_context.source_id + record_id; for a Zoopla-only table, record_id is sufficient. Use this key for deduplication and upserts instead of result position, title or address. Stable identifiers make records easier to merge, sync and compare across repeated runs.

The canonical url opens the public listing. source_context.source_url identifies the search scope that produced the row when available, while page, position and enrichment fields provide collection context. location.uprn can support property-level joins when published, but it is optional and should not replace the listing-level idempotency key.

Example: enriched rental property listing

The following is a synthetic, sample-safe record using the current public structure and value types. Optional groups and fields vary by listing.

{
"record_type": "property_listing",
"record_id": "70000000",
"url": "https://www.zoopla.co.uk/to-rent/details/70000000/",
"source_context": {
"source_id": "zoopla_uk_property_scraper",
"source": "zoopla",
"source_domain": "zoopla.co.uk",
"source_url": "https://www.zoopla.co.uk/to-rent/property/birmingham/?q=Birmingham&search_source=to-rent",
"page_number": 1,
"position": 1,
"country": "United Kingdom",
"language": "en",
"enrichment_status": "enriched",
"enriched_fields": [
"entity.description",
"property.material_information",
"contact_details.phones"
],
"detail_enrichment_status": "enriched",
"contact_enrichment_status": "enriched"
},
"entity": {
"title": "2 bed flat to rent",
"description": "Sample description for a furnished two-bedroom apartment close to local transport."
},
"location": {
"address": "18 Example Road, Birmingham B15",
"city": "Birmingham",
"county": "West Midlands",
"region": "West Midlands",
"postal_code": "B15 1AA",
"outcode": "B15",
"country": "United Kingdom",
"latitude": 52.4691,
"longitude": -1.9322,
"is_approximate": true,
"neighborhood": "Edgbaston",
"nearby_transport": [
{
"name": "Birmingham Five Ways",
"type": "train",
"distance_miles": 0.7
}
]
},
"pricing": {
"price": 1250,
"price_text": "£1,250 pcm",
"currency": "GBP",
"price_frequency": "pcm",
"alternate_price": {
"price": 288,
"price_text": "£288 pw",
"frequency": "pw"
}
},
"property": {
"property_type": "flat",
"bedrooms": 2,
"bathrooms": 1,
"living_rooms": 1,
"floor_area": 780,
"area_unit": "sqft",
"epc_rating": "C",
"council_tax_band": "Band B",
"features": ["Furnished", "Close to transport"],
"material_information": [
{
"key": "deposit",
"title": "Deposit",
"value": "£1,440"
}
]
},
"listing": {
"deal_type": "rent",
"listing_type": "residential",
"listing_status": "available",
"posted_at": "2026-07-10T09:30:00",
"posted_at_label": "Listed on",
"available_from": "1st Aug 2026",
"available_from_label": "Available from",
"furnishment": "furnished",
"condition": "pre-owned",
"member_type": "agent",
"is_premium": false,
"is_retirement_home": false,
"is_shared_ownership": false,
"is_auction": false
},
"media": {
"main_image_url": "https://lid.zoocdn.com/sample-listing.jpg",
"image_urls": [
"https://lid.zoocdn.com/sample-listing.jpg"
],
"image_count": 12,
"floorplan_count": 1,
"floorplans": [
{
"url": "https://lc.zoocdn.com/sample-floorplan.jpg"
}
]
},
"contact_details": {
"phones": ["0121 000 0000"]
},
"relationships": {
"agency": {
"agency_id": "50000",
"name": "Example Property Partners",
"url": "https://www.zoopla.co.uk/find-agents/branch/example-property-partners-birmingham-50000/",
"is_developer": false
}
},
"attributes": {
"source_specific": {
"listing_revision_id": "sample-revision-id",
"smart_tags": ["Modern", "Home office"]
}
}
}

Run Summary, Map, And Artifacts

The default dataset remains the authoritative listing export. The actor also exposes these run-level outputs through the run's key-value-store links:

ArtifactPurpose
RUN-SUMMARYMachine-readable run receipt with input scope, saved and parsed counts, requested limit, stop reason, duplicate and skipped counts, coverage state, enrichment outcomes, price and property breakdowns, coordinate coverage, map counts, warnings and artifact names.
RUN-SUMMARY.htmlHuman-readable report presenting the main completion, enrichment, location, pricing and warning indicators.
results-mapInteractive clustered map for saved listings with valid coordinates, including mapped, skipped-coordinate and duplicate-marker counts.

Property teams can use these artifacts to review a run without opening every row. Data teams and AI agents can use them as run receipts for completion checks, recurring-run comparison, alert routing and retry decisions. When maximize_coverage is enabled, the summary indicates that state, reports deeper-coverage activity and records whether the requested limit or another stop condition ended the run.

Field Reference

Only record_type, record_id, url, source_context and entity are required at the top level. All other groups and nested fields are optional unless stated otherwise.

Record identity

  • record_type (string, required): record family; currently always property_listing.
  • record_id (string, required): stable Zoopla listing identifier.
  • url (string, required): canonical public Zoopla listing URL.

Source context

  • source_context (object, required): provenance, result position and enrichment context.
  • source_context.source_id (string, optional): stable source identifier used for lineage and composite idempotency.
  • source_context.source / source_context.source_domain (string, optional): normalized source label and public domain.
  • source_context.source_url (string, optional): public Zoopla source page that produced the row: a search-result page for query runs or the detail page for direct listing-URL runs.
  • source_context.page_number / source_context.position (integer, optional): observed result page and position; neither is a stable identity.
  • source_context.country / source_context.language (string, optional): source country and content language.
  • source_context.enrichment_status (string, optional): lightweight or enriched.
  • source_context.enriched_fields (string array, optional): field paths added or changed by enrichment.
  • source_context.detail_enrichment_status (string, optional): present as enriched when richer listing details added useful fields.
  • source_context.detail_enriched_fields (string array, optional): fields changed by detail enrichment.
  • source_context.contact_enrichment_status (string, optional): present as enriched when public contact collection adds a phone.
  • source_context.contact_enriched_fields (string array, optional): fields changed by contact enrichment.

Entity

  • entity (object, required): human-readable listing identity.
  • entity.title (string, optional): compact source-provided listing title.
  • entity.description (string, optional): public listing summary or richer description when available.

Location

  • location (object, optional): public address, geographic labels and coordinates.
  • location.address (string, optional): displayed address, which can be partial.
  • location.city / location.county / location.region (string, optional): normalized geographic labels.
  • location.postal_code / location.outcode (string, optional): public postcode and postcode district.
  • location.country (string, optional): normalized country label.
  • location.latitude / location.longitude (number, optional): coordinate pair used for mapping when valid.
  • location.is_approximate (boolean, optional): indicates that the public map point is approximate.
  • location.neighborhood (string, optional): local area label.
  • location.property_number_or_name / location.street_name (string, optional): separately published address components.
  • location.uprn (string, optional): published Unique Property Reference Number; availability varies.
  • location.nearby_transport (object array, optional): nearby public transport entries.
  • location.nearby_transport[].name / type (string, optional): transport point name and category.
  • location.nearby_transport[].distance_miles (number, optional): approximate distance in miles.

Pricing

  • pricing (object, optional): displayed asking-price or rent values.
  • pricing.price (number, optional): numeric asking price or rent.
  • pricing.price_text / pricing.short_price_text (string, optional): full and compact source display labels.
  • pricing.currency (string, optional): normalized currency code, typically GBP.
  • pricing.original_price (number, optional): earlier or original asking price when published.
  • pricing.price_per_area (number, optional): asking price per area unit; interpret with property.area_unit.
  • pricing.price_qualifier (string, optional): wording such as guide price or offers over.
  • pricing.price_frequency (string, optional): rental period such as pcm or pw.
  • pricing.alternate_price (object, optional): equivalent rent at another frequency.
  • pricing.alternate_price.price (number, optional): alternate numeric rent.
  • pricing.alternate_price.price_text / frequency (string, optional): alternate display label and frequency.
  • pricing.price_change (object, optional): compact source price-change summary.
  • pricing.price_change.first_price_date / last_price_change_date (string, optional): source-formatted price dates.
  • pricing.price_change.percentage_change_label (string, optional): source display value for percentage change.

Property

  • property (object, optional): physical, tenure and material property attributes.
  • property.property_type (string, optional): normalized residential property category.
  • property.bedrooms / property.bathrooms / property.living_rooms (number, optional): published room counts.
  • property.floor_area (number, optional): numeric floor area; always interpret with area_unit.
  • property.area_unit (string, optional): floor-area unit such as sqft or sq. ft.
  • property.floor_area_source (string, optional): source context for the floor-area value.
  • property.epc_rating (string, optional): published energy performance rating.
  • property.tenure (string, optional): ownership or tenure label, mainly for sale listings.
  • property.council_tax_band (string, optional): published council-tax band or availability label.
  • property.features (string array, optional): deduplicated public features, highlights and tags.
  • property.material_information (object array, optional): structured public topics such as deposit, utilities, parking or restrictions.
  • property.material_information[].key / title / value (string, optional): machine key, display label and published value.

Listing

  • listing (object, optional): mode, publication, availability, promotion and status values.
  • listing.deal_type (string, optional): normalized buy or rent mode.
  • listing.listing_type / listing.display_type (string, optional): source listing and display categories.
  • listing.featured_type / listing.result_group (string, optional): result presentation labels, not property-quality signals.
  • listing.listing_status (string, optional): point-in-time availability status such as available or under_offer.
  • listing.posted_at / listing.posted_at_label (string, optional): publication value and its source label.
  • listing.available_from / listing.available_from_label (string, optional): rental availability value and label.
  • listing.is_premium (boolean, optional): premium result-treatment flag, not a verification signal.
  • listing.condition / listing.furnishment / listing.member_type (string, optional): condition, furnishing and advertiser classification.
  • listing.chain_free (boolean, optional): source-provided chain-free sale signal.
  • listing.is_auction / listing.is_shared_ownership / listing.is_retirement_home (boolean, optional): source-provided listing flags.
  • listing.history (object array, optional): source price-history events added when available.
  • listing.history[].is_price_drop (boolean, optional): whether the event represents a price reduction.
  • listing.history[].changed_at (string, optional): source timestamp for the event.
  • listing.history[].price / price_text (number/string, optional): historical numeric and displayed asking price.

Media

  • media (object, optional): public listing images, plans, documents, brochures, videos and tours.
  • media.main_image_url (string, optional): primary public listing image URL.
  • media.image_urls (string array, optional): deduplicated gallery URLs in source order.
  • media.image_count / floorplan_count / video_count (number, optional): source-reported or normalized media counts.
  • media.floorplans / media.epc_documents / media.virtual_tours (object array, optional): media items containing a public url.
  • media.brochure_urls / media.video_urls (string array, optional): public brochure and video links.

Contact details and relationships

  • contact_details (object, optional): public agent or agency contact values.
  • contact_details.phones (string array, optional): deduplicated public phone numbers.
  • contact_details.phone_source (string, optional): source label for an additionally revealed public phone.
  • relationships (object, optional): public advertiser relationship.
  • relationships.agency (object, optional): agency or branch attached to the listing.
  • relationships.agency.agency_id / name (string, optional): public advertiser identifier and name.
  • relationships.agency.url / logo_url (string, optional): public agency profile and logo URLs.
  • relationships.agency.is_developer (boolean, optional): source-provided developer classification.

Source-specific attributes

  • attributes (object, optional): non-duplicate Zoopla-specific values for specialist workflows.
  • attributes.source_specific (object, optional): source-specific listing values that do not duplicate the canonical groups.
  • attributes.source_specific.listing_revision_id (string, optional): source revision identifier; not the primary listing ID.
  • attributes.source_specific.smart_tags (string array, optional): deduplicated Zoopla smart-tag labels.

Data Model Notes

  • Identity: use source_context.source_id + record_id for cross-source upserts, or record_id within a Zoopla-only table.
  • Provenance: use url to open the listing and source_context.source_url to audit the search scope when present.
  • Property value: entity, location, pricing, property, listing and media carry the main consumer-facing attributes.
  • Point-in-time values: asking prices, availability, descriptions, public contact details and listing statuses reflect what was visible at run time.
  • Nested groups: related values remain grouped to support JSON-first ETL, review and agent context without ambiguous flat column names.
  • Optionality: null-check or existence-check every non-required group and nested field; availability depends on the listing, mode and public source record.
  • Repeated runs: compare stable identifiers and selected business fields, while keeping Apify run metadata and input configuration alongside the export for auditability.

Data Quality, Guarantees, And Handling

  • Structured records: results are normalized into predictable JSON objects for downstream use.
  • Field preservation: meaningful schema-supported listing and property values are retained in stable public fields or grouped objects; optional source values can still be absent for a specific record.
  • Best-effort extraction: fields may vary by region, availability, account visibility, listing type, UI experiments or source-side changes.
  • Optional fields: null-check optional values in downstream code, models and dashboards.
  • Deduplication: use source_context.source_id + record_id, or record_id in a Zoopla-only dataset.
  • Freshness: results reflect publicly available information at run time.
  • Repeated runs: use the recommended idempotency key when syncing into warehouses, CRMs, search indexes, vector stores or monitoring systems.
  • Schema awareness: rely on documented fields and handle newly missing optional values gracefully.
  • Run receipts: use the summary and map artifacts to audit counts, coverage state, skipped outcomes, enrichment, map readiness and export readiness; they do not replace listing rows.

Tips For Best Results

  • Start with a small limit to validate the record shape before scaling up.
  • Use one city, postcode, neighborhood, property type or price segment per run for cleaner comparisons.
  • Leave optional filters empty when the goal is broad discovery.
  • Add filters gradually so their effect on the matching result set is easy to understand.
  • Use enrich_data only when richer fields justify the additional run time.
  • Keep maximize_coverage for high-volume searches where deeper matching retrieval matters and the limit is at least 1,100.
  • Use the stable idempotency key when retaining records across recurring runs.
  • Review RUN-SUMMARY and results-map before importing a changed or expanded configuration into a production workflow.

How to Run on Apify

  1. Open the Actor in Apify Console.
  2. Configure a location and supported search filters, or add individual listing-detail URLs.
  3. Set the maximum number of listings to save.
  4. Click Start and wait for the run to finish.
  5. Open the dataset, inspect the first records and review the run summary and map.
  6. Download results in JSON, CSV, Excel or another Apify-supported format.

Agentic And API-First Usage

The actor can serve as a structured public property-data acquisition step inside larger automated workflows. Its documented input schema, stable listing identity, nested output contract and run receipts let workflow builders separate collection from downstream analysis and action.

Agent workflow pattern

  1. Generate or select a scoped input from the supported parameters.
  2. Run the actor manually, on a schedule or through Apify platform automation.
  3. Wait for completion and read the dataset records.
  4. Validate records against the Field Reference.
  5. Read the summary or map artifact to verify counts, coverage state, stop reason, skipped outcomes, coordinates and export readiness.
  6. Upsert records into the destination using source_context.source_id + record_id.
  7. Trigger market analysis, enrichment, alerts, BI refreshes, search indexing, lead review or human verification.

For agentic use, keep prompts grounded in documented inputs and start with small validation runs. Give downstream AI steps the Field Reference and one representative record rather than asking them to infer the schema. Treat optional fields as nullable, and store run ID, input configuration and export metadata outside the listing record for audit trails. When context is limited for Claude, Codex, an internal copilot or a property workflow agent, provide the input schema, idempotency key, relevant field groups, run summary and one output example.

Scheduling & Automation

Scheduling

Automated Data Collection

Schedule validated inputs to maintain recurring public listing snapshots for monitoring and reporting.

  1. Navigate to Schedules in Apify Console.
  2. Create a daily, weekly or custom-cron schedule.
  3. Configure and save the input parameters.
  4. Enable notifications for run completion.
  5. Add webhooks when another system should process completed runs.

Integration Options

  • BI dashboards: monitor asking prices, property mix, listing status, geography and coordinate coverage over time.
  • Data warehouses and ETL: load nested JSON into historical listing tables and curated analytical models.
  • CRM enrichment: attach public listing, agency, property and available phone attributes to internal records.
  • Webhooks and alerts: trigger validation, ingestion or stakeholder notifications after a completed run.
  • Google Sheets or Airtable: review smaller exports, annotate listings and share scoped research with operational teams.
  • Search and vector indexes: support listing discovery, retrieval workflows and grounded agent context.
  • MCP connectors: authorize a compatible connector in Apify and select it in the input to receive a concise run summary plus available dataset, report and map links in the destination tool.

For connector delivery, the actor receives only the selected connector IDs. Apify keeps the destination credentials server-side. Connector delivery is optional and best effort; it does not replace the dataset or run artifacts.

Export Formats And Downstream Use

  • JSON: preserves nested objects and arrays for APIs, applications, AI agents and data pipelines.
  • CSV or Excel: supports spreadsheet review and lightweight analysis; nested values may need deliberate flattening.
  • API access: enables automated ingestion into internal applications and services.
  • BI and warehouses: supports reporting, dashboards, historical analysis and monitoring.
  • Search or vector indexes: supports structured discovery, semantic retrieval and agent context using listing text and metadata.

Downstream Pipeline Guide

  • Idempotency: upsert on source_context.source_id + record_id; use record_id alone only in a source-isolated table.
  • Null handling: treat every non-required group and nested value as nullable or absent.
  • Type handling: preserve numbers, booleans, arrays and nested objects in JSON-first destinations.
  • Flattening: flatten nested groups deliberately for CSV or relational tables and retain the original JSON for full fidelity.
  • Partitioning: store run date, input segment, geography, deal type and workflow name alongside records for analysis.
  • Change detection: compare repeated runs by stable key and selected fields such as pricing.price, listing.listing_status, listing.available_from and relevant property attributes.
  • Quality checks: monitor saved counts, duplicate counts, required IDs, asking-price availability, coordinate fill rate and enrichment status using dataset rows and the run summary.
  • Human review: route records with missing critical values, unusual prices, changed status or important segments into a review queue.
  • Retention: choose separate retention periods for raw exports, run receipts and normalized warehouse tables based on the workflow.

Performance And Coverage Expectations

Recent validation runs provide examples, not guarantees:

Run typeExample scopeListingsDurationCoverage notes
Lightweight buySouth London, limit 339.693 secondsLimit reached; 3 lightweight rows, 3 valid map markers, no skipped or duplicate rows.
Detail and contact enriched rentBirmingham, limit 3314.347 secondsLimit reached; 3 detail-enriched and 3 contact-enriched rows, 3 valid map markers, no recorded warnings.

Execution time varies with filters, result volume, target availability, response size, enrichment depth, coordinate and map artifact creation, and the amount of public information returned per listing. Highly filtered runs can finish sooner, while broad discovery, detail-rich records, contact collection or maximize_coverage can take longer. Coverage mode prioritizes deeper retrieval within the selected criteria and can trade speed for a more complete matching collection. The actor does not promise the fastest runtime, complete market coverage or lossless availability of optional source fields.

Limitations

  • Results depend on what Zoopla publicly exposes at run time.
  • Optional descriptions, coordinates, media, floor area, EPC, material information, history, agency and contact fields may be absent.
  • A requested limit is a maximum, not a promise that the source contains that many matching public listings.
  • Very broad searches and coverage-aware runs can take longer than focused validation runs.
  • Source-side presentation or field changes can affect availability and naming.
  • Asking prices, availability, status, descriptions and contact details are point-in-time public signals and should be verified before operational decisions.
  • The actor provides structured public listing data, not legal, financial, investment, valuation, appraisal or brokerage advice.

Troubleshooting

  • No results returned: check location spelling, deal type, filters, direct URLs and whether Zoopla currently shows matching public listings.
  • Fewer results than expected: raise limit if it is restrictive, remove overly narrow filters or enable maximize_coverage for eligible high-volume searches.
  • Some fields are empty: optional fields depend on what each listing and advertiser publicly provides and whether enrichment is enabled.
  • Duplicate-looking records: compare record_id; similar properties can be separate listings, units or advertiser records.
  • Run takes longer than expected: lower the limit for validation, disable optional enrichment or split a broad workflow into focused segments.
  • Output changed: compare records with the current Field Reference and retain a small sample for support.
  • Downstream import failed: check JSON validity, nullable values, arrays, nested objects and whether the destination expects flattened columns.
  • Connector delivery did not arrive: confirm that the connector remains authorized and compatible; the dataset and key-value-store artifacts remain the primary outputs.

FAQ

What data does this actor collect?

Public Zoopla sale and rental listing records, including stable listing identity, source context, title, location, asking price, property attributes, listing status, media, agency relationships and optional enrichment.

Which search filters are supported?

The actor supports direct individual listing URLs or a location-based query using buy or rent mode, radius, bedroom and bathroom ranges, price, property type, retirement status, features, publication window and keyword, plus documented sale-only and rental-only filters.

Why did I receive fewer records than my limit?

limit is a maximum. The selected criteria may contain fewer visible public matches, records may become unavailable, or the run may report another stop condition in RUN-SUMMARY.

What does maximize_coverage do?

For limits of at least 1,100, it can collect deeper within the same selected criteria when a broad search reports more matches than are normally visible. It does not relax the filters and can increase run time.

Where are the run summary and map?

Open the run's Outputs section or key-value store links for RUN-SUMMARY, RUN-SUMMARY.html and results-map.

How should I choose a first-run limit?

Start with 10 or 25 records, verify the output groups and optional-field fill rate, then increase the limit for the validated workflow.

Can I schedule recurring runs?

Yes. Save a tested input and configure an Apify schedule for daily, weekly or custom execution.

How do I avoid duplicates across runs?

Upsert using source_context.source_id + record_id, or record_id in a Zoopla-only table. Do not use title, address or result position as the unique key.

Can AI agents use the output?

Yes. Give the agent the input schema, relevant field reference, one output example and the run summary, and require it to treat optional fields as nullable.

Which export formats are available?

Apify datasets can be consumed as JSON and exported to formats such as CSV and Excel, subject to the standard platform options.

Does the actor collect private data or provide official valuations?

It collects publicly available listing information. It does not provide private property records, MLS completeness, ownership verification, appraisal-grade valuations or investment advice.

Compliance & Ethics

Responsible Data Collection

This actor collects publicly available property listing information from Zoopla for legitimate business purposes, including:

  • Real estate research and public market analysis
  • Property inventory monitoring and operational reporting
  • Schema-aware enrichment of internal property datasets

Users are responsible for ensuring that their collection, storage and use are lawful and appropriate. This section is informational and not legal advice.

Best Practices

  • Use collected data in accordance with applicable laws, regulations and Zoopla's terms.
  • Respect individual privacy and personal information.
  • Use data responsibly and avoid disruptive or excessive collection.
  • Do not use this actor for spamming, harassment, discrimination, unlawful housing practices or other harmful purposes.
  • Follow relevant data-protection, fair-housing, consumer-protection and sector-specific requirements.
  • Review retention, access-control and data-sharing policies before operationalizing the dataset.

Support

Use the Issues tab on the Actor page to ask for help. Include the redacted input, Apify run ID, expected versus actual behavior and, when useful, a small output sample. For export or pipeline issues, also include the downstream destination and format, such as JSON, CSV, Excel, CRM or warehouse ingestion.