Skip to content

How to Get Zillow Property Details by URL or ZPID

Collect details for known Zillow properties, verify address and unit identity, and export available prices, estimates and histories to CSV.

Dievio Team · Growth Systems · November 6, 2026 · 6 min read

House and magnifier for an individual property lookup

To get Zillow property details, give the Zillow Property Details Scraper a property URL, ZPID or complete US address. Run a small batch in Apify and download the Dataset as CSV or JSON. Keep the original input and returned zpid so you can verify the property and identify missing results.

The output includes the details available from the source: property attributes, prices, estimates, descriptions, photo URLs and histories. Start with a known property, check its identity, then process a larger prepared list. An MCP-connected agent can also coordinate the lookup and export.

Choose the property input you already have

Supported ways to identify known Zillow properties
Your inputActor fieldImportant detail
Property-page URLstartUrlsThe URL must contain a numeric ZPID.
Property IDzpidsUse the numeric value before _zpid in the property URL.
Complete addressaddressesInclude street number, unit, city, state and ZIP.
Existing Apify DatasetpropertyDatasetId, datasetFieldRead identifiers from its zpid or url column.

A city search URL belongs in the Zillow listings workflow. Here you are identifying individual properties. Keep a master sheet with a source row ID and the original property identifier before starting.

Step 1. Run a small ZPID lookup in Apify Console

Open the Zillow Property Details Scraper on Apify, click Try for free and sign in if prompted. Use the editable Input form in Apify Console.

  1. Enter a known ID under Property IDs (ZPIDs).
  2. Leave the other input methods empty for this first test.
  3. Set Maximum results per run to 5.
  4. Keep advanced collection limits unchanged.
  5. Review the current pricing and set Max total charge in run settings.
  6. Click Start, then inspect the completed Dataset.

This example uses the ZPID from the Actor’s documentation. Replace it with your own verified property ID for your actual collection.

{
  "zpids": ["89070667"],
  "maxResults": 5
}

With one unique input, a cap of five still requests only that one property. The cap is a ceiling on saved results; it does not create extra properties or guarantee all source fields are present.

The public input reference shows the available methods. The screenshot is read-only; enter your real identifiers in the Console form.

Zillow Property Details Scraper fields for property URLs, ZPIDs, result cap and exact full addresses
Read-only reference for known property inputs, the result cap and exact-address lookup.

Use a property URL instead

The same documented property can be supplied through startUrls. A numeric ZPID is required in each property URL.

{
  "startUrls": [
    {
      "url": "https://www.zillow.com/homedetails/89070667_zpid/"
    }
  ],
  "maxResults": 5
}

Choose one identifier method for the pilot. You can combine methods later; duplicate properties are removed and the result cap is shared across the inputs.

Use complete addresses and preserve unit identity

For address lookup, supply the street number, apartment or unit when applicable, city, two-letter state and five-digit ZIP. The Actor saves an exact normalized address-and-unit match. Ambiguous or unmatched addresses are reported as collection issues.

Check the returned address and ZPID against your source row. A shared street address does not make a building and apartment 4B interchangeable. Once you have the verified unit URL or ZPID, keep it for later lookups.

If the address cannot be resolved, leave the source row in review. Check spelling, ZIP and unit information before retrying. Keep the original address alongside any corrected input so the change is traceable.

Step 2. Review prices, estimates and histories separately

Open the Dataset and verify identity before using the detailed values. The property’s asking price, a source estimate and a historical sale are separate observations with different meanings.

Property detail fields worth retaining
GroupFields
Identityzpid, url, address and unit context.
Listing and estimatesstatus, price, zestimate, rentZestimate.
Attributesbedrooms, bathrooms, livingArea, homeType, yearBuilt.
Sale historysoldDate, lastSoldPrice, priceHistoryJson.
Other detaildescription, photosJson, taxHistoryJson, factsJson, schoolsJson.
Available listing contactsAgent, brokerage and listing contact fields when supplied.
Collection contextdetailStatus, inputAddress, source, scrapedAt.

