How to Get Zillow Property Data with Python in 5 Minutes
April 2, 2026 · 6 min read
Need Zillow property data for a Python project? Whether you're building an investment analysis tool, tracking home prices, or feeding data into a spreadsheet, the APIllow API makes it straightforward. In this tutorial, you'll go from zero to fetching property prices, Zestimates, and 50+ data fields in under 5 minutes.
Prerequisites
- Python 3.7+
- The
requests library (pip install requests)
- A free APIllow API key (get one here)
1 Get Your API Key
Sign up at apillow.co with your email. You'll receive an API key instantly. The free tier gives you 50 requests per month — enough to follow this tutorial and prototype your project.
2 Search for Properties
The APIllow API has one primary endpoint: POST /v1/properties. You can search by city, ZIP code, street address, Zillow URL, or property ID. Here's a basic search by city:
import requests
import time
API_KEY = "your_api_key_here"
BASE_URL = "https://api.apillow.co"
# Search for homes in Austin, TX
response = requests.post(
f"{BASE_URL}/v1/properties",
headers={"X-API-Key": API_KEY},
json={
"search": "Austin TX",
"type": "sale",
"max_items": 5
}
)
data = response.json()
job_id = data["job_id"]
print(f"Job submitted: {job_id}")
The API is asynchronous — it returns a job_id immediately. This means you can submit large batch requests (up to 1,000 properties) without waiting for all results before getting a response.
3 Poll for Results
Use the job_id to check when your results are ready:
# Poll until results are ready
while True:
result = requests.get(
f"{BASE_URL}/v1/results/{job_id}",
headers={"X-API-Key": API_KEY}
).json()
if result["status"] == "complete":
break
elif result["status"] == "failed":
print("Job failed:", result["errors"])
break
time.sleep(2)
properties = result["results"]
print(f"Got {len(properties)} properties")
4 Extract the Data You Need
Each property in the results contains 50+ structured fields. Here's how to extract the most useful ones:
for prop in properties:
print(f"""
Address: {prop['street_address']}, {prop['city']}, {prop['state']} {prop['zipcode']}
Price: ${prop['price']:,}
Zestimate: ${prop.get('zestimate', 'N/A'):,}
Beds/Baths: {prop['bedrooms']}bd / {prop['bathrooms']}ba
Sqft: {prop.get('living_area', 'N/A'):,}
Year Built: {prop.get('year_built', 'N/A')}
Status: {prop.get('home_status', 'N/A')}
""")
# Access price history
for event in prop.get("price_history", [])[:3]:
print(f" {event['date']}: {event['event']} - ${event.get('price', 0):,}")
# Access nearby schools
for school in prop.get("nearby_schools", [])[:2]:
print(f" School: {school['name']} (rating: {school.get('rating', 'N/A')}/10)")
5 Search by Address
Need data for a specific property? Pass a street address:
response = requests.post(
f"{BASE_URL}/v1/properties",
headers={"X-API-Key": API_KEY},
json={
"addresses": ["742 Evergreen Terrace, Springfield, IL"]
}
)
You can also search by ZIP code, Zillow property ID (ZPID), or paste a Zillow URL directly:
# Search by ZIP code
{"zipcodes": ["90210", "90211"], "type": "sale", "max_items": 20}
# Search by Zillow URL
{"urls": ["https://www.zillow.com/homedetails/123-Main-St/12345_zpid/"]}
# Search by ZPID
{"zpids": ["12345", "67890"]}
Full Working Example
Here's a complete script that searches for properties and saves results to a CSV file:
import requests
import time
import csv
API_KEY = "your_api_key_here"
BASE = "https://api.apillow.co"
HEADERS = {"X-API-Key": API_KEY}
# Submit search
resp = requests.post(f"{BASE}/v1/properties", headers=HEADERS, json={
"search": "Denver CO",
"type": "sale",
"max_items": 25
})
job_id = resp.json()["job_id"]
# Wait for results
while True:
result = requests.get(f"{BASE}/v1/results/{job_id}", headers=HEADERS).json()
if result["status"] != "processing":
break
time.sleep(2)
# Save to CSV
fields = ["street_address", "city", "state", "zipcode", "price",
"zestimate", "bedrooms", "bathrooms", "living_area", "year_built"]
with open("properties.csv", "w", newline="") as f:
writer = csv.DictWriter(f, fieldnames=fields, extrasaction="ignore")
writer.writeheader()
writer.writerows(result["results"])
print(f"Saved {len(result['results'])} properties to properties.csv")
Available Data Fields
Every property response can include these fields (when available on the listing):
- Location: street_address, city, state, zipcode, latitude, longitude
- Pricing: price, zestimate, rent_zestimate, last_sold_price, tax_assessed_value, hoa_fee
- Details: bedrooms, bathrooms, living_area, lot_size, year_built, property_type, home_status
- History: price_history[], tax_history[]
- Agent: listing_agent (name, phone, email, company)
- Schools: nearby_schools[] with ratings and distance
- Media: image_urls[], virtual_tour_url
- Extras: description, features, comps, days_on_market, page_views, favorites_count
Ready to try it?
Get your free API key and start fetching Zillow data in Python today.
Get Your Free API Key
Next Steps