All scrapers

Real estate

Zillow Property Details Scraper

zillow.com

100% Success rate
2.6s Avg response
PerimeterX Protection
1,050 calls Measured over

Zillow's search results show a card per home; the rest - the description, the facts and features, the price history, the MLS listing and broker, and the full photo gallery - lives on the property page, behind PerimeterX. A dedicated plugin endpoint takes a zpid or a homedetails URL and returns that property already parsed from the record Zillow ships with the page: status, price, the last sale, beds and baths with full and half counts, living area, lot size, year built, home type, price per square foot, HOA fee, days on Zillow, the description, the full address with neighborhood and coordinates, the MLS id and name, the broker and listing agent, the photo count and gallery, the 3D tour link, Zillow's facts list and the price history. Rentals ship Zillow's fuller record, which can add the Zestimate and rent Zestimate, tax history, parking and nearby schools with their ratings; for-sale and sold pages ship fewer sections. A field the page does not carry comes back as null, so every record has the same keys. It is the single-property companion to our Zillow search plugin: search returns the list, this returns one home in full.

What you can extract

  • Status, price and price text, last sold price and date, price per sqft, HOA fee and days on Zillow
  • Beds, baths with full and half counts, living area, lot size, year built, home type and subtype
  • Description, full address with county and neighborhood, coordinates and time zone
  • Price history with dates and prices, and the event names on pages that include them
  • MLS id and name, broker and listing agent contact
  • Photo count, the photo gallery, the 3D tour link and the facts list
  • When the page carries them: Zestimate, rent Zestimate, tax history, tax-assessed value, parking and nearby schools with ratings

Dedicated endpoints

/realestate/zillow-detail

Zillow property details

One property by zpid or homedetails URL: status, price, zestimate, rentZestimate, beds, baths, area, lotSize, yearBuilt, homeType, pricePerSqft, monthlyHoaFee, daysOnZillow, description, address with latitude and longitude, mlsid, brokerName, listingAgent, photos, virtualTourUrl, facts, parking, priceHistory, taxHistory and schools. Every key is always present; a section the property page does not carry is null.

How to scrape it

curl -X POST \
  -H "X-ScrapeUnblocker-Key: $SU_API_KEY" \
  "https://api.scrapeunblocker.com/realestate/zillow-detail?zpid=29429575"
import requests

resp = requests.post(
    "https://api.scrapeunblocker.com/realestate/zillow-detail",
    headers={"X-ScrapeUnblocker-Key": SU_API_KEY},
    params={"zpid": "29429575"},
)
print(resp.text)
import { ScrapeUnblockerClient } from 'scrapeunblocker';

const su = new ScrapeUnblockerClient({ apiKey: process.env.SU_API_KEY });

const results = await su.zillowDetail({ zpid: '29429575' });
console.log(results);

Requests are POST and take their parameters in the query string. Browser rendering always happens - there is no flag to enable.

Example response

{
  "property": {
    "zpid": "29429575",
    "url": "https://www.zillow.com/homedetails/8804-Little-Laura-Dr-Austin-TX-78757/29429575_zpid/",
    "status": "FOR_SALE",
    "statusText": "For sale",
    "price": 660000,
    "priceText": "$660,000",
    "currency": "USD",
    "zestimate": null,
    "rentZestimate": null,
    "beds": 3,
    "baths": 2,
    "bathsFull": 2,
    "bathsHalf": 0,
    "area": 1597,
    "areaUnit": "sqft",
    "lotSize": 5959.008,
    "lotSizeUnit": "Square Feet",
    "yearBuilt": 1998,
    "homeType": "SINGLE_FAMILY",
    "pricePerSqft": 413,
    "monthlyHoaFee": null,
    "daysOnZillow": 3,
    "description": "Warm, light-filled, and full of character, this single-story North Shoal Creek home offers classic charm, recent...",
    "address": "8804 Little Laura Dr, Austin, TX 78757",
    "city": "Austin",
    "state": "TX",
    "zipcode": "78757",
    "neighborhood": "North Shoal Creek",
    "latitude": 30.3726,
    "longitude": -97.73293,
    "mlsid": "2541366",
    "mlsName": "Unlock MLS",
    "brokerName": "Christies Intl Real Estate Lone Star",
    "listingAgent": { "name": null, "phone": "...", "email": null, "licenseNumber": null },
    "photoCount": 30,
    "photos": ["https://photos.zillowstatic.com/fp/66453dd79e36bf193ef84073937f2b3e-cc_ft_1536.jpg"],
    "virtualTourUrl": "https://www.zillow.com/view-3d-home/651214bd-6245-40cc-ac29-8bf497d9846b",
    "facts": [
      { "label": "Type", "value": "Single Family Residence" },
      { "label": "Year Built", "value": "1998" },
      { "label": "Heating", "value": "Central, Natural Gas" }
    ],
    "priceHistory": [
      {
        "date": "2026-09-25",
        "event": null,
        "price": 660000,
        "pricePerSquareFoot": null,
        "priceChangeRate": null,
        "source": null
      }
    ],
    "taxHistory": null,
    "schools": null
  }
}

Read the API docs

Frequently asked questions

Is it legal to scrape Zillow property details?

Collecting publicly available property data - prices, facts, price history and photos - is lawful in many jurisdictions, but the rules depend on your country, the data you collect and how you use it. Listing agent names and contacts can be personal data, and listing photos are copyrighted, so use them responsibly. ScrapeUnblocker returns the public property page; what you collect and how you use it is your decision.

How do I scrape Zillow property pages without getting blocked?

Zillow is protected by PerimeterX, which answers traffic it does not trust with a challenge page instead of the property. The /realestate/zillow-detail plugin fetches the property page through ScrapeUnblocker's exits without a browser render, reads the record Zillow ships with the page, and when a fetch comes back without it, tries again on fresh exits, up to three rounds. In ScrapeUnblocker's benchmark it returned the property on 100% of 1,050 calls with different homes, about 2.6s per call.

What data do I get for each property?

The status and price, the last sold price and date, price per square foot, HOA fee and days on Zillow; beds, baths with full and half counts, living area, lot size, year built, home type and subtype; the description, the address with street, city, state, ZIP, county and neighborhood, coordinates and time zone; the MLS id and name, the broker and the listing agent's contact; the photo count, every photo URL, the 3D tour link, Zillow's facts list and the price history. Rentals ship Zillow's fuller record, which can add the Zestimate and rent Zestimate, tax history, parking and nearby schools with rating, grades and distance; for-sale and sold pages ship fewer sections, and a field the page does not carry is null.

Do I need the Zillow API?

No. Zillow's own data access is restricted, and the plugin needs no Zillow account or key: send a zpid such as 29429575, or a homedetails URL, with your ScrapeUnblocker key and get the property back as JSON. Use our Zillow search plugin (/realestate/zillow) to find the zpids for a city or ZIP, then this plugin to read each home in full.

Can I track price changes on a home?

Yes. Each response carries the current status and price, the latest price change and its date when Zillow shows one, and the price history with its dates and prices, labelled with the event, such as Listed for rent, on pages that include it. Call the plugin for the same zpids on a schedule to follow a home from listing to sale.

How much does it cost to scrape Zillow property details?

Each call is one request: one zpid, one property record. 1 request = 1 credit, EUR 1.00 per 1,000 on pay as you go, down to about EUR 0.55 per 1,000 on the Ultimate plan. Blocks and timeouts are not billed, and the free trial includes 500 requests with no card.

Related scrapers

Start scraping this site today

Free tier included. No credit card required to test it.