In our test the hosted API answered every call from a server, and the best free tool was a short Python script that fetched home pages only from a residential connection. We make ToolzerHub, so two of the four tools are ours. Apify and Bright Data suit no-code bulk exports better, and pyzill returns more raw fields and has price filters.
| Rank | Tool | Calls answered, run 1 and run 2 | Time per call | Pick it when |
|---|---|---|---|---|
| 1 | ToolzerHub API, /v1/zillow (we make it) |
23 of 23, 23 of 23, no proxy | search 1.4 to 12.7 s, home 1.3 to 20.4 s, history 1.1 to 9.4 s | You want JSON from any server and will pay 1 credit a call |
| 2 | toolzerhub/zillow-scraper (we make it) | Residential 23 of 23, 23 of 23. Datacenter: searches 3 of 3 twice, home pages 0 of 7 twice | residential 1.4 to 4.8 s | You want a free script and run it from a home connection |
| 3 | pyzill | Residential: homes 10 of 10 and 9 of 10, searches 0 of 3 twice. Datacenter 0 of 13, 0 of 13 | homes 2.3 to 4.2 s | You want Zillow's raw home record or price, bed and bath filters |
| 4 | scrapehero/zillow_real_estate | Residential: HTTP 200 with 0 listings, twice. Datacenter: HTTP 403, twice | residential 2.0 and 2.7 s | Reference only |
Tested 2026-10-18. Time is for the calls that returned data. API times are per coto api call minus 0.37 s of start-up; script times include Python start-up and, where used, the proxy.
How we tested
We ran three searches: Tacoma, WA for sale; ZIP code 78704 in Austin, TX for sale; and Denver, CO sold. We took 10 home ids (zpids) from them: four from Tacoma, three from 78704 and three from Denver. The API and our script got the same places and ids, logged out, twice. pyzill takes a map box, so it got rough boxes around the same places; the 2018 script takes a ZIP code and cannot fetch a home, so it ran only the 78704 search.
A search counts with at least 10 listings that each have an id, a price and an address; a home, with the right id, address, price and bedrooms; a history, with a price or tax history.
Every call had a 60-second limit, and none reached it. A run stopped on the first HTTP 429; other failures were recorded and skipped. We ranked by calls answered across both runs, then by whether the tool works from a server.
"Datacenter" is our own server, a Hostinger IP in Germany. "Residential" is a paid residential proxy with a US exit. We left 15 minutes between each script's two datacenter runs: our script's second run, started 20 seconds after its first, got HTTP 429 on its first search, so we reran it and did not count that attempt.
ToolzerHub API
The API answered all 46 calls, 23 per run, from the datacenter server with no proxy on our side: 3 searches, 10 home records and 10 price histories per run. Searches took 1.4 to 12.7 seconds, homes 1.3 to 20.4 seconds (median 4.8) and histories 1.1 to 9.4 seconds (median 2.1).
curl -H "x-api-key: $TOOLZERHUB_API_KEY" \
"https://api.toolzerhub.com/v1/zillow/property?zpid=49261209"
For zpid 49261209 in Tacoma, the call returned price 399,000, 3 beds, 3 baths, 1,486 sq ft, a Zestimate of 399,600 and 28 photos on 2026-10-18. Price, beds, baths and square feet matched our script's and pyzill's on all 10 homes. Search rows matched our script's too: the 40 Tacoma listings both returned and all 41 in each other search had the same price.
The API is the slowest of the working tools. Over the 7 days to 2026-10-18, /v1/zillow/search answered 1,839 calls with no 5xx: median 2.3 seconds, 95th percentile 11.7, and 11.8 to 14.0 on each day from 2026-10-14 to 2026-10-17. /v1/zillow/property answered 56 calls with no 5xx, 40 of them on one day, too few to judge its speed. /v1/zillow/history had 4 calls that week, so we rely on our 20 of 20.
Every Zillow route costs 1 credit per call, and failed calls cost nothing. A search call returns up to 41 listings, so 1,000 listings is 25 credits, 2 to 5 cents, though the rows lack the Zestimate and days on Zillow. 1,000 home records is 1,000 credits: $0.99 to $1.45 on a monthly plan, $1.25 to $1.90 with credit packs. Price and tax history is a second call, so a full record costs double. A search reaches at most 20 pages; the Denver sold search reported 30,452 matches.
toolzerhub/zillow-scraper
Our free script answered all 46 commands through the residential IP: 1.7 to 2.2 seconds for a 41-listing search, 2.0 to 4.8 (median 2.4) for a home and 1.4 to 3.7 for a history. From the datacenter its search worked 6 of 6 times, in 0.6 to 0.9 seconds. Its home pages did not: of 14 attempts, 12 got HTTP 403 in about 3 seconds and 2 got HTTP 429, which stopped the run. The script retries a refused page, so about 21 requests went out before each 429, and history was never reached from there.
Its README says home pages are refused from datacenter IPs, and the test agrees. Like the API, it stops at 820 listings per place (20 pages of 41), and it has no price filters.
pyzill
pyzill has 106 stars, a last commit on 2025-08-28 and needs no key. Its README tells you to use residential proxies. Through one, get_from_home_id returned 10 of 10 homes in run 1 and 9 of 10 in run 2, in 2.3 to 4.2 seconds; the miss was an HTTP 403. Its search call got HTTP 403 6 of 6 times with our rough boxes and place names (we did not try other boxes), and the library then raised a JSONDecodeError because it parses the HTML error page as JSON. From the datacenter every call got HTTP 403 within half a second: 0 of 26.
A returned home has the most raw data: at least 100 top-level keys against 36 in our script, many of them button, ad and marketing settings. pyzill has no price history call, but it has price, bed and bath filters and a rentals search.
scrapehero/zillow_real_estate
This 2018 script (163 stars) fetches one ZIP code page with requests. Through the residential IP it got HTTP 200 and wrote a CSV with a header and no rows, in 2.0 and 2.7 seconds. From the datacenter it printed 403 and wrote the same empty file in 0.2 seconds. It returned 0 listings in 4 of 4 runs.
What each tool returns
The three tools that returned homes gave back the same core record. This is what each held across the 10 homes, run 1.
| Field | API | Our script | pyzill |
|---|---|---|---|
| Price, beds, baths, sq ft | 10 of 10 | 10 of 10 | 10 of 10 |
| Year built | 4 of 10 in year_built; 10 of 10 in reso_facts |
10 of 10 | 10 of 10, nested in resoFacts |
| Zestimate, rent estimate | 7 of 10 | 7 of 10 | 7 of 10 |
| Listing description | 7 of 10 | 7 of 10 | 7 of 10 |
| Page views, favorites | 6 of 10 | 6 of 10 | 6 of 10 |
| Price history, schools | 10 of 10 (separate call) | 10 of 10 (separate command) | none |
| Tax history | 9 of 10 (separate call) | 9 of 10 (separate command) | none |
The API's year_built was empty on 6 homes whose year Zillow had; the value sat in reso_facts.yearBuilt, so it was returned but misplaced. The table leaves out agent and broker details.
Search rows differ more. Our script's rows carry the Zestimate on 80 of 123 and days on Zillow on 82; the API's carry neither. Four of the API's row flags were false on all 123 rows, so they told us nothing, while has_open_house was true on 20.
Paid products we did not run
We did not sign up for or run these. Everything below is from each public page, read 2026-10-18.
| Product | Price on the page | Free allowance on the page |
|---|---|---|
| Apify Zillow Search Scraper | "from $1.30 / 1,000 results"; "$2 to scrape 1,000 search results" | "$5 free usage credits every month", "2,500 results for free" |
| Apify Zillow Detail Scraper | "from $1.70 / 1,000 results"; "$3 to scrape 1,000 search results" | "$5 free usage credits every month", "1,600 results for free" |
| Bright Data Zillow scraper | "Pay as you go $1.5 /1K record", "Pay only for success" | "5K records per month" |
Per 1,000 listings from search, our 2 to 5 cents is below Apify's $1.30 to $2, with fewer fields per row. Per 1,000 home records, our $0.99 to $1.90 sits beside Apify's $1.70 to $3 and Bright Data's $1.50, or $1.98 to $3.80 with price history.
Does a free Zillow scraper work from a server?
Partly. From our datacenter server our script's search worked 6 of 6 times, but its home pages were refused 14 of 14 times, and pyzill was refused on all 26 calls.
Tools we skipped
HomeHarvest (752 stars) ranks high for Zillow searches, but it reads Realtor.com only. ChrisMuir/Zillow (170 stars) is a Selenium script whose README says it "no longer works for most users" since 2019. omkarcloud/zillow-scraper and realtyapi/Zillow-Scraper-API-Python need an account key.
Zillow's terms of use showed a human-verification page to our server on 2026-10-18, so we could not read them, and this post makes no claim about what they allow.
When to use something else
- Licensed feeds: Zillow's own MLS and Public Records APIs are invite only (what is open).
- A CSV of one ZIP code: export Zillow listings to CSV.
- Scripts for other sites: ToolzerHub open source.
The API is on the Zillow API page, and a free key gives 100 credits a month.
We are not affiliated with Zillow Group.
Sources
- toolzerhub/zillow-scraper, commit a1c61b1, https://github.com/toolzerhub/zillow-scraper, run 2026-10-18
- pyzill 1.0.3, https://github.com/johnbalvin/pyzill (106 stars, last commit 2025-08-28), run 2026-10-18
- scrapehero/zillow_real_estate, commit 932f39f, https://github.com/scrapehero/zillow_real_estate (163 stars, last commit 2018-02-26), run 2026-10-18
- HomeHarvest, https://github.com/ZacharyHampton/HomeHarvest, README read 2026-10-18
- ChrisMuir/Zillow, https://github.com/ChrisMuir/Zillow, README read 2026-10-18
- Apify, Zillow Search Scraper, https://apify.com/maxcopell/zillow-scraper, read 2026-10-18
- Apify, Zillow Detail Scraper, https://apify.com/maxcopell/zillow-detail-scraper, read 2026-10-18
- Bright Data, Zillow scraper, https://brightdata.com/products/web-scraper/zillow, read 2026-10-18
- ToolzerHub pricing, https://toolzerhub.com/pricing, read 2026-10-18
- ToolzerHub API OpenAPI spec (credits per route), https://api.toolzerhub.com/openapi.json, read 2026-10-18