{
  "openapi": "3.0.1",
  "info": {
    "title": "Zoopla Property Scraper (UK)",
    "description": "Scrapes property listings for sale or rent from Zoopla, the UK's #2 property portal. Search by location, property type and price/bedroom filters; returns price, address, coordinates, features and agent from a single search call, with an optional detail pass.",
    "version": "0.1",
    "x-build-id": "vGYrIu5BFWnpGUztd"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/scrapyx~zoopla-properties-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-scrapyx-zoopla-properties-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/scrapyx~zoopla-properties-scraper/runs": {
      "post": {
        "operationId": "runs-sync-scrapyx-zoopla-properties-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/scrapyx~zoopla-properties-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-scrapyx-zoopla-properties-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": [
          "locations"
        ],
        "properties": {
          "locations": {
            "title": "Locations to search",
            "type": "array",
            "description": "Place names/slugs as they appear in Zoopla's own URLs, e.g. 'london', 'manchester', 'rye', 'west-london'. One search per entry, each with its own SEARCH_SUMMARY row. An unrecognised location is reported as segmentResolved=false rather than silently returning a national baseline.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "section": {
            "title": "For sale or to rent",
            "enum": [
              "for-sale",
              "to-rent"
            ],
            "type": "string",
            "description": "Which market to search. Applies to every location in this run.",
            "default": "for-sale"
          },
          "propertyType": {
            "title": "Property type",
            "enum": [
              "property",
              "houses",
              "flats",
              "bungalows",
              "retirement"
            ],
            "type": "string",
            "description": "Narrows results to one property type. 'property' means all types combined. Only types verified live to genuinely filter (distinct totals from the 'property' baseline) are offered.",
            "default": "property"
          },
          "priceMin": {
            "title": "Minimum price (GBP)",
            "minimum": 0,
            "type": "integer",
            "description": "Only listings priced at or above this (GBP). Verified live to genuinely filter, not silently ignored. Leave 0/empty for no minimum.",
            "default": 0
          },
          "priceMax": {
            "title": "Maximum price (GBP)",
            "minimum": 0,
            "type": "integer",
            "description": "Only listings priced at or below this (GBP). Verified live to genuinely filter, not silently ignored. Leave 0/empty for no maximum.",
            "default": 0
          },
          "bedsMin": {
            "title": "Minimum bedrooms",
            "minimum": 0,
            "type": "integer",
            "description": "Only listings with at least this many bedrooms. Verified live to genuinely filter. Leave 0/empty for no minimum.",
            "default": 0
          },
          "bedsMax": {
            "title": "Maximum bedrooms",
            "minimum": 0,
            "type": "integer",
            "description": "Only listings with at most this many bedrooms. Verified live to genuinely filter. Leave 0/empty for no maximum.",
            "default": 0
          },
          "includePropertyDetails": {
            "title": "Fetch listing detail pages",
            "type": "boolean",
            "description": "Also fetch each listing's detail page for floor area, bed/bath counts, tenure, EPC, nearby stations and price history -- none of which are present in search results. Costs one extra request per listing. Off by default because search results already carry price, address, coordinates, features, images and the listing agent.",
            "default": false
          },
          "maxItems": {
            "title": "Max properties per search",
            "minimum": 0,
            "type": "integer",
            "description": "Stop paginating a search after this many properties. Set to 0 for unlimited (still bounded by Max pages and Zoopla's own ~1,000-listing ceiling per query).",
            "default": 100
          },
          "maxPages": {
            "title": "Max pages per search",
            "minimum": 1,
            "type": "integer",
            "description": "Hard cap on pagination depth, independent of maxItems. Zoopla pages honestly (a page past the real ceiling answers a clean HTTP 404, not a repeat/clamp) and caps queries at pageNumberMax=40 (25 listings/page, ~1,000 total) regardless of this setting.",
            "default": 20
          },
          "maxConcurrency": {
            "title": "Max concurrent requests",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "Upper bound on requests in flight at once, across searches and detail fetches. Kept moderate by default: this target sits behind a Cloudflare managed challenge that two TLS profiles fail deterministically and the rest fail intermittently (cleared by retry+profile-rotation, built into the client).",
            "default": 4
          },
          "minRequestInterval": {
            "title": "Minimum seconds between request starts",
            "minimum": 0,
            "type": "integer",
            "description": "Paces request starts (not held inside a concurrency slot) rather than raw concurrency. Kept at 1s by default as a courtesy to reduce how often the Cloudflare challenge fires.",
            "default": 1
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Zoopla sits behind a Cloudflare managed challenge (two TLS profiles blocked outright, the rest challenged intermittently). Residential proxy pinned to the UK is the default, matching this portfolio's standard baseline for a single-country site behind an active WAF.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ],
              "apifyProxyCountry": "GB"
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}