Zillow Real-Time Property & Agent Data Scraper avatar

Zillow Real-Time Property & Agent Data Scraper

Pricing

from $2.50 / 1,000 results

Go to Apify Store
Zillow Real-Time Property & Agent Data Scraper

Zillow Real-Time Property & Agent Data Scraper

Scrape Zillow in real time: search any location, get full property details, prices, beds/baths, year built, taxes, schools, and agent contacts — clean, normalized phone numbers and agent IDs. Results stream to your dataset as JSON with webhooks and proxy rotation built in.

Pricing

from $2.50 / 1,000 results

Rating

0.0

(0)

Developer

Emmanuel

Emmanuel

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Categories

Share

Zillow Real-Time Data — Property & Real-Estate Lead Data at Scale

Turn Zillow listings into clean, structured property and lead data. Give it one or more locations — or specific listing URLs — and get one flat JSON row per property, complete with price, home facts, taxes, HOA, schools, days on market, listing agent, and (optionally) enriched lead contact details. Rows stream into your Apify dataset as they are collected, so even very long runs stay light and nothing is lost mid-run.

No Zillow API keys. No spreadsheets. No cleanup. Just enter locations and press Start.

⚡ Real-time streaming output • 🎯 Multi-location runs • 🧩 Flat, predictable JSON • 🤝 Lead details without filtering • 💸 Pay only for what you export


✅ Pricing & free-plan note (read first)

This Actor uses Apify's pay-per-result model — you're charged per exported row (see Pricing).

  • Apify free plan: runs are limited to a 2-result sample per run, and the log tells you to upgrade. This is an Apify platform plan restriction, applied transparently — it is not an error.
  • Any paid Apify plan (Bronze and above): full, uncapped output. You get exactly what your input asks for.
  • Every run also honors your max run charge (spending limit): the Actor finishes gracefully the moment your configured limit is reached.

Details: Free plan limitations · Pricing


Why this Actor

Zillow Real-Time DataTypical scraper
SpeedFast per-result collectionOften slow & fragile
Memory512 MB default2–4 GB+
SetupOrganized input UI — run immediatelyOften needs tuning
OutputFlat, stable JSON field namesMessy, inconsistent
StreamingRows saved live during the runResults only at the end
ScaleUp to 50,000 rows per runOften capped much lower
FreshnessCollected at run time ("real-time")Cached or stale

What you get — 80+ data points per property

Every property row includes featureType and scrapedAt so you can filter, join, and pipe into any workflow.

Property rows (featureType: "search" / "property_details")

GroupFields
Identityzpid, propertyUrl, address, streetAddress, city, state, zipCode, neighborhood, county
Status & typepropertyType, propertySubType, listingType, listingStatus, homeStatus
Pricingprice, pricePerSqFt, zestimate, rentZestimate, originalPrice, priceChange, priceChangePercent, daysOnZillow
Home factsbedrooms, bathrooms, fullBathrooms, halfBathrooms, squareFeet, lotSize, lotSizeUnits, yearBuilt, yearRenovated, stories, rooms, floors
Locationlatitude, longitude, timezone, walkScore, transitScore, bikeScore
Featuresheating, cooling, parking, garageSpaces, hasPool, hasView, hasWaterfront, isNewConstruction, isForeclosure, isAuction, isComingSoon, isForSaleByAgent, isForSaleByOwner, isPending, isBankOwned, isOpenHouse, isVirtualTour, is3dHome, isHomeStage
MediamainImage, images[], imageCount
SchoolsschoolDistrict, elementarySchool, middleSchool, highSchool, schoolRating, schoolDistance
Tax & HOAtaxAssessedValue, taxAnnualAmount, taxYear, hoaFee, hoaFrequency
Descriptiondescription, features[], amenities[]
HistorylastSoldDate, lastSoldPrice, previousListings[], nearbySales[]
Listing agentagentId, agentName, agentPhone, agentEmail, agentUrl, brokerageName, agentContact

Agent profile rows (featureType: "agent_details")

GroupFields
IdentityagentId, agentName, agentTitle, agentUrl, profileImageUrl
Contactemail, phone, phoneNumbers[], fax, website
SocialsocialMedia (facebook, twitter, linkedin, instagram, youtube, tiktok, pinterest)
LicenselicenseNumber, licenseState, licenseExpiration, yearsExperience
BrokeragebrokerageName, brokerageUrl, brokeragePhone, brokerageAddress
Service areaserviceAreas[], officeAddress, officeCity, officeState, officeZip
PerformancerecentSales, activeListings, averageRating, reviewCount, specializations[], languages[]

Features

Add any number of locations (city, state, or ZIP) and collect up to N properties per location. Pick the listing status: for sale (default), for rent, sold, pending, or all. Optional result filters: minimum/maximum price, minimum/maximum bedrooms, minimum bathrooms.

