Zillow Property Scraper with Agents & Description avatar

Zillow Property Scraper with Agents & Description

Pricing

from $0.70 / 1,000 property listings

Go to Apify Store
Zillow Property Scraper with Agents & Description

Zillow Property Scraper with Agents & Description

Extract Zillow property listings at scale with prices, full descriptions, photo galleries, coordinates, property facts, amenities, and agent contacts. Built for market research, comps, inventory monitoring, CRM enrichment, BI, and ETL pipelines.

Pricing

from $0.70 / 1,000 property listings

Rating

0.0

(0)

Developer

Fatih Tahta

Fatih Tahta

Maintained by Community

Actor stats

1

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Share

Zillow Property Scraper

Slug: fatihtahta/zillow-property-scraper

Overview

Zillow Property Scraper collects structured public property listing records from Zillow. It supports location-based searches, direct Zillow search or listing URLs, and common real estate filters such as listing mode, price, bedrooms, bathrooms, property type, status, amenities, views, parking, area, building year, keywords, and listing freshness. Each saved record is normalized into a grouped property listing object with source provenance, listing identity, pricing, location, property facts, media, metrics, availability, contact details, relationships, and source-specific attributes when available. The actor is designed for market research, comparable-listing review, recurring monitoring, CRM enrichment, BI dashboards, ETL pipelines, and AI-agent workflows. It can also write run-level summary and map artifacts so users can verify counts, coverage, coordinates, and export readiness without inspecting every record manually. Optional MCP connector delivery can send a compact run summary and output links to user-authorized Apify connector destinations when configured. Results reflect publicly available Zillow data at run time and should be verified before legal, financial, valuation, brokerage, or operational decisions.

What Makes This Actor Different

  • Schema-led output: records use a stable property_listing envelope with grouped objects for pricing, location, property facts, media, availability, contacts, relationships, and attributes.
  • Flexible starting points: use a location, a direct Zillow search URL, a map/list URL, or specific listing URLs.
  • Real estate filters: narrow runs by listing mode, sort order, price, payment, beds, baths, property type, listing category, status, tours, HOA, parking, area, lot size, year built, amenities, views, keywords, and freshness.
  • Coverage-aware option: maximize_coverage can collect deeper within the selected criteria when first visible results are not enough.
  • Enrichment control: enrich_data lets users choose richer listing details or faster search-level validation runs.
  • Run receipts: the actor can write RUN-SUMMARY, RUN-SUMMARY.html, and results-map artifacts for review, audit, and downstream routing.
  • Pipeline-friendly identity: record_id, listing.listing_id, property.property_id, and url make recurring upserts and deduplication easier.
  • Connector-ready delivery: mcpConnectors can deliver compact run summaries and output links through user-authorized Apify MCP connectors when selected.

Who Should Use This Actor

  • Real estate analysts comparing asking prices, inventory, status, location, and property mix across markets.
  • Brokerage, investment, and operations teams monitoring Zillow listing changes over time.
  • CRM and lead operations teams enriching internal records with public listing facts and source links.
  • Data engineers building real estate ingestion, normalization, warehouse, or search-index pipelines.
  • BI teams creating dashboards for public listing inventory, pricing bands, geography, amenities, and availability.
  • AI-agent builders that need structured property listing records and run receipts for automated workflows.
  • Product, research, and marketplace teams that need repeatable public property-data collection.

Common Use Cases

  • Track new or recently updated public Zillow listings in a city, ZIP code, neighborhood, or market.
  • Build comparable-listing datasets by property type, price band, bedroom count, bathroom count, and listing status.
  • Monitor price-reduced listings, open houses, tours, or specific amenities.
  • Review rental, sale, or sold-listing history based on the selected deal_type.
  • Enrich internal property, lead, or account records with public listing URLs, pricing, location, and property facts.
  • Export structured records into BI tools, spreadsheets, data warehouses, CRMs, or AI workflows.
  • Compare repeated runs using stable listing identifiers and point-in-time pricing or status fields.
  • Use map artifacts to review coordinate coverage and geographic distribution for saved listings.

Real-World Questions This Data Can Answer

  • Which public listings match a specific city, price band, property type, and bedroom/bathroom profile?
  • How many saved listings include coordinates, open-house signals, photos, contact details, or enrichment data?
  • Which listings appear to be price reduced, recently posted, pending, coming soon, or active?
  • What is the distribution of saved listings by city, region, status, property type, or deal type?
  • Which records should be upserted, deduplicated, or compared across repeated monitoring runs?
  • Which listings have enough structured detail for CRM review, BI reporting, alerts, or AI-agent analysis?
  • Did a run stop at the requested limit, and did coverage-aware collection produce deeper matching results?

Quick Start

  1. Open fatihtahta/zillow-property-scraper in Apify Console.
  2. Enter a location or paste one or more direct Zillow URLs in url.
  3. Choose deal_type and any filters needed for your target market or listing segment.
  4. Set limit to a small value for the first validation run.
  5. Start the actor and inspect the first dataset records.
  6. Review RUN-SUMMARY, RUN-SUMMARY.html, and results-map when they are available.

