This post shows how to turn one Zillow rentals search URL into a repeatable market dataset and run it again each week. You get a flat row for every public rental listing, including its price, beds, baths, square footage, and address when Zillow shows those values.
A rental market only tells you something when you watch it. One snapshot of Los Angeles listings is trivia. The same query every week for three months is a trend you can act on.
The awkward part has always been the collection. Our Zillow Rentals Scraper takes the filtered search URL you already use and writes the visible rental listings to an Apify dataset.
Which rental fields do you get back?
Each result is a flat record from the Zillow rental search page. The main output fields documented in the Actor README are:
pricefor the asking rent shown on the result.bedsandbathsfor the listed room counts.- Square footage for listings where Zillow displays it.
- The rental address, plus other details present on the search result page.
The Actor does not fill gaps with estimates. If Zillow leaves a value off a search result, the corresponding field can be empty. That is useful when you build a time series because you can distinguish a source omission from a zero.
The rows can be exported from Apify as CSV, JSON, Excel, or XML. Keep the raw rows for each run. You can calculate medians or compare inventory later without throwing away the listing-level evidence.
Start from a search URL, not a query language
The scraper takes the Zillow URL you already have:
curl -X POST "https://api.apify.com/v2/acts/parseforge~zillow-rentals-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"listingUrl": "https://www.zillow.com/los-angeles-ca/rent",
"maxItems": 200
}'
That is the whole input. Filter on Zillow until the map shows what you want, copy the URL out of the address bar, and paste it in. Price bands and other Zillow filters stay in the URL, so the Actor sees the same search page.
The synchronous endpoint returns a JSON array and stores the run’s default dataset.
Which input options control the run?
This Actor has two input fields, so saved inputs stay easy to inspect:
listingUrlis the Zillow rental search URL. It has no declared schema default. The Apify form prefillshttps://www.zillow.com/los-angeles-ca/rentals/as an example.maxItemscaps the number of rentals collected. Its declared default is100, its form prefill is10, and its accepted range is 1 through 1,000,000.
The non-obvious tip is to build the URL on Zillow instead of trying to reproduce its filters elsewhere. Apply the filters on the search page, then copy the complete browser URL into listingUrl. The Actor accepts one URL per run. For separate cities, save separate tasks or run once per city URL.
maxItems is a ceiling rather than a promise. A run stops when it reaches the cap or when Zillow has no more search results for that URL. Setting it to 1,000 does not create 1,000 listings in a market that currently shows fewer.
Build the series, not the snapshot
One run gives you current listings. A useful series needs comparable runs and enough raw data to revisit the calculation.
- Freeze the query. Use the same
listingUrleach week. Changing filters means you are measuring a different search. - Stamp each run. Keep the run date and dataset id with the exported rows so each observation has a source.
- Store rows, not averages. Compute the median later. An average saved at collection time discards the distribution.
- Separate markets. Since each run takes one URL, give each city or search area its own saved task and dataset trail.
Apify schedules can run the saved Actor task daily or weekly. Each run writes a dataset, and a webhook can notify your own endpoint after completion. You can also download each dataset as CSV and append the run date before loading it into a spreadsheet.
When you compare weeks, match the same listing across runs using the values returned in your dataset. Keep first-seen and last-seen dates in your own table if you want time-on-market analysis. The Actor returns the current search results; the history comes from retaining each run.
The numbers worth watching
Median asking rent moves slowly and can lag changes in the available inventory. Listing count often moves sooner because new supply and removed listings appear directly in each snapshot.
Time on market requires your own bookkeeping across runs. Record when a listing first appears and when it disappears from later results. Storing raw rows makes that possible, while collecting only a weekly average does not.
Empty square-footage or room-count values need their own missing-data treatment. Do not turn an omitted value into zero before calculating price per square foot or grouping unit types.
How much does it cost?
Standard result rows start at $2.71 per 1,000 results, based on pricing.perResultUsd of $0.00271. The Actor also defines a detailed-result charge event that starts at $0.00543 per detailed row. Apify’s free monthly credit covers a trial, so use the 10-item form prefill to inspect the returned fields before collecting a full market.
Billing follows results written, so a high cap alone does not create that charge.
What breaks and what we do about it
No results usually point to the input URL or the market itself. Confirm that listingUrl is a valid Zillow rentals search URL, open it in a browser to verify that Zillow shows listings, and keep maxItems at 1 or higher.
A run that stops below maxItems has reached the end of the results available for that URL. Broaden the filters or use a larger area if you need a wider sample. Re-running the same narrow URL with a larger cap will still stop when Zillow has no more matching listings.
Empty fields mean Zillow did not show those values on the result page. Preserve the empty value rather than treating it as scraper failure or inventing a replacement.
Zillow can rate-limit aggressive collection or show a CAPTCHA. The README recommends lowering maxItems or spacing out runs. A proxy is another option. A weekly schedule is less aggressive than repeatedly launching the same market back to back.
This Actor is built for rental search-result pages. It does not scrape an individual property detail URL. Use a Zillow detail scraper when the job starts from one property page rather than a market search.
FAQ
Do I need a Zillow API key?
No. The Actor reads public Zillow rental search pages directly. You need a valid Zillow rentals search URL and an Apify account to run it.
Can I scrape more than one city at a time?
Each run takes one URL. Run one saved task per city, or use a Zillow search URL that already spans the areas you need.
Can I filter by price, beds, or pets?
Yes. Apply those filters on Zillow’s search page and pass the resulting URL as listingUrl. The Actor collects the listings shown by that filtered search.
Does the Actor handle pagination?
Yes. It follows Zillow search-result pagination until it reaches maxItems or there are no more listings.
Open the Apify listing, paste one saved market URL, and run the 10-item prefilled trial before creating the weekly schedule.