Zillow Scraper & API: Zillow Data, Listings, Price History
Pricing
from $1.00 / 1,000 listings
Zillow Scraper & API: Zillow Data, Listings, Price History
Zillow data and real estate data API, no login: Zillow search for homes for sale, rentals and sold homes by ZIP, city or URL with Zillow's filters, every listing past the page cap; Zillow property data by URL, zpid or address lookup: price history, tax history, Zestimate, schools, agent, photos.
Pricing
from $1.00 / 1,000 listings
Rating
0.0
(0)
Developer
Hyperbach
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
2
Monthly active users
2 days ago
Last modified
Categories
Share
Zillow listings and property records as data, logged out: a ZIP, a city or a Zillow search URL in, one row per listing out — price, status, beds, baths, area, lot, home type, address and coordinates, Zestimate and rent Zestimate, days on Zillow, price cut, broker, open-house time, all photos, 3D-tour and video flags — for sale, for rent (homes and buildings with their units) and sold (with the sale price and date), with Zillow's own filters and sorts, and every listing past Zillow's page cap when you ask. A property by homedetails URL, zpid or address in, the full record out: the price history and tax history, schools, nearby homes, 180+ facts (resoFacts), the listing agent with phone and license, the co-agent, the broker, MLS id, the description, every photo at full size, the open-house schedule, views and saves, climate risk (flood, fire, heat, wind, air with FEMA zone and insurance advice), and on request the 10-year Zestimate history and the walk, transit and bike scores. The same full record can ride every listing row of a search. A free summary row per search states Zillow's own count, how many distinct listings were read and whether the list was COMPLETE, TRUNCATED or CAPPED; an off-market home comes back with its status named; an unknown zpid or address is a free not_found row. Your own id travels with every row. No login, no Zillow account, no API key, no browser, proxies handled for you.
Why this Zillow scraper
- Every listing Zillow lists, counted. Zillow shows 41 listings a page and its route serves 24 pages (about 980 listings) per list; the lane's tools stop at the page cap or their own limit and never say where the list ended. Here a search walks the list page by page in Zillow's order, then past the cap by price, de-duplicates by zpid, and the free summary row states Zillow's own count (
results_count, 1,477 sold homes for ZIP 95476 on our test), how many distinct listings were read and a verdict: COMPLETE, TRUNCATED (Zillow's list ends before its count) or CAPPED (yourmaxListingsPerSearchormaxItems). - The whole property record in one row.
properties(a homedetails URL, a zpid or an address) orincludeDetails/detailsForon a search read Zillow's own record for the listing: the price history (every event with price, price per sqft, change rate and source), the tax history (assessed value and tax paid per year), the schools with ratings, the nearby homes and Zillow's similar homes, 180+ facts (facts: year built, lot, parking, heating, cooling, HOA, appliances, flooring, views, roof, sewer, …), the listing agent's name, phone and license, the co-agent, the broker and its phone, the MLS id, the full description, every photo at full size, the open-house schedule with every date and time, page views and saves, and the five-peril climate block. The lane's leader returns 43 facts and no agent block; several rivals drop the bathrooms total. - Three views, Zillow's own filters.
listingTypefor_sale, for_rent (homes and buildings; a building row carries its units and phone, and its page's unit list withincludeDetails) or sold (sale price and date;daysOnZillowas the sold window over the 3 years Zillow keeps). Price, beds, baths, home types, days on Zillow, keywords, square feet, lot size, year built, HOA fee, sale types (agent, owner, new construction, coming soon, auction, foreclosure), pending on or off, and must-haves (garage, pool, waterfront, air conditioning, basement, 3D tour, open house) go into Zillow's own request — every filter is Zillow's, never a guess over the rows — and so do the sorts. - Honest runs. A search Zillow lists nothing for, a place its lookup does not know, a value that is no search, a refusal the exits could not pass, an unknown zpid and an address Zillow does not resolve are free rows with the reason; an off-market home is delivered with
statusoff_market andhome_statusOTHER named (the lane's leader returns it silently as a sale); a listing is charged once a run, whatever searches overlap. The run summary (RUN_SUMMARY) carries the walk per search and the share of fresh exits Zillow served in your run's own window. - Your id on every row. A search or property object with an
id({"zpid": 72542621, "id": "lead-17"}) carries it asinput_idon every row it produces;search_idandsearch_labeljoin rows to the input either way;propertiesDatasetIdchains a search run's dataset into a details run. - Monitoring.
onlyChangeswith a memory name remembers every listing delivered and, on the next run of the same searches, delivers only the listings that are new or whose price or status moved, with the previous price and the change; unchanged listings are counted, not delivered, not charged. - Plain HTTP, 256 MB, seconds a search. A page of 41 listings is one call to Zillow's own search route (35 KB on the wire), a full record one call to its own GraphQL document (18 KB): no browser, no page load, no token to mint. A 41-listing search with two full records took 13 seconds from a cold start in our tests; 150 listings over five searches 12 seconds.
Who it's for
- Investors, wholesalers and lead-generation teams — every for-sale or sold listing of a ZIP list with Zillow's count and a completeness verdict, the full record for each with the price and tax history, the listing agent's phone and license, days on Zillow and price cuts; a saved task on a schedule with
onlyChangesdelivers only what is new or moved. - Real estate apps and analysts — listings by city, county or search URL in Zillow's order or sorted by price, newest or Zestimate, with coordinates, photos, Zestimates and 180+ facts per property; sold comparables with the sale price and date over the last 90 days or 3 years.
- Renters' tools and property managers — the rent view of a place with homes and buildings, each building's units and phone, filters on rent, beds and must-haves.
- Developers and agents — typed rows keyed by
search_idand your owninput_id, a free summary row per search with the status and its reason, a dataset input to chain runs, and a run summary to check a pipeline against; every input constrained in the schema.
Quick start
A ZIP's first screen, Zillow's order
{"location": "95476","maxListingsPerSearch": 41}
Every home sold in a ZIP in the last 90 days, with the full record
{"location": "95476","listingType": "sold","daysOnZillow": "90","includeDetails": true}
Properties by URL, zpid and address, with the Zestimate history
{"properties": ["https://www.zillow.com/homedetails/19071-Hickory-St-Sonoma-CA-95476/72542621_zpid/",15800416,"19071 Hickory St, Sonoma, CA 95476"],"includeExtras": true}
Filters, a sort and many ZIPs with your own ids
{"searches": [{"location": "95476","id": "sonoma"},{"location": "94558","id": "napa"}],"minPrice": 500000,"maxPrice": 1500000,"minBeds": 3,"homeTypes": ["house"],"sortBy": "newest","maxListingsPerSearch": 100}
Output
One row per listing or property (and one free summary row per search):
| field | meaning |
|---|---|
row_type | listing (one listing of a search), property (one property asked by URL, zpid, address or dataset) or search (the free summary row of a search). |
search_id | s1, s2, …: the input the row answers, in the order of the input; join rows by it. |
search_label | The input as you gave it (the ZIP, place or URL; the search object; the property URL, zpid or address). |
input_id | Your own id from a search or property object ({"zpid": 72542621, "id": "lead-17"}), on every row of that input; null when none was given. |
status | On a listing row ok. On a property row: ok, off_market (a whole record whose Zillow status is OTHER), not_found (an unknown zpid, or an address or unit Zillow does not resolve; free), failed (a refusal the exits could not pass; free), invalid (a value that is no property; free), duplicate (the same property as an earlier input: read once, with that input; free), not_read (maxItems, the charge limit or the run's time limit came first; free). On a search row: ok, no_results, failed, invalid, duplicate, not_read. |
status_detail | Why the status is not ok, in a sentence; on a detailed listing row whose record was not served, why. |
scraped_at | When the row was read, UTC. |
zpid | Zillow's property id. |
url | The listing's or property's Zillow page (a building's page for a rent building). |
listing_type | for_sale, for_rent, sold or off_market, from Zillow's status. |
home_status | Zillow's own status: FOR_SALE, PENDING, FOR_RENT, RECENTLY_SOLD, SOLD, OTHER (off market), … |
status_text | The card's status text as Zillow shows it (House for sale, Sold, The Retreat at Sonoma). |
home_type | Zillow's home type: SINGLE_FAMILY, CONDO, TOWNHOUSE, MULTI_FAMILY, LOT, APARTMENT, MANUFACTURED, … |
rank | The listing's position in the search's rows (1 = the first of Zillow's first screen for relevance). |
price | The list price (for rent: the monthly rent; sold: the sale price; a building: its lowest unit price), USD. |
price_label | The price as Zillow shows it ($905,000, $4,000/mo, $1,895+). |
currency | The currency of every money field (USD). |
zestimate | Zillow's Zestimate of the home's value, USD. |
rent_zestimate | Zillow's rent Zestimate, USD a month. |
price_per_sqft | The list price per square foot (the record's own figure). |
price_cut | The amount of the last price cut on the card, USD, as a positive number (null when the last change was a rise, or none); its date is price_changed_at. |
price_changed_at | The date of the last price change on the card. |
sold_price | The sale price of a sold listing, USD. |
sold_date | The sale date of a sold listing. |
last_sold_price | The record's last sale price, USD (on a full record). |
last_sold_date | The record's last sale date (its sale date, or the latest "Sold" event of its price history; on a full record). |
beds | Bedrooms. |
baths | Bathrooms, Zillow's total (2.5 for two full and a half). |
living_area | The living area, in living_area_unit. |
living_area_unit | sqft. |
lot_area | The lot size, in lot_area_unit. |
lot_area_unit | sqft or acres, as Zillow gives it. |
year_built | The year built (on a full record). |
stories | Stories (on a full record). |
address | The full address as Zillow shows it ((undisclosed Address) where the lister hides it). |
street | The street address part. |
city | City. |
state | State (two letters). |
zipcode | ZIP code. |
county | County (on a full record). |
neighborhood | Neighborhood, where Zillow names one (on a full record). |
latitude | Latitude. |
longitude | Longitude. |
is_address_undisclosed | true when the lister hides the address. |
parcel_id | The county's parcel id (on a full record). |
county_fips | The county's FIPS code (on a full record). |
days_on_zillow | Days the listing has been on Zillow. |
time_on_zillow | The time on Zillow as the record shows it (8 days). |
date_listed | The date the listing was posted (the card's time on Zillow counted back from the read; the record's own date or its "Listed for" event on a full record). |
listing_sub_types | Zillow's flags on the listing: agent, owner (FSBO), new_construction, foreclosure, bank_owned, auction, coming_soon, pending, open_house. |
new_construction_type | Zillow's new-construction type where the listing is one. |
contingent_type | Zillow's contingency type on a pending or contingent listing (on a full record). |
is_showcase | true for a Zillow Showcase listing. |
is_featured | true for a listing Zillow marks as featured on the list. |
description | The listing's description (on a full record). |
image_url | The first photo, full size. |
photos | Every photo at its largest source size (the card's carousel on a listing row, the record's full set on a full record). |
photo_count | How many photos the listing has. |
has_3d_tour | true when the listing has a 3D home tour. |
has_video | true when the listing has a video. |
virtual_tour_url | The listing's virtual tour link (on a full record). |
open_house | The next open house as text (Open House - 1:00 - 3:00 PM on a card; the first slot's times on a full record). |
open_house_schedule | Every open-house slot, {start, end} in the listing's local time (YYYY-MM-DDTHH:MM:SS): every showing on the card and on a full record. |
page_views | Zillow's page view count for the listing (on a full record). |
saves | How many Zillow users saved the listing (on a full record). |
broker_name | The listing broker (brokerage). |
broker_phone | The broker's phone (on a full record). |
agent_name | The listing agent's name (on a full record). |
agent_phone | The listing agent's phone as Zillow shows it (on a full record). |
agent_license | The listing agent's license number (DRE #01713257; on a full record). |
agent_email | The listing agent's e-mail where Zillow's record carries one (it does not, as a rule; null). |
co_agent_name | The co-listing agent's name (on a full record). |
co_agent_phone | The co-listing agent's phone (on a full record). |
co_agent_license | The co-listing agent's license (on a full record). |
mls_id | The MLS listing id (on a full record). |
mls_name | The MLS the listing comes from (on a full record). |
listing_status_mls | The MLS's own status word (Active; on a full record). |
listing_updated_at | When the listing data was last updated by the MLS, as Zillow shows it (on a full record). |
listing_checked_at | When Zillow last checked the listing (on a full record). |
builder_name | The builder of a new-construction listing. |
is_building | true for a rent building (an apartment community) with units instead of one home. |
building_name | The building's name. |
building_id | Zillow's id of the building (its lot id). |
building_phone | The building's leasing phone. |
units_available | How many units the building has available. |
units | The building's units: the card's {price, price_label, beds} entries (numbers; the label as Zillow writes it, $3,000+), or with includeDetails the page's list {unit, zpid, beds, baths, sqft, price, base_rent, available_from}. |
floor_plans | The building's floor plans {name, beds, baths, sqft, min_price, max_price, units_available} (with includeDetails). |
unit | The unit number of a home inside a building, where the card carries one. |
price_history | Every price event of the record: {date, event, price, price_per_sqft, price_change_rate, source, buyer_agent, seller_agent} (on a full record). |
tax_history | Every tax year of the record: {year, tax_paid, tax_increase_rate, assessed_value, value_increase_rate} (on a full record). |
schools | The assigned schools: {name, rating, grades, level, type, distance_miles, link} (on a full record). |
nearby_homes | Zillow's nearby homes: {zpid, url, address, price, beds, baths, living_area, home_status, home_type, latitude, longitude} (on a full record). |
similar_homes | Zillow's "Similar homes" for the listing (the comps the record shows, 20 as a rule): {zpid, url, address, price, beds, baths, living_area, home_status, home_type, latitude, longitude} (on a full record). |
facts | The whole facts block of the record (resoFacts, 180+ keys: year built, lot, parking, heating, cooling, HOA, appliances, flooring, views, roof, sewer, water, zoning, …), as Zillow gives it (on a full record). |
facts_count | How many keys facts carries. |
hoa_fee | The monthly HOA fee, USD (Zillow's own monthly figure; the facts' text with its period is hoa_fee_text; on a full record). |
hoa_fee_text | The HOA fee as the facts show it ($250 monthly). |
property_tax_rate | The property tax rate, percent (on a full record where Zillow gives it). |
tax_assessed_value | The tax assessed value, USD. |
tax_annual_amount | The annual tax amount from the facts, USD. |
parking | Parking features from the facts. |
parking_capacity | Parking spaces from the facts. |
garage_capacity | Garage spaces from the facts. |
heating | Heating from the facts. |
cooling | Cooling from the facts. |
appliances | Appliances from the facts. |
flooring | Flooring from the facts. |
view | Views from the facts (Hills, Mountain(s)). |
climate | Zillow's climate risk block: {flood, fire, heat, wind, air}, each with risk (MINIMAL … EXTREME), score out of max, the flood fema_zone, insurance advice, insurance_policy, historic event counts, the 30-year probability_by_year / hot_days_by_year / bad_air_days_by_year and the source link (on a full record). |
climate_flood_risk | The flood risk label (MINIMAL, MINOR, MODERATE, MAJOR, SEVERE, EXTREME). |
climate_fire_risk | The wildfire risk label. |
climate_fema_zone | The FEMA flood zone (X_UNSHADED, AE, AH, …). |
zestimate_history | With includeExtras: the Zestimate over 10 years, monthly {date, value} (121 points on our test). |
walk_score | With includeExtras: the Walk Score. |
transit_score | With includeExtras: the Transit Score (null where none). |
bike_score | With includeExtras: the Bike Score. |
details_read | true when the row carries the full record (every property row; a listing row with includeDetails / detailsFor; a building row with its page's units). |
detail_route | Which Zillow document served the full record: full (the page's own full-render document) as a rule; nonpriority, manifest or page when Zillow dropped a document and the actor stepped down; building_page for a building's units. |
location | The search's location as given (a ZIP, a place or a URL). |
location_resolved | The region Zillow resolved the location to (Sonoma CA 95476, Austin, TX); on a property by address, the address Zillow matched. |
region_id | Zillow's region id of the search. |
region_type | zipcode, city, county, state, neighborhood, … |
filters | The filters the search was sent with (listingType, price, beds, baths, home types, days on Zillow, keywords, sqft, lot, year built, HOA, sale types, pending, amenities, sort). |
sort | The sort asked: relevance, newest, price_asc, price_desc, zestimate. |
results_count | Zillow's own count of listings for the search, as every answer states it. |
listings_found | Distinct listings the walk read for the search (the duplicates of an earlier search included). |
listings_delivered | Listing rows delivered for the search. |
duplicates_skipped | Listings of this search already delivered by an earlier search of the run (delivered and charged once). |
verdict | COMPLETE (the distinct listings read reach Zillow's count), TRUNCATED (Zillow's list ended before its count), CAPPED (your maxListingsPerSearch or maxItems stopped the walk), PARTIAL (a refusal stopped the walk after some pages). |
verdict_detail | The verdict in a sentence: what was read against Zillow's count, the pages and price blocks, and why it stopped. |
list_calls | Calls made for the search (the place lookup, the pages, the full records). |
change_type | With onlyChanges: new (not in the memory), changed (the price or status moved), unchanged (counted, not delivered). |
changed_fields | With onlyChanges: which watched fields moved (price, status). |
previous_read_at | With onlyChanges: when the memory last read this listing. |
first_read_at | With onlyChanges: when the memory first read this listing. |
times_read | With onlyChanges: how many runs read this listing. |
previous_price | With onlyChanges: the price when the listing was last delivered. |
price_change | With onlyChanges: the price now minus the price last delivered. |
price_history_own | With onlyChanges: our own reads of the listing, {at, price}. |
Example record:
{"row_type": "listing","search_id": "s1","search_label": "95476","input_id": null,"status": "ok","status_detail": null,"scraped_at": "2026-10-16T21:07:58Z","zpid": 72542621,"url": "https://www.zillow.com/homedetails/19071-Hickory-St-Sonoma-CA-95476/72542621_zpid/","listing_type": "for_sale","home_status": "FOR_SALE","status_text": "House for sale","home_type": "SINGLE_FAMILY","rank": 1,"price": 905000,"price_label": "$905,000","currency": "USD","zestimate": 900900,"rent_zestimate": 4053,"price_per_sqft": 546,"price_cut": null,"price_changed_at": null,"sold_price": null,"sold_date": null,"last_sold_price": 693000,"last_sold_date": "2007-08-03","beds": 3,"baths": 3,"living_area": 1659,"living_area_unit": "sqft","lot_area": 6690.816,"lot_area_unit": "sqft","year_built": 2007,"stories": 2,"address": "19071 Hickory Street, Sonoma, CA 95476","street": "19071 Hickory Street","city": "Sonoma","state": "CA","zipcode": "95476","county": "Sonoma County","neighborhood": null,"latitude": 38.299156,"longitude": -122.49017,"is_address_undisclosed": false,"parcel_id": "052362035000","county_fips": "06097","days_on_zillow": 2,"time_on_zillow": "2 days","date_listed": "2026-10-14","listing_sub_types": ["agent"],"new_construction_type": null,"contingent_type": null,"is_showcase": false,"is_featured": false,"description": "Turnkey Sonoma Valley gem with a spacious backyard oasis. Welcome to this beautifully updated 3-bedroom, 2.5-bathroom home, where comfort, charm, and indoor-outdoor living come tog …(truncated for display)","image_url": "https://photos.zillowstatic.com/fp/0214eb797c7ed80b17ba8f9c43fd97c8-uncropped_scaled_within_1536_1152.jpg","photos": ["https://photos.zillowstatic.com/fp/0214eb797c7ed80b17ba8f9c43fd97c8-uncropped_scaled_within_1536_1152.jpg","https://photos.zillowstatic.com/fp/8ed9a0e4a275925c60f2b70573ee6003-uncropped_scaled_within_1536_1152.jpg","https://photos.zillowstatic.com/fp/ec6b7cc2f0316e20b39ed264f5e8cb7f-uncropped_scaled_within_1536_1152.jpg"],"photo_count": 22,"has_3d_tour": false,"has_video": false,"virtual_tour_url": "http://www.19071HickorySt.com","open_house": "2026-10-17T13:00:00 – 2026-10-17T15:00:00","open_house_schedule": [{"start": "2026-10-17T13:00:00","end": "2026-10-17T15:00:00"}],"page_views": 669,"saves": 45,"broker_name": "Compass","broker_phone": "707-939-9500","agent_name": "Heather B Hanlon","agent_phone": "707-529-2669","agent_license": "DRE #01713257","agent_email": null,"co_agent_name": "Daniel Casabonne","co_agent_phone": "707-494-3130","co_agent_license": "DRE #01221013","mls_id": "326086706","mls_name": "BAREIS","listing_status_mls": "Active","listing_updated_at": "2026-10-16 03:11:30","listing_checked_at": "2026-10-16 13:33:44","builder_name": null,"is_building": false,"building_name": null,"building_id": null,"building_phone": null,"units_available": null,"units": null,"floor_plans": null,"unit": null,"price_history": [{"date": "2026-10-14","event": "Listed for sale","price": 905000,"price_per_sqft": 546,"price_change_rate": -0.015233949945593036,"source": "BAREIS","buyer_agent": null,"seller_agent": null},{"date": "2026-10-01","event": "Listing removed","price": 919000,"price_per_sqft": 554,"price_change_rate": 0,"source": "BAREIS","buyer_agent": null,"seller_agent": null},{"date": "2026-09-08","event": "Price change","price": 919000,"price_per_sqft": 554,"price_change_rate": -0.03263157894736842,"source": "BAREIS","buyer_agent": null,"seller_agent": null}],"tax_history": [{"year": "2026","tax_paid": null,"tax_increase_rate": 0,"assessed_value": 928458,"value_increase_rate": 0.019998813},{"year": "2025","tax_paid": 12094.84,"tax_increase_rate": 0.015088491,"assessed_value": 910254,"value_increase_rate": 0.019999865},{"year": "2024","tax_paid": 11915.06,"tax_increase_rate": 0.019716406,"assessed_value": 892406,"value_increase_rate": 0.019998651}],"schools": [{"name": "El Verano Elementary School","rating": 4,"grades": "K-5","level": null,"type": null,"distance_miles": 0.6,"link": "https://www.greatschools.org/california/sonoma/7095-El-Verano-Elementary-School/"},{"name": "Altimira Middle School","rating": 2,"grades": "6-8","level": null,"type": null,"distance_miles": 1.0,"link": "https://www.greatschools.org/california/sonoma/7092-Altimira-Middle-School/"},{"name": "Sonoma Valley High School","rating": 7,"grades": "9-12","level": null,"type": null,"distance_miles": 2.1,"link": "https://www.greatschools.org/california/sonoma/7100-Sonoma-Valley-High-School/"}],"nearby_homes": [{"zpid": 64466412,"url": "https://www.zillow.com/homedetails/864-Laurel-Ave-Sonoma-CA-95476/64466412_zpid/","address": "864 Laurel Ave, Sonoma, CA, 95476","price": 955800,"beds": 3,"baths": 3,"living_area": 1552,"home_status": "OTHER","home_type": "SINGLE_FAMILY","latitude": 38.29921,"longitude": -122.489944},{"zpid": 15797462,"url": "https://www.zillow.com/homedetails/910-Laurel-Ave-Sonoma-CA-95476/15797462_zpid/","address": "910 Laurel Ave, Sonoma, CA, 95476","price": 1153300,"beds": 5,"baths": 4,"living_area": 2722,"home_status": "OTHER","home_type": "SINGLE_FAMILY","latitude": 38.299038,"longitude": -122.49047},{"zpid": 15797449,"url": "https://www.zillow.com/homedetails/19085-Hickory-St-Sonoma-CA-95476/15797449_zpid/","address": "19085 Hickory St, Sonoma, CA, 95476","price": 915500,"beds": 5,"baths": 3,"living_area": 1805,"home_status": "OTHER","home_type": "MULTI_FAMILY","latitude": 38.298904,"longitude": -122.4898}],"similar_homes": [{"zpid": 15800152,"url": "https://www.zillow.com/homedetails/141-Theodor-Ln-Sonoma-CA-95476/15800152_zpid/","address": "141 Theodor Lane, Sonoma, CA, 95476","price": 815000,"beds": 3,"baths": 3,"living_area": 1615,"home_status": "FOR_SALE","home_type": "SINGLE_FAMILY","latitude": 38.32748,"longitude": -122.48657},{"zpid": 15829860,"url": "https://www.zillow.com/homedetails/1265-Pickett-St-Sonoma-CA-95476/15829860_zpid/","address": "1265 Pickett Street, Sonoma, CA, 95476","price": 945000,"beds": 3,"baths": 3,"living_area": 1806,"home_status": "FOR_SALE","home_type": "SINGLE_FAMILY","latitude": 38.27858,"longitude": -122.464066},{"zpid": 15828591,"url": "https://www.zillow.com/homedetails/661-Verano-Ave-Sonoma-CA-95476/15828591_zpid/","address": "661 Verano Avenue, Sonoma, CA, 95476","price": 1049000,"beds": 3,"baths": 2,"living_area": 1568,"home_status": "FOR_SALE","home_type": "SINGLE_FAMILY","latitude": 38.301735,"longitude": -122.47038}],"facts": {"bathrooms": 3,"bathroomsFull": 2,"bathroomsThreeQuarter": null,"bathroomsHalf": 1,"bathroomsOneQuarter": null,"bedrooms": 3,"aboveGradeFinishedArea": null,"accessibilityFeatures": null,"additionalFeeInfo": null,"additionalParcelsDescription": null,"architecturalStyle": "Contemporary,Craftsman","associations": [],"associationFee": null,"associationAmenities": null,"associationFee2": null,"associationFeeIncludes": null,"associationName": null,"associationName2": null,"associationPhone": null,"associationPhone2": null},"facts_count": 187,"hoa_fee": null,"hoa_fee_text": null,"property_tax_rate": null,"tax_assessed_value": 928458,"tax_annual_amount": null,"parking": ["Attached","Enclosed","Garage Faces Front","Inside Entrance","Side By Side","Level"],"parking_capacity": 4,"garage_capacity": 2,"heating": ["Central"],"cooling": ["Central Air"],"appliances": ["Built-In Gas Range","Dishwasher","Disposal","Free-Standing Refrigerator","Range Hood","Wine Refrigerator"],"flooring": ["Bamboo","Tile","Wood"],"view": ["Hills"],"climate": {"flood": {"risk": "MINIMAL","score": 1,"max": 10,"fema_zone": "X_UNSHADED","insurance": "NOT_CRITICAL","insurance_policy": "NOT_REQUIRED","historic_events_property": 0,"probability_by_year": [{"probability": 0.0,"relativeYear": 0},{"probability": 0.0,"relativeYear": 5},{"probability": 0.0,"relativeYear": 10},{"probability": 0.0,"relativeYear": 15},{"probability": 0.0,"relativeYear": 20},{"probability": 0.0,"relativeYear": 25},{"probability": 0.0,"relativeYear": 30}],"source": "https://firststreet.org/property/19071-hickory-st-sonoma-ca-95476/602943696_fsid"},"fire": {"risk": "MODERATE","score": 4,"max": 10,"insurance": "CRITICAL","insurance_policy": "LIKELY_REQUIRED","historic_events": 10,"probability_by_year": [{"probability": 0.000699999975040555,"relativeYear": 0},{"probability": 0.00419999985024333,"relativeYear": 5},{"probability": 0.007699999958276749,"relativeYear": 10},{"probability": 0.011099999770522118,"relativeYear": 15},{"probability": 0.014600000344216824,"relativeYear": 20},{"probability": 0.017999999225139618,"relativeYear": 25},{"probability": 0.0215000007301569,"relativeYear": 30}],"source": "https://firststreet.org/property/19071-hickory-st-sonoma-ca-95476/602943696_fsid"},"heat": {"risk": "MODERATE","score": 4,"max": 10,"percentile_98_temp_f": 96.0,"hot_days_by_year": [{"dayCount": 7,"relativeYear": 0},{"dayCount": 9,"relativeYear": 5},{"dayCount": 10,"relativeYear": 10},{"dayCount": 12,"relativeYear": 15},{"dayCount": 13,"relativeYear": 20},{"dayCount": 15,"relativeYear": 25},{"dayCount": 16,"relativeYear": 30}],"source": "https://firststreet.org/property/19071-hickory-st-sonoma-ca-95476/602943696_fsid"},"wind": {"risk": "MINIMAL","score": 1,"max": 10,"insurance": "NOT_CRITICAL","insurance_policy": "LIKELY_OPTIONAL","historic_events": 8,"source": "https://firststreet.org/property/19071-hickory-st-sonoma-ca-95476/602943696_fsid"},"air": {"risk": "EXTREME","score": 9,"max": 10,"bad_air_days_by_year": [{"dayCount": 19,"relativeYear": 0},{"dayCount": 19,"relativeYear": 5},{"dayCount": 19,"relativeYear": 10},{"dayCount": 19,"relativeYear": 15},{"dayCount": 19,"relativeYear": 20},{"dayCount": 19,"relativeYear": 25},{"dayCount": 19,"relativeYear": 30}],"source": "https://firststreet.org/property/19071-hickory-st-sonoma-ca-95476/602943696_fsid"}},"climate_flood_risk": "MINIMAL","climate_fire_risk": "MODERATE","climate_fema_zone": "X_UNSHADED","zestimate_history": null,"walk_score": null,"transit_score": null,"bike_score": null,"details_read": true,"detail_route": "full","location": "95476","location_resolved": "95476","region_id": 98233,"region_type": "zipcode","filters": {"listingType": "for_sale","includePending": true,"sortBy": "relevance"},"sort": "relevance","results_count": 187,"listings_found": null,"listings_delivered": null,"duplicates_skipped": null,"verdict": null,"verdict_detail": null,"list_calls": null,"change_type": null,"changed_fields": null,"previous_read_at": null,"first_read_at": null,"times_read": null,"previous_price": null,"price_change": null,"price_history_own": null}
Pricing
Pay only for the rows a run delivers, with no start fee and no platform usage billed to you. Prices fall with your Apify plan.
| per 1,000 | Free | Starter | Scale | Business |
|---|---|---|---|---|
Listing (listing) | $2.00 | $1.70 | $1.40 | $1.00 |
Property record (property) | $3.00 | $2.55 | $2.10 | $1.50 |
A listing row of a search is $2.00 per 1,000 on the Free plan ($0.002 a listing) and $1.00 on Business: Zillow's first screen of 41 listings costs $0.082 on the Free plan, the whole sold list of a ZIP (1,480 listings on our run) $2.96. A full property record is $3.00 per 1,000 ($0.003 a record, $0.0015 on Business), whether you ask for the property by URL, zpid or address or a search delivers the listing with its record (includeDetails / detailsFor: that listing row is charged as one property row, not as a listing plus a record); includeExtras adds nothing to the price. Free: every search summary row (Zillow's count, the distinct listings read, the verdict, the status and its reason), a search Zillow lists nothing for or a place it does not know, a value that is no search or property (invalid), an unknown zpid or an address Zillow does not resolve (not_found), a refusal the exits could not pass (failed), a repeated input or a listing already delivered in the run (duplicate), an input left unread at the cap or the time limit (not_read), the unchanged listings onlyChanges does not deliver, and a run that failed before its first row. A listing is charged once a run, whatever searches overlap. A run that stops early (a timeout, an abort) is charged for the rows it delivered. maxItems counts the charged rows (listings and records); before the first request the log names the price of each row at your plan and the most the run can cost (for a search with no maxListingsPerSearch and no maxItems an estimate, "about": such a search reads every listing Zillow lists, which Zillow's count decides). Enterprise plans have their own rates — the Actor's Pricing tab shows the price for your plan.
Usage patterns
- One search or many — Give
location(a ZIP, a city with its state, a county, or a Zillow search URL) with the run's filters, or list searches insearches(strings, or objects with their ownlistingType, filters,maxListingsPerSearchandid), or properties inproperties(homedetails URLs, zpids, addresses, or objects with anid), or a dataset inpropertiesDatasetId. A Zillow search URL brings its own view and filters:/sonoma-ca-95476/sold/is the sold view, a URL withsearchQueryStatein it carries its bounds and filters exactly as Zillow built them. Every row carriessearch_id,search_labeland yourinput_id, and every search gets one freesearchrow with its status and verdict. - What a row is —
row_type=listing: one listing of a search, in the order read (rank; Zillow's order forrelevance), with the card's fields; withincludeDetails/detailsForthe full record is merged into it (details_readtrue) and it is charged as aproperty.property: one property asked by URL, zpid, address or dataset, the full record;statusok, or off_market (a whole record whose Zillow status is OTHER), or a free not_found / failed / invalid.search: the free summary of a search (Zillow's count, the place Zillow resolved, distinct listings read and delivered, the verdict with its reason, the status with its reason). - How far a search goes —
maxListingsPerSearch= 0 (the default) reads every listing Zillow lists: 24 pages of 41 in the asked order, then the rest by a price cursor (the price sort, each block starting at the last price seen, the overlap de-duplicated) — 1,477 sold homes of a ZIP in 40 calls on our runs.maxListingsPerSearch= 41 is Zillow's first screen in Zillow's order (one call).maxItemscaps the charged rows of the whole run. The summary row'sverdictandverdict_detailsay what was read against Zillow'sresults_count; a row count that stops short of the count is never silent. - Filters and sorts —
minPrice/maxPrice(the monthly rent for rentals),minBeds/maxBeds,minBaths,homeTypes,daysOnZillow,keywords,minSqft/maxSqft,minLotSqft/maxLotSqft,minYearBuilt/maxYearBuilt,maxHoa,saleTypes,includePendingandamenitiesare Zillow's own request filters (each one measured against a control on our runs: the count moves and every row passes on its own fields).sortByrelevance / newest / price_asc / price_desc / zestimate are Zillow's own sorts; the rows come out in that order (a list read past 24 pages continues by price). Filters on the run apply to every search; a search object's own fields override them. - The full record —
propertiesalways reads it;includeDetailsreads it for every listing of each search,detailsForN for the first N. One more call per property (18 KB):price_history,tax_history,schools,nearby_homes,similar_homes(Zillow's 20 comps),facts(the wholeresoFactsblock,facts_countkeys) and the common facts as columns (year_built,lot_area,parking,heating,cooling,hoa_fee,price_per_sqft,stories,appliances,flooring,view), the agent and broker block,description,photos(every photo, the largest size),open_house_schedule,page_views,saves,climate(flood, fire, heat, wind, air: risk label and score, FEMA zone, insurance advice, the 30-year probabilities) with the flood and fire risk and the FEMA zone as columns.includeExtrasadds two more calls:zestimate_history(10 years, monthly) andwalk_score,transit_score,bike_score.detail_routesays which Zillow document served the record (fullas a rule; the actor steps down to another document or the page if Zillow drops one). - Rentals and buildings —
listingType=for_rentlists homes (with a zpid) and buildings (is_buildingtrue:building_name,building_id,units_available,unitswith each unit's price and beds,building_phone, the building's URL;priceis the lowest unit price). WithincludeDetailsa building row reads its page:unitsbecomes the full unit list (unit number, beds, baths, sqft, price, available from) andfloor_plansthe plans. A rental home gets the same full record as a sale listing. - Monitoring: only what moved —
onlyChangeswith astateStoreNameremembers every listing row delivered (by its zpid and search) and, on the next run of the same memory, delivers only the listings that are new or whose price or status moved:change_type,changed_fields,previous_price,price_changeandprice_history_own(our own reads) say what. Unchanged listings are counted in the summary, not delivered, not charged. Save it as a task and schedule it. - Chaining runs —
propertiesDatasetIdtakes the dataset of a search run (this Actor's, or another one whose items carryzpid,urlordetail_url) and reads the full record for every item; an item'sid/input_idis carried through. One search run of a ZIP list, then one details run of its dataset, is the leader's three-actor job in two runs — or one run withincludeDetails.
Input configuration
| field | type | default | what it does |
|---|---|---|---|
location | string | "" | One search: a ZIP (95476), a place with its state (Sonoma, CA, Austin, TX, Sonoma County, CA) or a Zillow search URL (https://www.zillow.com/sonoma-ca-95476/, /…/sold/, /…/rentals/, or one with searchQueryState in it: its filters are the search's own). Not searched when searches or properties has an item: the list is then the whole run, and the filters here are its defaults. |
searches | array | [] | Many searches in one run: a list of ZIPs, places or Zillow search URLs as strings, or objects with their own filters and your own id: {"location": "95476", "listingType": "sold", "daysOnZillow": "90", "minPrice": 500000, "maxPrice": 900000, "minBeds": 3, "homeTypes": ["house"], "sortBy": "newest", "maxListingsPerSearch": 100, "id": "my-ref-17"} (the run's fields are the defaults). An object's bounds ({"west": -122.47, "east": -122.45, "south": 38.28, "north": 38.30}, degrees) searches that map box; its location is then only its name. Up to 500 searches a run; a value that is no search is a free invalid row, and a search given twice a free duplicate row. |
properties | array | [] | Properties to read in full: homedetails URLs (https://www.zillow.com/homedetails/19071-Hickory-St-Sonoma-CA-95476/72542621_zpid/, the zpid-only form too), building pages (https://www.zillow.com/b/…/: the building with its units and floor plans), bare zpids (72542621), addresses (19071 Hickory St, Sonoma, CA 95476: resolved by Zillow's address lookup), or objects with your own id: {"zpid": 72542621, "id": "lead-17"}, {"url": "…"}, {"address": "…"}. Each one is a property row with the full record; an unknown zpid or an address (or unit) Zillow does not resolve is a free not_found row; a property given twice is read once (a free duplicate row for the repeat). Up to 5,000 a run. |
propertiesDatasetId | string | "" | The id of an Apify dataset whose items carry a zpid, url or detail_url (the output of a search run of this Actor, or of another one): every item becomes a property to read in full (id / input_id on the item is carried through). Up to 5,000 items. |
listingType | for_sale / for_rent / sold | "for_sale" | for_sale (the default), for_rent (homes and buildings; a building row carries its units with includeDetails) or sold (with the sale price and date; daysOnZillow is then the sold window: 90 = sold in the last 90 days, 36m = the 3 years Zillow keeps). A Zillow URL's own view (/sold/, /rentals/) overrides it. |
maxListingsPerSearch | integer | 0 | Stop a search after this many listings. 0 = every listing Zillow lists for it: the route's 24 pages of 41, then the rest by a price cursor (1,477 sold homes of a ZIP in 40 calls on our runs). The free summary row says how many Zillow counts and whether the list was COMPLETE, TRUNCATED or CAPPED. 41 = Zillow's first screen in Zillow's order. |
includeDetails | boolean | false | Read the full property record for every listing of each search (one more call each, 18 KB): the price and tax history, schools, nearby homes, 180+ facts, the listing agent with phone and license, the broker, MLS id, all photos, the open-house schedule, the description, views and saves, climate risk. Such a row is charged as a property instead of a listing. |
detailsFor | integer | 0 | Read the full record for the first N listings of each search only (0 = none; includeDetails reads every one). Those rows are charged as property. |
includeExtras | boolean | false | On every full record, two more calls: the Zestimate history (zestimate_history: 10 years of monthly points, 121 on our test) and the walk, transit and bike scores. No extra charge. |
minPrice | integer | 0 | Keep listings from this price up (for rent: the monthly rent). Applied by Zillow. 0 = no limit. |
maxPrice | integer | 0 | Keep listings up to this price (for rent: the monthly rent). Applied by Zillow. 0 = no limit. |
minBeds | integer | 0 | Keep listings with at least this many bedrooms. Applied by Zillow. 0 = any. |
maxBeds | integer | 0 | Keep listings with at most this many bedrooms. Applied by Zillow. 0 = any. |
minBaths | `` / 1 / 1.5 / 2 / 3 / 4 | "" | Keep listings with at least this many bathrooms (Zillow's own steps). Applied by Zillow. |
homeTypes | array | [] | Keep these home types only, one per line: house, condo, townhouse, multi_family, lot, apartment, manufactured. Empty = every type. Applied by Zillow. |
daysOnZillow | `` / 1 / 7 / 14 / 30 / 90 / 6m / 12m / 24m / 36m | "" | Keep listings on Zillow for at most this long; for sold, homes sold within this window (Zillow keeps 3 years: 36m = all). Applied by Zillow. |
keywords | string | "" | Zillow's keyword filter over the listing text (pool, view, ADU). Applied by Zillow. |
minSqft | integer | 0 | Keep listings with at least this living area (sqft). Applied by Zillow. 0 = any. |
maxSqft | integer | 0 | Keep listings with at most this living area (sqft). Applied by Zillow. 0 = any. |
minLotSqft | integer | 0 | Keep listings with at least this lot size, in square feet (an acre is 43,560). Applied by Zillow. 0 = any. |
maxLotSqft | integer | 0 | Keep listings with at most this lot size, in square feet. Applied by Zillow. 0 = any. |
minYearBuilt | integer | 0 | Keep homes built in this year or later. Applied by Zillow. 0 = any. |
maxYearBuilt | integer | 0 | Keep homes built in this year or earlier. Applied by Zillow. 0 = any. |
maxHoa | integer | 0 | Keep homes whose monthly HOA fee is at most this (homes with no HOA included). Applied by Zillow. 0 = any. |
saleTypes | array | [] | Keep these kinds of for-sale listings only, one per line: agent, owner (FSBO), new_construction, coming_soon, auction, foreclosure. Empty = every kind. Applied by Zillow. |
includePending | boolean | true | For-sale searches include listings pending or under contract (Zillow's default). Switch it off to leave them out. |
amenities | array | [] | Keep listings with every one of these, one per line: garage, pool, waterfront, air_conditioning, basement, 3d_tour, open_house. Applied by Zillow (its own filter keys). |
sortBy | relevance / newest / price_asc / price_desc / zestimate | "relevance" | relevance keeps Zillow's own order (its first screen first); newest, price_asc, price_desc and zestimate are Zillow's own sorts. A list longer than Zillow's 24 pages is read by price past that point. |
onlyChanges | boolean | false | Remember every listing row delivered (by its zpid and search) and, on the next run of the same memory, deliver only the listings that are new or whose price or status moved: change_type, changed_fields, previous_price, price_change say what. Unchanged listings are counted, not delivered, not charged. |
stateStoreName | string | "" | With onlyChanges: the name of the memory to keep between runs (letters, digits, dashes); empty = a name derived from the searches. |
maxItems | integer | 0 | Stop after this many charged rows (listings and property records; the free search summary rows and the free not-found rows do not count). 0 = no limit. |
Errors
A run does not fail because of your input. When an input cannot be used — a date that is not a date, an id in the wrong form, two settings that contradict each other — the run ends Succeeded, charges nothing, and says what to change:
- the status message starts with
INPUT REJECTED; - the dataset holds one row,
{"error": true, "code": "…", "message": "…"}, and no results; - the key-value store record
ERRORholds the same object.
From code, check error on the first row before reading results.
A search Zillow lists nothing for is not an error: it gets one free search row with status no_results and the reason, and the run goes on with the others. A run that ends Failed is a fault on our side, never your input; it charges nothing, and we are alerted.
FAQ
How many listings does a search return?
As many as you ask (maxListingsPerSearch), up to every listing Zillow lists for it. Zillow states a count for the search (results_count); its route serves 24 pages of 41 per list and the Actor reads the rest by price, so the whole list is reachable (1,477 of 1,477 sold homes of a ZIP on our test). The summary row's verdict says COMPLETE, TRUNCATED (with the reason) or CAPPED.
Which status is which?
home_status is Zillow's own: FOR_SALE, PENDING, FOR_RENT, RECENTLY_SOLD, SOLD, OTHER (off market). listing_type groups them as for_sale / for_rent / sold / off_market. listing_sub_types carries Zillow's flags (agent, owner, new_construction, foreclosure, bank_owned, auction, coming_soon, pending, open_house). A property row's status is ok, off_market, not_found, failed or invalid.
Is the agent's contact on the row?
The listing agent's name, phone and license, the co-agent's, the broker's name and phone and the MLS id are on every full record where Zillow shows them (the record's own attribution block; 74 of 78 listings carried an agent name and 73 a phone in our study). E-mail addresses are not on Zillow's pages and are not delivered.
Why is a property off_market?
Zillow keeps a record for homes that are not listed (status OTHER): the Zestimate, the last sale, the histories, the facts and one photo. It is delivered as a whole record with its status named, so a pipeline never reads it as an active listing. The lane's leader returns it as a sale with no note.
Why did a search end as no_results or failed?
no_results: Zillow lists nothing for the place and filters, or its place lookup knows no region for the words (the row names its first suggestion; an address goes under properties). failed: a refusal the exits could not pass, Zillow's own error, or the run's time limit or maxItems reached before the search (the detail says which). Nothing is charged for either.
Are the photos full size?
photos carries every photo of the record at its largest source size (1536 px wide), image_url the first; a listing row without the full record carries the card's carousel at the same size and photo_count.
What does a run cost?
The log's first line names the price of a listing row and of a full record at your plan and the most the run can cost for what you asked ("about", an estimate, for a search with no maxListingsPerSearch and no maxItems: it reads every listing Zillow lists, as many as Zillow's count; set either for a hard maximum); only rows Zillow served are charged, the free rows never. A run that stops early (a timeout, an abort) is charged for the rows it delivered.
Integration
JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_TOKEN' });const run = await client.actor('hyperbach/zillow-scraper').call({"location": "95476", "maxListingsPerSearch": 41});const { items } = await client.dataset(run.defaultDatasetId).listItems();
Python
from apify_client import ApifyClientclient = ApifyClient('YOUR_TOKEN')run = client.actor('hyperbach/zillow-scraper').call(run_input={'location': '95476', 'maxListingsPerSearch': 41})items = client.dataset(run['defaultDatasetId']).list_items().items
CLI
$apify call hyperbach/zillow-scraper --input '{"location": "95476", "maxListingsPerSearch": 41}'
REST
curl -X POST "https://api.apify.com/v2/acts/hyperbach~zillow-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \-H 'Content-Type: application/json' -d '{"location": "95476", "maxListingsPerSearch": 41}'
Support
This page is generated from the Actor's schemas and a live sample — it cannot describe a field the Actor does not have.