Input Parameters

FieldTypeDefaultOptionsDescription
urlarraynoneZillow search, map/list, or listing URLsDirect Zillow URLs to collect from. Use one URL per item for repeatable known searches or specific listings.
locationstringnoneany Zillow-supported city, state, ZIP, neighborhood, or marketLocation used to build a Zillow search when URLs are not provided.
deal_typesingle selectbuybuy, rent, soldListing mode for structured searches.
sort_bysingle selectglobalrelevanceexglobalrelevanceex, days, priced, pricea, paymentd, paymenta, beds, baths, size, lot, zest, zestaSort order requested from Zillow before collection.
min_priceintegernonenumeric amountMinimum asking price or rent.
max_priceintegernonenumeric amountMaximum asking price or rent.
min_monthly_paymentintegernonenumeric amountMinimum estimated monthly payment.
max_monthly_paymentintegernonenumeric amountMaximum estimated monthly payment.
bedroom_countmulti selectnone1, 2, 3, 4, 5Bedroom threshold requested from Zillow.
bathroom_countmulti selectnone1, 2, 3, 4, 5Bathroom threshold requested from Zillow.
property_typemulti selectnonehouses, condos_coops, apartments_condos_coops, multi_family, apartments, manufactured, lots_land, townhomes, room, entire_placeProperty categories to include. Leave empty for all supported categories in scope.
max_hoasingle selectnone0, 50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000, 1500, 2000Maximum monthly HOA fee.
listing_typemulti selectnoneagent_listed, owner_posted, new_construction, foreclosures, auctions, foreclosed, pre_foreclosuresListing source and ownership categories.
listing_statusmulti selectnoneactive, coming_soon, zillow_preview, pending_under_contract, accepting_backup_offersListing status groups to include.
toursmulti selectnoneopen_house, 3d_tour, showcaseTour, open-house, or showcase signals to require.
min_parkingsingle selectnone1+, 2+, 3+, 4+Minimum parking capacity.
closed_garagebooleanfalsetrue, falseRequire garage parking.
min_floor_areaintegernonesquare feetMinimum interior floor area.
max_floor_areaintegernonesquare feetMaximum interior floor area.
min_land_areaintegernonesquare feetMinimum lot or land area.
max_land_areaintegernonesquare feetMaximum lot or land area.
min_building_yearintegernonefour-digit yearEarliest building year.
max_building_yearintegernonefour-digit yearLatest building year.
basementbooleanfalsetrue, falseRequire basement mentions.
single_storybooleanfalsetrue, falseRequire single-story listings.
55_plus_communitiessingle selectnoneinclude, exclude, onlyInclude, exclude, or require 55+ community listings.
amenitiesmulti selectnoneair_conditioning, pool, waterfront, disabled_access, hardwood_floors, utilities_included, fitness_center, dishwasher, high_speed_internet, elevator, furnished, outdoor_space, pets_allowed, in_unit_laundry, short_term_lease, controlled_access, no_pets, promotionAmenities or rental features to require.
viewmulti selectnonecity, mountain, park, waterView types to require.
commute_timestringnonedestination textCommute destination for Zillow-supported commute filtering.
price_reducedbooleanfalsetrue, falseOnly include listings marked as price reduced.
publication_datesingle selectnoneany, 1, 7, 14, 30, 90, 6m, 12m, 24m, 36mListing freshness window.
keywordstringnonetextKeyword or phrase to search in listing text.
maximize_coveragebooleanfalsetrue, falseCollect deeper within the selected criteria when broad searches have more matching listings than the first visible result set.
enrich_databooleantruetrue, falseCollect richer listing details when available. Disable for faster validation when search-result fields are enough.
mcpConnectorsarray[]user-authorized Apify MCP connectorsOptional connector destinations for compact run-summary delivery with dataset, summary, and map links when available.
limitintegernonepositive integerMaximum number of listing records to save.

Choosing Inputs

Use location when you want the actor to build a Zillow search from a market, listing mode, and filters. Use url when you already have a Zillow search page, map/list page, or listing URL that you want to monitor repeatedly. Choose deal_type first because sale, rental, and sold-listing workflows usually require different filters and downstream interpretation. Add price, payment, bedrooms, bathrooms, property type, status, listing type, area, year, parking, tour, view, amenity, keyword, and freshness filters only when they are part of your intended scope. Leave optional filters empty for broad discovery or early validation. Split large workflows by city, neighborhood, property type, price band, listing mode, or status when you need cleaner downstream comparison. Enable maximize_coverage when deeper collection inside the same selected criteria is more important than the fastest exploratory run. Disable enrich_data for quick shape checks when the first visible result set and standard fields are enough.

