Blog/Local data
5 min read

Zillow API: Get Listings, Sold Prices and Property Details

Pull Zillow homes for sale, rentals, sold prices and property details through one key, billed per call, with no scraper to maintain.

Zillow API: Get Listings, Sold Prices and Property Details

Get Zillow homes for sale, sold prices and property details for an area in one prompt. Paste this into your agent:

Set up https://monid.ai/SKILL.md, and then use Monid to pull the homes for sale in Austin, TX from Zillow, drop duplicates on zpid, and give me a table with address, beds, baths, price and a link, sorted by price.

One prompt pulls an area. 1 min setup · 20-40 hrs saved.

You want Zillow data in a table: listings for a city, what homes actually sold for, or the full record for one address. People search for a Zillow API, a Zillow scraper, a dataset or an export, and they all want the same thing, which is rows they can use without babysitting a scraper. This guide shows the quickest route, what a property record contains (we ran it live on 2026-10-16), and what to watch for before you scale it up. It runs through Monid, the OpenRouter for agent tools: one key, one balance, every tool priced per call.

What is the easiest way to get Zillow data through an API?

Monid. Install it once, add a key, and your agent calls the Zillow endpoints for homes for sale, rentals, recently sold properties and single-property details, with no portal, no plan and no vendor account to set up.

  • Pay per call. Each call is billed on its own: $0.01 for a property record, $0.03 for a page of rentals, $0.05 for a page of homes for sale (Verified 2026-10-16 with monid inspect, listed on the real estate tools page). Buy calls as you need them: no monthly plan and no minimum top-up. Discovery and inspection are free; only a run bills.
  • One install, every API. The same key and balance call Zillow and every other tool on Monid, so the next data source is not a new account.
  • Lives inside your agent. Your agent reads SKILL.md, learns the discover, inspect, run workflow and calls the tools whenever it needs them, with nothing to keep running. Setup is about a minute.

A page of for-sale results holds up to 41 listings, so one call at that price is about $0.0012 per listing when the page is full (Verified 2026-10-16).

📖 See also MLS Real Estate API: What You Get When You Cannot Get MLS

How do you pull Zillow listings for an area?

Search by location, one call per page, and key every row on zpid. Zillow is not one dataset: for sale, for rent, recently sold and single-property details are separate endpoints, so start by seeing which ones exist.

For agents

Grab an API key at app.monid.ai, then paste this to your agent and hand it the key:

set up https://monid.ai/SKILL.md

It learns the whole discover, inspect, run workflow itself. More in the agent quickstart.

For humans

npm install -g @monid-ai/cli
monid keys add -k <your-api-key> -l main

See which Zillow surfaces are covered

monid discover -q "zillow real estate listings"

Discovery never bills. On 2026-10-16 the Zillow provider listed endpoints for homes for sale, homes for rent, recently sold, property details, rental details, the Zestimate, open houses, mortgage rates and agents.

Pull one area, small

monid run -p zillow -e /search_homes_for_sale -w --query '{"location": "Austin, TX"}'

The endpoint takes location (a city and state, a ZIP code or a neighborhood) and page, 1-based. It returns up to 41 listings per call, with price, beds, baths, area, Zestimate and coordinates according to its description. Wider is cheaper per row: a call costs the same whether the page is full or half empty, so search the whole city rather than ten neighbourhoods when a city is what you want.

Key on zpid, not on address

seen = {}
for listing in results:
    seen[listing["zpid"]] = listing   # last write wins, same property

Overlapping searches return the same property more than once and address strings vary between records, while zpid is the property identifier every other Zillow endpoint takes.

Or hand the whole job to an agent

Give this to your agent

$Set up https://monid.ai/SKILL.md, and then use Monid to pull homes for sale in Austin TX and Round Rock TX, deduplicate on zpid, and give me a CSV of address, beds, price and detail url sorted by price.

Can you scrape Zillow yourself with Python?

You can try, and the first thing you meet is a block. On 2026-10-16 a plain request to zillow.com with a browser User-Agent returned HTTP 403 for the home page and 403 again for a city page, while robots.txt returned 200. A plain requests or curl script does not get as far as a listing, and hosting your own proxy does not help, as Node Unblocker: fetch a blocked page from your agent shows.

