Skip to content

How to Enrich Zillow Search Results with Property Details

Pass Zillow search results into the Property Details Actor, keep each stage’s identifiers, and merge reviewed details back to every original listing row.

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

Search dataset connected to an individual house

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.

Keep the four identifiers clear
IdentifierPurpose
Search run IDDiscovery logs, coverage and continuation of that Search collection.
Search Dataset IDThe source input passed to propertyDatasetId.
Details run IDDetail-stage logs, coverage and continuation of that detail collection.
Details Dataset IDThe 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.

Choose the source field
What the source containsDetails input
Numeric Zillow IDs in zpiddatasetField: "zpid".
Property URLs containing a ZPID in urldatasetField: "url".
A different field name or external CSVPrepare a Dataset with a supported column, or use a direct small zpids list.
Missing IDs or unsupported building/search URLsRetain 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.

  1. Paste the accessible Search Dataset ID into Property list from Apify Dataset.
  2. Choose zpid or url under Property identifier column.
  3. Leave other property-input methods empty for this pilot.
  4. Set Maximum results per run to 25 or another suitable small cap.
  5. 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
}
Zillow Property Details Scraper fields for the source Apify Dataset ID and the zpid or url identifier column
Read-only reference for handing a Search Dataset to the Details Actor using its supported property identifier column.

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.

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 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, photoCount and available photo URLs when useful.
  • Preserve serialized histories such as priceHistoryJson and taxHistoryJson.
  • Keep detailStatus, source and scrapedAt with 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.

Fictional four-row master after enrichment
Source rowPropertyOutcome
1AReviewed details attached.
2A, from another searchSame details; separate search relationship retained.
3BDetail request failed or remains incomplete, according to run evidence.
4No usable IDRetained 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.

Keep reading

Build your first list.

100 free credits. No credit card required.

Start free