{
  "openapi": "3.0.1",
  "info": {
    "title": "Zoopla Scraper - Property Listings, Sold Prices & Monitoring",
    "description": "Scrape UK property from Zoopla: for sale, to rent and Land Registry sold prices. Search by place with filters or paste links. Optional full detail adds EPC, floor plans, tenure, price history, stations and agent phone. Incremental mode for change monitoring.",
    "version": "1.0",
    "x-build-id": "NsLcgxLb91CYRUEue"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/abotapi~zoopla-co-uk-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-abotapi-zoopla-co-uk-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/abotapi~zoopla-co-uk-scraper/runs": {
      "post": {
        "operationId": "runs-sync-abotapi-zoopla-co-uk-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/abotapi~zoopla-co-uk-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-abotapi-zoopla-co-uk-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "required": [
          "mode"
        ],
        "properties": {
          "mode": {
            "title": "Mode",
            "enum": [
              "search",
              "url"
            ],
            "type": "string",
            "description": "Choose 'search' to look up places by name and apply filters, or 'url' to scrape Zoopla links you paste, results pages, house-price pages and individual listing pages are all accepted.",
            "default": "search"
          },
          "locations": {
            "title": "Places to search",
            "type": "array",
            "description": "One or more UK places, for example 'London', 'Manchester', 'SW19', or 'Islington, London' for a district inside a city. Each place is searched separately on every channel you pick below.",
            "items": {
              "type": "string"
            }
          },
          "channels": {
            "title": "Channels",
            "type": "array",
            "description": "Which parts of Zoopla to search. 'For sale' and 'To rent' return live listings; 'Sold prices' returns Land Registry sale records from the house-prices section (address, sold price, sold date, UPRN, tenure, floor area). Pick more than one to cover several at once.",
            "items": {
              "type": "string",
              "enum": [
                "for-sale",
                "to-rent",
                "sold"
              ],
              "enumTitles": [
                "For sale",
                "To rent",
                "Sold prices"
              ]
            },
            "default": [
              "for-sale"
            ]
          },
          "minPrice": {
            "title": "Minimum price (GBP)",
            "minimum": 0,
            "type": "integer",
            "description": "Optional. Lowest price to include. For rentals this is read together with 'Rent price shown per' below."
          },
          "maxPrice": {
            "title": "Maximum price (GBP)",
            "minimum": 0,
            "type": "integer",
            "description": "Optional. Highest price to include. For rentals this is read together with 'Rent price shown per' below."
          },
          "minBeds": {
            "title": "Minimum bedrooms",
            "minimum": 0,
            "maximum": 10,
            "type": "integer",
            "description": "Optional. Only return properties with at least this many bedrooms."
          },
          "maxBeds": {
            "title": "Maximum bedrooms",
            "minimum": 0,
            "maximum": 10,
            "type": "integer",
            "description": "Optional. Only return properties with at most this many bedrooms."
          },
          "minBaths": {
            "title": "Minimum bathrooms",
            "minimum": 0,
            "maximum": 10,
            "type": "integer",
            "description": "Optional. Only return properties with at least this many bathrooms."
          },
          "propertySubTypes": {
            "title": "Property types",
            "type": "array",
            "description": "Optional. Narrow to specific property types. Leave empty for every type. On the 'Sold prices' channel Zoopla accepts a single type only, so the first one you pick is used there.",
            "items": {
              "type": "string",
              "enum": [
                "detached",
                "semi_detached",
                "terraced",
                "flats",
                "bungalow",
                "farms_land",
                "park_home",
                "offices",
                "retail",
                "hospitality",
                "industrials"
              ],
              "enumTitles": [
                "Detached",
                "Semi-detached",
                "Terraced",
                "Flats and apartments",
                "Bungalows",
                "Farms and land",
                "Park homes",
                "Offices",
                "Retail",
                "Hospitality",
                "Industrial"
              ]
            }
          },
          "radius": {
            "title": "Search radius (miles)",
            "enum": [
              "0",
              "0.25",
              "0.5",
              "1",
              "3",
              "5",
              "10",
              "15",
              "20",
              "30",
              "40"
            ],
            "type": "string",
            "description": "Optional. Widen the search around the place you named. 'This area only' is Zoopla's own default.",
            "default": "0"
          },
          "addedSince": {
            "title": "Added to site",
            "enum": [
              "",
              "24_hours",
              "3_days",
              "7_days",
              "14_days"
            ],
            "type": "string",
            "description": "Optional. Only return listings published within this window. Very useful for a daily monitoring run.",
            "default": ""
          },
          "keywords": {
            "title": "Keyword",
            "type": "string",
            "description": "Optional. Free-text keyword Zoopla matches against the listing, for example 'garden', 'garage' or 'balcony'."
          },
          "sortBy": {
            "title": "Sort results by",
            "enum": [
              "recommended",
              "newest_listings",
              "highest_price",
              "lowest_price",
              "most_reduced"
            ],
            "type": "string",
            "description": "Order Zoopla returns results in. Note that paid-for premium listings are pinned to the top of the first page whatever you pick here.",
            "default": "recommended"
          },
          "chainFreeOnly": {
            "title": "Chain free only",
            "type": "boolean",
            "description": "Optional, for sale only. Only return properties advertised as chain free.",
            "default": false
          },
          "auctionOnly": {
            "title": "Auction properties only",
            "type": "boolean",
            "description": "Optional, for sale only. Only return properties being sold at auction.",
            "default": false
          },
          "sharedOwnershipOnly": {
            "title": "Shared ownership only",
            "type": "boolean",
            "description": "Optional, for sale only. Only return shared-ownership properties.",
            "default": false
          },
          "retirementOnly": {
            "title": "Retirement homes only",
            "type": "boolean",
            "description": "Optional, for sale only. Only return retirement properties.",
            "default": false
          },
          "reducedPriceOnly": {
            "title": "Reduced price only",
            "type": "boolean",
            "description": "Optional. Only return listings whose asking price has been reduced.",
            "default": false
          },
          "includeUnderOffer": {
            "title": "Include under offer / sold STC",
            "type": "boolean",
            "description": "Optional, for sale only. Also return properties marked under offer or sold subject to contract, which Zoopla hides by default.",
            "default": false
          },
          "includeLetAgreed": {
            "title": "Include let agreed",
            "type": "boolean",
            "description": "Optional, to rent only. Also return properties marked let or let agreed, which Zoopla hides by default.",
            "default": false
          },
          "furnishedState": {
            "title": "Furnishing",
            "enum": [
              "",
              "furnished",
              "part_furnished",
              "unfurnished"
            ],
            "type": "string",
            "description": "Optional, to rent only. Narrow rentals by how they are furnished.",
            "default": ""
          },
          "priceFrequency": {
            "title": "Rent price shown per",
            "enum": [
              "",
              "per_month",
              "per_week"
            ],
            "type": "string",
            "description": "Optional, to rent only. Whether the minimum and maximum price above are per month or per week. Zoopla treats rents as per month unless you change this.",
            "default": ""
          },
          "petsAllowed": {
            "title": "Pets allowed only",
            "type": "boolean",
            "description": "Optional, to rent only. Only return rentals that accept pets.",
            "default": false
          },
          "billsIncluded": {
            "title": "Bills included only",
            "type": "boolean",
            "description": "Optional, to rent only. Only return rentals where bills are included.",
            "default": false
          },
          "soldPeriodMonths": {
            "title": "Sold within",
            "enum": [
              "all-time",
              "3",
              "6",
              "12",
              "60",
              "120",
              "240"
            ],
            "type": "string",
            "description": "Optional, sold prices only. How far back to look for sold records.",
            "default": "all-time"
          },
          "startUrls": {
            "title": "Zoopla links",
            "type": "array",
            "description": "Paste Zoopla addresses: a results page such as https://www.zoopla.co.uk/for-sale/property/london/islington/ , a house-prices page such as https://www.zoopla.co.uk/house-prices/london/islington/ , or a single listing such as https://www.zoopla.co.uk/for-sale/details/73365838/ . A bare numeric listing id also works. A pasted page number is honoured as the starting page.",
            "items": {
              "type": "string"
            }
          },
          "includeDetails": {
            "title": "Fetch full listing details",
            "type": "boolean",
            "description": "Add the full detail set to every record: EPC rating and EPC graph images, floor plan images, tenure, council tax band, service charge, ground rent, UPRN, price history, full description, features, nearest stations with distances, EV charge points, virtual tours, brochures and the agent's phone number. Billed as a per-listing surcharge, so leave it off for a fast, cheap listing-level pull. It has no effect on the 'Sold prices' channel, which publishes no per-property detail.",
            "default": false
          },
          "maxItems": {
            "title": "Max results",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum number of records to return across the whole run. Use 0 for unlimited.",
            "default": 20
          },
          "maxPages": {
            "title": "Max pages per place and channel",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum result pages to cover per place and channel. Leave empty or 0 to cover every result page Zoopla offers, which is at most 40 pages (about 1000 records) per search, the site's own limit."
          },
          "resumeFromRunId": {
            "title": "Resume from a previous run",
            "type": "string",
            "description": "Paste a previous run ID or dataset ID to continue a large crawl without returning, or charging for, records already collected there. For recurring monitoring of the same search use Incremental mode below instead."
          },
          "incrementalMode": {
            "title": "Incremental changes for scheduled runs",
            "type": "boolean",
            "description": "Turn this on for daily or recurring monitoring. The first run returns everything as NEW. Later runs normally return only NEW, UPDATED and REAPPEARED records. State is kept separately for each combination of places, channels, filters and detail setting; use State key to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from a previous run above.",
            "default": false
          },
          "stateKey": {
            "title": "State key (optional, incremental mode only)",
            "type": "string",
            "description": "Optional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty to let the actor derive a key from the search itself, so two different searches never mix state."
          },
          "emitUnchanged": {
            "title": "Emit unchanged records (incremental mode only)",
            "type": "boolean",
            "description": "Off by default. Turn on to also return records that have not changed since the last run, marked UNCHANGED. This returns, and bills, extra rows you already have, so leave it off unless you want a full snapshot every run.",
            "default": false
          },
          "emitExpired": {
            "title": "Emit expired records (incremental mode only)",
            "type": "boolean",
            "description": "Off by default. Turn on to also return records that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked search, never when Max results capped it or when Resume was used. This returns, and bills, extra synthetic rows.",
            "default": false
          },
          "proxy": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Apify Proxy is required for reliable results. The standard pool is used by default. This actor never upgrades a run to a metered pool on its own, so the pool you pick here is the pool it uses.",
            "default": {
              "useApifyProxy": true
            }
          },
          "mcpConnectors": {
            "title": "Pipe results into your apps (optional)",
            "type": "array",
            "description": "Optionally send results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize one under Apify, Settings, API & Integrations, then select it here. Notion gets a rich page-per-item export; other connectors get a best-effort write or digest. Leave empty to skip; this never changes the dataset output. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com)."
          },
          "notionParentPageUrl": {
            "title": "Notion parent page (Notion connector only)",
            "type": "string",
            "description": "URL or id of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors."
          },
          "maxNotifyListings": {
            "title": "Max items to export per connector",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Cap on items written to each connector per run. Does not affect the dataset.",
            "default": 50
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}