How-to
How to run Zillow & Redfin Property Data Scraper
Step-by-step: the exact input, what each of the ~50 fields means, and the property record that comes back from Redfin, Zillow or Realtor.com.
You have a street address and you need the house behind it as data — what it’s worth, what it last
sold for, what the county assesses it at, beds, baths, square footage. Redfin and Zillow both show
all of that on the listing page, so for one address you should just open the page and read it. It
stops being a minute of your life somewhere around the twentieth address, when it’s a spreadsheet
column of addresses and every row is a page-load, a scroll, and six copy-pastes. Worse, you can’t
just script it: a plain fetch or a curl at either site comes back 403/429, because they
fingerprint the client, not just the IP. This actor is that same public listing data, as one clean
JSON record of up to 50 fields, addressable from an API — for a city address or a small rural town.
What you’ll need
Nothing but an Apify account and the address. There’s no API key to get and no proxy to configure.
Redfin is where the full record comes from. Zillow returns the core physical facts plus its Zestimate,
rent Zestimate, coordinates and tax assessment, and is used as the fallback when Redfin has no exact
match; it routes itself through residential IPs, so you don’t
set anything for it. The useProxy toggle only matters at high volume.
Step 1 — Open the actor
Open Zillow & Redfin Property Data Scraper on the Apify Store and press Try for free.
Step 2 — Fill in the input
Three fields:
- Property address — a full US street address, e.g.
745 Garland Dr, Palo Alto, CA 94303. Street number, street, city, state, ZIP. The more complete it is, the more reliably it resolves to a single home. - Listing source —
auto(the default),redfin,zillow,realtororall.autolooks the property up on Redfin and falls back to Zillow when Redfin has no exact match. On our 50-address test list (2026-10-09) that fallback took matches from 36 to all 38 real addresses, while all 12 invented addresses still came back not found. Pick a single source to pin the lookup to it.alldoes whatautodoes and also asks Realtor.com, merging its own value estimate (with a low–high range), the agent’s email, the HOA fee and the list date into the same row. Realtor.com only opens through Apify’s Web Fetch service, which the run calls with your Apify account, so Apify bills you for it separately — about $0.0015 per Realtor.com page on the Free plan. The actor’s own price doesn’t change, andautonever touches Realtor.com. - Use residential proxy — off by default. It routes the Redfin browser through a residential IP; turn it on only if you’re running enough volume that a direct IP starts getting rate-limited. Zillow lookups use residential IPs on their own either way.
Step 3 — Run it and read the result
Press Start. A few seconds later you get one record. A hit looks like this (trimmed — the real record carries the full price history, every amenity group, and the whole photo gallery):
{
"found": true,
"source": "redfin",
"data": {
"address": "745 Garland Dr",
"city": "Palo Alto",
"state": "CA",
"zip": "94303",
"county": "Santa Clara County",
"estimatedValue": 8864967,
"price": 6750000,
"priceLabel": "Last Sold Price",
"pricePerSqft": 1642,
"lastSoldDate": "2018-08-09",
"status": "Sold",
"priceHistory": [
{ "date": "2018-08-09", "event": "Sold (MLS)", "price": 6750000, "mlsNumber": "ML81715261", "mlsStatus": "Sold" },
{ "date": "2018-08-09", "event": "Sold (Public Records)", "price": 6750000, "annualAppreciation": 0.1925 }
],
"taxAssessedValue": 7680343,
"taxesDue": 91413.72,
"taxYear": 2025,
"taxHistory": [
{ "year": 2025, "land": 5689144, "improvement": 1991199, "assessed": 7680343, "taxesDue": 91413.72 }
],
"publicRecordBeds": 3,
"publicRecordSqft": 3301,
"beds": 5,
"baths": 4.5,
"sqft": 4110,
"yearBuilt": 2012,
"lotSizeSqft": 12722,
"propertyType": "Single Family Residential",
"latitude": 37.4377962,
"longitude": -122.133369,
"fips": "06085",
"apn": "00361019",
"mlsId": "ML81715261",
"listingAgent": "Jim Holt",
"listingAgentPhone": "650-388-0108",
"listingBroker": "Compass",
"buyerAgent": "Elyse Barca",
"femaFloodZone": "X (shaded)",
"schools": [
{ "name": "Walter Hays Elementary School", "type": "Public", "grades": "K-5", "rating": 9,
"district": "Palo Alto Unified School District", "testScoresRating": 10 }
],
"riskFactors": {
"flood": { "score": 1, "summary": "Minimal risk of a flood reaching the building in the next 30 years" }
},
"sourceUrl": "https://www.redfin.com/CA/Palo-Alto/745-Garland-Dr-94303/home/1210666"
}
}
The fields worth knowing about:
estimatedValueis the Redfin Estimate — Redfin’s own automated valuation, in whole dollars. It’s their number, not ours, and not a Zestimate. It came back on every address we tested, including sold and off-market homes. A row Zillow answered haszestimateandrentZestimate(monthly) instead — a different model, so a different field: on 32 Philadelphia homes the Zestimate never matched the Redfin Estimate and sat a median 10.7% away from it.priceandpriceLabelgo together.priceLabeltells you whetherpriceis what the home is asking ("Listed at Price") or what it sold for ("Last Sold Price"/"Sold Price") — don’t read one without the other. A Zillow row has a price only when the home is listed or sold, because for an off-market home Zillow’s “price” is just its Zestimate again.pricePerSqftispricedivided by the living area, so it always matchespriceLabel.priceHistoryis the full listed / sold / price-change / delisted timeline, newest first, with each listing’s MLS number and status.annualAppreciationis the yearly growth since the previous sale — 745 Garland went from $1.45M in 2009 to $6.75M in 2018,0.1925, i.e. 19.25% a year.taxHistoryis the county’s year-by-year assessment and tax bill (up to 17 years on our test homes).publicRecordBeds/publicRecordSqftare the county’s own figures: on this home they say 3 beds and 3,301 sq ft against the listing’s 5 and 4,110 — a gap worth knowing about.listingAgentPhone,listingOfficePhone,buyerAgentandfemaFloodZonecome from the same listing page: the agent’s published numbers, the buyer’s agent on a sold home, and the FEMA zone the home is estimated to be in.taxAssessedValueis the county’s assessed value (land + improvement), andtaxYearis the roll year it comes from — whatever the county last filed, which is often not the current year. Zillow rows carry the same county total (it matched Redfin’s on 33 of 35 shared homes) but no year.apn,fips,countyandlatitude/longitudeare the join keys: they let a record line up with county assessor files and census data instead of dead-ending at a street address.schoolscarries the GreatSchools 1-10rating;riskFactorscarries First Street’s 1-10scorefor flood, fire, heat, wind and air.
data.address is the street line only (745 Garland Dr), not the whole “city, ST zip” — the city,
state, and ZIP are their own fields so you can map them straight into a form or a database. baths
can be fractional (2.5). lotSizeSqft is always square feet; if the source reports acres, the
actor converts it.
Any field it doesn’t have, it omits — you’ll never get a null, a 0, or a guessed value
standing in for “unknown”. That’s why the field count varies by home: valuation, status and geo come
back on effectively any resolvable address, but tax figures need a public county record, and
mlsId, description and the agent fields need an MLS record. A never-listed home just won’t have
those keys. Rural addresses work too, but counties there publish less: in 10 small towns across 10
states (Ely NV, Marfa TX, Hettinger ND, Valentine NE and others, 2026-10-27), 17 of 20 addresses
came back as records and 8 of those 17 had tax history. Texas publishes no sale prices at all.
One caveat on all of it: values are passed through exactly as the source publishes them. If Redfin’s own record has something wrong — we found the Empire State Building filed under the wrong county — you get their error, not a corrected version.
If the address doesn’t resolve on that source — or the source blocks the lookup — you get:
{ "found": false }
Step 4 — Reading the charge
You’re charged once per successful lookup — a match with address, city, and ZIP. A found: false
result is free, so a bad address or a blocked source never costs you anything. That makes it safe
to throw a messy address list at it: you only pay for the ones that come back with real facts.
Where to go from here
Point your app at it: send one address per call and prefill a property form, enrich a CRM record, or build a comps table. See Auto-fill a property form from just an address for the end-to-end pattern, or open the actor directly: Zillow & Redfin Property Data Scraper.
Working on the property too? Verify the trades you hire with Multi-State Contractor & Trade License Lookup.
Last updated 2026-10-27