In a fictional record, an asking price of $475,000, a Zestimate of $462,000 and a past sale of $410,000 belong in different columns. Keep the sale date with the historical amount and the collection time with the observed listing.

Missing values stay null. A property with no Zestimate can still be a valid identity match. A Zestimate is a source estimate; the Actor does not produce an appraisal.

Photo output contains links to images. Histories, photos, facts and schools can be JSON strings inside flat rows. Available listing-agent or brokerage contacts describe those listing participants; verify their role before using the fields as contact data.

Dievio

Your next customer starts here.

Find decision-makers by role, company and location. Build your next prospect list in Dievio.

Find my leads

Free audience preview · No credit card

Find leadsExample
FounderSoftwareUnited States
AM
Alex MorganFounder & CEO · Northstaralex@northstar.example
JC
Jamie ChenCo-founder · Formlyjamie@formly.example
Work emailsCompany detailsCSV export

Step 3. Export CSV and keep the requested-property list

  1. Download the completed Dataset as CSV.
  2. Keep the ZPID, property URL and collection timestamp with the detail fields.
  3. Download JSON as well when you need the serialized detail structures.
  4. Match returned properties back to the original source sheet.
  5. Retain failed, unmatched and unprocessed inputs with separate statuses.

For a history table, parse the relevant JSON string and keep one row per property and event. Avoid treating an entire history array as a single current price. Preserve the original property-level file alongside any expanded event table.

Enrich an existing Apify Dataset

If a previous search already produced property IDs, enter its accessible Dataset ID in propertyDatasetId. Select datasetField: "zpid" for numeric IDs or "url" for property URLs containing ZPIDs.

The Actor supports up to 100,000 source rows and freezes the distinct valid property list before collection. Later appends to that source do not silently change the continuing collection. Keep the source Dataset unchanged as your master; successful detail rows go into a separate output Dataset.

Invalid or missing identifiers are reported separately. Keep source rows without a usable property ID in review. The search-to-details guide explains the full two-Actor handoff and merge.

Continue larger batches and understand missing results

Manual input lists accept up to 100 entries per method, while a source Dataset supports the larger list. Paid-plan maxResults can be 1–100,000 per run. The Free collection allowance is 25 properties across continuation batches; results still use Apify credits.

After a finished batch, inspect RUN_SUMMARY, ERRORS and PAGINATION. If hasMore is true, copy the full nextInput to a new run of this same Actor and account. Keep the property inputs unchanged and set a new batch budget.

Continue from the latest finished run. Newly saved properties appear in the new Dataset, so retain every batch. Earlier successful rows are skipped along that continuation chain. A fresh independent collection needs its own reconciliation against earlier files.

Check coverageComplete separately from hasMore. Failed access, unavailable pages and unmatched addresses can remain even when the request queue has ended. Keep the original requested-property count as the basis for your coverage report.

Run property details with your agent through Apify MCP

Connect an MCP-compatible agent to https://mcp.apify.com and authorize Apify using the official MCP guide. Give it the known-property list or source Dataset.

Use x_guru/zillow-property-details-scraper.
Property input: [MY_ZPIDS_URLS_OR_DATASET]
First-run maxResults: 5
Approved event-charge cap USD: [AMOUNT]

Inspect the current schema. Keep a
master mapping of original inputs.
Choose the supported identifier method.
Apply the approved cap through
callOptions.maxTotalChargeUsd.

Wait for completion and read all output
pages. Verify zpid, address and unit.
Keep prices, estimates and histories
separate, with source and scrapedAt.
Save raw output and a property CSV.
Read RUN_SUMMARY, ERRORS and PAGINATION.
Retain unmatched and unprocessed rows.
Report coverage, run ID and Dataset ID.
Wait before continuing another batch.

The agent starts with call-actor, checks progress with get-actor-run and reads Dataset pages through get-dataset-items. Ask it to keep the latest continuation input with its run history.

For discovery, use the listing CSV guide. For recurring price observations, see the price-drop monitor. For application-based collection and downloads, use the Apify run and Dataset guide.

Keep reading

Build your first list.

100 free credits. No credit card required.

Start free