Input Recipes

  • Validation run: choose one focused location, keep filters minimal, set a small limit, and optionally disable enrich_data to inspect the output shape quickly.
  • Targeted property search: combine location, deal_type, property_type, min_price, max_price, bedroom_count, and bathroom_count for a comparable listing slice.
  • Broad market discovery: use location, deal_type, sort_by, a sensible limit, and few optional filters to understand available inventory.
  • Maximum matching coverage: enable maximize_coverage with a broad market, selected property criteria, and an explicit limit when deeper matching collection matters.
  • Monitoring run: reuse the same location or url, set publication_date or sort_by, and schedule the actor to compare new, repriced, updated, or removed listings.
  • Enrichment run: paste known Zillow listing URLs in url, keep enrich_data enabled, and use a moderate limit to collect richer listing details for review or matching.

Example Inputs

{
"location": "Austin, TX",
"deal_type": "buy",
"property_type": ["houses", "townhomes"],
"min_price": 450000,
"max_price": 900000,
"bedroom_count": ["3"],
"limit": 25
}

Recently listed rental monitoring

{
"location": "Brooklyn, NY",
"deal_type": "rent",
"sort_by": "days",
"publication_date": "7",
"amenities": ["in_unit_laundry", "pets_allowed"],
"limit": 50
}

Direct listing URL enrichment

{
"url": [
"https://www.zillow.com/homedetails/8144-Irondale-Ave-Winnetka-CA-91306/19908910_zpid/"
],
"deal_type": "buy",
"enrich_data": true,
"limit": 1
}

Output

Output Destination

The actor writes results to an Apify dataset as JSON records. The dataset is designed for direct consumption by analytics tools, ETL pipelines, AI agents, and downstream APIs with minimal post-processing.

The current dataset contract exposes one record shape: property_listing. Each record represents one public Zillow listing and is documented below based on the dataset schema, saved rows, and run-artifact evidence.

Record Envelope And Stable Identifiers

Each record includes required top-level fields: record_type, record_id, url, source_context, entity, and listing. The recommended idempotency key is record_id, with listing.listing_id, property.property_id, entity.external_ids.zpid, and url as useful reconciliation fields. Use the same key for deduplication and upserts when syncing repeated runs into warehouses, CRMs, search indexes, vector stores, or monitoring systems. Stable identifiers make records easier to merge, deduplicate, sync, and compare across recurring runs. Provenance fields such as source_context.source_url, source_context.canonical_url, source_context.seed_url, source_context.search_query, source_context.scraped_at, and source_context.fingerprint help trace the public source and compare snapshots.

Example: Property Listing Record

