# Zillow Search Scraper | Filtered Search URLs (`datascraperes/zillow-search-url-scraper`) Actor

Scrape Zillow sale, rental and sold listings from filtered search URLs. Export available prices, addresses, home facts, Zestimates and photos as JSON, CSV or Excel. Choose pagination, map samples or map subdivision, with unique-property limits per search and across the run.

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

## Pricing

from $1.00 / 1,000 property 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

Extract property listings from **filtered Zillow search URLs**. Keep your map area and search filters, then export unique properties with prices, addresses, home facts, estimates and available photos. This unofficial tool is not affiliated with Zillow.

### What this Actor does

Collects available property search cards using pagination, visible map markers or adaptive subdivision of dense map areas. Sale, rental and sold searches are selected through the Zillow URL. Full property-detail pages and monthly market trends are outside this Actor's scope.

### Use cases

- Monitor inventory within a selected map area and price range.
- Export matching listings for property comparison.
- Collect a small map sample or a larger paginated collection.

### How to use

1. Open Zillow, select an area and apply your filters.
2. Move the map until the URL contains `searchQueryState` with `mapBounds`.
3. Paste that complete URL into `searchUrls` and select the method and limits.
4. Start the Actor and open its Dataset to export JSON, CSV, Excel or other supported formats.

### Input

Provide 1–50 HTTPS Zillow search URLs containing `searchQueryState` and rectangular `mapBounds`. Each entry can be a URL string or an object containing `url`. Duplicate searches are merged. Collection starts at page one. Other search-state values, including filters and region constraints, are retained.

| Field | Default | Behavior |
|---|---|---|
| `searchUrls` | Required | Filtered search URLs; plain city, ZIP and property-detail URLs are not accepted. |
| `extractionMethod` | `PAGINATION_WITH_ZOOM_IN` | Map subdivision, visible-window pagination or a map-marker sample. |
| `resultsLimit` | 100 | Maximum new unique properties per URL, from 1 to 100,000. |
| `maxTotalResults` | 1,000 | Maximum unique properties across the run, from 1 to 100,000. |

Properties delivered for an earlier URL are skipped and do not count again toward a later URL's new-property limit. The global limit stops collection across all URLs. Limits are ceilings, not guarantees that enough listings exist.

Complete input example:

```json
{
  "searchUrls": [
    {
      "url": "https://www.zillow.com/homes/for_sale/?searchQueryState=%7B%22mapBounds%22%3A%7B%22west%22%3A-74.02%2C%22east%22%3A-73.99%2C%22south%22%3A40.72%2C%22north%22%3A40.75%7D%2C%22isMapVisible%22%3Atrue%2C%22isListVisible%22%3Atrue%2C%22pagination%22%3A%7B%22currentPage%22%3A1%7D%2C%22filterState%22%3A%7B%22isForRent%22%3A%7B%22value%22%3Afalse%7D%2C%22isRecentlySold%22%3A%7B%22value%22%3Afalse%7D%2C%22isForSaleByAgent%22%3A%7B%22value%22%3Atrue%7D%2C%22isForSaleByOwner%22%3A%7B%22value%22%3Atrue%7D%7D%7D"
    }
  ],
  "extractionMethod": "PAGINATION_WITH_ZOOM_IN",
  "resultsLimit": 10,
  "maxTotalResults": 10
}
```

Choose the extraction method according to the coverage you need:

| Method | Coverage per search URL |
|---|---|
| `PAGINATION_WITH_ZOOM_IN` | Searches smaller map areas while keeping your filters. Can collect beyond the single pagination window; larger searches take more work and may still remain partial. |
| `PAGINATION` | The visible result window, typically up to 20 pages of about 41 search cards: **about 820 cards**. Stops with a partial summary when that window restricts the search. |
| `MAP_MARKERS` | One map sample of **up to about 500 cards**. Provides a sample, not every matching property. |

These are approximate source windows, not guaranteed property counts or permanent Zillow limits. Valid unique properties can be fewer than the card count because grouped buildings, recommendations and cards without an individual property ZPID are excluded. Increasing `resultsLimit` or `maxTotalResults` does not expand the pagination window or marker sample. Use map subdivision for broader coverage, or provide smaller search areas; an exhaustive inventory is never guaranteed.