🏠 Full property details (on by default)

Every property is enriched with description, taxes, HOA, schools, days on market, features, history, and the listing agent. Adds a little extra time per business.

🤝 Enable lead details (on by default) — enrichment, never a filter

Adds lead contact details to each property — agent name, phone, email, website, and social profiles — when they are available.

Every property is still exported even when no lead details are found. Nothing is ever dropped for lacking contact info, so the time and cost of a run stay predictable (this is deliberate: you always know what a run of N businesses costs).

🕵️ Agent profiles

Paste agent profile URLs and collect complete agent records as their own rows — ideal for building real-estate contact lists.

📎 Property URLs

Already have listing URLs? Collect full details for them directly — alone or combined with a location search.


Who it's for

  • Real-estate lead generators & ISAs — lists of homes + the agent (or team) behind them, with contact details ready for outreach.
  • Mortgage, insurance & home-service providers — properties in target markets with price, size, and days-on-market signals.
  • Realtors & brokerages — track competing listings, new inventory, and recently sold comparables.
  • RE investors & acquisitions teams — for-sale and sold inventory with lot size, taxes, and history for deal screening.
  • Market analysts & researchers — structured, joinable data across cities for pricing and inventory studies.
  • CRMs, data teams & warehouses — stable flat JSON that drops straight into Postgres, BigQuery, Airtable, or Sheets.
  • AI & automation builders — clean rows for LLM prompts, scoring agents, and enrichment pipelines via the Apify API and MCP.

Use cases

  • Listing-agent lead gen — run locations nationwide, enable lead details, and get every listing's agent with phone/email when available.
  • Multi-market prospecting — 50 cities in one run; each row tagged with its location context.
  • New-listing alerts — daily scheduled runs on "for sale" + webhook → Slack/CRM the moment inventory appears.
  • Sold-comparable analysis — status "sold" across a zip code, then join against your own valuations.
  • Days-on-market tracking — daysOnZillow + priceChangePercent per property over recurring runs.
  • Rental inventory scans — status "for rent" with rentZestimate for portfolio or SaaS data products.
  • Agent & team building — agent-profile rows become a real-estate contact database with brokerage, license, and service areas.
  • URL enrichment — bring your own listing URLs, leave with full property records.
  • AI listing summaries — feed description, facts, and taxes to an LLM for instant comparative write-ups.
  • Investor deal flow — filter price/beds in-run and route matches to your acquisitions CRM by webhook.

Quick start

  1. Open the Actor in Apify Console.
  2. Add one or more locations (e.g. Austin, TX).
  3. Choose listing status and max results per location.
  4. Leave Full property details and Enable lead details on for maximum data per row.
  5. Press Start and watch rows stream into the dataset.
  6. Export as JSON / CSV / Excel, pull via the Apify API, wire up a webhook, or use MCP.

Example — for-sale homes in two cities

{
"enableSearch": true,
"searchLocations": ["Austin, TX", "Denver, CO"],
"searchStatus": "for_sale",
"searchMaxResults": 50,
"enablePropertyDetails": true,
"enableLeadDetails": true,
"maxItems": 100
}

Example — investor screen (price + beds filters)

{
"searchLocations": ["Phoenix, AZ"],
"searchStatus": "for_sale",
"searchMaxResults": 200,
"searchMinPrice": 150000,
"searchMaxPrice": 400000,
"searchMinBeds": 3,
"maxItems": 200
}

Example — enrich your own listing URLs

{
"enableSearch": false,
"propertyUrls": [
"https://www.zillow.com/homedetails/1200-Main-St-Austin-TX-78701/12345678_zpid/"
],
"enablePropertyDetails": true,
"enableLeadDetails": true
}

Example — agent contact list from profile URLs

{
"enableSearch": false,
"enableAgentDetails": true,
"agentUrls": [
"https://www.zillow.com/profile/Agent-Name/12345678"
],
"maxItems": 500
}

Example — results to a webhook (Slack-friendly)

{
"searchLocations": ["Miami, FL"],
"searchMaxResults": 25,
"webhookUrl": "https://hooks.slack.com/services/T000/B000/XXXX",
"webhookFormat": "slack"
}

Input reference

