Zillow Detail Scraper — Agent Contacts & Zestimate
Pricing
from $1.40 / 1,000 listing details
Zillow Detail Scraper — Agent Contacts & Zestimate
Paste Zillow listing links and take the full record of each home: price, Zestimate, rent estimate, taxes, beds, baths, lot, year built, description, every photo, the RESO facts, and the listing agent's name, email and phone. Name a city instead and the listings are found first.
Pricing
from $1.40 / 1,000 listing details
Rating
0.0
(0)
Developer
The Netaji
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
7 days ago
Last modified
Categories
Share
Zillow Detail Scraper
Paste Zillow listing links, get one row per home with everything Zillow holds on it — including the three things the page itself never shows anybody: the listing agent's email address and telephone number, and how many people have looked at the listing.
No Zillow account, no session cookie, no key of any kind. You pay per home read, and a link that no longer resolves is not billed.
Accepted input
zpid is the list of listings, one per line. Paste the links straight out of your browser; a bare
property identifier works too, and the two forms can be mixed in one list. The same home given twice
under two spellings is read once.
{"zpid": ["https://www.zillow.com/homedetails/2114-S-Trumbull-Ave-Chicago-IL-60623/2146999031_zpid/","https://www.zillow.com/homedetails/2146999031_zpid/","2077663766"],"maxItems": 0}
The address half of a Zillow link is decorative — /homedetails/2146999031_zpid/ and
/homedetails/any-slug-at-all/2146999031_zpid/ open the same house — so nothing here tries to match
on an address, and a link you assembled from one is not a link to anything in particular.
Or name a city instead. Leave zpid empty and set region to the san-francisco-ca in
https://www.zillow.com/san-francisco-ca/, or paste the search link itself. A bare state (ca) and
a ZIP code (94103) are regions too. The listings are found first and then read, so one run gets you
from a city name to full records:
{"region": "san-francisco-ca","status": "for_sale","maxItems": 50}
status is for_sale or sold. startPage splits a large city across several runs. Both are
ignored when you paste listings, because a list is specific and a city is not. maxItems caps the
run; 0 means no cap.
What a row holds
{"zpid": "2146999031","price": 480000,"zestimate": 468600,"rent_zestimate": 1936,"bedrooms": 3,"bathrooms": 2,"living_area": 1600,"year_built": 1911,"street_address": "2114 S Trumbull Ave","city": "Chicago","county": "Cook County","agent_name": "Luis Ortiz","agent_phone": "708-990-4079","broker_name": "RE/MAX Partners","mls_name": "MRED as distributed by MLS GRID","page_view_count": 197,"favorite_count": 20,"days_on_zillow": 23,"photo_count": 61}
Who is selling the home arrives as agent_name, agent_email, agent_phone, broker_name,
broker_phone, mls_id, mls_name, listing_agreement and true_status. None of it is rendered
on the Zillow page. agent_email is null more often than not — a telephone number is stated far more
consistently than an email address. mls_id is only unique inside the feed that issued it, so read
it together with mls_name. true_status is the MLS's own status word before Zillow mapped it onto
its smaller set, and it is not always the same value as home_status.
How much attention the listing is getting arrives as page_view_count, favorite_count and
tour_view_count. A save is a logged-in action by somebody who means to come back, so its ratio to
the view count behaves as a conversion rate for the individual home. Read all three against
days_on_zillow: 197 views over 23 days describes a different listing from 197 views in one.
The money is price, currency, zestimate, rent_zestimate, last_sold_price, date_sold,
price_change and price_change_date_display, with tax_annual_amount, property_tax_rate and
monthly_hoa_fee beside them. A null monthly_hoa_fee means the home has no association, which is
a different statement from a fee of zero. The Zestimate is a model output rather than a listed
figure and is stated even for homes that are not for sale, so the gap between it and price is
Zillow's opinion rather than a fact about the market.
The structure is bedrooms, bathrooms, living_area, lot_size, lot_area_value,
lot_area_units, year_built, home_type, property_type, listing_type and
contingent_listing_type. lot_size and lot_area_value describe the same lot in different units;
lot_area_units names the second one.
The location is street_address, city, state, zipcode, country, county,
neighborhood, community, subdivision, latitude, longitude and time_zone. county is
stated here and nowhere else on the row, and it is the join key for public tax and deed records.
neighborhood is frequently null, meaning Zillow names none rather than that the home has none.
photos holds every photograph at the widest size available, deduplicated — 61 on the sampled
property. photo_count counts what actually arrived rather than repeating a figure the page printed.
reso_facts is republished whole under Zillow's own key names, such as bathroomsThreeQuarter and
garageParkingCapacity, and it is the one field on the row that does not follow this Actor's
naming. RESO is the real-estate industry's own interchange standard and its field names are the
format, so renaming them would destroy the portability that makes the object worth carrying. It is
also flat, wide and variable — roughly a hundred facts, of which any listing carries a different
subset — so a fixed shape would either invent columns or drop real ones.
What it costs
One event per home read, charged after the record arrives. A listing that no longer resolves produces no row and costs nothing.
Naming a city instead of pasting links adds a second, much smaller event per home, because the listings have to be found before they can be read. Runs given links never fire it.
Questions
One link produced no row, and the run did not fail. Why? Zillow served no home for it: either it never existed, or the listing has been withdrawn. That home is skipped with a line in the run log and the rest of the list continues. Twenty links collected last week will not all still resolve, and losing the other nineteen rows to one dead one is the wrong trade.
I gave both a list and a region. What ran? The list. A region is only read when no listings are given, and the run log says so. Reading a whole city when somebody pasted six links is the worse of the two surprises.
Why are some fields empty on a sold home?
A sold or off-market home states fewer fields than a live listing; description in particular is
normally absent once a listing closes. Fields the record does not state come back as null rather
than being omitted, so a column never silently changes width and "Zillow states nothing here" stays
distinguishable from "the Actor did not look".
Where is the price history? Not on this row, and not because it was dropped. The document a listing record is read from does not contain the price history, the tax history, the schools or the comparable homes — they are genuinely absent from it rather than withheld, so collecting them is a second read of a different document. Zillow Property Scraper has a mode for it.
How many listings can one region run reach? Zillow serves at most 20 pages of any region, about 820 homes, however many it says match. The run log states both numbers on the first page. Split the region by ZIP code, or supply the listings yourself.
Is a Zillow account, cookie or API key required? No. None of the three is supplied to the Actor or needed by it.
Related Actors
Zillow Search Scraper returns the listing rows for a city without reading each home's record, which is the cheaper way to see what is on the market before deciding which homes are worth a full read.
Zillow Property Scraper reads the same record from a property identifier and additionally offers the price, tax, school and comparable history as a second mode.
Zillow Sitemap Scraper supplies property identifiers in bulk from Zillow's published index of roughly 14 million homes, which is the cheapest way to assemble a list this Actor can consume.