### Output

Each Dataset item represents one unique property ZPID across the run. `sourceSearchUrl` identifies the first search that delivered it. Missing information remains `null`. Photos and listing facts depend on what Zillow supplies in its search cards. This is a complete item from a real collection using the input above:

```json
{
  "zpid": "465691491",
  "propertyUrl": "https://www.zillow.com/homedetails/719-Greenwich-St-PENTHOUSE-New-York-NY-10014/465691491_zpid/",
  "address": "719 Greenwich St #Penthouse, New York, NY 10014",
  "streetAddress": "719 Greenwich St #Penthouse",
  "city": "New York",
  "state": "NY",
  "zipCode": "10014",
  "latitude": 40.734596,
  "longitude": -74.00683,
  "price": 10500000,
  "priceFormatted": "$10,500,000",
  "currency": "USD",
  "listingStatus": "FOR_SALE",
  "statusText": "Active",
  "homeType": "CONDO",
  "bedrooms": 4,
  "bathrooms": 2.0,
  "livingArea": 3060,
  "lotAreaValue": null,
  "lotAreaUnit": null,
  "zestimate": 10288900,
  "rentZestimate": null,
  "daysOnZillow": 21,
  "brokerName": "Listing by: Compass",
  "mainImage": "https://photos.zillowstatic.com/fp/ab1d5f7a50836dde7861c4bdd2ef808d-p_e.jpg",
  "photos": [
    "https://photos.zillowstatic.com/fp/ab1d5f7a50836dde7861c4bdd2ef808d-p_e.jpg",
    "https://photos.zillowstatic.com/fp/853086bda549d0eea35ee172a33186d3-p_e.jpg",
    "https://photos.zillowstatic.com/fp/7e82eb67ac7c0ab1d3eb859bce797d97-p_e.jpg",
    "https://photos.zillowstatic.com/fp/b7d2334d60238bda874df70fc29752b6-p_e.jpg",
    "https://photos.zillowstatic.com/fp/7a627e763f605e623029e075601afa07-p_e.jpg",
    "https://photos.zillowstatic.com/fp/a335bbc8a23e83303ad961d0c0a1317c-p_e.jpg",
    "https://photos.zillowstatic.com/fp/943ef5d0dc268f501923df9f00a96f09-p_e.jpg",
    "https://photos.zillowstatic.com/fp/2c627d4fe142b3994ba54a91de32af53-p_e.jpg",
    "https://photos.zillowstatic.com/fp/979bd3a837473f47db3c8ec49e588532-p_e.jpg",
    "https://photos.zillowstatic.com/fp/6c16b80a46d36e542effd0f73e7bc1bc-p_e.jpg",
    "https://photos.zillowstatic.com/fp/0688c36efd29bec1b85c80eef2b47345-p_e.jpg",
    "https://photos.zillowstatic.com/fp/0d1ea0e9cf330ab85b773e87fcd46a51-p_e.jpg",
    "https://photos.zillowstatic.com/fp/726f045495938eb8cdf5ded11b6d83aa-p_e.jpg"
  ],
  "openHouse": null,
  "listingType": {
    "is_FSBA": true
  },
  "sourceSearchUrl": "https://www.zillow.com/homes/for_sale/?searchQueryState=%7B%22mapBounds%22%3A%7B%22west%22%3A-74.02%2C%22east%22%3A-73.99%2C%22south%22%3A40.72%2C%22north%22%3A40.75%7D%2C%22isMapVisible%22%3Atrue%2C%22isListVisible%22%3Atrue%2C%22pagination%22%3A%7B%22currentPage%22%3A1%7D%2C%22filterState%22%3A%7B%22isForRent%22%3A%7B%22value%22%3Afalse%7D%2C%22isRecentlySold%22%3A%7B%22value%22%3Afalse%7D%2C%22isForSaleByAgent%22%3A%7B%22value%22%3Atrue%7D%2C%22isForSaleByOwner%22%3A%7B%22value%22%3Atrue%7D%7D%7D",
  "extractionMethod": "PAGINATION_WITH_ZOOM_IN",
  "scrapedAt": "2026-10-21T17:57:01.531524+00:00"
}
```

