AI Content Creation

Extract Zillow Data Into Google Sheets (What Actually Works)

Every tutorial for this starts with IMPORTXML. Every one of them was written before Zillow started blocking Google's servers.

By FITS TeamAugust 4, 20265 min read

Start with the part most posts on this keyword will not tell you. No formula typed into a Google Sheets cell can pull data off a Zillow listing page. Not IMPORTXML, not IMPORTHTML, and not =FITS() either.

That is worth understanding properly, because it changes what you should build.

The Old Way (IMPORTXML, Then Apps Script)

The standard first attempt looks like this.

=IMPORTXML("https://www.zillow.com/homedetails/...", "//span[@data-testid='price']")

The cell returns #N/A with the message "Could not fetch url". Two independent reasons, and fixing one does not help.

First, IMPORTXML runs from Google's servers, not your browser. Zillow runs bot mitigation that recognises datacenter IP ranges and non-browser request headers, and answers with a 403 or a challenge page. Your browser can load the listing fine because your request does not look like that one.

Second, even if the fetch succeeded, the price is not in the HTML that gets returned. Zillow renders listing details client side with JavaScript. IMPORTXML parses static markup and never runs scripts, so your XPath is pointed at an element that does not exist yet in the document it received.

The next stop is usually Apps Script with a spoofed user agent.

UrlFetchApp.fetch(url, { headers: { "User-Agent": "Mozilla/5.0 ..." } })

That fails for the same first reason. Changing the user agent string does not change the source IP, and modern bot detection also fingerprints the TLS handshake, which UrlFetchApp cannot disguise. You get back an HTML page whose title says access has been denied. Zillow's terms also prohibit scraping the site, so this is not just technically fragile.

Get the Data Legitimately First

Since the fetch is the blocked step, get the raw text into the sheet by a route that is not blocked. Any of these work.

  1. Copy the listing details from your browser and paste them into one cell per property.
  2. Export your saved searches or agent feed, if you have an account that offers it.
  3. Use your MLS export, which is the authoritative source Zillow itself pulls from.
  4. Use a licensed property data API and pass its response into the sheet.

Now you have a column of unstructured listing text. That is the problem a formula can actually solve, and it is the part that used to take all the manual effort anyway.

The FITS Way (Parse the Blob Into Columns)

Pasted listing text is inconsistent in exactly the way regex hates. Price appears as $425,000 or 425K, size as 1,850 sqft or 1850 sq. ft., and beds as 3 bd or 3 Beds. Ask FITS for the field instead of matching the format.

=FITS("Return the listing price from this property text as a plain number, no dollar sign or commas. Return UNKNOWN if there is no price: " & A2)
=FITS("Return the square footage from this property text as a plain number. Return UNKNOWN if it is not stated: " & A2)
=FITS("Return bedrooms and bathrooms from this property text as two numbers separated by a comma, beds first. Use UNKNOWN for either if missing: " & A2)

Split that last one into two columns with SPLIT and you have a comparable set. Then compute the thing you actually opened the spreadsheet for.

=IFERROR(ROUND(B2 / C2, 2), "")

The description text is worth mining too, because that is where the details live that no structured field captures.

=FITS("Does this listing description suggest the property needs significant renovation? Answer YES, NO, or UNCLEAR only: " & A2)
=FITS("List any of these features that this listing mentions: garage, pool, basement, HOA, new roof. Comma separated, or NONE: " & A2)

Every prompt above names an explicit fallback. On scraped or pasted text that matters more than usual, because some rows will be truncated or incomplete, and you want those visible in a filter rather than guessed at.

The Short Version

Fetching Zillow from a spreadsheet is blocked and stays blocked. Bring the text in through a route you are allowed to use, then let a formula do the structuring. The same split applies to pulling data from websites generally, and the field level parsing overlaps with parsing an address into street, city, state, and ZIP and extracting numbers out of mixed text. The full tour is in automating Google Sheets tasks you used to need regex for.

Turn Listing Text Into Columns

FITS puts plain-English AI formulas inside Google Sheets. Stop retyping prices and square footage out of pasted listings. Free tier included.