Zillow Property Details Scraper: Price History
Pricing
from $0.85 / 1,000 properties
Zillow Property Details Scraper: Price History
Get full Zillow property records by home link, zpid or street address, or for every home of a Zillow search: price and tax history, Zestimate, schools, facts, HOA, MLS id, page views, saves and mortgage rates. Buildings bring their unit homes. No login; misses are free. JSON, CSV, API.
Pricing
from $0.85 / 1,000 properties
Rating
0.0
(0)
Developer
Automation Craft
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
6 days ago
Last modified
Categories
Share
Zillow Property Details Scraper: Price History
Zillow property details scraper: give Zillow home links, zpids or street addresses and get each home's full Zillow record as one row: price, Zestimate and rent Zestimate, beds, baths, living area, lot, year built, description, facts and features, price history, tax history, schools with ratings, HOA, parcel id, MLS id, county, brokerage, nearby homes, climate risk, every photo, the home's page views and saves on Zillow and current mortgage rates. It also takes apartment and condo building links (and the unit homes in them), new construction community links, an earlier dataset of zpids, and whole Zillow searches (places, ZIP codes, map areas, search links with filters), each home delivered with its full record. Add Home insights for the Walk Score, Transit Score and Bike Score, 10 years of Zestimate history and the comparable homes behind the Zestimate. No login, no Zillow API key, no browser. A home Zillow does not have, an address that matches no home exactly, or a link that is not a home is a free row, never a charge.
Who uses it: real estate investors checking a list of deals, agents, brokers and lenders preparing comps and valuations, proptech, valuation and data teams enriching their own lists of addresses or zpids, landlords and property managers, and AI agents that need one home's facts.
Quick start
- Open the Input tab and put homes into Homes, one per line: a Zillow home link
(
https://www.zillow.com/homedetails/1704-Shelbourne-Dr-Austin-TX-78752/29412761_zpid/), a zpid (29412761) or a full street address (1704 Shelbourne Dr, Austin, TX 78752). Building links and community links work too. - To get every home of a search instead, use Places, Zillow search links, ZIP codes or Map areas with the Listing status and filters you need (all optional).
- Turn on Home insights if you need the scores, the Zestimate history and the comparables.
- Set Maximum homes (whole run) and click Start. Download the rows as JSON, CSV or Excel, or read them through the Apify API.
What you get
One row per home (type: "home"), each with its full Zillow record in details; one free coverage row per search
(type: "search"); free status rows for anything that could not be delivered (type: "status"); and a free run summary
(type: "summary").
Fill rates below were measured on the Actor's own run of 2026-10-27 on its real build (run ajZyefWZ3cDkc60fc): 400 home records looked up by zpid, drawn at random from Zillow's own sitemaps: for sale 194, pending 64, sold 49, off market 61, for rent 32.
| Field | What it is | Filled on (400 records) |
|---|---|---|
id, zpid, buildingId, url | the row's id, Zillow's property id (a string), a building's id instead of a zpid, the home's Zillow link | every row |
listingStatus, homeStatus, statusText | forSale, pending, sold, forRent, offMarket, foreclosure; Zillow's own status words | every row |
price, soldPrice, soldDate | the list price, the monthly rent for rentals, the sold price and date where Zillow shows them | price 98.5 percent |
zestimate, rentZestimate, taxAssessedValue | Zillow's value and rent estimates, the tax assessed value | 58.2, 79.8 and 70.0 percent |
beds, baths, livingArea, lotArea, lotAreaUnit | bedrooms, bathrooms, living area in square feet, the lot in sqft or acres | 94.2, 95.2, 92.2 and 77.5 percent |
homeType | SINGLE_FAMILY, CONDO, TOWNHOUSE, MULTI_FAMILY, APARTMENT, MANUFACTURED, LOT | 100 percent |
address (full, street, city, state, zipcode), latitude, longitude | the home's address and coordinates | ZIP code 100, coordinates 89.2 percent |
availabilityDate | a rental's move in date from its record | rentals that give one |
deal | price per square foot, price as a percent of the Zestimate, gross rent yield, from the row's own figures | where the figures exist |
summary | one plain sentence about the home, for people and AI agents | every row |
details.description | the listing description, exactly as Zillow serves it | 99.8 percent |
details.yearBuilt, county, countyFips, neighborhood | year built, county, county FIPS code, neighbourhood | year built 86.5, county 100 percent |
details.priceHistory | every price event: day, event, price, price per square foot, change rate, source | 88.0 percent |
details.taxHistory | per year: tax paid, assessed value and their change rates | 70.5 percent |
details.schools | nearby schools: name, GreatSchools rating, grades, distance in miles, link | 97.5 percent |
details.parcelId, mlsId, mlsName | the parcel id, the MLS number and the MLS's name | 73.0 and 56.5 percent (rentals and off market homes carry no MLS id) |
details.hoaFee, hoaFeeText, propertyTaxRate | the HOA fee, as a number and as Zillow writes it; the property tax rate | HOA fee 20.2 percent |
details.lastSoldPrice, zestimateLowPercent, zestimateHighPercent, datePosted, timeOnZillow | the last sold price, the Zestimate's range, the record's dates | last sold price 53.8 percent |
details.facts | Zillow's facts and features (heating, cooling, parking, appliances, construction, rooms and many more) | 100 percent |
details.nearbyHomes | nearby homes with zpid, price, beds, baths, area, status, address and coordinates | 100 percent |
details.photos, photoCaptions, photoCount, virtualTourUrl, hasPublicVideo | every photo at its largest size, the captions a listing gives its photos (few do), a virtual tour link, a video | photos 100, captions 2.5 percent |
details.climateRisk | First Street's flood, fire, heat, wind and air quality risk as Zillow serves it | 82.5 percent |
details.brokerage (name, phone), buyerBrokerage | the listing brokerage and its phone, the buyer's brokerage (business data, always delivered) | brokerage 69.0 percent |
details.pageViews, saves, viewsStatus | how many times the home's Zillow page was viewed and how many people saved it, as Zillow counts them; read last, so a run short of its unpaid work allowance skips them rather than stop (viewsStatus says so) | 100 percent |
details.mortgageRates | Zillow's current 30 year fixed, 15 year fixed and 5/1 ARM rates for the home, with the date Zillow updated them | 55.8 percent (homes for sale, pending, sold and off market; never rentals) |
details.openHouseSchedule, foreclosure, downPaymentAssistance, tourViewCount | open house times, foreclosure facts, down payment assistance, tour views | where Zillow has them |
details.listingAgent, coAgent, buyerAgent, listingContactPhone, listedBy | persons: only with Include personal data (below) | with the switch on |
detailsStatus | delivered on every row (a home whose record could not be read is never delivered) | every row |
insights, insightsStatus | the Home insights block (below) | with Home insights |
search (key, input, page, position) | which input, search, page and place delivered the row | every row |
scrapedAt | when the row was written | every row |
Buildings and their unit homes
A building link (/b/... or /apartments/...) gives one row for the building, with its own page in details: name, address,
phone, amenities, floor plans (beds, baths, square feet, prices, deposits and fees, pets) and every unit the page lists (unit
number, beds, baths, square feet, price or rent, availability, listing). With Building links: also the unit homes
(buildingUnits), every unit home of the statuses you pick (forSale, sold, forRent, offMarket) that the page lists with
its own zpid is also delivered as its own row with its full record. A building met in a search keeps its units inside its own row;
to get them as rows, run the search, then give its dataset id in datasetId with buildingUnits (search filters are never
judged on a unit home). A building Zillow keeps a page for while nothing in it is listed is a free row
(building_off_market) naming the building. A building link by map position (/b/<name>/<latitude>,<longitude>_ll/) is not read:
paste the building's own page link.
New construction communities
A community link (/community/<name>/<id>_plid/ or /community/<name>/<zpid>_zpid/) gives one row per builder plan, move in ready
home and lot (pick them with communityHomeTypes), each with its full record.
Home insights (add-on)
With Home insights on, insights carries walkScore, transitScore and bikeScore (score and description),
zestimateHistory and rentZestimateHistory (monthly points over 10 years) and zestimateComparables (the comparable homes
behind the Zestimate, with price, beds, baths, area, address and link). insightsStatus says delivered when at least one of them
was read.
Street addresses
An address is delivered only when exactly one Zillow home matches it under one rule: the house number, every street word both ways
(with the usual abbreviations, Street and St, North and N), the unit both ways (#C-167, Apt 44K, Unit B, Lot 40,
Space 270), and the town or the ZIP code. The record Zillow returns is checked again against the same rule before the row is
delivered. Several matching homes, or none, give a free row with Zillow's candidates. In the build's spike (run RifdhVlkxLNHnJaY0), 40
homes were written five ways each (Zillow's own form, without ZIP code, long words, lower case without commas, street and ZIP code
only): 35 of them were delivered, each the home asked for and never another home, and the three causes of the misses found there
are fixed.
The coverage row
Each search gets one free row (type: "search") with Zillow's total for it, the homes met and delivered, repeats, homes left out
by reason (skipped, including record_not_found and record_not_read for homes whose record could not be read), pages read and
failed, price bands, whether the search was read to its end (complete) and why it stopped (stoppedBy), with a plain note.
How much does it cost to scrape Zillow property details?
You pay per event, with Apify's store discounts by plan:
| Event | Free plan | Bronze | Silver | Gold |
|---|---|---|---|---|
| Property (one home with its full record) | $1.19 per 1,000 | $1.08 per 1,000 | $0.98 per 1,000 | $0.85 per 1,000 |
| Home insights (add-on, per home with at least one part read) | $1.68 per 1,000 | $1.54 per 1,000 | $1.39 per 1,000 | $1.20 per 1,000 |
| Actor start (once per run, charged on every run) | $0.0075 | $0.0075 | $0.0075 | $0.0075 |
Platinum and Diamond plans pay the Gold price.
The Store pricing card shows these same prices per 1,000 events: "$0.85 / 1,000" on the Property row means one home's full record costs USD 0.00085.
- Never billed: homes Zillow does not have, addresses that match no home or several, links that are not homes, a home whose record could not be read, a home met twice in one run, homes outside your search or filters, buildings with nothing listed, Home insights that could not be read, coverage rows, status rows and the summary. The Actor start event is charged on every run, whatever it delivers: an input with nothing usable delivers nothing, and only the run's start fee is charged.
- The run obeys the maximum cost you set for it: a home whose events the limit cannot pay is not delivered, and neither is any home after it.
- Example on the Gold plan: 1,000 homes cost $0.0075 (start) + $0.85 (1,000 properties) = about $0.86; with Home insights add $1.20: about $2.06. One home costs $0.0075 + $0.00085 = about $0.0084.
- The same runs on the Free plan: $0.0075 + $1.19 = about $1.20; with Home insights about $2.88.
Input
| Setting | What it does |
|---|---|
homes | Zillow home links (/homedetails/.../12345678_zpid/, /homedetails/12345678_zpid/, /homes/.../12345678_zpid/), zpids, full street addresses, apartment and condo building links (/b/..., /apartments/...) or new construction community links (..._plid/ or ..._zpid/). Up to 10,000 entries. Search filters do not apply to these homes. |
addresses, startUrls | Two more ways to give the same lookups: addresses takes street addresses only; startUrls takes links ({ "url": ... } objects or plain text): home, building and community links are read as homes, search links as searches. |
datasetId | An Apify dataset whose rows carry a zpid or a Zillow home link (for example a Zillow search run): every home in it is looked up, a page of 1,000 rows at a time. Datasets of up to 200,000 rows. |
buildingUnits | For building links (and buildings in datasetId): also the unit homes of these statuses (forSale, sold, forRent, offMarket), each as its own row with its full record. |
communityHomeTypes | For community links: plan (floor plans), moveInReady (move in ready homes), lot (lots, when Zillow lists them with their own zpid). Empty means all. |
locations, searchUrls, zipCodes, mapAreas | Searches: places as Zillow names them (Austin, TX, 78704, Travis County, TX, Brooklyn, NY, Texas; searched only when exactly one Zillow place matches), Zillow search links with their own status, filters, drawn area and sort, five digit ZIP codes, and map circles (latitude,longitude,radius in miles) or boxes (south,west,north,east). Every home of the search is delivered with its full record. |
listingStatus | For searches: forSale (default), forRent, sold or all. |
| Filters | For searches, as in the Zillow Scraper: price or rent, beds, baths, home types, living area, lot size, year built, days on Zillow, sold within, keywords, HOA, parking, garage, pool, air conditioning, waterfront, single story, basement, views, 55+ communities, 3D tour, open houses, price cuts, Showcase, with photos, sale types, pending, backup offers, foreclosed, distressed, 23 rental amenities, move in date, and the sort: each is sent to Zillow and checked again on each home whose row shows it. Zillow has no filter for a minimum number of days on Zillow, a maximum of baths, absentee owners, price as a percent of the Zestimate, gross rent yield or a minimum school rating: those are checked on each home only. |
maxItems, maxItemsPerSearch, maxPagesPerSearch, splitPastCap | Caps for the run and per search, result pages per search (41 homes a page, 1 to 24), and the split past Zillow's per search cap of 984 homes (on by default). |
includeInsights, includePersonalData | The Home insights add-on and the personal data switch (both off by default). |
outputFormat, includeRawData | nested (default) or flat rows with columns such as details.yearBuilt for spreadsheets; Zillow's own search row as raw (Zillow's record, and a building's or a community's raw data, only with Include personal data on, because they name the agents and contacts). |
maxConcurrency, proxyConfiguration | Parallel Zillow connections (1 to 4, default 3), each keeping a polite pace; Apify Proxy datacenter by default (included in the price), or your own proxy links. |
Speed
Each home takes two reads of Zillow (its record, then its page views, saves and mortgage rates), one read every 4.5 seconds or more per connection. At the default 3 connections a run delivers about 12 to 13 homes a minute (the build's runs of 563 and 400 homes took 44 and 32 minutes); 1,000 homes take about 80 minutes. The default timeout is one hour: set the run's timeout to match for long lists.
Personal data
Brokerage names and phones, building phones and builder data are business data and always delivered. The listing agent, co agent
and buyer's agent (name, phone, e-mail, licence), the listing contact (listingContactPhone, and listedBy, the person a listing
names as its contact: a landlord or an owner selling by owner) and the agents named on price history events are delivered only with
Include personal data (includePersonalData) on; with it off those fields are empty. A home its owner sells or lets (Zillow's by
owner listings) is a private person's home: with the switch off its street, coordinates, parcel id, unit number and building name
are left out (url becomes the plain zpid link, personalDataHidden is true), every nearby home in its row loses its street and
position, and every link in its row but Zillow's photos and the plain zpid link is left out (school links, climate risk links, tour
sites: a link can name a place); the positions and streets of by owner homes nested in any other row go the same way; the town,
state and ZIP code stay. Descriptions, photo captions, fact texts, Zillow's card note and every other text are delivered exactly as
Zillow serves them, whether the switch is on or off. You are responsible for using personal data lawfully (GDPR, CCPA and
similar laws).
When Zillow fails
When Zillow refuses or does not answer after retries, the run still ends normally and its status message says how many calls Zillow failed, which homes or search pages could not be read, that nothing was charged for them, and to try again later.
API examples
Run it and get the rows in one call (replace YOUR_TOKEN):
curl -X POST "https://api.apify.com/v2/acts/automation_craft~zillow-property-details-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \-H "Content-Type: application/json" \-d '{"homes": ["29412761", "1704 Shelbourne Dr, Austin, TX 78752", "https://www.zillow.com/homedetails/2061476945_zpid/"]}'
Node.js:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_TOKEN' });const run = await client.actor('automation_craft/zillow-property-details-scraper').call({ homes: ['29412761'], includeInsights: true });const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items.filter((x) => x.type === 'home').map((h) => [h.zpid, h.details.priceHistory.length]));
Python:
from apify_client import ApifyClientclient = ApifyClient("YOUR_TOKEN")run = client.actor("automation_craft/zillow-property-details-scraper").call(run_input={"zipCodes": ["78704"], "listingStatus": "sold", "soldWithin": "90", "maxItems": 100})homes = [x for x in client.dataset(run["defaultDatasetId"]).iterate_items() if x["type"] == "home"]
What this Actor does not do
- No monitoring between runs. By design it keeps no memory from one run to the next, so it does not deliver only new or changed homes on later runs: each run delivers the records as Zillow shows them at that moment.
- No agent profiles or agent directory. By design this Actor covers homes; the agents named on a listing come with the record and the personal data switch.
- No agent e-mails from other sources. It delivers only Zillow's own agent e-mail field (behind the personal data switch), which was empty on 8 of 8 homes read in the family's tests, and looks nothing up on other sites.
- No pre foreclosures. Zillow shows them only to signed in users: logged out, its own pre foreclosure switch changes neither the total nor the rows.
- No home insights panel and no affordability estimate. None of the data a Zillow home page loads for a visitor carries them.
- No search from a school. Zillow's own place search answers no school for visitors without a login; search the school's town, ZIP code or a map area and use the minimum school rating.
- No school type filter (public, private, charter). Zillow ignores its own school filters for visitors without a login, and its
school entries carry no type. The school rating is checked on each home's record instead (
minSchoolRating). - No permit history. No data a Zillow home page loads for a visitor carries one.
- No building links by map position. A
/b/<name>/<latitude>,<longitude>_ll/link is refused free with the reason; the building's own link works. - No home without its record. A home whose record Zillow does not answer is left out free and counted; it is never delivered half filled.
- A run can stop early to protect its margin. Work that earns nothing is capped (the unpaid work allowance: USD 0.001 plus 30
percent of what the run's events earn). A list whose first entries are all homes Zillow does not have stops after about 10 to
20 zpids (11 made up numbers on run daI18tDJGH6ZDjVnV: Zillow answers those with a general error, which is read twice before it
counts as a miss; 18 on an earlier build) or 20 to 30 street addresses in a row that match nothing (22 on run hBWTobPAr6ODVDaYN,
30 on an earlier run); homes found between the misses keep the run going. A very strict filter or very slow answers can end a run
the same way, with
stoppedBy: "work_allowance"on the summary; nothing is charged for homes not delivered. Put the homes you are surest of first in a long list. - No login and no captcha solving. It reads only what Zillow shows any visitor.
FAQ
How do I get Zillow property details by address?
Put the full street address into Homes, for example 1704 Shelbourne Dr, Austin, TX 78752 (with the unit, #C-167 or
Apt 44K, where the home has one). The home is delivered only when exactly one Zillow home matches; otherwise a free row lists
Zillow's candidates.
How do I find a home's zpid?
Every row carries zpid, Zillow's property id, and url, the home's Zillow link. Look a home up by its address and read the zpid
from its row; the zpid is also the number before _zpid in any Zillow home link.
Can I get Zillow price history and tax history?
Yes. Every row carries details.priceHistory (every listing, price change and sale event with its date, price and source) and
details.taxHistory (tax paid and assessed value per year) where Zillow has them: 88.0 and 70.5 percent of 400 records in the
build's own run.
Does Zillow have a public API for property details?
This Actor needs no Zillow API key or account: it reads what Zillow shows any visitor and works as a Zillow property details API. Call it through the Apify API with links, zpids or addresses and read the rows back as JSON.
Can I get the full property record from a zpid?
Yes. Put zpids into Homes (up to 10,000 a run): each one is read from its full Zillow record, and a zpid Zillow does not have is
a free row. The homes of a Zillow search work the same way: give the search itself (a place, ZIP code, map area or search link),
or the dataset id of an earlier search run in datasetId.
Why does this Actor run with limited permissions?
Least privilege: it reads and writes only its own run's dataset and key-value store, opens no named store, and reads another
dataset only when you give its id in datasetId. Limited permissions keep the rest of your Apify data out of its reach.
Changelog
- 0.1 (2026-10-28): first release: full Zillow records by link, zpid, street address, building link (with its unit homes), community link or dataset, and for every home of a search; Home insights add-on; mortgage rates, page views and saves and photo captions in every record; personal data behind its switch, texts as Zillow serves them.
More data tools by Automation Craft
- Zillow Scraper: Homes for Sale, Rent and Sold
- SeLoger Scraper: Listings, Prices and Agencies
- Bien'ici Scraper: France Real Estate Ads & DPE
- Immowelt Scraper: Rents, Prices and Energy Data
- FINN Eiendom Scraper: Norway Homes and Rentals
- Airbnb Scraper: Airbnb Data, Prices, Calendar
- US Building Permits Scraper - 38 City Sources
- UK EPC Register Scraper - Energy Certificates