{
"record_type": "property_listing",
"record_id": "123456789",
"url": "https://www.zillow.com/homedetails/123-Sample-Oak-Ave-Austin-TX-78701/123456789_zpid/",
"source_context": {
"source_id": "zillow_property_scraper",
"source_domain": "zillow.com",
"source_url": "https://www.zillow.com/homedetails/123-Sample-Oak-Ave-Austin-TX-78701/123456789_zpid/",
"canonical_url": "https://www.zillow.com/homedetails/123-Sample-Oak-Ave-Austin-TX-78701/123456789_zpid/",
"seed_url": "https://www.zillow.com/austin-tx/",
"search_query": "Austin TX homes",
"seed_type": "zillow_search",
"seed_value": "Austin TX homes",
"page_number": 1,
"position": 3,
"deal_type": "buy",
"enrichment_status": "enriched",
"enrichment_requested": true,
"scraped_at": "2026-07-09T17:32:14+00:00",
"country": "US",
"fingerprint": "sample-record-fingerprint",
"search": {
"url": "https://www.zillow.com/austin-tx/",
"deal_type": "buy",
"source_list": "listResults"
}
},
"entity": {
"title": "123 Sample Oak Ave, Austin, TX 78701",
"description": "Sample public listing description for a renovated home near parks and transit.",
"url": "https://www.zillow.com/homedetails/123-Sample-Oak-Ave-Austin-TX-78701/123456789_zpid/",
"status": "House for sale",
"external_ids": {
"zpid": "123456789"
}
},
"listing": {
"listing_id": "123456789",
"listing_type": "property_listing",
"listing_status": "FOR_SALE",
"deal_type": "sale",
"transaction_type": "House for sale",
"posted_at": "1771772735000"
},
"pricing": {
"price": 725000,
"price_text": "$725,000",
"currency": "USD",
"price_per_area": 402.78,
"source_price_per_square_foot": 403,
"estimates": {
"zestimate": 731000,
"rent_zestimate": 3850,
"estimated_monthly_cost": 4680
},
"price_changes": {
"last_change_amount": -15000,
"last_change_date": "2026-07-07"
},
"fees": {
"monthly_hoa_fee": 125
},
"valuation": {
"tax_assessed_value": 610000
}
},
"location": {
"address": "123 Sample Oak Ave, Austin, TX 78701",
"city": "Austin",
"region": "TX",
"postal_code": "78701",
"country": "US",
"latitude": 30.2672,
"longitude": -97.7431
},
"property": {
"property_id": "123456789",
"property_type": "SINGLE_FAMILY",
"bedrooms": 3,
"bathrooms": 2.5,
"floor_area": 1800,
"land_area": 6500,
"area_unit": "sqft",
"land_area_unit": "sqft",
"lot_size_text": "6500 sqft",
"year_built": 2014,
"parking_capacity": 2,
"garage_parking_capacity": 2,
"parking_features": ["Driveway", "Garage"]
},
"media": {
"main_image_url": "https://photos.zillowstatic.com/fp/sample-photo-p_e.jpg",
"image_urls": [
"https://photos.zillowstatic.com/fp/sample-photo-p_e.jpg"
],
"photos": [
{
"url": "https://photos.zillowstatic.com/fp/sample-photo-p_e.jpg",
"key": "sample-photo",
"source": "search_carousel"
}
],
"photo_count": 32,
"virtual_tours": [
{
"type": "third_party",
"url": "https://www.example.com/sample-tour",
"approved": true
}
]
},
"metrics": {
"view_count": 276,
"save_count": 14,
"days_on_zillow": 6,
"time_on_zillow": "6 days",
"time_on_zillow_ms": 518400000
},
"availability": {
"open_house": {
"description": "Open House - 2:00 - 4:00 PM",
"starts_at": "2026-07-11T14:00:00",
"ends_at": "2026-07-11T16:00:00"
},
"tour_eligibility": {
"self_tour": false,
"contact_agent": true
},
"date_posted": "1771772735000"
},
"contact_details": {
"phones": ["555-0100"],
"emails": ["agent@example.com"],
"contacts": [
{
"name": "Sample Agent",
"phone": "555-0100",
"email": "agent@example.com",
"role": "listing_agent"
}
]
},
"relationships": {
"agent": {
"name": "Sample Agent",
"mls_id": "SAMPLE123",
"mls_name": "Sample MLS"
},
"agency": {
"name": "Example Realty Group",
"mls_id": "SAMPLE456",
"mls_name": "Sample MLS"
}
},
"attributes": {
"flags": {
"has_image": true,
"has_video": false,
"has_open_house": true,
"is_showcase": false,
"is_zillow_owned": false
},
"zillow": {
"ids": {
"zpid": "123456789",
"result_id": "123456789"
},
"status": {
"status_type": "FOR_SALE",
"status_text": "House for sale",
"marketing_status": "For Sale by Agent"
},
"display": {
"content_type": "daysOnZillow",
"flex_field_text": "6 days on Zillow"
},
"search_result": {
"source_list": "listResults",
"is_list_result": true,
"is_relaxed_match": false
},
"listing_sub_type": {
"is_FSBA": true,
"is_FSBO": false,
"is_openHouse": true
},
"enrichment": {
"detail_available": true
}
}
}
}

Run Summary, Map, And Artifacts

The actor can write stable Apify key-value-store artifacts after dataset records are saved:

ArtifactKeyPurpose
Run summary JSONRUN-SUMMARYMachine-readable run receipt with saved listing counts, selected input scope, filter summary, enrichment coverage, location coverage, coordinate coverage, top records, and artifact keys.
Run summary HTMLRUN-SUMMARY.htmlHuman-readable report for reviewing listing totals, coverage, enrichment, pricing, property facts, location breakdowns, media coverage, and representative records.
Interactive listing mapresults-mapStandalone map for saved records with valid latitude and longitude values. If no valid coordinates are available, the map reports zero mapped listings.
Run summary diagnosticsRUN-SUMMARY-ERRORBest-effort public diagnostic written only if run summary generation fails after records were saved.

Use these artifacts as a run receipt before importing data into production dashboards, CRMs, warehouses, alerting systems, or agent workflows. They can help verify completion, saved listing count, skipped or duplicate outcomes, selected coverage mode, limit behavior, enrichment count, coordinate coverage, map marker count, and export readiness. When maximize_coverage is enabled, the run summary helps confirm that deeper matching collection was requested, how many listings were saved, and whether the requested limit shaped the final output.

Field Reference

Record Envelope

  • record_type (string, required): dataset row family; Zillow listing rows use property_listing.
  • record_id (string, required): stable Zillow listing identifier and recommended upsert key.
  • url (string, required): primary public Zillow listing URL.

