Zillow Property Details Scraper

Scrape public Zillow property detail pages for price, status, facts, history, schools, photos, agent/broker data, and diagnostics.

Data fields

FieldTypeDescription
inputstringValue exported as input.
inputTypestringValue exported as inputType.
workKeystringStable key used for deduplication and safe resume.
statusstringValue exported as status.
sourcestring | nullLive structured source or transparent six-hour persistent cache fallback that produced a complete record.
zpidstring | nullValue exported as zpid.
canonicalUrlstring | nullValue exported as canonicalUrl.
homeStatusstring | nullValue exported as homeStatus.

Input preview

propertyUrlsZillow property URLs
zpidsZPIDs
searchResultsDatasetIdSearch results dataset ID
maxItemsMaximum properties
includePhotosInclude photos
includeHistoryInclude price and tax history

API and agents

This actor can be run through Apify API, datasets, webhooks, schedules, and the official Apify MCP server.

Ready-to-run examples

Open a saved Apify example, adjust the input, and run the actor in your own Apify account.

View all examples

How this actor works

See example inputs, outputs, API usage, and practical limits before running this actor on Apify.

Open Apify page

Scrape public Zillow property detail pages into structured records with prices, facts, photos, schools, price history, tax history, agent/broker data, and diagnostics.

Use this Actor to enrich Zillow search results, monitor selected homes, audit comparable properties, or export detail-page data to CSV, JSON, Excel, API, and automation workflows.

At a glance

  • Primary job: Turn Zillow detail URLs or ZPIDs into normalized property detail rows.
  • Input: Provide propertyUrls, zpids, or searchResultsDatasetId, then set maxItems.
  • Output: One row per property with status, source, zpid, canonicalUrl, address, price, facts, history, photos, and diagnostics.
  • Best for: Real estate research, listing enrichment, lead qualification, portfolio monitoring, and downstream automations.

Who is it for?

  • Real estate investors and analysts who need repeatable property facts, pricing signals, and comparable-home exports.
  • Brokerages and agents enriching lead lists or saved searches with current public detail-page fields.
  • Proptech and data teams chaining Zillow search/listing datasets into normalized property-detail records.
  • Automation builders feeding Zillow detail data into CRMs, alerts, spreadsheets, dashboards, or AI agents.

Common workflows

  • Enrich listing results: Pass a dataset from a Zillow listings/search workflow with URL or ZPID columns.
  • Analyze property details: Submit a curated list of /homedetails/ URLs for price, facts, schools, and history.
  • Monitor homes or rentals: Schedule repeat runs on the same zpids and compare fresh dataset exports.
  • Audit failures cleanly: Blocked or missing properties are saved with status, errorCode, errorMessage, and diagnostics. Diagnostic rows are not charged as items.

What data can you extract?

Field Description
input, inputType, workKey Original input, its origin, and a stable deduplication/resume key.
status success, blocked, not_found, fetch_error, or parse_error.
source Structured live source, or persistent_cache when a recent successful public record is used after all live routes are blocked.
zpid, canonicalUrl Zillow property ID and normalized detail URL.
homeStatus, propertyType Listing status and property type when available.
address Structured address object from Zillow payloads.
price, zestimate, rentZestimate Listing and estimate values when exposed.
beds, baths, livingArea, lotSize, yearBuilt Core home facts.
description, facts Listing description and detailed facts object.
agent, broker Listing attribution data when present.
priceHistory, taxHistory Optional history arrays controlled by includeHistory.
schools, photos, nearbyHomes Optional public detail-page arrays.
missingFields, warnings, errorCode, errorMessage, diagnostics, scrapedAt Quality and troubleshooting metadata.

Example input

{
  "propertyUrls": [
    { "url": "https://www.zillow.com/homedetails/17199-Park-Ave-Sonoma-CA-95476/15800416_zpid/" }
  ],
  "maxItems": 1,
  "includePhotos": false,
  "includeHistory": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"],
    "apifyProxyCountry": "US"
  }
}