Getting past that means a headless browser, proxies, retries and parsing code, and a repair every time the page or the blocking changes. That is hours of setup before the first useful row and a job that stays yours to maintain. The rules side differs by country and by use, so read the site's terms and the rules that apply to you before you build anything.

The honest comparison is with hours of your own time. A property record is $0.01 (Verified 2026-10-16), and the collection is maintained for you, so for anything you run more than once pick Monid. A downloaded dataset is quicker for a one-off look, but it is a snapshot of one date for the places its author chose. Browser extensions that export a page work for a handful of listings and do not loop over an area.

📖 See also TripAdvisor API: Pull Hotels, Ratings and Reviews for a Whole City

What does a Zillow listing contain, and what can you build with it?

A flat property record keyed on zpid, with the price as a number, a split address and the full listing text. We ran /get_property_details twice on 2026-10-16, on a Boise house and an Austin house, so the fields below are what came back.

The property record

monid run -p zillow -e /get_property_details -w --query '{"zpid": "79594498"}'

The Boise record, trimmed:

{ "zpid": 79594498,
  "price": 575000,
  "address": { "streetAddress": "7836 W Hummel Dr", "city": "Boise", "state": "ID", "zipcode": "83709" },
  "bedrooms": 4, "bathrooms": 2, "homeType": "SINGLE_FAMILY", "yearBuilt": 1975,
  "zestimate": 570000, "rentZestimate": 2634,
  "livingArea": 2616, "lotAreaValue": 0.283, "lotAreaUnits": "Acres",
  "homeStatus": "FOR_SALE",
  "latitude": 43.597004, "longitude": -116.27948 }

Four things are worth knowing. price is an integer, so there is no dollar sign to strip and no "contact agent" string to handle. The address arrives split into street, city, state and ZIP, which is the difference between joining to your own data and guessing where the city ends. resoFacts carries the structured facts, such as pricePerSquareFoot (220 for the Boise house), parking capacity and features. And description is the agent's full write-up, which is where facts like an RV pad, a pool or a theatre room live as text.

What you can build with it

  • A price-monitoring sheet. Pull an area on a schedule and compare price per zpid between runs to catch cuts.
  • A lead list from the description text. Search the write-ups for the words that matter to you, such as "motivated", "as is" or "estate sale".
  • A comparison table for a client. Take a handful of zpids, call the detail endpoint on each and line them up on price, size, lot and Zestimate. Ten properties is 10 calls, $0.10 at $0.01 a call (Verified 2026-10-16).

What goes wrong when you pull Zillow data at scale?

Fields that are present on one record are empty on the next, and units change. Both showed up in two calls.

Why is the Zestimate sometimes null?

Because it is not on every property. The Boise house returned zestimate 570000 and rentZestimate 2634. The Austin house, listed for sale at 425000, returned zestimate: null and rentZestimate: null. Treat the Zestimate as optional, never as the price, and keep a column for "no estimate" rather than a zero.

Why do some history fields come back null?

taxHistory, daysOnZillow and county were null on both records. priceHistory was null on the Boise house and held 16 entries on the Austin house, some of them dated rows with a null price. A pipeline that assumes a list will crash on the first null, and one that assumes every row has a price will average in the gaps.

history = [h for h in (rec.get("priceHistory") or []) if h.get("price")]

Why does lot size need a unit check?

Because the unit changes with the property. The Boise lot came back as 0.283 with lotAreaUnits set to Acres, and the Austin lot as 7997.616 with Square Feet. Read lotAreaUnits on every row and convert to one unit before you compare or sort, or the acre lot looks like the smallest in the table.

Why do text filters return so little?

The for-sale search has pet_friendly, has_yard, has_pool and keywords options, and its description says all of them narrow results through a keyword search that matches words in the listing description and features, because Zillow has no dedicated checkbox for them on sale listings. A listing that has a yard but never says so in its text is dropped, and a keyword search can legitimately return an empty result. Use them to narrow, then read the count before you trust the set.

What does a full sweep cost?

Cost follows pages, not rows. Ten areas of homes for sale at one page each is 10 calls, $0.50 at $0.05 a call (Verified 2026-10-16). Decide how many pages you need before you loop, and pull recently sold data weekly rather than daily, because closed sales do not change faster than that.