source_context

  • source_context.source_id (string, optional): source identifier for the listing record.
  • source_context.source_domain (string, optional): source website domain, usually zillow.com.
  • source_context.source_url (string, optional): public source URL used as the listing audit link.
  • source_context.canonical_url (string, optional): canonical listing URL when available.
  • source_context.seed_url (string, optional): input search, map/list, or listing URL that led to the record.
  • source_context.search_query (string, optional): human-readable query or market used for search-mode runs.
  • source_context.seed_type (string, optional): seed family, such as a Zillow search or direct listing URL.
  • source_context.seed_value (string, optional): normalized seed value for grouping and audit review.
  • source_context.page_number (integer, optional): result page number when available.
  • source_context.position (integer, optional): listing position within the result set when available.
  • source_context.deal_type (string, optional): requested mode such as buy, rent, or sold.
  • source_context.enrichment_status (string, optional): whether the record is search-level or enriched with richer details.
  • source_context.enrichment_requested (boolean, optional): whether richer detail collection was requested.
  • source_context.enrichment_source (string, optional): source family for richer detail fields when available.
  • source_context.scraped_at (string, optional): collection timestamp.
  • source_context.language (string, optional): language or locale when available.
  • source_context.country (string, optional): country code associated with the source context.
  • source_context.fingerprint (string, optional): record fingerprint useful for recurring snapshot comparison.
  • source_context.search (object, optional): search-specific context such as URL, deal type, and source-list metadata.

entity

  • entity.title (string, optional): display title, usually the address or listing headline.
  • entity.description (string, optional): listing description when richer detail collection is available.
  • entity.url (string, optional): public listing URL associated with the display entity.
  • entity.status (string, optional): Zillow display status or label.
  • entity.external_ids.zpid (string, optional): Zillow property identifier.

listing

  • listing.listing_id (string, optional): source listing identifier, normally matching record_id.
  • listing.listing_type (string, optional): normalized listing family.
  • listing.listing_status (string, optional): listing status code, such as active, pending, sold, or sale-related states.
  • listing.deal_type (string, optional): normalized transaction family such as sale, rent, or sold.
  • listing.transaction_type (string, optional): display transaction text.
  • listing.posted_at (string, optional): source-provided posted timestamp or date string.

pricing

  • pricing.price (number, optional): numeric displayed asking price or rent.
  • pricing.price_text (string, optional): human-readable displayed price.
  • pricing.currency (string, optional): currency code for numeric price fields.
  • pricing.price_per_area (number, optional): price per interior area unit when available.
  • pricing.source_price_per_square_foot (number, optional): Zillow-provided price per square foot when available.
  • pricing.estimates.zestimate (number, optional): Zillow-provided Zestimate when present.
  • pricing.estimates.rent_zestimate (number, optional): Zillow-provided rent estimate when present.
  • pricing.estimates.estimated_monthly_cost (number, optional): Zillow-provided estimated monthly cost when present.
  • pricing.price_changes.last_change_amount (number, optional): most recent price-change amount when available.
  • pricing.price_changes.last_change_date (string, optional): date of the most recent price change when available.
  • pricing.fees.monthly_hoa_fee (number, optional): monthly HOA fee when exposed.
  • pricing.valuation.tax_assessed_value (number, optional): source-provided tax assessed value when exposed.

location

  • location.address (string, optional): displayed listing address or address-like label.
  • location.city (string, optional): city or locality.
  • location.region (string, optional): state, province, or region code.
  • location.postal_code (string, optional): postal or ZIP code.
  • location.country (string, optional): country code.
  • location.latitude (number, optional): latitude for mapping and geospatial workflows when available.
  • location.longitude (number, optional): longitude for mapping and geospatial workflows when available.

property

  • property.property_id (string, optional): source property identifier, normally matching the Zillow property ID.
  • property.property_type (string, optional): source or normalized property type.
  • property.bedrooms (integer, optional): bedroom count.
  • property.bathrooms (number, optional): bathroom count; decimal values may appear.
  • property.floor_area (number, optional): interior floor area.
  • property.land_area (number, optional): lot or land area.
  • property.area_unit (string, optional): unit for floor_area.
  • property.land_area_unit (string, optional): unit for land_area.
  • property.lot_size_text (string, optional): source-formatted lot size text.
  • property.year_built (integer, optional): construction year.
  • property.parking_capacity (number, optional): parking capacity.
  • property.garage_parking_capacity (number, optional): garage parking capacity.
  • property.parking_features (array of strings, optional): parking feature labels.

media

  • media.main_image_url (string, optional): primary listing image URL.
  • media.image_urls (array of strings, optional): gallery image URLs.
  • media.photos (array of objects, optional): photo records with URL, key, and optional source metadata.
  • media.photo_count (integer, optional): source-provided or counted number of photos.
  • media.virtual_tours (array of objects, optional): virtual-tour links and labels when exposed.

metrics

  • metrics.view_count (integer, optional): source-provided view count.
  • metrics.save_count (integer, optional): source-provided save count.
  • metrics.days_on_zillow (integer, optional): days-on-market style counter.
  • metrics.time_on_zillow (string, optional): display text for time on Zillow.
  • metrics.time_on_zillow_ms (number, optional): time-on-Zillow value in milliseconds when available.

availability

  • availability.open_house.description (string, optional): open-house display text.
  • availability.open_house.starts_at (string, optional): open-house start date or time when available.
  • availability.open_house.ends_at (string, optional): open-house end date or time when available.
  • availability.tour_eligibility (object, optional): tour scheduling options and windows when exposed.
  • availability.date_posted (string, optional): source-provided posting timestamp or date string.

