Zoopla Uk Property Scraper with Contacts & Features
Pricing
from $0.70 / 1,000 property listings
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
Maintained by CommunityActor stats
1
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
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_listingenvelope with stable identity and nestedsource_context,entity,location,pricing,property,listing,media,contact_details,relationshipsandattributesgroups. - 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_coveragecan 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.htmlandresults-mapprovide 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
- Choose
deal_typeasbuyorrent. - Enter one focused UK
location, or provide individual Zoopla listing-detail URLs inurl. - Add only the filters relevant to the selected listing mode and start with a small
limit, such as 10 or 25. - Run the actor in Apify Console and inspect the first dataset records.
- Review
RUN-SUMMARYandresults-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.
| Parameter | Type | Description | Default |
|---|---|---|---|
deal_type | single select | Listing mode: buy or rent. Determines which mode-specific filters are valid. | buy |
location | string | UK city, postcode, neighborhood, county or market, such as South London, Birmingham or SW1A. | – |
url | string array | Individual Zoopla /for-sale/details/.../, /to-rent/details/.../ or /new-homes/details/.../ URLs. Search-result URLs are not accepted. | Empty |
radius | single select | Distance 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_bedroom | single select | Minimum bedrooms from 0 through 10; 0 includes studios. | – |
max_bedroom | single select | Maximum bedrooms from 0 through 10; 0 means studios only. | – |
min_bathroom | single select | Minimum bathrooms from 1 through 10. | – |
max_bathroom | single select | Maximum bathrooms from 1 through 10. | – |
min_price | integer | Minimum asking price in GBP. Rent searches use Zoopla's monthly rent scale. | – |
max_price | integer | Maximum asking price in GBP. Rent searches use Zoopla's monthly rent scale. | – |
property_type | string array | Any of semi-detached, detached, terraced, bungalow, park-home, flats or farms-land. | Empty |
retirement_home | single select | include, exclude or only retirement-home listings. | – |
features | string array | Any 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_date | single select | Listings added within 24-hours, 3-days, 7-days, 14-days or 30-days. | – |
keyword | string | Free-text listing keyword, such as balcony, parking or air conditioning. | – |
rental_house_share | single select | For rent mode: include, exclude or only shared accommodation. | – |
rental_student_accommodation | single select | For rent mode: include, exclude or only student accommodation. | – |
rental_availability | single select | For rent mode: now, one-month, three-months, six-months or twelve-months. | – |
furnishment | single select | For rent mode: furnished, part-furnished or unfurnished. | – |
include_let_agreed | boolean | Include rental listings marked let or let agreed. | false |
sale_new_build_home | single select | For buy mode: include, exclude or only new-build homes. | – |
sale_shared_ownership | single select | For buy mode: include, exclude or only shared-ownership listings. | – |
sale_owner_type | string array | For buy mode: any of leasehold, freehold or share-of-freehold. | Empty |
sale_property_status | string array | For buy mode: any of chain-free, reduced-price or under-offer-or-sold-stc. | Empty |
sale_low_deposit_mortgage | boolean | Require a supported low-deposit mortgage incentive on buy listings. | false |
enrich_data | boolean | Add richer public listing details to query-driven results. Individual url inputs always read their detail pages. | true |
get_contact | boolean | Add an additional public agent or agency phone number when available. This works independently of enrich_data. | false |
maximize_coverage | boolean | For 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 |
limit | integer | Maximum number of listing records to save; minimum 1. Leave empty to continue through the available selected scope. | – |
mcpConnectors | MCP connector array | User-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
limitto 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
urlto 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_coverageto 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:
| Artifact | Purpose |
|---|---|
RUN-SUMMARY | Machine-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.html | Human-readable report presenting the main completion, enrichment, location, pricing and warning indicators. |
results-map | Interactive 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):
lightweightorenriched. - source_context.enriched_fields (string array, optional): field paths added or changed by enrichment.
- source_context.detail_enrichment_status (string, optional): present as
enrichedwhen 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
enrichedwhen 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
pcmorpw. - 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
sqftorsq. 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
buyorrentmode. - 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
availableorunder_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_idfor cross-source upserts, orrecord_idwithin a Zoopla-only table. - Provenance: use
urlto open the listing andsource_context.source_urlto audit the search scope when present. - Property value:
entity,location,pricing,property,listingandmediacarry 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, orrecord_idin 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
limitto 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_dataonly when richer fields justify the additional run time. - Keep
maximize_coveragefor 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-SUMMARYandresults-mapbefore importing a changed or expanded configuration into a production workflow.
How to Run on Apify
- Open the Actor in Apify Console.
- Configure a location and supported search filters, or add individual listing-detail URLs.
- Set the maximum number of listings to save.
- Click Start and wait for the run to finish.
- Open the dataset, inspect the first records and review the run summary and map.
- 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
- Generate or select a scoped input from the supported parameters.
- Run the actor manually, on a schedule or through Apify platform automation.
- Wait for completion and read the dataset records.
- Validate records against the Field Reference.
- Read the summary or map artifact to verify counts, coverage state, stop reason, skipped outcomes, coordinates and export readiness.
- Upsert records into the destination using
source_context.source_id + record_id. - 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.
- Navigate to Schedules in Apify Console.
- Create a daily, weekly or custom-cron schedule.
- Configure and save the input parameters.
- Enable notifications for run completion.
- 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; userecord_idalone 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_fromand 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 type | Example scope | Listings | Duration | Coverage notes |
|---|---|---|---|---|
| Lightweight buy | South London, limit 3 | 3 | 9.693 seconds | Limit reached; 3 lightweight rows, 3 valid map markers, no skipped or duplicate rows. |
| Detail and contact enriched rent | Birmingham, limit 3 | 3 | 14.347 seconds | Limit 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
limitis 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
limitif it is restrictive, remove overly narrow filters or enablemaximize_coveragefor 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.