Example output

{
  "input": "https://www.zillow.com/homedetails/17199-Park-Ave-Sonoma-CA-95476/15800416_zpid/",
  "inputType": "url",
  "workKey": "zpid:15800416",
  "status": "success",
  "source": "html_cache",
  "zpid": "15800416",
  "canonicalUrl": "https://www.zillow.com/homedetails/15800416_zpid/",
  "homeStatus": "FOR_SALE",
  "address": { "streetAddress": "17199 Park Ave", "city": "Sonoma", "state": "CA", "zipcode": "95476" },
  "price": 995000,
  "beds": 3,
  "baths": 2,
  "livingArea": 1520,
  "priceHistory": [],
  "errorCode": null,
  "scrapedAt": "2026-07-13T00:00:00.000Z"
}

Tips for best results

  • Start small: Use maxItems: 1 until the selected URLs produce the fields you need.
  • Use detail pages: Search result pages are better handled by a Zillow listings actor; this Actor is for property details.
  • Keep inputs focused: Split very broad enrichment jobs into smaller runs.
  • Expect diagnostics: Zillow may return access-denied pages; those are saved as free diagnostic rows for review.
  • Understand cached fallbacks: If every live route is blocked, the Actor may return a successful public record cached within the previous six hours. The row uses source: "persistent_cache", preserves its original scrapedAt, and includes a warning and cache age.
  • Use retries deliberately: The default retries temporary failures twice per source. Lower maxRetries for quick probes or raise it for small reliability-focused jobs.

API usage

Node.js:

import { ApifyClient } from "apify-client";

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor("fetch_cat/zillow-property-details-scraper").call({
  propertyUrls: [{ url: "https://www.zillow.com/homedetails/17199-Park-Ave-Sonoma-CA-95476/15800416_zpid/" }],
  maxItems: 1,
});
console.log(run.defaultDatasetId);

Python:

from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("fetch_cat/zillow-property-details-scraper").call(run_input={
    "zpids": ["15800416"],
    "maxItems": 1,
})
print(run["defaultDatasetId"])

cURL:

curl -X POST "https://api.apify.com/v2/acts/fetch_cat~zillow-property-details-scraper/runs?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"zpids":["15800416"],"maxItems":1}'

MCP and AI agents

Use this Actor from MCP-compatible tools through the official Apify MCP Server.

claude mcp add --transport http apify "https://mcp.apify.com?tools=fetch_cat/zillow-property-details-scraper"
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=fetch_cat/zillow-property-details-scraper"
    }
  }
}

Example prompt: "Run Zillow Property Details Scraper for these three ZPIDs and summarize price, beds, baths, and any diagnostic errors."

Limits and caveats

  • Coverage: Zillow may vary detail-page payloads by property type, geography, and access controls.
  • Freshness: Source data can change after a run finishes.
  • Access controls: Zillow can return anti-bot pages. The Actor detects HTML and JSON challenges, rotates proxy sessions between retries, and tries bounded structured fallbacks before saving a diagnostic.
  • Partial runs: The Actor reserves shutdown time, saves unfinished normalized inputs in PENDING_WORK, and writes aggregate counters to RUN_SUMMARY.
  • Success contract: A row is only marked and charged as successful when it contains a ZPID, a usable address, and multiple core property facts.

Legality and responsible use

Process only data that users are allowed to access. Follow website terms, Apify's terms, and applicable laws.

Support

Open an issue from the Actor page if a run fails or output looks wrong. Include the run ID or run URL, input JSON, expected output, actual output, and one reproducible public URL.

Common questions

Questions and answers reused from the canonical actor README.

Can I export results?

Yes. Apify datasets support JSON, CSV, Excel, XML, RSS, and API access.

Why are some fields empty?

Some properties do not expose every field publicly. The Actor leaves unavailable fields empty and lists important gaps in missingFields.