contact_details

  • contact_details.phones (array of strings, optional): public phone numbers exposed with the listing.
  • contact_details.emails (array of strings, optional): public email addresses exposed with the listing.
  • contact_details.contacts (array of objects, optional): contact cards with name, phone, email, and role when available.

relationships

  • relationships.agent.name (string, optional): displayed listing agent name.
  • relationships.agent.mls_id (string, optional): source-provided MLS identifier associated with the agent or listing when available.
  • relationships.agent.mls_name (string, optional): source-provided MLS name when available.
  • relationships.agency.name (string, optional): displayed agency or brokerage name.
  • relationships.agency.mls_id (string, optional): source-provided MLS identifier associated with the agency or listing when available.
  • relationships.agency.mls_name (string, optional): source-provided MLS name when available.

attributes

  • attributes.flags (object, optional): boolean listing signals such as image, video, showcase, Zillow-owned, and open-house flags.
  • attributes.zillow.ids (object, optional): Zillow-specific identifiers such as zpid, result ID, pals ID, ssid, or MLS ID.
  • attributes.zillow.status (object, optional): Zillow-specific status codes and display status fields.
  • attributes.zillow.display (object, optional): display labels such as flex field text or content type.
  • attributes.zillow.search_result (object, optional): search-result metadata such as source list and result flags.
  • attributes.zillow.listing_sub_type (object, optional): listing subtype flags such as FSBA, FSBO, foreclosure, auction, new home, open house, or pending.
  • attributes.zillow.enrichment (object, optional): additional source detail facts when richer listing data is available.

Data Model Notes

  • Identity fields: use record_id as the primary upsert key; keep listing.listing_id, property.property_id, entity.external_ids.zpid, and url for reconciliation.
  • Source provenance: source_context fields trace each record back to its public source, input seed, search context, and collection timestamp.
  • Property and listing attributes: entity, listing, pricing, location, property, media, availability, contact_details, and relationships carry the main review and analysis value.
  • Pricing and status fields: prices, estimates, valuation-like values, statuses, availability, and descriptions are point-in-time public signals.
  • Nested objects: related values stay grouped so JSON-first pipelines, APIs, and AI agents can preserve context.
  • Optional fields: null-check fields that depend on listing type, region, account visibility, source availability, enrichment, or selected filters.
  • Repeated runs: compare records by stable identifier plus Apify run metadata, input segment, and timestamp stored in your downstream system.

Data Quality, Guarantees, And Handling

  • Structured records: results are normalized into predictable JSON objects for downstream use.
  • Field preservation: meaningful schema-supported listing and property values are kept in stable public fields or grouped objects when available.
  • Best-effort extraction: fields may vary by region, availability, account visibility, listing type, UI experiments, or source-side changes.
  • Optional fields: null-check optional fields in downstream code, dashboards, and agents.
  • Deduplication: use record_id first, with listing.listing_id, property.property_id, entity.external_ids.zpid, and url as supporting keys.
  • Freshness: results reflect publicly available Zillow data at run time.
  • Repeated runs: use the recommended idempotency key when syncing data into warehouses, CRMs, search indexes, vector stores, or monitoring systems.
  • Schema awareness: downstream systems should rely on documented fields and handle newly missing optional fields gracefully.
  • Run receipts: use summary and map artifacts to audit listing counts, coverage mode, skipped outcomes, enrichment status, map readiness, and export readiness without treating artifacts as replacement dataset records.

Tips For Best Results

  • Start with a small limit to validate the output shape before scaling up.
  • Use one city, neighborhood, ZIP code, property type, price band, listing mode, or status segment per run when you need clean comparison.
  • Leave optional filters empty when the goal is broad market discovery.
  • Add filters gradually to understand how each field changes coverage.
  • Keep enrich_data enabled for richer listing review, and disable it for quick validation runs when search-level data is enough.
  • Keep maximize_coverage enabled for broad matching searches when deeper collection matters more than speed.
  • Schedule recurring runs for monitoring workflows instead of relying on manual one-off runs.
  • Review run summary and map artifacts before importing records into production pipelines, dashboards, CRMs, or AI workflows.

How to Run on Apify

  1. Open the actor in Apify Console.
  2. Configure the available input fields for the target location, URLs, or property scope.
  3. Set limit to the maximum number of listings you want to save.
  4. Click Start and wait for the run to finish.
  5. Open the dataset and inspect the first records.
  6. Download results in JSON, CSV, Excel, or another supported format.

Agentic And API-First Usage