FieldTypeDefaultDescription
enableSearchbooleantrueCollect properties across the locations below.
searchLocationsstring[][]Cities, states, or ZIPs — one row per location.
searchStatusselectfor_salefor_sale, for_rent, sold, pending, or all.
searchMaxResultsinteger20Max properties per location (1–500).
searchMinPrice / searchMaxPriceinteger–Result filters: keep only properties within this price band.
searchMinBeds / searchMaxBedsinteger–Result filters: bedroom range.
searchMinBathsinteger–Result filter: minimum bathrooms.
enablePropertyDetailsbooleantrueEnrich each property with the full detail set. Adds a little extra time per business.
enableLeadDetailsbooleantrueAdd lead contact details when available. Never filters — every property is exported either way.
propertyUrlsstring[][]Collect full details for specific listing URLs.
enableAgentDetailsbooleanfalseCollect full agent profiles from agentUrls.
agentUrlsstring[][]Agent profile URLs to collect.
maxItemsinteger10000Global cap on total rows this run (1–50000). Free plan: capped at 2 — see Free plan limitations.
webhookUrlstring""Optional. Each row is saved to the dataset and delivered to this URL in real time.
webhookFormatselectjsonjson (full record) or slack (message payload).
proxyConfigurationproxyUS residentialApify proxy settings (US residential on by default).

Provide at least one location, property URL, or agent URL.

Output reference

Every exported record is a flat JSON object in the run's dataset, tagged by featureType:

featureTypeRow shape
searchProperty found via location search (optionally enriched with details + lead details).
property_detailsFull property record collected from a listing URL you provided.
agent_detailsFull agent/realtor profile from an agent URL you provided.

Common fields on every row:

FieldTypeDescription
featureTypestringsearch, property_details, or agent_details.
sourcestringWhich stage produced the row (e.g. search, search+details).
scrapedAtstringISO 8601 UTC timestamp of collection.

Property rows carry the full field set documented in What you get above; agent rows carry the agent-profile field set. Missing values are null — field names are stable across runs, so your transforms won't break.

Run summary (OUTPUT key-value store)

Each run also writes a summary you can read via the Apify API:

{
"totalPushed": 120,
"enabledFeatures": ["search", "lead_details"],
"errors": [],
"spendingLimitReached": false,
"paywall": {
"detected": true,
"isPaying": true,
"pricingTier": "SILVER",
"blocked": false,
"limited": false,
"mode": "limit",
"freeTierMaxItems": null
},
"finishedAt": "2026-07-10T12:00:00.000Z"
}
Summary fieldMeaning
totalPushedRows exported this run.
enabledFeaturesFeatures that ran (e.g. search, property_details, agent_details, lead_details).
errorsNon-fatal failures, expressed as fixed user-facing sentences.
spendingLimitReachedtrue when your max run charge was reached — the run then finishes gracefully.
paywallFree-plan gate transparency: detected, isPaying, pricingTier, blocked, limited, mode, freeTierMaxItems.
finishedAtWhen the run wrapped up.

Dataset views

The dataset ships with ready-made views: Overview, Properties, and Agents — switch between them in the Console's Dataset tab.


Webhooks — real-time delivery to your stack

Every row is always saved to the run's dataset. Optionally, set Webhook URL and each row is also delivered to your URL the moment it is collected — perfect for CRMs, Slack, Zapier, Make, n8n, or Google Sheets.

SettingValues
webhookUrlYour receiving URL (any service that accepts a POST).
webhookFormatjson = the full record; slack = Slack message payload.

Payload example (json format):

{
"featureType": "search",
"address": "1200 Main St, Austin, TX 78701",
"city": "Austin",
"state": "TX",
"price": 725000,
"bedrooms": 3,
"bathrooms": 2,
"squareFeet": 1840,
"agentName": "Jane Doe",
"agentPhone": "(512) 555-0142",
"agentEmail": "jane@example.com",
"propertyUrl": "https://www.zillow.com/homedetails/...",
"scrapedAt": "2026-07-10T12:00:00.000Z"
}

Payload example (slack format):

{
"text": ":house: *1200 Main St, Austin, TX 78701*\n*Price:* $725,000\n*3 bd / 2 ba*\n*Agent:* Jane Doe • (512) 555-0142\n<View listing|...>"
}

Failed deliveries are logged as a single warning (Webhook delivery failed) and never interrupt the run or dataset writes.

Apify's own webhooks (run succeeded / failed / aborted) are configured separately under your run's Storage → Webhooks in the Console and work with any Actor.


Integrations — API, MCP, and automations

Apify API

Pull results programmatically as JSON, CSV, or Excel:

  • GET https://api.apify.com/v2/datasets/{DATASET_ID}/items — your rows.
  • Full reference: Apify API v2

Start and monitor runs with POST /v2/acts/{actorId}/runs — schedule them with Schedules for daily inventory or lead refreshes.

MCP usage (AI assistants)

Use the Apify MCP server so AI assistants (Claude, ChatGPT, Cursor, and others) can run this Actor and read its results directly in chat:

  1. Connect the Apify MCP server to your assistant (setup guide).
  2. Ask in natural language — the assistant calls this Actor with the right input.
  3. Results come back as dataset items the assistant can summarize, tabulate, or chain onward.

Example prompts:

"Collect 30 for-sale homes in Austin, TX under $600k with at least 3 bedrooms and summarize each in two sentences."
"Run the Zillow actor for Miami, FL and turn the top 20 results into a CSV table with address, price, and agent phone."
"Find recently sold homes in Denver and group them by price band."

