Zillow & Redfin Property Data Scraper
Look up any US home by street address — city or rural — and get up to 50 structured fields: Redfin Estimate, price and tax history, beds/baths/sqft, listing agent phone, schools, FEMA flood zone, climate risk, from Redfin and Zillow, with Realtor.com as an option. Pay per match; misses are free.
Verification
Output fields
Authoritative field set from the dataset schema.
| Field | Type |
|---|---|
query | string|null |
found | boolean|null |
source | string|null |
address | string|null |
city | string|null |
state | string|null |
zip | string|null |
beds | integer|null |
baths | number|null |
sqft | integer|null |
yearBuilt | integer|null |
lotSizeSqft | integer|null |
propertyType | string|null |
sourceUrl | string|null |
estimatedValue | integer|null |
zestimate | integer|null |
rentZestimate | integer|null |
price | integer|null |
priceLabel | string|null |
pricePerSqft | number|null |
lastSoldDate | string|null |
status | string|null |
latitude | number|null |
longitude | number|null |
county | string|null |
fips | string|null |
apn | string|null |
mlsId | string|null |
stories | number|null |
yearRenovated | integer|null |
fullBaths | integer|null |
halfBaths | integer|null |
taxAssessedValue | integer|null |
taxAssessedLand | integer|null |
taxAssessedImprovement | integer|null |
taxesDue | number|null |
taxYear | integer|null |
description | string|null |
listingAgent | string|null |
listingBroker | string|null |
priceHistory | array|null |
amenities | object|null |
schools | array|null |
riskFactors | object|null |
images | array|null |
floorPlans | array|null |
sources | array|null |
filledFrom | object|null |
realtorEstimate | integer|null |
realtorEstimateLow | integer|null |
realtorEstimateHigh | integer|null |
listDate | string|null |
hoaFee | number|null |
listingAgentPhone | string|null |
listingAgentEmail | string|null |
listingOfficePhone | string|null |
buyerAgent | string|null |
buyerBroker | string|null |
realtorFlags | array|null |
realtorUrl | string|null |
realtorPropertyId | string|null |
realtorError | string|null |
Sample row
{
"found": true,
"source": "redfin",
"data": {
"address": "745 Garland Dr",
"amenities": {
"Interior": {
"# of Baths (1/2)": "1",
"# of Baths (Full)": "4"
},
"Parking": {
"Garage (Maximum)": "2",
"Garage (Minimum)": "2"
}
},
"apn": "00361019",
"baths": 4.5,
"beds": 5,
"city": "Palo Alto",
"county": "Santa Clara County",
"description": "This home checks all the boxes for Silicon Valley living. New construction completed just 6 years ago, a separate home for extended family or rental income, a central courtyard wit ...",
"estimatedValue": 8864967,
"femaFloodZone": "X (shaded)",
"fips": "06085",
"fullBaths": 4,
"halfBaths": 1,
"images": [
{
"url": "https://ssl.cdn-redfin.com/photo/8/bigphoto/261/ML81715261_8.jpg",
"width": 1440,
"height": 960
}
],
"lastSoldDate": "2018-08-09",
"latitude": 37.4377962,
"buyerAgent": "Elyse Barca",
"buyerBroker": "Compass",
"listingAgent": "Jim Holt",
"listingAgentPhone": "650-388-0108",
"listingBroker": "Compass",
"listingOfficePhone": "650-323-1111",
"longitude": -122.133369,
"lotSizeSqft": 12722,
"mlsId": "ML81715261",
"price": 6750000,
"priceHistory": [
{
"date": "2018-08-09",
"event": "Sold (MLS)",
"mlsNumber": "ML81715261",
"mlsStatus": "Sold",
"price": 6750000
},
{
"annualAppreciation": 0.1925,
"date": "2018-08-09",
"event": "Sold (Public Records)",
"price": 6750000
}
],
"priceLabel": "Last Sold Price",
"pricePerSqft": 1642,
"propertyType": "Single Family Residential",
"publicRecordBaths": 4,
"publicRecordBeds": 3,
"publicRecordSqft": 3301,
"riskFactors": {
"flood": {
"score": 1,
"summary": "Minimal risk of a flood reaching the building in the next 30 years"
},
"fire": {
"score": 1,
"summary": "Unlikely to be in a wildfire in next 30 years"
}
},
"schools": [
{
"distanceMiles": "0.6",
"district": "Palo Alto Unified School District",
"equityRating": 5,
"grades": "K-5",
"name": "Walter Hays Elementary School",
"rating": 9,
"studentGrowthRating": 8,
"studentTeacherRatio": 11,
"students": 305,
"testScoresRating": 10,
"type": "Public"
},
{
"distanceMiles": "0.1",
"grades": "6-8",
"name": "Frank S. Greene Jr. Middle",
"rating": 9,
"students": 732,
"type": "Public"
}
],
"sourceUrl": "https://www.redfin.com/CA/Palo-Alto/745-Garland-Dr-94303/home/1210666",
"sqft": 4110,
"state": "CA",
"status": "Sold",
"stories": 2,
"taxAssessedImprovement": 1991199,
"taxAssessedLand": 5689144,
"taxAssessedValue": 7680343,
"taxHistory": [
{
"assessed": 7680343,
"improvement": 1991199,
"land": 5689144,
"taxesDue": 91413.72,
"year": 2025
}
],
"taxYear": 2025,
"taxesDue": 91413.72,
"virtualTourUrl": "http://www.745Garland.com",
"yearBuilt": 2012,
"zip": "94303"
}
} Inputs
| Field | Type | Req | Default | Description |
|---|---|---|---|---|
address | string | no | "745 Garland Dr, Palo Alto, CA 94303" | Full US property address, e.g. '745 Garland Dr, Palo Alto, CA 94303'. To look up several properties, use 'Property addresses' below — one run handles the whole list on a single browser, which is faster and cheaper than a run per address. |
addresses | array | no | ["745 Garland Dr, Palo Alto, CA 94303","1600 Amphitheatre Pkwy, Mountain View, CA 94043"] | Look up many properties in ONE run. Each address is scraped on the same warm browser and pushed as its own row, so a batch is substantially faster than starting a run per address. Combined with 'Property address' if you fill both, and duplicates are removed. Billing is unchanged: you are charged per matched property, not per address submitted. A batch stops early, with a free notice row listing the addresses it skipped, when your run's maximum charge is reached, or when the batch clearly isn't working: fewer than 3 of the first 50 addresses found (usually a list missing city, state or ZIP), 200 misses in a row, or 10 lookups in a row refused by the sites or timed out. Ordinary misses mixed into a list don't stop it. |
source | string | no | "auto" | Which site to look the property up on. 'Auto' tries Redfin first (the full 40-field record) and falls back to Zillow (core physical facts) when Redfin has no exact match — no proxy setting needed. Pick a single source to pin the lookup to it. 'Realtor.com only' and 'All sources' (opt-in): 'All sources' runs Auto and also looks the address up on Realtor.com, returning ONE merged row per address — the Redfin/Zillow record plus Realtor's own value estimate (with its low–high range), listing agent phone/email, listing office, buyer's agent on sold homes, HOA fee and list date, with any gap filled from Realtor and named in 'filledFrom'. This actor's price is the same in every mode (one charge per matched address). IMPORTANT: Realtor.com pages can only be opened through Apify's Web Fetch service, which this run calls with YOUR Apify account, so Apify bills you for it separately (about $0.0015 per Realtor page on the Free plan, less on paid plans). It is only called for addresses Realtor.com has an exact match for, and Realtor is switched off for the rest of the run after 5 refused pages in a row. Realtor lookups take ~15 s each (several run at once). |
useProxy | boolean | no | false | Route the Redfin browser through Apify residential proxy. Default off (direct). Turn on only for IP rate-limiting at high volume. Zillow lookups always use residential IPs on their own, whatever this is set to. |
Pricing
Pay per result (property-lookup) — no charge for empty runs.
Example: 100 matched property lookup at $0.004/result ≈ $0.40.
FAQ
What do I give it and what do I get back?
You give it a US street address. It returns one JSON record with up to 50 fields — the Redfin Estimate, price and price history, tax assessment and tax history, beds, baths, sqft, year built, lot size, property type, the county's public-record figures, county/FIPS/APN, lat/long, MLS number, listing description, listing agent and office phone, buyer's agent, FEMA flood zone, assigned schools, climate-risk scores, amenities, and the photo gallery — or { "found": false } if no source has a match.
Does it return the Redfin Estimate / a valuation?
Yes — data.estimatedValue is the Redfin Estimate, Redfin's own automated valuation, in whole dollars. It came back on every address we tested, including sold and off-market homes. It is Redfin's number, not ours and not a Zestimate. When Zillow answers instead, the row carries data.zestimate (Zillow's Zestimate) and data.rentZestimate (its monthly rent estimate). They are different models — on 32 Philadelphia homes we checked, the Zestimate never equalled the Redfin Estimate and the two were a median 10.7% apart — so each keeps its own field.
Which sources are supported?
Redfin and Zillow by default, with Realtor.com as an option. Redfin is the primary path and is where the full record comes from. Set source to 'all' to also look the address up on Realtor.com and merge its own value estimate and range, agent email, HOA fee and list date into the same row, or 'realtor' for Realtor.com alone (see the Realtor.com cost question below). Zillow returns the core physical facts (address, beds, baths, sqft, year built, lot size, property type) plus the Zestimate, rent Zestimate, latitude/longitude, county, county tax-assessed value, and a price when the home is listed or sold. The default source 'auto' tries Redfin first and falls back to Zillow when Redfin has no exact match, with no setting needed. Zillow sits behind PerimeterX, so a Zillow lookup can occasionally be refused; it is then reported as not found with the reason, and is free.
How am I charged?
Pay-per-event: one charge per successful lookup (a match with address, city, and ZIP). Not-found or blocked lookups are free, so you never pay for a miss.
Why did my batch stop before the end?
For one of two reasons, and the last row of the dataset says which and lists every address it skipped, free of charge. Either your run's maximum charge was reached (raise it and re-run the skipped addresses), or the batch was clearly not going to work: fewer than 3 of the first 50 addresses found (usually a list missing city, state or ZIP — fix it and re-run), 200 misses in a row, or 10 lookups in a row refused by the sites or timed out (re-run those later). A batch with ordinary misses mixed in runs to the end.
Why not just fetch the pages?
Redfin and Zillow block plain HTTP requests on TLS/browser fingerprint (not just IP), so curl and a bare fetch get 403/429. Redfin is read from inside a real browser session; Zillow walls headless browsers outright, so it is read with a client that presents Chrome's fingerprint over residential IPs. Either way the actor reads each site's own structured data.
Do I need a proxy?
No. Redfin works direct, and the Zillow fallback routes its requests through residential IPs on its own. The useProxy option additionally sends the Redfin browser through a residential proxy, which can help at high volume.
Does it return listing photos?
Yes — the data.images array gives the listing's photo gallery as full-size image URLs in order (the first is the hero), each with width and height. The URLs are public CDN links you can load directly in an <img> tag. A home with no gallery (many off-market/sold listings) returns an empty array. Photos come from Redfin and, with source 'realtor' or 'all', Realtor.com; the Zillow-only mode returns none.
Does it return floor plans?
Yes, when the listing publishes one: data.floorPlans holds them separately from the photos. Each entry has a url (the image, or the SVG preview of an interactive CubiCasa scan), a kind ('image' or 'interactive'), a viewerUrl for interactive scans, and the source. Most homes have no public floor plan, so the array is often empty: 10 of 28 for-sale homes sampled on 2026-10-28 had one, and off-market homes rarely do. Redfin is checked on every lookup; source 'all' also adds plans only Realtor.com tags. The Zillow-only mode returns none. The price per property is unchanged.
Is this personal data?
It returns public property facts, plus the listing agent's, buyer's agent's and brokerage's names and the phone numbers (and, from Realtor.com, the email) they publish on the public listing page — that is business contact information, not private data. It does no owner lookup and adds no PII enrichment: there is no owner name, phone, email, or occupant data in the output.
Does it work for rural and small-town addresses?
Yes. On 2026-10-27 we looked up 20 addresses in 10 small towns in 10 states — Ely NV, Marfa TX, Hettinger ND, Lewistown MT, Hazard KY, Valentine NE, Monticello UT, Greenville ME, Clayton GA and Hillsboro WV — and 17 came back as full records (the other 3 had no exact match on Redfin, and were free). What varies is how much the county and MLS publish: rural records are thinner — tax history came back on 8 of those 17, the county's beds/sqft on fewer — and a non-disclosure state like Texas publishes no sale prices at all. Fields a county does not publish are simply left out of the row.
What does Realtor.com cost me?
This actor's price is the same in every mode — one charge per matched address. But Realtor.com only opens through Apify's Web Fetch service (it blocks ordinary scrapers), and the run calls Web Fetch with your own Apify account, so Apify bills you for it separately: about $0.0015 per Realtor.com page on the Free plan, less on paid plans. It is only called when Realtor.com has an exact match for your address, and Realtor.com is switched off for the rest of the run after 5 refused pages in a row. Realtor.com pages take ~15 s each, several in parallel. The default 'auto' never uses it.
Why are some fields missing from my result?
Unknown fields are omitted rather than returned as null or 0, so what is present is real. Valuation, status, geo and county come back on effectively any resolvable address. Tax assessment needs a public county record, and MLS number, listing description and agent need an MLS record — a never-listed or off-market home simply won't have those keys.
How current is the data?
It reflects each site's live data at run time, so the facts are as current as Redfin's/Zillow's own published records. Values are passed through as published — including the assessment roll year in data.taxYear, which is whatever the county last filed rather than the current year.
Guides & use cases
Related actors