The actor can be used as a structured public property-data acquisition step inside larger automated workflows. It works well when an agent or pipeline needs a scoped Zillow input, normalized listing records, stable identifiers, and a compact run receipt for follow-up decisions.

  1. Generate or select a scoped input from the supported schema.
  2. Run the actor manually, on a schedule, or through Apify platform automation.
  3. Wait for completion and read the dataset records.
  4. Validate records against the field reference.
  5. Read run summary or map artifacts when present to verify counts, coverage state, limit behavior, skipped outcomes, coordinates, and export readiness.
  6. Upsert records into the downstream system using record_id.
  7. Trigger market analysis, enrichment, alerts, BI refreshes, vector/search indexing, lead review, or human verification.

Practical notes for agentic use:

  • Keep prompts and automations grounded in the documented input parameters.
  • Start with small validation runs before allowing broad automated collection.
  • Feed the Field Reference and a small output sample to downstream AI steps.
  • Feed run summary or map artifacts to downstream agents when present so they can reason about completion, record counts, coverage, location distribution, and follow-up actions.
  • Treat optional property and listing fields as nullable instead of asking agents to infer missing values.
  • Store run ID, input configuration, and dataset export metadata outside the record when building audit trails.
  • For tools such as Claude, Codex, internal copilots, or property workflow agents, pass the input schema, Field Reference, idempotency key, and one representative output example when context is limited.

Scheduling & Automation

Scheduling

Automated Data Collection

Use Apify schedules to keep Zillow-derived listing datasets fresh for recurring market monitoring, alerting, CRM review, or reporting.

  • Navigate to Schedules in Apify Console.
  • Create a new schedule, such as daily, weekly, or a custom cron interval.
  • Configure input parameters for the market, URLs, filters, and limit.
  • Enable notifications for run completion.
  • Add webhooks for automated processing.

Integration Options

  • CRM enrichment: sync public listing, pricing, location, property, agency, or contact attributes into account, property, or lead records.
  • BI dashboards: monitor asking prices, availability, listing status, property mix, geography, photos, and enrichment coverage over time.
  • Warehouses and ETL pipelines: ingest normalized JSON records into analytics systems with stable upsert keys.
  • Google Sheets or Airtable: review smaller market slices, lead lists, or validation outputs with operations teams.
  • Webhooks: trigger validation, notifications, imports, or alerts after each completed run.
  • MCP connectors: authorize a connector in Apify, select it in mcpConnectors, and use the delivered compact listing summary plus dataset, summary, or map links in the destination tool when available.
  • Search or vector indexes: index listing titles, descriptions, locations, property facts, and source links for discovery or AI retrieval workflows.

Export Formats And Downstream Use

  • JSON: for APIs, applications, AI agents, and data pipelines that preserve nested objects.
  • CSV or Excel: for spreadsheet workflows, stakeholder review, and lightweight analysis.
  • API access: for automated ingestion into internal systems.
  • BI and warehouses: for reporting, dashboards, historical analysis, and monitoring.
  • Search or vector indexes: for discovery, semantic search, retrieval workflows, or agent context.

Downstream Pipeline Guide

  • Idempotency: use record_id for upserts, with URL and source IDs as supporting reconciliation fields.
  • Null handling: treat optional fields as nullable, especially contact details, estimates, photos, tour data, open-house data, coordinates, MLS labels, and enriched facts.
  • Type handling: preserve numbers, booleans, arrays, and nested objects when exporting to JSON-first systems.
  • Flattening: if exporting to CSV or Excel, flatten nested objects deliberately and keep the original JSON export for full fidelity.
  • Partitioning: store run date, input segment, geography, property type, listing mode, and workflow name outside or alongside records for easier analysis.
  • Change detection: compare repeated runs by record_id and selected business fields such as pricing.price, listing.listing_status, availability.date_posted, metrics.days_on_zillow, or key property facts.
  • Quality checks: monitor record count, duplicate rate, required identifiers, price/status availability, coordinate coverage, enrichment status, and important optional field fill rates.
  • Human review: route records with missing critical fields, unusual values, changed status, price changes, or high-value segments into a review queue when needed.
  • Retention: decide how long to keep raw exports versus normalized warehouse tables based on your use case.

Performance And Coverage Expectations

Example run metrics from saved validation artifacts:

Run typeExample scopeListingsDurationCoverage notes
Location validationFocused location, lightweight output1about 4 secondsPassed dataset validation.
Direct URL validationOne Zillow URL, lightweight output1about 2 secondsPassed dataset validation.
Enriched location validationFocused location with enrichment enabled1about 4 secondsPassed dataset validation.
Coverage validationBroad collection with higher limit800about 65 secondsPassed dataset validation with 800 saved records.
Artifact validationTwo saved listings with coordinates2not recordedWrote RUN-SUMMARY, RUN-SUMMARY.html, and results-map; map marker count was 2.

These are example validation runs, not guarantees. Execution time varies based on filters, result volume, target availability, target response size, enrichment depth, coordinate and map artifact creation, and how much information is returned per listing. Highly filtered runs can finish faster, while broad discovery, maximize_coverage, enrichment, or detail-rich listing records may take longer. maximize_coverage prioritizes deeper retrieval within the selected criteria and can trade speed for a more complete matching collection.