Which endpoint should I use for which job?

EndpointWhat it doesInputReturnsBilling
zillow/search_homes_for_saleActive sale listingslocation, page, optional keyword filtersUp to 41 listings per pagePer call
zillow/search_recently_soldClosed saleslocation, pageUp to 41 sold listings per page, with sold price and sale datePer call
zillow/search_homes_for_rentRental inventorylocation, page, furnishedUp to 41 rentals or buildings per pagePer call
zillow/get_property_detailsOne property's full recordzpidPrice, address, facts, Zestimate, descriptionPer call
zillow/get_rental_detailsOne rental's termszpid from the rental searchRent, lease term, deposits, pet and application factsPer call
zillow/get_mortgage_ratesCurrent mortgage ratesnone listedRates by loan typePer call

Prices, Verified 2026-10-16 with monid inspect: $0.05 for homes for sale, $0.05 for recently sold, $0.03 for rentals and $0.01 for property details. We ran the property details endpoint twice; the search endpoints were inspected, and what we say about their output comes from their descriptions. The current figures are on monid.ai/tools.

Everything here is billed per call, so the size of a page is free and the cost driver is how many areas you cover and how often. Sale and rental listings are separate inventories with separate meanings for price, a purchase price against a monthly rent, so keep them in separate tables.

When is another route a better fit?

You are licensed and can get MLS data. If you hold a licence or work with someone who does, an MLS feed is the source property portals draw on, and it is more complete. Use it, and use this for the cases where that door is closed.

You need a legal record. County recorder data is the record of a transaction. A portal is convenient and is not the register, and for anything with a compliance dimension that difference matters.

You need guaranteed national coverage. A missing property in a portal looks the same as a property that does not exist. If completeness is the requirement, a compiled dataset is the route.

You need an hourly feed of one listing. This is built for pulling areas and records on demand. Watching one listing minute by minute is a different job.

And the disclosure: we resell these endpoints. The cheapest saving in this post is calling the sold endpoint weekly instead of daily, and it is free whoever you buy from.

Conclusion

The quickest way to get Zillow listings, sold prices and property details is one call per page or per property through Monid: $0.01 for a property record and $0.05 for a page of homes for sale (Verified 2026-10-16), one key for Zillow and everything else, about a minute to set up and ready inside your agent whenever you need it. Scraping it yourself starts with a 403 on the first request and ends with a job you maintain.

Two things matter more than the choice of route. Key every row on zpid, because addresses vary and searches overlap. And treat every field as optional: on 2026-10-16 the Zestimate, the price history and the tax history were each null on at least one of two records, and the lot size changed unit between them.

How we estimated the time saved: building and keeping alive your own Zillow collection is roughly 10 to 20 hours each for getting past blocking and for parsing and paging, across two tasks, which is 20 to 40 hours. The 1 minute is the install, key and first call once you already have a Monid key.

Free next step: run monid discover -q "zillow real estate listings", then monid inspect -p zillow -e /get_property_details, and make one $0.01 call on a zpid you know (Verified 2026-10-16). Start at monid.ai.

FAQ

Is there a free Zillow API?

Not free, but you pay only for what you run: through Monid a property record is $0.01 a call (Verified 2026-10-16), with no monthly plan and no minimum top-up, and discovery and inspection cost nothing.

How do you get a Zillow API key?

You do not need a Zillow key to use these endpoints. Create a Monid key at app.monid.ai, add it with monid keys add, and the same key calls Zillow and every other tool in the catalogue.

Can you export Zillow data to Excel or a CSV?

Yes, once you have the rows as JSON. Pull the area, keep zpid, address, beds, baths and price, and write them to a CSV with any tool, or ask your agent to do it in the same prompt.

Is the Zestimate in the data?

Yes when Zillow has one. The /get_property_details endpoint returns zestimate and rentZestimate, and on 2026-10-16 the Boise house had both while the Austin house returned null for both, so handle the empty case.

Can you use the same data for rentals and sales?

Keep them apart. Sales and rentals are separate endpoints with separate inventories, and price means a purchase in one and a monthly rent in the other. Join them only where you decide what the join means, such as a yield for one property.

Published August 2026.

zillow apizillow scraperproperty data apizestimatereal estate api