The collection summary reports how many properties were saved and whether collection completed, reached a requested limit, returned a map sample or remained partial. Saved properties remain available when a search cannot finish. Valid searches can return no properties.

### Pricing

You pay for each unique property successfully delivered to the default Dataset. Pricing uses pay-per-event billing. Duplicates, empty results and collection summaries are not separate property results.

| Apify plan | Price per property | Equivalent per 1,000 properties |
|---|---:|---:|
| FREE | $0.0024 | $2.40 |
| BRONZE | $0.0019 | $1.90 |
| SILVER | $0.0015 | $1.50 |
| GOLD | $0.0010 | $1.00 |
| PLATINUM | $0.0010 | $1.00 |
| DIAMOND | $0.0010 | $1.00 |

Apify applies the price associated with your plan. See the Pricing tab for the current rates before running.

### Related Actors

| Actor | Best for |
|---|---|
| [Zillow ZIP Code Scraper | Listings & Market Trends](https://apify.com/datascraperes/zillow-zip-code-scraper) | ZIP-based Zillow collection with optional property details and monthly market trends. |
| [Realtor.com US Property Listings Scraper](https://apify.com/datascraperes/realtor-property-search) | Compare US inventory from Realtor.com using city, state or ZIP inputs. |

### Limits and data quality

Search URLs must contain valid map bounds. Filter values are submitted to Zillow, which determines matching inventory. Zillow's displayed matching count can exceed what a selected method returns. A request for 5,000 properties can therefore return about 820 or fewer with pagination only, or fewer than 500 properties with map markers. The accepted maximum of 100,000 for the result-limit inputs is a requested ceiling, not a coverage guarantee. Listings and source windows can change between requests. Map subdivision also has finite collection bounds and cannot guarantee every property in an arbitrarily large area.

Building groups without an individual property ZPID, recommended properties and relaxed-match cards are excluded. A map sample is complete as a sample, not as an exhaustive inventory. Search cards can be less detailed than property pages. Unavailable sources or restricted result windows produce a partial summary.

### Frequently asked questions

#### Can I paste a plain city or property URL?

Use a Zillow search URL containing `searchQueryState` and `mapBounds`. Move the map on Zillow to obtain one. This Actor does not resolve place names or accept property-detail URLs.

#### Does map subdivision guarantee all listings?

No. It narrows dense searches, but source limits, changing inventory and finite collection bounds can leave a search partial. Review the collection summary.

#### Does this replace the ZIP-based Actor?

No. Use this Actor for filtered map search URLs. Choose the ZIP-based Actor for ZIP inputs, optional property details or market trends.

### Responsible use

Use collected data in accordance with applicable laws, privacy requirements and Zillow's terms. Verify important property facts with the original listing.

### Support

Open an issue in the Actor's Issues tab with a reproducible input and run ID. Remove private information before sharing your input.

# Actor input Schema

## `searchUrls` (type: `array`):

Paste HTTPS Zillow search URLs containing searchQueryState and map bounds. Search filters are preserved; collection starts at page one. Duplicate searches are merged.

## `extractionMethod` (type: `string`):

Pagination only is limited to Zillow's visible window, typically 20 pages of about 41 search cards (about 820 cards per URL). Map markers return one sample of up to about 500 cards. Valid unique properties can be fewer because unavailable, grouped or recommended cards are excluded. Map subdivision can collect beyond the single-window limit by searching smaller areas, but does not guarantee every matching property. These source windows may change. Increasing the result limits does not enlarge the pagination window or marker sample.

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

Requested ceiling for unique properties per search URL, not a guaranteed count. Pagination-only and map-sample source limits still apply even when this number is higher. Properties already saved by an earlier URL are skipped.

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

Requested ceiling for unique properties across all search URLs. Collection stops when reached; availability and the selected method can produce fewer properties.

## Actor input object example

```json
{
  "searchUrls": [
    {
      "url": "https://www.zillow.com/homes/for_sale/?searchQueryState=%7B%22mapBounds%22%3A%7B%22west%22%3A-74.02%2C%22east%22%3A-73.99%2C%22south%22%3A40.72%2C%22north%22%3A40.75%7D%2C%22isMapVisible%22%3Atrue%2C%22isListVisible%22%3Atrue%2C%22pagination%22%3A%7B%22currentPage%22%3A1%7D%2C%22filterState%22%3A%7B%22isForRent%22%3A%7B%22value%22%3Afalse%7D%2C%22isRecentlySold%22%3A%7B%22value%22%3Afalse%7D%2C%22isForSaleByAgent%22%3A%7B%22value%22%3Atrue%7D%2C%22isForSaleByOwner%22%3A%7B%22value%22%3Atrue%7D%7D%7D"
    }
  ],
  "extractionMethod": "PAGINATION_WITH_ZOOM_IN",
  "resultsLimit": 10,
  "maxTotalResults": 10
}
```

# 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 = {
    "searchUrls": [
        {
            "url": "https://www.zillow.com/homes/for_sale/?searchQueryState=%7B%22mapBounds%22%3A%7B%22west%22%3A-74.02%2C%22east%22%3A-73.99%2C%22south%22%3A40.72%2C%22north%22%3A40.75%7D%2C%22isMapVisible%22%3Atrue%2C%22isListVisible%22%3Atrue%2C%22pagination%22%3A%7B%22currentPage%22%3A1%7D%2C%22filterState%22%3A%7B%22isForRent%22%3A%7B%22value%22%3Afalse%7D%2C%22isRecentlySold%22%3A%7B%22value%22%3Afalse%7D%2C%22isForSaleByAgent%22%3A%7B%22value%22%3Atrue%7D%2C%22isForSaleByOwner%22%3A%7B%22value%22%3Atrue%7D%7D%7D"
        }
    ],
    "extractionMethod": "PAGINATION_WITH_ZOOM_IN",
    "resultsLimit": 10,
    "maxTotalResults": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("datascraperes/zillow-search-url-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 = {
    "searchUrls": [{ "url": "https://www.zillow.com/homes/for_sale/?searchQueryState=%7B%22mapBounds%22%3A%7B%22west%22%3A-74.02%2C%22east%22%3A-73.99%2C%22south%22%3A40.72%2C%22north%22%3A40.75%7D%2C%22isMapVisible%22%3Atrue%2C%22isListVisible%22%3Atrue%2C%22pagination%22%3A%7B%22currentPage%22%3A1%7D%2C%22filterState%22%3A%7B%22isForRent%22%3A%7B%22value%22%3Afalse%7D%2C%22isRecentlySold%22%3A%7B%22value%22%3Afalse%7D%2C%22isForSaleByAgent%22%3A%7B%22value%22%3Atrue%7D%2C%22isForSaleByOwner%22%3A%7B%22value%22%3Atrue%7D%7D%7D" }],
    "extractionMethod": "PAGINATION_WITH_ZOOM_IN",
    "resultsLimit": 10,
    "maxTotalResults": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("datascraperes/zillow-search-url-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 '{
  "searchUrls": [
    {
      "url": "https://www.zillow.com/homes/for_sale/?searchQueryState=%7B%22mapBounds%22%3A%7B%22west%22%3A-74.02%2C%22east%22%3A-73.99%2C%22south%22%3A40.72%2C%22north%22%3A40.75%7D%2C%22isMapVisible%22%3Atrue%2C%22isListVisible%22%3Atrue%2C%22pagination%22%3A%7B%22currentPage%22%3A1%7D%2C%22filterState%22%3A%7B%22isForRent%22%3A%7B%22value%22%3Afalse%7D%2C%22isRecentlySold%22%3A%7B%22value%22%3Afalse%7D%2C%22isForSaleByAgent%22%3A%7B%22value%22%3Atrue%7D%2C%22isForSaleByOwner%22%3A%7B%22value%22%3Atrue%7D%7D%7D"
    }
  ],
  "extractionMethod": "PAGINATION_WITH_ZOOM_IN",
  "resultsLimit": 10,
  "maxTotalResults": 10
}' |
apify call datascraperes/zillow-search-url-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,datascraperes/zillow-search-url-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/3djBZADAYKC4rBvT8/builds/Ljqlxm0fGmr4pFmb1/openapi.json