Limitations

  • Availability depends on what Zillow publicly exposes at run time.
  • Some optional fields may be missing on sparse records, certain property types, direct URL records, or listings without richer public detail.
  • Very broad searches may take longer or require higher limit values.
  • Coverage-aware runs can take longer when many listings match the selected criteria.
  • Target-side changes can affect field availability, naming, or display values.
  • Regional, account, visibility, listing status, and availability differences may change visible results.
  • Listing prices, estimates, availability, status, descriptions, and valuation-like values are point-in-time public signals and should be verified before operational decisions.
  • The actor provides structured public real estate data, not legal, financial, investment, valuation, appraisal, MLS, or brokerage advice.

Troubleshooting

  • No results returned: check filters, location spelling, listing mode, property category, direct URLs, and whether Zillow has matching public records.
  • Fewer results than expected: broaden filters, raise limit, enable maximize_coverage for broad searches, or verify that Zillow contains enough matching records.
  • Some fields are empty: optional fields depend on what each listing publicly provides and whether richer detail collection is available.
  • Duplicate-looking records: compare record_id, listing.listing_id, property.property_id, and url to decide whether records represent variants, updates, or distinct listings.
  • Run takes longer than expected: reduce scope, lower limit for validation, disable enrich_data for a quick shape check, or split broad collection into smaller segments.
  • Output changed: compare the current output with the Field Reference and report a small sample if support is needed.
  • Downstream import failed: check JSON validity, nullable fields, nested objects, and whether your destination expects flattened columns.

FAQ

What data does this actor collect?

It collects public Zillow property listing records, including listing identity, URLs, pricing, location, property facts, media, metrics, availability, contact details, relationships, and source-specific attributes when available.

Can I filter by location, property type, date, price, status, keyword, or other criteria?

Yes. The input schema supports location, deal_type, property_type, publication_date, price and payment ranges, bedroom and bathroom thresholds, listing categories, listing statuses, tours, parking, area, building year, amenities, views, keyword, and related filters.

Why did I receive fewer results than my limit?

The selected filters, location, listing mode, direct URLs, target availability, or public result set may contain fewer matching records than the requested limit.

What does maximize_coverage do?

maximize_coverage requests deeper collection within the same selected criteria. It does not broaden your filters; it is intended for broad searches where the first visible result set is not enough.

Where can I find the run summary or interactive map?

When available, open the actor run output and key-value-store artifacts for RUN-SUMMARY, RUN-SUMMARY.html, and results-map.

How should I choose a limit for my first run?

Start with a small limit, such as 10 to 25 records, inspect the dataset shape and artifacts, then increase the value for scheduled monitoring, dashboards, CRM imports, or ETL ingestion.

Can I schedule recurring runs?

Yes. Use Apify schedules to run the same input daily, weekly, or on a custom cadence.

How do I avoid duplicates across runs?

Use record_id as the primary key for upserts. Keep listing.listing_id, property.property_id, entity.external_ids.zpid, and url as supporting reconciliation fields.

Can I use the output with AI agents or automated workflows?

Yes. The actor writes structured JSON records and run artifacts that can be consumed by AI agents, workflow automations, ETL jobs, BI pipelines, and search or vector indexes.

Can I export the data to CSV, Excel, or JSON?

Yes. Apify datasets support common export formats including JSON, CSV, Excel, and API-based consumption.

Does this actor collect private data or provide official MLS/appraisal data?

No. It is intended for publicly available Zillow information. It does not provide private data, official MLS feeds, appraisal-grade valuation, legal advice, financial advice, investment advice, or brokerage services.

What should I include when reporting an issue?

Include the redacted input, run ID, expected behavior, actual behavior, a small output sample if helpful, and downstream destination or export format if the issue is pipeline-related.

Compliance & Ethics

Responsible Data Collection

This actor collects publicly available property listing information from Zillow for legitimate business purposes, including:

  • Real estate research and market analysis.
  • Listing monitoring, CRM enrichment, and operational review.
  • BI, ETL, AI-agent, and internal workflow automation.

This section is informational and not legal advice. Users are responsible for making sure their collection and use of data complies with applicable laws, regulations, platform terms, and internal policies.

Best Practices

  • Use collected data in accordance with applicable laws, regulations, and the target site's terms.
  • Respect individual privacy and personal information.
  • Use data responsibly and avoid disruptive or excessive collection.
  • Do not use this actor for spamming, harassment, discrimination, unlawful housing practices, or other harmful purposes.
  • Follow relevant data protection, fair housing, consumer protection, and sector-specific requirements where applicable.
  • Review your own retention, access control, and data-sharing policies before operationalizing the dataset.

Support

Ask for help through the actor page or Issues. Include the redacted input used, run ID, expected versus actual behavior, a small output sample when useful, and the downstream destination or export format if the issue is pipeline-related.