Typical MCP flow:

User: "Collect 10 condos in San Diego under $500k and draft outreach to their listing agents"
→ MCP runs Actor with searchLocations=["San Diego, CA"], searchMaxResults=10, maxItems=10
→ MCP reads dataset items (address, price, agentName, agentEmail)
→ Assistant drafts the outreach

LLM & RAG pipelines

Output is stable, flat JSON — ideal for ChatGPT, Claude, Gemini, LangChain, and LlamaIndex:

{
"featureType": "search",
"address": "1200 Main St, Austin, TX 78701",
"price": 725000,
"bedrooms": 3,
"bathrooms": 2,
"daysOnZillow": 12,
"agentName": "Jane Doe",
"agentEmail": "jane@example.com",
"scrapedAt": "2026-07-10T12:00:00.000Z"
}

Workflow: run the Actor → fetch dataset items via the API → pass records to your LLM or vector store.

Native integrations

Push rows straight from the dataset to Google Sheets, Airtable, Dropbox, Google Drive, Zapier, Make, and more via Apify Integrations — no code required.


Pricing

  • Pay per exported result (pay-per-event). You are charged for rows actually delivered to your dataset — not for time, and not for work you don't receive.
  • Spending limit respected: if you set a max charge for a run in Apify, the Actor stops gracefully the moment that limit is reached, with a clear status message — never an overrun. See Apify's pay-per-event docs.
  • Cost levers: lower maxItems, lower searchMaxResults, and turn off Full property details / Enable lead details for lighter runs.

Free plan limitations

Apify free-plan accounts are limited to a 2-result sample per run. The run log shows an explicit notice to upgrade to a paid Apify plan for full, unlimited data, and the run's paywall summary object records the decision (detected, isPaying, pricingTier, blocked, limited). This is a transparent platform plan restriction — runs finish cleanly; nothing errors. Paid plans (Bronze and above) always get the full, normal output with no cap.


Performance & scale

  • Streaming: rows are written to the dataset as they are collected — memory stays light and a long run never loses completed work.
  • 512 MB default memory (configurable up to 2 GB).
  • 10,000-second run timeout — supports very large multi-location runs.
  • Up to 50,000 rows per run (maxItems).
  • US residential connectivity enabled by default for consistent results.

FAQ

Do I need a Zillow API key or account?
No. Just enter locations and press Start.

What does "real-time" mean here?
Data is collected when your run executes — not served from a stale cache. Schedule runs to keep it fresh.

I'm on the Apify free plan — why only 2 results?
That's the platform free-plan restriction for this Actor: 2 results per run plus an upgrade notice in the log. Upgrade to any paid Apify plan for full, unlimited output. See Free plan limitations.

Will rows without contact details be dropped?
Never. Enable lead details adds contact information when it's available — it never filters. Every collected property is exported, so run time and cost stay predictable.

Why does a run take a little longer with lead details on?
Lead details add a little extra time per business. Turn the toggle off if you only need property facts.

Some of my property URLs produced no row — why?
Rows are only exported for listings that were successfully collected. Unavailable or invalid listings are skipped and noted in the log with a fixed, generic message.

Can I filter by price or beds?
Yes — set searchMinPrice, searchMaxPrice, searchMinBeds, searchMaxBeds, or searchMinBaths. Rows missing that data point don't match a set filter.

How do webhooks work?
Set webhookUrl (and webhookFormat) and each row is delivered to your URL as it is collected, in addition to being saved to the dataset. Failures log one warning and never stop the run.

Can AI assistants use this Actor?
Yes — connect the Apify MCP server and run it with natural language. See MCP usage.

How do I control cost?
Use maxItems as the hard cap, keep per-location results realistic, and set a run spending limit in Apify — the Actor honors it and stops gracefully.

What does spendingLimitReached: true mean?
Your configured max charge for that run was reached. The run wrapped up cleanly with everything collected so far saved.

What do the paywall fields mean?
They make the free-plan gate visible in the run output: whether it was detected, whether the account is paying, the pricing tier, and whether results were capped or blocked.

Is the data public?
The Actor collects publicly displayed listing information only.

Which countries/locations work?
Any location Zillow lists — cities, regional areas, and ZIP codes across the US.

How often can I run it?
As often as you like, bounded by your Apify plan and spending limits. Scheduled runs are supported.

What does "Webhook delivery failed" in the log mean?
Your receiving URL rejected or timed out the delivery. Dataset writes are unaffected — fix the receiver or re-deliver from your own queue.

How do I export data?
Console export (JSON/CSV/Excel), the Apify API, native integrations, or your webhook.


Support

Open an issue on this Actor's GitHub repository or contact the developer through the Apify Store page.

License

See repository for license details.