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
| Your input | Actor field | Important detail |
|---|---|---|
| Property-page URL | startUrls | The URL must contain a numeric ZPID. |
| Property ID | zpids | Use the numeric value before _zpid in the property URL. |
| Complete address | addresses | Include street number, unit, city, state and ZIP. |
| Existing Apify Dataset | propertyDatasetId, datasetField | Read 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.
- Enter a known ID under Property IDs (ZPIDs).
- Leave the other input methods empty for this first test.
- Set Maximum results per run to 5.
- Keep advanced collection limits unchanged.
- Review the current pricing and set Max total charge in run settings.
- 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.

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.
| Group | Fields |
|---|---|
| Identity | zpid, url, address and unit context. |
| Listing and estimates | status, price, zestimate, rentZestimate. |
| Attributes | bedrooms, bathrooms, livingArea, homeType, yearBuilt. |
| Sale history | soldDate, lastSoldPrice, priceHistoryJson. |
| Other detail | description, photosJson, taxHistoryJson, factsJson, schoolsJson. |
| Available listing contacts | Agent, brokerage and listing contact fields when supplied. |
| Collection context | detailStatus, 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.
Step 3. Export CSV and keep the requested-property list
- Download the completed Dataset as CSV.
- Keep the ZPID, property URL and collection timestamp with the detail fields.
- Download JSON as well when you need the serialized detail structures.
- Match returned properties back to the original source sheet.
- 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.



