To enrich Zillow search results with property details, run the Zillow Scraper to collect listings, then give its Dataset ID to the Zillow Property Details Scraper. Select the source identifier column and run the detail collection. Join the new detail rows back to your original listing file by verified ZPID.
This is useful when you already have a listing Dataset, want to review properties before enrichment or need separate histories for discovery and details. You can do both stages through Apify forms, or ask an MCP-connected agent to coordinate them.
Step 1. Collect a small listing Dataset
Open the Zillow Scraper on Apify, click Try for free and use the Input form in Apify Console. Start with one city or a checked search URL and basic listing output.
{
"locations": ["Austin, TX"],
"listingType": "sale",
"maxResults": 25,
"includeDetails": false
}Review pricing and set a run budget before starting. When the run finishes, inspect the Dataset and its coverage summary. The listing export guide covers the first stage in detail.
For a territory list, use the Zillow ZIP Code Scraper and the multi-ZIP guide. The property-detail handoff uses the resulting supported identifiers in the same way.
Step 2. Find the Dataset ID and inspect its identifier column
Open the completed Search run’s Dataset and copy its Dataset ID. Keep the run ID separately. The Details Actor’s propertyDatasetId expects the Dataset identifier, not the Search run identifier.
| Identifier | Purpose |
|---|---|
| Search run ID | Discovery logs, coverage and continuation of that Search collection. |
| Search Dataset ID | The source input passed to propertyDatasetId. |
| Details run ID | Detail-stage logs, coverage and continuation of that detail collection. |
| Details Dataset ID | The separate enriched-property output. |
Inspect a few JSON items from the source Dataset. Confirm that the property identifiers are in a top-level zpid column or supported property URLs in url. Keep the original source rows and search attribution alongside them.
| What the source contains | Details input |
|---|---|
Numeric Zillow IDs in zpid | datasetField: "zpid". |
Property URLs containing a ZPID in url | datasetField: "url". |
| A different field name or external CSV | Prepare a Dataset with a supported column, or use a direct small zpids list. |
| Missing IDs or unsupported building/search URLs | Retain those source rows for input review. |
A building card or rental unit without a usable property ID needs its own review. Preserve its original context rather than assigning details from a different property simply to fill the row.
Step 3. Pass the source Dataset to Property Details
Open the Zillow Property Details Scraper in Apify Console.
- Paste the accessible Search Dataset ID into Property list from Apify Dataset.
- Choose
zpidorurlunder Property identifier column. - Leave other property-input methods empty for this pilot.
- Set Maximum results per run to 25 or another suitable small cap.
- Set a separate detail-run spending limit and start the Actor.
Replace the placeholder below with the actual Dataset ID from your account. Dataset IDs have 17 characters, and the run must have read access to that source.
{
"propertyDatasetId": "YOUR_SEARCH_DATASET_ID",
"datasetField": "zpid",
"maxResults": 25
}
The read-only field reference shows the Dataset handoff controls. Paste the ID and select the column in the editable Console form.
Understand the frozen input list
The Actor reads up to 100,000 source rows and freezes the distinct valid property list for that collection. Duplicate ZPIDs are collected once. Invalid or missing identifiers are reported separately.
Later appends to the source Dataset do not change that collection’s continuation. Submit newly added properties as a separate logged collection when needed. The fixed list controls which properties are requested; their details are still observed when each source page is fetched.
The Details Actor creates a separate Dataset. It does not update the original Search rows or copy them all into the detail output. Keep both stages’ files for reconciliation.
Step 4. Review the detail fields and identity
Open the completed detail Dataset and compare ZPID, URL, address and unit identity against the requested property. Then review the additional fields you needed.
- Keep asking price, available source estimates and past sale information separately.
- Retain
description,photoCountand available photo URLs when useful. - Preserve serialized histories such as
priceHistoryJsonandtaxHistoryJson. - Keep
detailStatus,sourceandscrapedAtwith the result. - Review unavailable or failed properties through the run’s source issues.
Missing detail values can remain null even for a correctly identified property. The Property Details guide explains the output groups and direct URL, ZPID and address methods.
Step 5. Join details back to every original listing row
Create a source-row identifier in the listing master and keep the search URL, requested area or searchedZipcode attribution. Store ZPIDs as text and use an exact verified property key to attach detail results.
Prepare one reviewed detail record per ZPID, then look it up from the original listing sheet. Keep source rows with no usable input ID or no returned details. If a property appeared in two original searches, both rows can inherit the same reviewed detail record while retaining their own search context.
| Source row | Property | Outcome |
|---|---|---|
| 1 | A | Reviewed details attached. |
| 2 | A, from another search | Same details; separate search relationship retained. |
| 3 | B | Detail request failed or remains incomplete, according to run evidence. |
| 4 | No usable ID | Retained for input review. |
The final master still has four source rows. Count distinct valid properties and returned detail matches separately. A file with only the successful detail records would hide the unresolved part of the original listing list.
Continue the correct stage and assemble all batches
For an unfinished detail collection, use the latest Details run’s PAGINATION.nextInput with the same Details Actor and account. Keep its source Dataset and selected field fixed, and set a new batch budget.
The next detail Dataset contains newly saved properties. Keep every detail batch and assemble them before joining to the listing master. A Search run’s continuation belongs to the discovery stage and should be tracked separately.
If Search itself produced several batch Datasets, either prepare a combined supported-identifier Dataset or enrich each source Dataset separately while preserving the master mapping. Deduplicate repeated property IDs before new paid detail work where appropriate.
The Details Free allowance is 25 properties across a collection’s continuation chain, using Apify credits. Manual property inputs accept up to 100 entries per method; Dataset input supports the larger list. Source, request, time and spending limits can still stop a batch earlier.
Choose two stages or details during the original search
The Search Actor also supports includeDetails: true. That is useful when you want details for the discovered properties immediately. Separate stages are useful when you want to inspect, select or reuse the listing list before enrichment.
Check the current pricing and fields already collected before adding another detail run. If an enriched Search retained basic rows with failed details, inspect its DETAIL_RETRY_INPUT. Ordinary Search continuation skips saved rows, so detail retries need their own prepared detail collection.
Ask your agent to coordinate the handoff through MCP
Connect an MCP-compatible agent to https://mcp.apify.com and authorize Apify using the MCP setup guide. Give it the market or existing Dataset and separate budgets.
Enrich a Zillow listing master.
Actors:
x_guru/zillow-search-scraper
x_guru/zillow-property-details-scraper
Market or existing Dataset: [MY_INPUT]
Approved event caps USD:
search [AMOUNT], details [AMOUNT].
Inspect both current schemas. If a search
is needed, start with 25 basic listings.
Save its Dataset ID and original rows.
Inspect zpid and url fields. Preserve
invalid rows and source attribution.
Pass the accessible Dataset ID to
propertyDatasetId in the Details Actor,
with the correct datasetField and cap.
Apply each approved cap through
callOptions.maxTotalChargeUsd.
Wait for each run and read all pages.
Review details by ZPID and unit identity.
Left-join one reviewed detail record to
every original source row. Keep missing
or incomplete results explicit.
Save raw files, master CSV, run IDs,
Dataset IDs and each stage's pagination.
Wait before continuing either stage.The agent starts each Actor with call-actor, waits with get-actor-run and reads Dataset pages through get-dataset-items. For a reusable application setup, follow the Apify run and Dataset guide.



