{
  "openapi": "3.0.1",
  "info": {
    "title": "Zillow Property Listings Scraper – For Sale, Rent & Sold",
    "description": "Scrape Zillow listings by city, ZIP, neighborhood, address or map area - for sale, for rent, sold, new construction and foreclosures. One row per home: price, beds, baths, sqft, lot, year built, Zestimate, MLS attribution, full-res photos, geo. Add price/tax history, schools, comps and climate risk.",
    "version": "0.0",
    "x-build-id": "qMudyriDIz4qb0gg6"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/rl1987~zillow-api-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-rl1987-zillow-api-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/rl1987~zillow-api-scraper/runs": {
      "post": {
        "operationId": "runs-sync-rl1987-zillow-api-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/rl1987~zillow-api-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-rl1987-zillow-api-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",
        "properties": {
          "mode": {
            "title": "Mode",
            "enum": [
              "search",
              "detail",
              "photos",
              "agent",
              "media",
              "market"
            ],
            "type": "string",
            "description": "Which slice of the data to return. <b>Listings</b> is the full search row. <b>Property detail</b> adds facts, Zestimate and agent contact per property. <b>Photos</b> returns one row per photo, <b>Agent contacts</b> one row per listing agent, <b>Media &amp; tours</b> the virtual-tour, floor-plan and 3D links — each a narrow dataset instead of sixty columns.<br><br>Mode picks the <i>shape</i>; <b>Extra data per property</b> below picks how much <i>history and context</i> comes with it — price history, tax history, schools, comparables, climate risk and more, in any mode. <b>Market stats</b> is the odd one out: it returns one row per <i>place</i> rather than per home — Zillow's market-temperature index and label and the median days to pending — so it takes a list of cities or ZIPs in <b>Regions</b> and ignores the listing filters. Use <b>Deep search</b> to collect more than the 1,000 listings one Zillow search returns.",
            "default": "search"
          },
          "q": {
            "title": "Location",
            "type": "string",
            "description": "City, ZIP code, neighborhood, or street address to search — e.g. \"Austin, TX\", \"90210\", \"Downtown, Austin, TX\". This is the main search input; it is resolved to a map area automatically. Zillow search-page URLs are not accepted: one only ever reproduced 2 of the 11 filters it carried, so the filters below are set explicitly instead."
          },
          "regions": {
            "title": "Regions (Market stats mode)",
            "type": "array",
            "description": "Cities, ZIPs or neighborhoods to report market stats for, one per line — <code>Austin, TX</code>, <code>78745</code>, <code>Denver, CO</code>. Used by <b>Market stats</b> mode only; every other mode ignores it. Each place costs one request <i>per property type</i> and returns one row per type (see Property types below). A street address has no market of its own and is skipped. Leave empty to use the Location above.",
            "items": {
              "type": "string"
            }
          },
          "useCodes": {
            "title": "Property types (Market stats mode)",
            "type": "array",
            "description": "Which property types the market figures cover. <b>Market stats</b> mode only. <code>uc_sfrcondo</code> (single-family + condo, the default) is the only one that returns both the market temperature and the median days to pending; <code>uc_sfr</code> returns the days only. Anything else Zillow answers with silence rather than an error, so the run refuses an unsupported value by name. <b>Each type costs its own request and returns its own row</b>, so two types over three places is six rows.",
            "items": {
              "type": "string",
              "enum": [
                "uc_sfrcondo",
                "uc_sfr"
              ],
              "enumTitles": [
                "Single-family + condo (both figures)",
                "Single-family only (days to pending only)"
              ]
            },
            "default": [
              "uc_sfrcondo"
            ]
          },
          "listingType": {
            "title": "Listing type",
            "enum": [
              "fsba,fsbo,newConstruction,comingSoon,auction",
              "forRent",
              "recentlySold",
              "foreclosure,preforeclosure,foreclosed"
            ],
            "type": "string",
            "description": "What kind of listings to search for"
          },
          "homeTypes": {
            "title": "Home types",
            "type": "array",
            "description": "Restrict results to these property types. Leave empty for all types.",
            "items": {
              "type": "string",
              "enum": [
                "singleFamily",
                "multiFamily",
                "condo",
                "townhome",
                "apartment",
                "manufactured",
                "land"
              ],
              "enumTitles": [
                "House",
                "Multi-family",
                "Condo/Co-op",
                "Townhouse",
                "Apartment",
                "Manufactured",
                "Lot / Land"
              ]
            },
            "default": []
          },
          "priceMin": {
            "title": "Min price",
            "type": "integer",
            "description": "Minimum price (USD)"
          },
          "priceMax": {
            "title": "Max price",
            "type": "integer",
            "description": "Maximum price (USD)"
          },
          "bedsMin": {
            "title": "Min beds",
            "type": "integer",
            "description": "Minimum bedrooms"
          },
          "bathsMin": {
            "title": "Min baths",
            "type": "integer",
            "description": "Minimum bathrooms"
          },
          "bedsMax": {
            "title": "Max beds",
            "type": "integer",
            "description": "Maximum bedrooms."
          },
          "bathsMax": {
            "title": "Max baths",
            "type": "integer",
            "description": "Maximum bathrooms."
          },
          "sqftMin": {
            "title": "Min living area (sqft)",
            "type": "integer",
            "description": "Minimum finished living area, in square feet."
          },
          "sqftMax": {
            "title": "Max living area (sqft)",
            "type": "integer",
            "description": "Maximum finished living area, in square feet."
          },
          "lotSizeMin": {
            "title": "Min lot size (sqft)",
            "type": "integer",
            "description": "Minimum lot size, in square feet - not acres. One acre is 43,560 sqft."
          },
          "lotSizeMax": {
            "title": "Max lot size (sqft)",
            "type": "integer",
            "description": "Maximum lot size, in square feet."
          },
          "yearBuiltMin": {
            "title": "Built after",
            "type": "integer",
            "description": "Earliest year built, inclusive."
          },
          "yearBuiltMax": {
            "title": "Built before",
            "type": "integer",
            "description": "Latest year built, inclusive."
          },
          "daysOnZillowMax": {
            "title": "Listed within (days)",
            "type": "integer",
            "description": "Only listings new to Zillow within this many days. Measured on Austin: 1 day matched 107 listings against 6,511 unfiltered, 7 days matched 394."
          },
          "keywords": {
            "title": "Keywords",
            "type": "string",
            "description": "Free-text keyword search over the listing, as Zillow's own keyword box does it - e.g. \"pool\", \"casita\", \"no HOA\". A word Zillow does not index matches nothing at all, so the run ends with no rows and says so."
          },
          "sortBy": {
            "title": "Sort by",
            "enum": [
              "daysOn",
              "price",
              "beds",
              "baths",
              "livingArea",
              "lotArea",
              "yearBuilt",
              "recentlyChanged",
              "featured",
              "relevance",
              "rentalPriorityScore",
              "rentalDays",
              "rentalPriorityScoreCandidate"
            ],
            "type": "string",
            "description": "Which order Zillow returns the listings in. These are Zillow's own sort keys, taken from the API's own list of accepted values. The three rental sorts work only when Listing type is For rent - Zillow refuses them for anything else, and the run will say so rather than return the wrong order.",
            "default": "daysOn"
          },
          "sortDescending": {
            "title": "Sort descending",
            "type": "boolean",
            "description": "Reverse the sort - highest price first, largest lot first, and so on. Note Relevance ignores it (Zillow returns the same order either way), and sorting by Price ascending puts listings with no published price, such as auctions, at the top.",
            "default": false
          },
          "zpids": {
            "title": "ZPIDs (detail lookup)",
            "type": "array",
            "description": "Look up these Zillow property IDs directly instead of searching. Works with every mode — pair it with Photos to pull the photo sets of listings you already know.",
            "items": {
              "type": "string"
            }
          },
          "north": {
            "title": "North latitude (advanced)",
            "type": "string",
            "description": "Advanced: raw bounding-box north latitude (e.g. 30.35). Optional power-user override — supply all four of north/south/east/west to search an exact map box instead of a Location."
          },
          "south": {
            "title": "South latitude (advanced)",
            "type": "string",
            "description": "Advanced: raw bounding-box south latitude (e.g. 30.20). Optional power-user override; used only when all four of north/south/east/west are given."
          },
          "east": {
            "title": "East longitude (advanced)",
            "type": "string",
            "description": "Advanced: raw bounding-box east longitude (e.g. -97.70). Optional power-user override; used only when all four of north/south/east/west are given."
          },
          "west": {
            "title": "West longitude (advanced)",
            "type": "string",
            "description": "Advanced: raw bounding-box west longitude (e.g. -97.85). Optional power-user override; used only when all four of north/south/east/west are given."
          },
          "deepSearch": {
            "title": "Deep search (auto-enables above 1,000 Maximum results)",
            "type": "boolean",
            "description": "One Zillow search returns at most 1,000 listings however many match — an Austin-wide search matches ~7,700 and returns 1,000. With this on, the actor subdivides the area into tiles that each fit under that cap and merges the results, reaching several times more properties. Costs proportionally more requests, and each property is still returned — and billed — only once. Left unset, it turns on automatically when Maximum results is 0 (all) or above 1,000."
          },
          "maxTileDepth": {
            "title": "Deep search — max subdivision depth",
            "minimum": 0,
            "maximum": 6,
            "type": "integer",
            "description": "How many times Deep search may halve the area. Each level quadruples the tile count, and every candidate tile costs one (free, row-less) count request — an Austin-wide run planned 151 searches. A tile still over the cap at full depth is partitioned by price band instead of being truncated, so lowering this trades requests for a coarser split rather than losing listings.",
            "default": 4
          },
          "includeDetail": {
            "title": "Include full HDP detail",
            "type": "boolean",
            "description": "Fetch each property's detail page too, filling in Zestimate, rent Zestimate, the bathroom breakdown, price-change, tour and floor-plan links and the listing-type flags. <b>This is a second request and a second charge per property</b> (detail-row), so leave it off if the search fields are enough. Forced on by the Property detail, Agent contacts and Media &amp; tours modes, which are built from it.",
            "default": false
          },
          "maxItems": {
            "title": "Max items",
            "type": "integer",
            "description": "0 = all matches. The same applies to Extra data: 2 listings with every section selected measured 44 rows on new construction and 336 on sold homes - still 2 charged properties either way. The spread is because the offer curve (41 rows) is for-sale only and the demand series (120 rows) is sold-only, so no single listing gets both.",
            "default": 100
          },
          "includeSections": {
            "title": "Include sections",
            "type": "array",
            "description": "Extra per-property data, as additional rows joined to the listing by <code>zpid</code> (read the <code>type</code> column to tell them apart). <b>All of these come from one Zillow request</b>, so picking five costs the same as picking one: <b>one extra request per property</b>, charged once. <ul><li><b>Price history</b> — every price change, sale and listing event with its source.</li><li><b>Tax history</b> — tax paid and assessed value per year.</li><li><b>Schools</b> — assigned schools with rating, enrollment and student-teacher ratio.</li><li><b>Nearby homes</b> — the 8 homes Zillow shows beside this one.</li><li><b>Comparables</b> — Zillow's own valuation comp set.</li><li><b>Offer-strength curve</b> — Zillow's own modelled probability of winning at each price from 80% to 120% of list, as 41 rows. <i>For-sale listings only</i>: new construction returns nothing, because the model does not cover builder listings.</li><li><b>Demand by asking price</b> — for four candidate asking prices around the property's value, a 30-day series of average page views, saves and shares for <b>similar listings nearby</b> (not this property's own traffic). <i>Sold / off-market homes only.</i></li><li><b>Nearby buildings</b> — <i>for-rent listings only</i>, from Zillow's own rental detail document: the neighbouring <i>buildings</i> with their price ranges and bedroom groups (a rental's neighbours are buildings, not comparable houses). <b>Picking either of these for a rental means that rental cannot also return climate risk</b> — the two live in different Zillow documents and the Actor makes one request per property, so it uses whichever your selection needs.</li><li><b>Climate risk</b> — fire, flood, air, wind and heat: risk score, label, FEMA zone and whether Zillow recommends insurance. Added as columns, not rows. <i>Not available for sold homes</i> — Zillow's off-market detail does not carry it.</li><li><b>Walk / bike / transit scores</b> plus the local legal protections (LGBT, source of income, housing voucher) for the listing's jurisdiction. Columns.</li><li><b>MLS attribution</b> — MLS id and name, the disclaimer text, the must-display flags a redistributor has to honour, and when Zillow last checked the listing. Columns.</li><li><b>Views &amp; saves</b> — page views, favourites and time on Zillow. Columns, and for-sale listings only.</li></ul>New construction has no tax history and sold homes have no list price, so a section can legitimately come back empty.",
            "items": {
              "type": "string",
              "enum": [
                "priceHistory",
                "taxHistory",
                "schools",
                "nearbyHomes",
                "comparables",
                "offerStrength",
                "demandByPrice",
                "nearbyBuildings",
                "climate",
                "neighborhood",
                "provenance",
                "engagement"
              ],
              "enumTitles": [
                "Price history",
                "Tax history",
                "Schools",
                "Nearby homes",
                "Comparables",
                "Offer-strength curve (for-sale only)",
                "Demand by asking price (sold homes only)",
                "Nearby buildings (for-rent only)",
                "Climate risk (fire, flood, air, wind, heat)",
                "Walk / bike / transit scores + legal protections",
                "MLS attribution & disclaimers",
                "Views & saves"
              ]
            },
            "default": []
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Route requests through a proxy. Residential (US) is the default and recommended — Zillow's PerimeterX blocks datacenter IPs.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ],
              "apifyProxyCountry": "US"
            }
          }
        }
      },
      "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}