Zillow
Zillow Search API
Search Zillow listings in any region - for sale, for rent or recently sold - and get price, beds, baths, living area, lot size, Zestimate, coordinates, broker, days on market and the full image gallery back as JSON. 25 filters and 14 sorts, roughly 40 listings a page. Costs 1 credit per request.
Authorizations
AuthorizationstringheaderrequiredBearer authentication header of the form Bearer <token>, where <token> is your Scavio API key (e.g. Bearer sk_live_your_key).
Body
application/jsonlocationstringrequiredRegion to search, 1-200 characters: a Zillow slug (austin-tx, travis-county-tx), a human form ("Austin, TX"), a bare ZIP, or a pasted zillow.com search URL. A region Zillow cannot resolve is a 404, not an empty result set. A BARE ZIP WORKS ONLY ON ITS OWN - combined with any filter or sort, Zillow resolves it by geolocation on that request shape and answers about a different city entirely, so the request is rejected with a 400 before it is billed. Use the city name when filtering.
Example: Austin, TX
listing_statusenum<string>default:for_saleWhich market to search. These are three different markets, not filters over one.
for_sale— Active for-sale listings (default).for_rent— Rentals. min_price / max_price become MONTHLY RENT here - Zillow files rent under its payment filter, not its price filter.sold— Recently sold homes.
pageintegerResults page, 1-based. Minimum 1. Roughly 40 listings per page; every page is another credit.
Example: 2
sortenum<string>Result ordering. Defaults to Zillow's own ranking. Zillow's saved / featured / personalised sorts are deliberately absent: they rank against a signed-in profile, and we are never signed in, so they would sort by somebody else's session.
relevance— Zillow's own relevance ranking.recommended— Zillow's recommended order.newest— Most recently listed first.price_low— Cheapest first.price_high— Most expensive first.payment_low— Lowest monthly payment first.payment_high— Highest monthly payment first.beds— Most bedrooms first.baths— Most bathrooms first.sqft— Largest living area first.lot_size— Largest lot first.zestimate_low— Lowest Zestimate first.zestimate_high— Highest Zestimate first.recent_change— Most recent price change first.
min_pricenumberMinimum price, inclusive. Must be 0 or greater. This is MONTHLY RENT, not sale price, when listing_status is "for_rent".
Example: 400000
max_pricenumberMaximum price, inclusive. Must be 0 or greater. Monthly rent when listing_status is "for_rent".
Example: 900000
beds_minintegerMinimum bedrooms. Whole number, 0 or greater.
Example: 3
beds_maxintegerMaximum bedrooms. Whole number, 0 or greater.
baths_minnumberMinimum bathrooms, 0 or greater. HALF BATHS ARE ALLOWED here - 1.5 is a value Zillow's own picker offers, unlike the bedroom bounds which are whole numbers.
Example: 2.5
baths_maxnumberMaximum bathrooms, 0 or greater. Half baths allowed.
sqft_minintegerMinimum living area in square feet. Whole number, 0 or greater.
Example: 1500
sqft_maxintegerMaximum living area in square feet. Whole number, 0 or greater.
lot_size_minintegerMinimum lot size in square feet. Whole number, 0 or greater.
lot_size_maxintegerMaximum lot size in square feet. Whole number, 0 or greater.
year_built_minintegerEarliest year built. Whole number, 0 or greater.
Example: 1990
year_built_maxintegerLatest year built. Whole number, 0 or greater.
max_hoanumberMaximum monthly HOA fee in dollars, 0 or greater. There is no minimum-HOA filter.
Example: 300
home_typeenum<string>Restrict to one property type. One value only - Zillow's type flags are set exclusively here.
houses— Single-family houses.townhomes— Townhouses.multi_family— Multi-family buildings.condos— Condominiums.apartments— Apartments.manufactured— Manufactured homes.lots_land— Lots and land.
days_on_zillowenum<string>Listed within the last N days - or, with listing_status "sold", sold within them. CLOSED SET, validated here rather than passed through: Zillow answers an unrecognised value with the UNFILTERED set under a 200, which would bill a scrape for a filter that did nothing while the response looked filtered.
1— Last day.7— Last 7 days.14— Last 14 days.30— Last 30 days.90— Last 90 days.6m— Last 6 months.12m— Last 12 months.24m— Last 24 months.36m— Last 36 months.
keywordsstringFree-text match against the listing description, 1-200 characters.
Example: casita
has_poolbooleanOnly listings with a pool.
Example: true
has_garagebooleanOnly listings with a garage.
has_air_conditioningbooleanOnly listings with air conditioning.
is_waterfrontbooleanOnly waterfront listings.
has_basementbooleanOnly listings with a basement.
is_new_constructionbooleanOnly new-construction listings.
has_open_housebooleanOnly listings with an upcoming open house.
price_reducedbooleanOnly listings whose price was reduced.
is_3d_tourbooleanOnly listings with a 3D tour.
Request
from scavio import ScavioClient
client = ScavioClient(api_key="sk_live_your_key")
# Page through a city. Use the city name, not a ZIP, whenever you filter.
page = 1
while True:
results = client.zillow.search(
location="Austin, TX",
min_price=400000,
beds_min=3,
sort="newest",
page=page,
)
listings = results["data"]["properties"]
if not listings:
break
for home in listings:
print(home["address"], home["price"], home["zpid"])
if not results["data"]["next_page_url"]:
break
page += 1Response