Zillow URL Search Property Scraper avatar

Zillow URL Search Property Scraper

Pricing

Pay per event

Go to Apify Store
Zillow URL Search Property Scraper

Zillow URL Search Property Scraper

Extract Zillow real estate listings by pasting any Zillow search URL — filters baked into the URL are honored. 74 output fields including agent contacts, price history, Zestimate, and property details. Pay-per-event pricing — only pay for properties enriched. Free plan: up to 15 properties per run.

Pricing

Pay per event

Rating

0.0

(0)

Developer

Andrey Afanasenko

Andrey Afanasenko

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 hours ago

Last modified

Share

Apify Actor

Paste any Zillow search URL — get one structured row per property with agent contacts, price history, and 74 output fields.


🎯 What it does

You paste a Zillow search URL (with whatever filters you've already set up on the Zillow website) and get one structured row per property in the dataset. Filters baked into the URL's searchQueryState (price range, beds/baths, status, home type, school rating, 50+ property features) are honored automatically — no need to re-enter them in the actor's input. Each row includes:

  • Address & location — street, city, state, ZIP, county, neighborhood, lat/lng
  • Listing data — price, status (For Sale / For Rent / Recently Sold), days on Zillow, page views, favorites, listing type
  • Property details — beds, baths, square footage, lot size, year built, home type, architectural style, flooring, heating/cooling, roof, appliances, fireplaces, garage, pool, basement, view types
  • Financial data — Zestimate, Rent Zestimate, price per sqft, HOA fees, property tax, price history, last sold date
  • Agent contacts — agent name, email, phone, license number, broker name, broker phone

The actor handles three URL shapes automatically:

  1. Search URLs with searchQueryState (e.g. https://www.zillow.com/austin-tx/?searchQueryState=...) — filters extracted from the URL and applied to a location search. Covers For Sale, For Rent, and Recently Sold listings (whichever the URL's searchQueryState encodes).
  2. Recently sold listings (e.g. https://www.zillow.com/homes/recently_sold/Indiana_rb/) — pulled as a sold-listings search.
  3. Single-property URLs (e.g. https://www.zillow.com/homedetails/.../12345_zpid/) — ZPID auto-extracted, that one property enriched directly (skip search).

⚡ Quick start

Minimal input — paste a Zillow search URL:

{
"zillowUrl": "https://www.zillow.com/austin-tx/houses/?searchQueryState=%7B%22filterState%22%3A%7B%22price%22%3A%7B%22min%22%3A400000%2C%22max%22%3A900000%7D%2C%22beds%22%3A%7B%22min%22%3A3%7D%7D%7D",
"maxProperties": 50
}

That run produces ~50 rows from Austin, TX with price 400k-900k, 3+ beds, one row per property with the default 74 output columns.


📦 Output sample

A full row from a real run. All 74 columns shown; only the narrative propertyDescription and the long priceHistory array are condensed for readability.

{
"zpid": "119617641",
"hdpUrl": "https://www.zillow.com/homedetails/10124-Pinnacle-Crest-Loop-Austin-TX-78747/119617641_zpid/",
"price": 375000,
"status": "FOR_SALE",
"propertyDescription": "Tucked away on a quiet street in popular South Austin, this beautifully upgraded home offers ... (full description ~2000 chars)",
"homeType": "SINGLE_FAMILY",
"latitude": 30.140326,
"longitude": -97.76442,
"lotAreaValue": "4,843 sqft",
"lotAreaUnit": "sqft",
"priceChange": null,
"datePriceChanged": null,
"has3DModel": false,
"hasVideo": false,
"pageViewCount": 2172,
"favoriteCount": 137,
"listingType": "FSBA",
"streetAddress": "10124 Pinnacle Crest Loop",
"city": "Austin",
"state": "TX",
"zipcode": "78747",
"county": "Travis County",
"neighborhood": null,
"agentName": "Hillary Smith",
"agentEmail": "hillary@homesmithatx.com",
"agentEmailSource": "agent_profile_direct",
"cellPhone": "512-585-1947",
"coAgentName": null,
"coAgentNumber": null,
"agentLicenseNumber": null,
"brokerName": "HOMESMITH REALTY, LLC",
"brokerPhoneNumber": "(512) 585-1947",
"zestimate": null,
"rentZestimate": null,
"pricePerSqft": 157,
"hoaFee": 47,
"propertyTax": 7749,
"bedrooms": 5,
"bathrooms": 3,
"bathroomsFull": 3,
"bathroomsHalf": null,
"livingArea": 2385,
"lotSize": "4,843 sqft",
"yearBuilt": 2014,
"stories": 2,
"architecturalStyle": null,
"parcelNumber": "04430309070000",
"view": "None",
"heating": "Central",
"cooling": "Ceiling Fan(s), Central Air",
"appliances": "Dishwasher, Dryer, Gas Range, Microwave, Refrigerator, Washer",
"flooring": "Carpet, Vinyl",
"roofType": "Composition, Shingle",
"laundryFeatures": null,
"fireplaceFeatures": "None",
"communityFeatures": null,
"hasPool": true,
"hasGarage": true,
"garageSpaces": null,
"parking": null,
"hasBasement": false,
"daysOnZillow": "6 days",
"openHouseSchedule": "",
"lastSoldDate": null,
"lastSoldPrice": null,
"lastTaxPaid": 7749.95,
"lastTaxAssessedValue": 378695,
"priceHistory": [
{ "date": "2026-04-30", "price": 375000, "event": "Listed for sale", "pricePerSquareFoot": 157, "source": "Unlock MLS", "postingIsRental": false },
{ "date": "2022-11-16", "price": 2450, "event": "Listed for rent", "pricePerSquareFoot": 1, "source": "Zillow Rental Manager", "postingIsRental": true },
{ "date": "2022-10-01", "price": 500000, "event": "Price change", "pricePerSquareFoot": 210, "source": "Unlock MLS", "postingIsRental": false }
/* ... 22 more historical entries (price changes, listings, removals back to 2017) */
],
"schools": [
{
"distance": 1.3, "name": "Blazier Elementary School", "rating": 5, "level": "Primary",
"studentsPerTeacher": null, "assigned": null, "grades": "PK-6",
"link": "https://www.greatschools.org/texas/austin/10788-Blazier-Elementary-School/",
"type": "Public", "size": null, "totalCount": null, "isAssigned": null
},
{
"distance": 3.3, "name": "Paredes Middle School", "rating": 2, "level": "Middle",
"studentsPerTeacher": null, "assigned": null, "grades": "6-8",
"link": "https://www.greatschools.org/texas/austin/9472-Paredes-Middle-School/",
"type": "Public", "size": null, "totalCount": null, "isAssigned": null
},
{
"distance": 2.2, "name": "Akins High School", "rating": 4, "level": "High",
"studentsPerTeacher": null, "assigned": null, "grades": "9-12",
"link": "https://www.greatschools.org/texas/austin/9663-Akins-High-School/",
"type": "Public", "size": null, "totalCount": null, "isAssigned": null
}
],
"mainPhoto": "https://photos.zillowstatic.com/fp/b7a661227b8e215ae7cd331817f37a34-p_d.jpg",
"photos": ["https://photos.zillowstatic.com/fp/b7a661227b8e215ae7cd331817f37a34-p_d.jpg"],
"walkScore": null,
"transitScore": null,
"bikeScore": null
}

Notes on the sample above:

  • zestimate / rentZestimate null — Zillow doesn't always publish a Zestimate on every listing.
  • agentLicenseNumber null — not every brokerage exposes the license number on the listing page.
  • photos array has 1 entry — Walk/Transit/Bike score and full photo gallery enrichment are not exposed on this URL-only actor. For per-property enrichment toggles, switch to the multi-mode parent actor.
  • walkScore / transitScore / bikeScore null — same reason.

🧭 When to use it

  • You already use Zillow's filter UI to narrow listings — copy the URL and let the actor do the rest. No need to translate filters into JSON.
  • Saved-search delivery — re-run the same URL on a schedule to capture new listings + price changes over time.
  • One-off geo + filter combos — when filters are complex (foreclosures + minimum school rating + finished basement + 3D tour), encoding them in the URL is faster than re-entering each in input.
  • Single-property lookup — paste a Zillow property page URL (e.g. /homedetails/.../12345_zpid/) and enrich just that one listing.

If you don't already have a URL and prefer typing parameters, use the sibling zillow-zip-search (single-mode, ZIP-input) or the multi-mode parent zillow-property-agent-data-scraper.


🛠 Input

Two input fields, only one required:

  • zillowUrl (required, string) — paste any Zillow search URL or single-property URL. Filters baked into the URL are honored.
  • maxProperties (integer, default 0=unlimited) — per-run property cap. Free plan: maximum 15 regardless.

Per-run cost ceilings are set via Apify's built-in "Maximum cost per run" option in the Run options panel — no input field needed.

See the Input tab in Apify Console for descriptions, types, defaults, and examples.


💰 Pricing

EventTierPrice
Property Data Enriched (primary)FREE$0.08
BRONZE$0.07
SILVER$0.06
GOLD$0.05
PLATINUM$0.05
DIAMOND$0.05
Actor Start (one-time per run)all tiers$0.00005 / GB of memory

You only pay for properties that were successfully enriched (full property + agent + history data fetched). Listings that fail discovery (no upstream match for the URL) are free.

Examples (FREE tier):

  • 10 properties enriched → ~$0.80
  • 100 properties enriched → ~$8.00
  • 1,000 properties enriched → ~$80.00

🆓 Free vs paid plan

Free planPaid plan
Properties per runup to 15unlimited
Per-run budget ceiling$1.20set via Apify Run options
Agent email visibilitydomain masked (name@xxx)full email
Filters & URL types supported

The first paid run unlocks unlimited properties + budgets + full agent emails immediately — no waiting period.


🔗 How to construct your Zillow URL

The fastest workflow is: open Zillow in your browser, apply the filters you want using the on-site UI, and copy the resulting URL straight from the address bar. Three URL shapes are supported:

Shape 1 — Search URL with filters (most common)

https://www.zillow.com/austin-tx/houses/?searchQueryState=%7B%22filterState%22%3A%7B%22price%22%3A%7B%22min%22%3A400000%2C%22max%22%3A900000%7D%2C%22beds%22%3A%7B%22min%22%3A3%7D%7D%7D

The searchQueryState parameter encodes filters as JSON — price, beds/baths, home type, and listing status (For Sale / For Rent / Recently Sold). The actor parses it and runs a location-mode search with your filters applied. Use this for any complex filter combo, including sold listings: copy the URL after you click Zillow's "Sold" tab and the rs:true flag will be embedded.

Shape 2 — Recently sold listings

https://www.zillow.com/homes/recently_sold/Indiana_rb/

A /homes/recently_sold/<Location>_rb/ URL — the actor pulls it as a sold-listings search. Use this when you want every recent sale in a state, county, or city without setting other filters.

Shape 3 — Single-property page

https://www.zillow.com/homedetails/10124-Pinnacle-Crest-Loop-Austin-TX-78747/119617641_zpid/

The actor auto-detects /12345_zpid/ and enriches just that property (skips search entirely). Useful for one-off lookups or watchlist-style runs.


📡 Live status & storage records

Every run writes a few records to the run's Storage tab:

KeyTypeDescription
RUN_SUMMARYJSONFull run statistics — input, properties (found / enriched / skipped), email yield, billing, plan tier, error info if any.
status.htmlHTMLAuto-refreshing status page rendered live during the run. View via the Live View tab in Apify Console.
SKIPPED_ITEMSJSONPer-item list of every URL / property skipped during the run, with reason and category (not_found, error, free_limit, test_run_cap). Useful for debugging and re-running the error cohort.
FREE_LIMITS_APPLIEDJSONArray of {id, message} for every free-tier ceiling hit during this run. Empty/omitted on paid runs.
USER_MESSAGEJSONOnboarding banner shown on a paid user's 1st and 3rd paid run. Empty/omitted otherwise.
UNKNOWN_INPUT_KEYSJSONLists any input field names that were not part of this actor's schema (e.g. zipCodes, zpids, filter fields — fields from sibling actors). Empty/omitted if all input keys are recognized.

🤖 Programmatic / API use

# Start a synchronous run + read the dataset directly
curl -X POST "https://api.apify.com/v2/acts/zillow-url-search/run-sync-get-dataset-items?token=YOUR_TOKEN" \
-H 'Content-Type: application/json' \
-d '{"zillowUrl":"https://www.zillow.com/austin-tx/houses/?searchQueryState=%7B%22filterState%22%3A%7B%22price%22%3A%7B%22min%22%3A400000%2C%22max%22%3A900000%7D%2C%22beds%22%3A%7B%22min%22%3A3%7D%7D%7D", "maxProperties":20}'

The actor exposes its schema for MCP / agent consumption — dataset_schema.json declares every output column with type and description, and input_schema.json declares every input field.


❓ FAQ

Why a URL-input actor instead of typed filters?

Zillow's filter UI is rich (price, beds, school rating, 50+ property features, sold-in-last, days-on-Zillow, etc.). Encoding all of that in JSON input is tedious. URL input lets you set up the search visually on Zillow once, then re-run on any schedule.

Public real-estate listing data has been collected and resold for years; this actor extracts data already publicly visible to any browser visitor. You are responsible for complying with Zillow's Terms of Service and any applicable local laws when using the output (especially for outreach to listing agents).

Why are some fields null?

Not every Zillow listing has every field populated — agent emails are missing on some listings, year-built is missing on new construction, lot size is missing on condos, etc. Null in the dataset means the source listing didn't expose that data.

Can I schedule runs?

Yes — use Apify's built-in Schedules feature in the Console. Common pattern: run weekly on the same Zillow URL to track new listings + price changes for that filter combo.

What happens when a run is aborted mid-way?

Properties already enriched and pushed to the dataset are persisted. The next run starts from scratch (this actor doesn't checkpoint between runs).

How do I avoid the test-mode 10-property cap?

Don't use the default Zillow URL (Beverly Hills, CA listings). Replace zillowUrl with your own URL and the cap is restored to your plan's normal limit (paid: unlimited; free: 15 per run).

Why does my paid run still show free-plan limits?

Confirm the run was started under your paid plan (the RUN_SUMMARY.plan field will say paid). API-origin runs sometimes hit a stale auth context — re-running through Console should resolve.

Can I do ZIP code or ZPID lookups?

Not in this actor. This is the single-mode URL search version. For ZIP code input, use the sibling zillow-zip-search. For ZPID lookups (or any-mode flexibility), use the multi-mode parent zillow-property-agent-data-scraper.

Does this actor enrich Walk Score and full photo galleries?

Not in this version. Per-property enrichment toggles (enrichWalkScore, enrichPhotos) are only available on the multi-mode parent actor. Switch to the parent if you need those columns populated.


You want to scrape Zillow by…Use this actor
Multi-mode (ZIP + ZPID + URL) — full flexibilityzillow-property-agent-data-scraper
ZIP code only — simpler input, single-modezillow-zip-search
Search URL — paste any Zillow search pageThis actor
MCP server — connect Claude Desktop / Cursor / ChatGPT to Zillow toolszillow-mcp-server

🛟 Support & feedback

  • Bug or unexpected behavior? Open an Issue in the actor's Issues tab.
  • Feature request? Same place — drop a one-paragraph note describing your use case.
  • Star ratings + reviews in the Apify Store help others find the actor.

⚖️ Disclaimer

This actor extracts data already publicly displayed on Zillow's website. It is provided "as-is" without warranty. You are responsible for complying with Zillow's Terms of Service and any applicable laws (including data-protection rules like CAN-SPAM, GDPR, CCPA) when using the extracted data, especially for outreach to agents and brokers.