# Zillow ZIP Code Scraper | Listings & Market Trends (`datascraperes/zillow-zip-code-scraper`) Actor

Scrape Zillow sale, rental and sold listings by US ZIP code. Export prices, addresses, home facts, Zestimates and photo URLs. Add optional property details with price and tax histories, schools and scores, plus monthly ZIP market trends with inventory, sale metrics and market temperature.

- **URL**: https://apify.com/datascraperes/zillow-zip-code-scraper.md
- **Developed by:** [DataScraperES](https://apify.com/datascraperes) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### What this Actor does

This Zillow ZIP code scraper exports structured property listings together with monthly market data for the same five-digit US ZIP codes. Choose homes for sale, for rent, sold properties, or a combination of these searches. Each returned property has a stable Zillow property identifier, its search context, available address and location, normalized listing and sold prices, home facts, property links, photo URLs and source attribution.

Optional property enrichment adds the available facts and features, price history, tax history, schools, walking/biking/transit scores and valuation history. ZIP market records contain monthly inventory, new listings, new pending listings, sale-to-list metrics, market temperature and the forecast available from Zillow. These are separate Dataset records so you can analyze properties and regional series independently.

Some supplementary listing fields are collected on a best-effort basis and can remain empty. If the supplementary lookup reaches its limit, the Actor preserves the property results and adds a warning to `RUN-SUMMARY`.

### Use cases

- Compare available properties across a short list of US ZIP codes.
- Export sale, rental and sold listing samples for property research.
- Add source price and tax histories to selected property records.
- Compare ZIP inventory and market temperature over time.
- Schedule recurring collections and join records using `zpid` or `zipCode`.

### How to use

1. Enter one or more five-digit ZIP codes as strings.
2. Select sale by agent, sale by owner, rental or sold properties, and set a result limit.
3. Enable property details if you need histories and deeper property facts.
4. Run the Actor and export the Dataset as JSON, CSV or Excel. Filter `recordType` to separate property and market records.

This small input collects one property and one month of market history:

```json
{
  "zipCodes": [
    "10014"
  ],
  "statuses": [
    "FOR_SALE"
  ],
  "resultsLimit": 1,
  "maxTotalResults": 1,
  "includeMarketTrends": true,
  "marketHistoryMonths": 1
}
```

### Input

```json
{
  "zipCodes": [
    "10014"
  ],
  "statuses": null,
  "maxResultsPerZipStatus": null,
  "maxTotalResults": null,
  "includePropertyDetails": false,
  "maxPropertyDetails": 5,
  "includeMarketTrends": false,
  "marketHistoryMonths": 12,
  "minPrice": null,
  "maxPrice": null,
  "minBedrooms": null,
  "maxBedrooms": null,
  "minBathrooms": null,
  "maxBathrooms": null,
  "minLivingArea": null,
  "maxLivingArea": null,
  "minYearBuilt": null,
  "maxYearBuilt": null,
  "homeTypes": [],
  "openHousesOnly": false,
  "showcaseOnly": false,
  "sortOrder": "DEFAULT",
  "resultsLimit": null,
  "priceMin": null,
  "priceMax": null,
  "daysOnZillow": "",
  "forSaleByAgent": true,
  "forSaleByOwner": false,
  "forRent": false,
  "sold": false
}
```

| Field | Default | Meaning |
| --- | --- | --- |
| `zipCodes` | Required | Five-digit US ZIP codes. Preserve leading zeros. Duplicate ZIPs are searched once. |
| `statuses` | null | Optional legacy status selection. When set, it takes precedence over the sale/rent/sold checkboxes. |
| `maxResultsPerZipStatus` | null | Optional legacy per-ZIP/status ceiling. Null collects all matching properties, subject to the other requested limits. |
| `maxTotalResults` | null | Run-wide property cap. ZIP market records do not count toward it. ZIPs and statuses are processed in input order. |
| `includePropertyDetails` | false | Enrich the first properties with available facts, price/tax history, schools, scores and valuation history. |
| `maxPropertyDetails` | 5 | Run-wide maximum detail lookups when enabled. Null enriches every returned property. Other listings are retained with detailsStatus=limit_reached. |
| `includeMarketTrends` | false | Add one marketTrends Dataset record per ZIP with monthly inventory, sale metrics, temperature and available forecast. |
| `marketHistoryMonths` | 12 | Maximum latest monthly points per history series. Actual Zillow coverage can be shorter. |
| `minPrice` | No filter | Optional bound. Leave empty for no bound. |
| `maxPrice` | No filter | Optional bound. Leave empty for no bound. |
| `minBedrooms` | No filter | Optional bound. Leave empty for no bound. |
| `maxBedrooms` | No filter | Optional bound. Leave empty for no bound. |
| `minBathrooms` | No filter | Optional bound. Leave empty for no bound. |
| `maxBathrooms` | No filter | Optional bound. Leave empty for no bound. |
| `minLivingArea` | No filter | Optional bound. Leave empty for no bound. |
| `maxLivingArea` | No filter | Optional bound. Leave empty for no bound. |
| `minYearBuilt` | No filter | Optional bound. Leave empty for no bound. |
| `maxYearBuilt` | No filter | Optional bound. Leave empty for no bound. |
| `homeTypes` | \[] | Leave empty to include all property types. |
| `openHousesOnly` | false | Enabled returns listings with an open house. Disabled applies no open-house filter. |
| `showcaseOnly` | false | Enabled returns Showcase listings. Disabled applies no Showcase filter. |
| `sortOrder` | "DEFAULT" | Use Zillow default ranking or ascending/descending listing price. |
| `resultsLimit` | null | Maximum unique properties per ZIP across selected statuses. Null collects all available matches. Smaller legacy or run-wide limits still apply. |
| `priceMin` | null | Optional price bound in USD, monthly for rentals. Alias of minPrice; both must agree if supplied. |
| `priceMax` | null | Optional price bound in USD, monthly for rentals. Alias of maxPrice; both must agree if supplied. |
| `daysOnZillow` | "" | Maximum age of the listing; for sold searches, maximum days since sale. Month choices use 30 days per month. |
| `forSaleByAgent` | true | Select this listing category. Optional legacy statuses take precedence for choosing contexts. |
| `forSaleByOwner` | false | Select this listing category. Optional legacy statuses take precedence for choosing contexts. |
| `forRent` | false | Select this listing category. Optional legacy statuses take precedence for choosing contexts. |
| `sold` | false | Select this listing category. Optional legacy statuses take precedence for choosing contexts. |

`resultsLimit` applies per ZIP across the selected listing categories. Leave it empty to collect all available matches. Optional `maxTotalResults` applies across the whole run; `maxResultsPerZipStatus` is an additional legacy limit. Searches run in input order and properties are deduplicated by ZIP and `zpid`. The optional legacy `statuses` selection overrides the checkboxes for choosing categories; sale checkboxes still control agent/owner filtering within a sale search. `priceMin`/`priceMax` and `minPrice`/`maxPrice` are aliases and must agree when both are supplied. `daysOnZillow` filters listing age, or days since sale for sold searches; month choices use 30 days per month. Market records are collected for every ZIP when enabled, even after the property limit is reached. A disabled open-house or Showcase checkbox applies no filter. Empty home types and `null` range bounds apply no restriction. Duplicate ZIP codes are searched once.

Source restrictions can delay or stop collection. Previously saved rows remain available. Source availability and completeness are not guaranteed.

### Output

The Dataset supports property records and optional market records. Property records expose normalized fields at the top level: `listingPrice`, `listingSoldPrice`, `listingAddress`, `coordinates`, `listingStatus`, `propertyUrl`, `mainImage`, `listingPhotos`, `photoCount`, `broker`, property facts, valuations, changes and sold dates. Prices include `amount`, `currency` and `formatted`. Photo objects contain a source URL and a nullable caption. Nested `address`, `location`, `facts`, `listing`, `media`, `attribution` and `sourceInfo` remain available for existing integrations. `propertyDetails` is populated only for the selected enrichment budget. Its `detailsStatus` is `available`, `unavailable`, `limit_reached` or `not_requested`. An unavailable optional detail preserves the base listing. Matched Zillow search cards also supply `sourceSearchUrl`, `isZillowOwned` and, for applicable rentals, `isRentalWithBasePrice`. Video and 3D indicators use available source flags and media links. A valid video link establishes video availability even when another source flag is false; unavailable evidence remains null. Optional property details can fill missing valuations, county and availability dates. Coverage differs between listing sources: unmatched or unavailable fields remain null. A false indicator means an explicit negative source flag with no positive evidence in the collected data.

Market records use `recordType: marketTrends`. `latest` contains the newest available point in each historical series. `history.listing`, `history.sale` and `history.temperature` contain up to the requested number of monthly points, newest first. `forecast` is kept separate from historical observations. `scrapedAt` is the collection time; source observation dates are stored inside each monthly point.

`listingSoldPrice` contains the price reported by the source for a sold search. It is not independent verification of a transaction. `media.photoKeys` preserves asset identifiers; `listingPhotos` supplies the available photo URLs. Images are not downloaded into the Dataset. `isValid` means the property passed output field/type validation; it does not guarantee that every field is populated. When a property summary is unavailable, the search listing is retained and `error` states that limitation. Fields without source support remain null rather than being inferred. The collection summary is available through the **Collection summary** output link, including counts and searches with zero results.

These are complete Dataset items from a real successful run:

```json
[
  {
    "recordType": "marketTrends",
    "source": "Zillow",
    "zipCode": "10014",
    "regionId": 61628,
    "region": {
      "city": "New York",
      "state": "NY",
      "county": "New York County",
      "country": "United States",
      "location": {
        "latitude": 40.73285212602145,
        "longitude": -74.00725937977433
      }
    },
    "historyMonthsRequested": 1,
    "latest": {
      "listing": {
        "regionId": 61628,
        "timePeriodEnd": "2026-08-31",
        "forSaleInventory": 78.0,
        "newListings": 12.0,
        "newPending": 14.0,
        "medianDaysToPending": null
      },
      "sale": {
        "regionId": 61628,
        "timePeriodEnd": "2026-07-31",
        "pctSoldAboveList": null,
        "pctSoldBelowList": null,
        "medianSaleToList": null
      },
      "temperature": {
        "regionId": 61628,
        "timePeriodEnd": "2026-08-31",
        "marketTempIndex": 39.07133200253793,
        "marketTempLabel": "buyer",
        "marketTempLabelDescription": "Sellers outnumber buyers. Listing price cuts and concessions are common, but not automatic. Prices are generally flat."
      }
    },
    "history": {
      "listing": [
        {
          "regionId": 61628,
          "timePeriodEnd": "2026-08-31",
          "forSaleInventory": 78.0,
          "newListings": 12.0,
          "newPending": 14.0,
          "medianDaysToPending": null
        }
      ],
      "sale": [
        {
          "regionId": 61628,
          "timePeriodEnd": "2026-07-31",
          "pctSoldAboveList": null,
          "pctSoldBelowList": null,
          "medianSaleToList": null
        }
      ],
      "temperature": [
        {
          "regionId": 61628,
          "timePeriodEnd": "2026-08-31",
          "marketTempIndex": 39.07133200253793,
          "marketTempLabel": "buyer",
          "marketTempLabelDescription": "Sellers outnumber buyers. Listing price cuts and concessions are common, but not automatic. Prices are generally flat."
        }
      ]
    },
    "forecast": [
      {
        "regionId": 61628,
        "timePeriodEnd": "2027-08-31",
        "growthCumulative": 0.040038489884308255
      }
    ],
    "scrapedAt": "2026-09-30T15:22:26Z"
  },
  {
    "recordType": "property",
    "source": "Zillow",
    "zipCode": "10014",
    "regionId": 61628,
    "zpid": "31497694",
    "search": {
      "context": "FOR_SALE",
      "totalMatchingCount": 200,
      "requestedLimit": 1,
      "limited": true
    },
    "address": {
      "__typename": "FormattedPropertyAddress",
      "line1": "201 W Houston St",
      "line2": "New York, NY 10014",
      "city": "New York",
      "stateOrProvince": "NY",
      "postalCode": "10014"
    },
    "location": {
      "__typename": "SearchProperty_LocationRecord",
      "latitude": 40.728302,
      "longitude": -74.00403,
      "subdivisionName": null
    },
    "facts": {
      "bedrooms": 4,
      "bathrooms": 4.0,
      "livingAreaSquareFeet": 3000,
      "yearBuilt": 1899,
      "homeType": "MULTI_FAMILY",
      "lotSizeSquareFeet": null,
      "lotSizeAcres": null,
      "isNewConstruction": false
    },
    "listing": {
      "status": "ACTIVE",
      "listingType": "FOR_SALE",
      "listPrice": 5995000.0,
      "currency": "USD",
      "daysOnMarket": 22,
      "pricePerSquareFoot": 1998,
      "priceChange": null,
      "hasOpenHouse": false,
      "openHouses": [],
      "isShowcaseListing": false,
      "onMarketEpochTimestamp": 1788825600000,
      "zestimate": 5917100,
      "rentZestimate": null,
      "lastSale": {
        "lastSoldDate": null
      },
      "rental": {
        "marketingTreatments": null,
        "areApplicationsAccepted": null,
        "listPriceIncludesRequiredMonthlyFees": null,
        "providerListingId": null,
        "totalRequiredMonthlyMinFee": null,
        "totalRequiredMonthlyMaxFee": null,
        "RoomForRent": null
      },
      "providerCategory": "MLS",
      "palsId": "6955001_S1843110"
    },
    "media": {
      "photoKeys": [
        "0f1f3fd5d453f4b1ea1b656fff467b77",
        "0b25274bd748e70563fd4bfc86c8484e",
        "ed882d707a9b53980354c524f245127e",
        "553316774066de9e32f94d329be86a98",
        "4b4022e3a35ab26dd82b4f5110339727",
        "99d186c3dce65c26c1fc6d7ced5c866d",
        "0cb25dc840dd11fcca31a9e07c4227b9",
        "888d417bd019e48d5accb2435a6cff11",
        "f8db5685c47587c1f92d083bb2045690",
        "67579717bd7e57dffd662ca68c885d4f",
        "d1b180c4dea5f165ed293296dd839b83",
        "3c920ca7c31bdea73e092c1f6d6f9acd",
        "a4721a5fa1d3325fa162ed9fec01e027",
        "c98580281243bcd8c76af2e4c9975ac4",
        "7bfa0d322923cbf9fe8c42d29940e349",
        "ecca04f488ab2a35517844b6f3106e22",
        "7c96fb9b6a793b9af06d9ea75584b685",
        "3d75b2586d6984cb7aaa34df3e55f7c6",
        "ca701d646ba68f6df04df4945cd1ec18",
        "c306c753d69d85a29ac34cfe57745c99",
        "8e8611e95b1dd43934af4c1a27e8a31e",
        "0abf319d1925c948eb96ae98d02e2986",
        "efa6523eda7dad10ff6d6eef13552ed3",
        "2157ed46b3e757efa0258712c51d42b6",
        "5e0799d2558996e30ec6980e086d1f5d",
        "ab124fda325bf17ec0b4dbb503e30160",
        "721b1c203f19f1a746a55b5fc24e680d",
        "b2f414f91b1dfdf2adeb71edd1d10798",
        "e88e7dac1f664baef027c12fcef7344b",
        "f20f9ed4c849fb48e7a76ee8d47b7868",
        "5bd4935c844e091a8d6f28ea979b37cb",
        "405ebbe8a5685fdb3efa96fc6ba5af50",
        "135ff60ce13a497cb5d3899f27450eea",
        "2ecdc944d82d1c5387b96eee6b0811fb",
        "f1048a2fbd142ee0f49cb7ebf6b42e76",
        "ec8739d91490b216af38848b0a265afe"
      ],
      "photoFallbackUrl": null,
      "video": null,
      "hasVideos": false,
      "hasVRModel": false,
      "hasFloorPlan": false,
      "richMediaVideos": null
    },
    "attribution": {
      "canShowAddress": true,
      "canShowOnMap": true,
      "mustDisplayLotSizeInAcres": false,
      "justAgentNameIfRequired": null,
      "agentPhoneIfRequired": null,
      "mlsIdIfRequired": null,
      "mlsNameIfRequired": null,
      "mlsStatusIfRequired": "Active",
      "brokerNameIfRequired": "Listing by: Compass",
      "brokerPhoneIfRequired": null,
      "builderNameIfRequired": null,
      "soldByOfficeNameIfRequired": null,
      "providerLogoIfRequired": null,
      "mapCardAttribution": {
        "brokerNameIfRequired": null,
        "mlsIdIfRequired": null,
        "providerLogoIfRequired": null
      }
    },
    "propertyDetails": null,
    "detailsStatus": "not_requested",
    "scrapedAt": "2026-09-30T15:22:27Z",
    "sourceInfo": {
      "providerInfo": [
        {
          "ssid": 6955,
          "disclaimer": "",
          "providerLogo": null
        }
      ],
      "limitedListingCoverageInfo": null,
      "highRestrictedListingRate": false,
      "propertySearchResultMetadata": {
        "searchTitle": null,
        "searchDescription": null
      }
    },
    "listingPrice": {
      "amount": 5995000.0,
      "currency": "USD",
      "formatted": "$5,995,000"
    },
    "listingSoldPrice": null,
    "listingAddress": {
      "street": "201 W Houston St",
      "unit": null,
      "city": "New York",
      "state": "NY",
      "zipCode": "10014",
      "county": null,
      "country": "USA",
      "neighborhood": null,
      "subdivision": null,
      "communityName": null,
      "timeZone": "America/New_York",
      "full": "201 W Houston St, New York, NY 10014"
    },
    "coordinates": {
      "latitude": 40.728302,
      "longitude": -74.00403
    },
    "listingStatus": "forSale",
    "propertyUrl": "https://www.zillow.com/homedetails/201-W-Houston-St-New-York-NY-10014/31497694_zpid/",
    "cardType": "home",
    "homeType": "MULTI_FAMILY",
    "listingType": {
      "isFSBA": true,
      "isFSBO": false,
      "isComingSoon": false,
      "isPending": false,
      "isOpenHouse": false,
      "isNewHome": false,
      "isForAuction": false,
      "isForeclosure": false,
      "isBankOwned": false,
      "contingencyType": null
    },
    "priceChange": null,
    "priceChangedAt": null,
    "priceReduction": null,
    "bedrooms": 4,
    "bathrooms": 4.0,
    "livingArea": 3000,
    "livingAreaUnit": "sqft",
    "lotArea": null,
    "daysOnZillow": 22,
    "rentZestimate": null,
    "taxAssessedValue": 7232000,
    "mainImage": "https://photos.zillowstatic.com/fp/0f1f3fd5d453f4b1ea1b656fff467b77-p_f.jpg",
    "listingPhotos": [
      {
        "url": "https://photos.zillowstatic.com/fp/0f1f3fd5d453f4b1ea1b656fff467b77-p_d.jpg",
        "caption": null
      },
      {
        "url": "https://photos.zillowstatic.com/fp/0b25274bd748e70563fd4bfc86c8484e-p_d.jpg",
        "caption": null
      },
      {
        "url": "https://photos.zillowstatic.com/fp/ed882d707a9b53980354c524f245127e-p_d.jpg",
        "caption": null
      },
      {
        "url": "https://photos.zillowstatic.com/fp/553316774066de9e32f94d329be86a98-p_d.jpg",
        "caption": null
      },
      {
        "url": "https://photos.zillowstatic.com/fp/4b4022e3a35ab26dd82b4f5110339727-p_d.jpg",
        "caption": null
      },
      {
        "url": "https://photos.zillowstatic.com/fp/99d186c3dce65c26c1fc6d7ced5c866d-p_d.jpg",
        "caption": null
      },
      {
        "url": "https://photos.zillowstatic.com/fp/0cb25dc840dd11fcca31a9e07c4227b9-p_d.jpg",
        "caption": null
      },
      {
        "url": "https://photos.zillowstatic.com/fp/888d417bd019e48d5accb2435a6cff11-p_d.jpg",
        "caption": null
      },
      {
        "url": "https://photos.zillowstatic.com/fp/f8db5685c47587c1f92d083bb2045690-p_d.jpg",
        "caption": null
      },
      {
        "url": "https://photos.zillowstatic.com/fp/67579717bd7e57dffd662ca68c885d4f-p_d.jpg",
        "caption": null
      },
      {
        "url": "https://photos.zillowstatic.com/fp/d1b180c4dea5f165ed293296dd839b83-p_d.jpg",
        "caption": null
      },
      {
        "url": "https://photos.zillowstatic.com/fp/3c920ca7c31bdea73e092c1f6d6f9acd-p_d.jpg",
        "caption": null
      },
      {
        "url": "https://photos.zillowstatic.com/fp/a4721a5fa1d3325fa162ed9fec01e027-p_d.jpg",
        "caption": null
      },
      {
        "url": "https://photos.zillowstatic.com/fp/c98580281243bcd8c76af2e4c9975ac4-p_d.jpg",
        "caption": null
      },
      {
        "url": "https://photos.zillowstatic.com/fp/7bfa0d322923cbf9fe8c42d29940e349-p_d.jpg",
        "caption": null
      },
      {
        "url": "https://photos.zillowstatic.com/fp/ecca04f488ab2a35517844b6f3106e22-p_d.jpg",
        "caption": null
      },
      {
        "url": "https://photos.zillowstatic.com/fp/7c96fb9b6a793b9af06d9ea75584b685-p_d.jpg",
        "caption": null
      },
      {
        "url": "https://photos.zillowstatic.com/fp/3d75b2586d6984cb7aaa34df3e55f7c6-p_d.jpg",
        "caption": null
      },
      {
        "url": "https://photos.zillowstatic.com/fp/ca701d646ba68f6df04df4945cd1ec18-p_d.jpg",
        "caption": null
      },
      {
        "url": "https://photos.zillowstatic.com/fp/c306c753d69d85a29ac34cfe57745c99-p_d.jpg",
        "caption": null
      },
      {
        "url": "https://photos.zillowstatic.com/fp/8e8611e95b1dd43934af4c1a27e8a31e-p_d.jpg",
        "caption": null
      },
      {
        "url": "https://photos.zillowstatic.com/fp/0abf319d1925c948eb96ae98d02e2986-p_d.jpg",
        "caption": null
      },
      {
        "url": "https://photos.zillowstatic.com/fp/efa6523eda7dad10ff6d6eef13552ed3-p_d.jpg",
        "caption": null
      },
      {
        "url": "https://photos.zillowstatic.com/fp/2157ed46b3e757efa0258712c51d42b6-p_d.jpg",
        "caption": null
      },
      {
        "url": "https://photos.zillowstatic.com/fp/5e0799d2558996e30ec6980e086d1f5d-p_d.jpg",
        "caption": null
      },
      {
        "url": "https://photos.zillowstatic.com/fp/ab124fda325bf17ec0b4dbb503e30160-p_d.jpg",
        "caption": null
      },
      {
        "url": "https://photos.zillowstatic.com/fp/721b1c203f19f1a746a55b5fc24e680d-p_d.jpg",
        "caption": null
      },
      {
        "url": "https://photos.zillowstatic.com/fp/b2f414f91b1dfdf2adeb71edd1d10798-p_d.jpg",
        "caption": null
      },
      {
        "url": "https://photos.zillowstatic.com/fp/e88e7dac1f664baef027c12fcef7344b-p_d.jpg",
        "caption": null
      },
      {
        "url": "https://photos.zillowstatic.com/fp/f20f9ed4c849fb48e7a76ee8d47b7868-p_d.jpg",
        "caption": null
      },
      {
        "url": "https://photos.zillowstatic.com/fp/5bd4935c844e091a8d6f28ea979b37cb-p_d.jpg",
        "caption": null
      },
      {
        "url": "https://photos.zillowstatic.com/fp/405ebbe8a5685fdb3efa96fc6ba5af50-p_d.jpg",
        "caption": null
      },
      {
        "url": "https://photos.zillowstatic.com/fp/135ff60ce13a497cb5d3899f27450eea-p_d.jpg",
        "caption": null
      },
      {
        "url": "https://photos.zillowstatic.com/fp/2ecdc944d82d1c5387b96eee6b0811fb-p_d.jpg",
        "caption": null
      },
      {
        "url": "https://photos.zillowstatic.com/fp/f1048a2fbd142ee0f49cb7ebf6b42e76-p_d.jpg",
        "caption": null
      },
      {
        "url": "https://photos.zillowstatic.com/fp/ec8739d91490b216af38848b0a265afe-p_d.jpg",
        "caption": null
      }
    ],
    "photoCount": 36,
    "broker": {
      "name": "Compass",
      "phoneNumber": null,
      "buyerBrokerName": null,
      "buyerAgentName": null
    },
    "marketingTagline": "Sleek finishes",
    "openHouse": null,
    "sourceSearchUrl": "https://www.zillow.com/homes/10014_rb/?searchQueryState=%7B%22usersSearchTerm%22%3A%2210014%22%2C%22regionSelection%22%3A%5B%7B%22regionId%22%3A61628%2C%22regionType%22%3A7%7D%5D%2C%22filterState%22%3A%7B%22isForSaleByAgent%22%3A%7B%22value%22%3Atrue%7D%2C%22isForSaleByOwner%22%3A%7B%22value%22%3Afalse%7D%2C%22isForRent%22%3A%7B%22value%22%3Afalse%7D%2C%22isRecentlySold%22%3A%7B%22value%22%3Afalse%7D%2C%22isNewConstruction%22%3A%7B%22value%22%3Atrue%7D%2C%22isComingSoon%22%3A%7B%22value%22%3Atrue%7D%2C%22isAuction%22%3A%7B%22value%22%3Atrue%7D%2C%22isForSaleForeclosure%22%3A%7B%22value%22%3Atrue%7D%2C%22isPendingListingsSelected%22%3A%7B%22value%22%3Atrue%7D%2C%22isPreMarketForeclosure%22%3A%7B%22value%22%3Afalse%7D%2C%22isPreMarketPreForeclosure%22%3A%7B%22value%22%3Afalse%7D%2C%22sortSelection%22%3A%7B%22value%22%3A%22globalrelevanceex%22%7D%7D%2C%22pagination%22%3A%7B%22currentPage%22%3A1%7D%2C%22isMapVisible%22%3Atrue%2C%22isListVisible%22%3Atrue%2C%22mapBounds%22%3A%7B%22west%22%3A-74.017978%2C%22east%22%3A-73.999555%2C%22south%22%3A40.702035%2C%22north%22%3A40.742862%7D%7D",
    "dateSold": null,
    "cardHighlight": "homeInsight",
    "priceIncludesMonthlyFees": null,
    "isRentalWithBasePrice": null,
    "isValid": true,
    "hasImage": true,
    "isZillowOwned": false,
    "zestimate": 5917100,
    "has3DModel": false,
    "hasVideo": false,
    "availabilityDate": null,
    "factsAndFeatures": {
      "fullBathroomCount": 4,
      "halfBathroomCount": 0,
      "hasFireplace": null,
      "hasAirConditioning": null,
      "hasSpa": null,
      "hasPool": null
    },
    "marketingTreatments": [],
    "units": null,
    "error": null
  }
]
```

### Pricing

This Actor uses one pay-per-event charge, `apify-default-dataset-item`, for each item written to its default Dataset. A property is charged once; optional property details are included in that same property item and do not add another event. If `includeMarketTrends` is enabled, each separate `marketTrends` item is also one billable result. Runs that write no Dataset items have no result charge, and there is no separate run-start charge.

| Apify plan | Price per Dataset item | Equivalent per 1,000 Dataset items |
| --- | ---: | ---: |
| Free (FREE) | $0.0024 | $2.40 |
| Starter (BRONZE) | $0.0019 | $1.90 |
| Scale (SILVER) | $0.0015 | $1.50 |
| Business (GOLD) | $0.0010 | $1.00 |
| Platinum (PLATINUM) | $0.0010 | $1.00 |
| Diamond (DIAMOND) | $0.0010 | $1.00 |

The actual charge is per Dataset item; the per-1,000 amounts are comparison equivalents. BRONZE, SILVER and GOLD are $0.10 less per 1,000 Dataset items than the MaxCopell ZIP-search reference. The current Actor pricing configuration records PLATINUM and DIAMOND at the GOLD rate.

### Related Actors

| Actor | Best for |
| --- | --- |
| [Realtor.com US Property Listings Scraper](https://apify.com/datascraperes/realtor-property-search) | US sale, rental and sold property searches on Realtor.com. |
| [Fotocasa Spain Property Listings Scraper](https://apify.com/datascraperes/fotocasa-property-search-scraper) | Spanish sale and rental property searches on Fotocasa. |
| [Idealista Property Listings Scraper | Sale & Rent](https://apify.com/datascraperes/idealista-property-search-scraper) | Sale and rental property listings on Idealista. |

### Limits and data quality

Already collected listings remain available if collection is interrupted, including listings awaiting optional details. Review the run status before treating its Dataset as a complete collection.

- Accepts a non-empty list of five-digit US ZIP strings; there is no fixed ten-ZIP ceiling. City names, map bounds and property URLs are not inputs.
- There is no fixed 1,000-property ceiling. Collection continues until the requested limits or available matches are reached. Very large searches or many listings sharing the same price can exceed source coverage; an incomplete exhaustive search stops with a partial collection summary while earlier rows remain available. An unlimited collection can take longer and use more resources. Set a result limit for a predictable batch.
- `maxPropertyDetails` bounds optional enrichment; null selects every returned property. The source may omit summaries, details or individual fields. Empty source values remain null or empty arrays.
- Requests up to 120 monthly history points per series. Available coverage differs by ZIP and metric; missing values stay `null` and short or empty histories are preserved.
- Zillow's source coverage, restrictions and attribution are retained in `sourceInfo` and `attribution`. Preserve relevant attribution when redisplaying listings.
- Monthly market observations can lag collection time. Zestimate values and market forecasts are source estimates.
- Temporary source unavailability ends collection gracefully and preserves saved results. Check `RUN-SUMMARY`: `collectionComplete` is false and `status` is `partial` when requested searches could not finish. A successful execution status alone does not mean the collection is complete.
- Reaching the run spending allowance stops further delivery with `status` set to `budget_limited`. A result limit and a spending allowance can end collection at different counts.
- Invalid inputs, incompatible saved state and unconfirmed output delivery still require attention and can fail the run. These conditions are never reported as a complete collection.

### Frequently asked questions

#### Can I collect rentals and sold properties?

Yes. Enable `forRent` or `sold`. Use `forSaleByAgent` and `forSaleByOwner` to select sale categories. Each selected category is searched independently. Sold results reflect Zillow's available listing data and are not a complete public-record sales database.

#### Do I need property enrichment for ZIP market history?

No. `includeMarketTrends` controls ZIP records independently of `includePropertyDetails`. Disable property details for listing-only research, or enable them for a bounded selection of properties.

#### Are property details additional Dataset records?

No. Each successful detail lookup enriches an existing property in `propertyDetails`. The detail count is the number of enriched properties, not extra listings. `maxPropertyDetails` applies to the whole run; remaining listings retain their search data. Market trends are separate records.

#### Why are some fields empty?

The source does not supply every field for every listing or region. Missing facts, schools, histories, media and estimates remain `null` or empty. The Actor does not infer missing source values. Normalized price/date formatting and boolean listing indicators are derived from the returned source fields.

#### How do I search a ZIP beginning with zero?

Use a string such as `"02116"`. Numeric ZIP values are rejected because they lose leading zeros.

### Responsible use

Use the collected data only for purposes you are authorized to perform. Respect Zillow's applicable terms, data licenses and source attribution, and handle any public listing contact information appropriately. This Actor is not affiliated with or endorsed by Zillow.

### Support

Report a reproducible issue through the Actor's **Issues** tab. Include the input, expected result and the affected run link, without sharing credentials or private information.

# Actor input Schema

## `zipCodes` (type: `array`):

Five-digit US ZIP codes. Preserve leading zeros. Duplicate ZIPs are searched once.

## `statuses` (type: `array`):

Optional legacy status selection. When set, it takes precedence over the sale/rent/sold checkboxes.

## `maxResultsPerZipStatus` (type: `integer`):

Optional legacy per-ZIP/status ceiling. Null collects all matching properties, subject to the other requested limits.

## `maxTotalResults` (type: `integer`):

Run-wide property cap. ZIP market records do not count toward it. ZIPs and statuses are processed in input order.

## `includePropertyDetails` (type: `boolean`):

Enrich the first properties with available facts, price/tax history, schools, scores and valuation history.

## `maxPropertyDetails` (type: `integer`):

Run-wide maximum detail lookups when enabled. Null enriches every returned property. Other listings are retained with detailsStatus=limit_reached.

## `includeMarketTrends` (type: `boolean`):

Add one marketTrends Dataset record per ZIP with monthly inventory, sale metrics, temperature and available forecast.

## `marketHistoryMonths` (type: `integer`):

Maximum latest monthly points per history series. Actual Zillow coverage can be shorter.

## `minPrice` (type: `integer`):

Optional bound. Leave empty for no bound.

## `maxPrice` (type: `integer`):

Optional bound. Leave empty for no bound.

## `minBedrooms` (type: `integer`):

Optional bound. Leave empty for no bound.

## `maxBedrooms` (type: `integer`):

Optional bound. Leave empty for no bound.

## `minBathrooms` (type: `number`):

Optional bound. Leave empty for no bound.

## `maxBathrooms` (type: `number`):

Optional bound. Leave empty for no bound.

## `minLivingArea` (type: `integer`):

Optional bound. Leave empty for no bound.

## `maxLivingArea` (type: `integer`):

Optional bound. Leave empty for no bound.

## `minYearBuilt` (type: `integer`):

Optional bound. Leave empty for no bound.

## `maxYearBuilt` (type: `integer`):

Optional bound. Leave empty for no bound.

## `homeTypes` (type: `array`):

Leave empty to include all property types.

## `openHousesOnly` (type: `boolean`):

Enabled returns listings with an open house. Disabled applies no open-house filter.

## `showcaseOnly` (type: `boolean`):

Enabled returns Showcase listings. Disabled applies no Showcase filter.

## `sortOrder` (type: `string`):

Use Zillow default ranking or ascending/descending listing price.

## `resultsLimit` (type: `integer`):

Maximum unique properties per ZIP across selected statuses. Null collects all available matches. Smaller legacy or run-wide limits still apply.

## `priceMin` (type: `integer`):

Optional price bound in USD, monthly for rentals. Alias of minPrice; both must agree if supplied.

## `priceMax` (type: `integer`):

Optional price bound in USD, monthly for rentals. Alias of maxPrice; both must agree if supplied.

## `daysOnZillow` (type: `string`):

Maximum age of the listing; for sold searches, maximum days since sale. Month choices use 30 days per month.

## `forSaleByAgent` (type: `boolean`):

Select this listing category. Optional legacy statuses take precedence for choosing contexts.

## `forSaleByOwner` (type: `boolean`):

Select this listing category. Optional legacy statuses take precedence for choosing contexts.

## `forRent` (type: `boolean`):

Select this listing category. Optional legacy statuses take precedence for choosing contexts.

## `sold` (type: `boolean`):

Select this listing category. Optional legacy statuses take precedence for choosing contexts.

## Actor input object example

```json
{
  "zipCodes": [
    "10014"
  ],
  "statuses": [
    "FOR_SALE"
  ],
  "maxResultsPerZipStatus": 25,
  "maxTotalResults": 100,
  "includePropertyDetails": false,
  "maxPropertyDetails": 5,
  "includeMarketTrends": false,
  "marketHistoryMonths": 12,
  "maxPrice": 1000000000,
  "maxBedrooms": 100,
  "maxBathrooms": 100,
  "maxLivingArea": 1000000,
  "minYearBuilt": 1000,
  "maxYearBuilt": 2100,
  "homeTypes": [],
  "openHousesOnly": false,
  "showcaseOnly": false,
  "sortOrder": "DEFAULT",
  "resultsLimit": 10,
  "priceMin": null,
  "priceMax": 1000000000,
  "daysOnZillow": "",
  "forSaleByAgent": true,
  "forSaleByOwner": false,
  "forRent": false,
  "sold": false
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

## `summary` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "zipCodes": [
        "10014"
    ],
    "statuses": [
        "FOR_SALE"
    ],
    "maxResultsPerZipStatus": 25,
    "maxTotalResults": 100,
    "includePropertyDetails": false,
    "maxPropertyDetails": 5,
    "includeMarketTrends": false,
    "marketHistoryMonths": 12,
    "minPrice": 0,
    "maxPrice": 1000000000,
    "minBedrooms": 0,
    "maxBedrooms": 100,
    "minBathrooms": 0,
    "maxBathrooms": 100,
    "minLivingArea": 0,
    "maxLivingArea": 1000000,
    "minYearBuilt": 1000,
    "maxYearBuilt": 2100,
    "homeTypes": [],
    "openHousesOnly": false,
    "showcaseOnly": false,
    "sortOrder": "DEFAULT",
    "resultsLimit": 10,
    "priceMin": 0,
    "priceMax": 1000000000,
    "daysOnZillow": "",
    "forSaleByAgent": true,
    "forSaleByOwner": false,
    "forRent": false,
    "sold": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("datascraperes/zillow-zip-code-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "zipCodes": ["10014"],
    "statuses": ["FOR_SALE"],
    "maxResultsPerZipStatus": 25,
    "maxTotalResults": 100,
    "includePropertyDetails": False,
    "maxPropertyDetails": 5,
    "includeMarketTrends": False,
    "marketHistoryMonths": 12,
    "minPrice": 0,
    "maxPrice": 1000000000,
    "minBedrooms": 0,
    "maxBedrooms": 100,
    "minBathrooms": 0,
    "maxBathrooms": 100,
    "minLivingArea": 0,
    "maxLivingArea": 1000000,
    "minYearBuilt": 1000,
    "maxYearBuilt": 2100,
    "homeTypes": [],
    "openHousesOnly": False,
    "showcaseOnly": False,
    "sortOrder": "DEFAULT",
    "resultsLimit": 10,
    "priceMin": 0,
    "priceMax": 1000000000,
    "daysOnZillow": "",
    "forSaleByAgent": True,
    "forSaleByOwner": False,
    "forRent": False,
    "sold": False,
}

# Run the Actor and wait for it to finish
run = client.actor("datascraperes/zillow-zip-code-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "zipCodes": [
    "10014"
  ],
  "statuses": [
    "FOR_SALE"
  ],
  "maxResultsPerZipStatus": 25,
  "maxTotalResults": 100,
  "includePropertyDetails": false,
  "maxPropertyDetails": 5,
  "includeMarketTrends": false,
  "marketHistoryMonths": 12,
  "minPrice": 0,
  "maxPrice": 1000000000,
  "minBedrooms": 0,
  "maxBedrooms": 100,
  "minBathrooms": 0,
  "maxBathrooms": 100,
  "minLivingArea": 0,
  "maxLivingArea": 1000000,
  "minYearBuilt": 1000,
  "maxYearBuilt": 2100,
  "homeTypes": [],
  "openHousesOnly": false,
  "showcaseOnly": false,
  "sortOrder": "DEFAULT",
  "resultsLimit": 10,
  "priceMin": 0,
  "priceMax": 1000000000,
  "daysOnZillow": "",
  "forSaleByAgent": true,
  "forSaleByOwner": false,
  "forRent": false,
  "sold": false
}' |
apify call datascraperes/zillow-zip-code-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,datascraperes/zillow-zip-code-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/QItF1c04vlFUhAFsB/builds/npbPDomUv0pFnfBZx/openapi.json
