Zumper Scraper: Apartments for Rent + Rent Change Monitor
Pricing
from $12.00 / 1,000 results
Zumper Scraper: Apartments for Rent + Rent Change Monitor
Zumper API alternative: export apartment and house rentals for any US city, then schedule it to get new listings and rent cuts with the previous price. Rent range, beds, baths, address, ZIP, link, contact phone where shown and a 0-100 lead score. Filters for price, beds and property type.
Pricing
from $12.00 / 1,000 results
Rating
0.0
(0)
Developer
Ben
Maintained by CommunityActor stats
1
Bookmarked
53
Total users
9
Monthly active users
8 days ago
Last modified
Categories
Security
Limited permissionsShare
Run a saved Zumper search on a schedule and get back only what changed: new rental listings and changes in asking rent, each with the previous rent and the size of the change. Or export a one-off list of apartments and houses for rent in any US city, filtered by property type, price and bedrooms. Export JSON, CSV or Excel, schedule runs in Apify, call the API, or connect the dataset to n8n, Make and Zapier.
Rent change monitor in one paragraph
Turn on onlyChanges and keep one monitorId per saved search. Every later run returns only rows whose change_type is new (a listing not seen before), price_changed (minimum or maximum asking rent moved, with previous_price_min, previous_price_max, price_change_amount and price_change_percent) or details_changed (beds, baths, availability date or listing URL changed). Unchanged listings stay out of the dataset and are not charged. The monitor remembers up to 5,000 listings seen in the last 90 days. It does not detect removed listings: a listing missing from one search is not proof that it was rented.
Need this as a managed weekly feed?
We track rental listings in your markets for you: weekly rent and availability snapshots with price changes flagged, delivered as CSV or JSON (other formats on request). Useful for comps, market studies and portfolio monitoring. You get a free sample before paying. Tell us what you need →
Open the tested Austin rental example or download the n8n rental-alert template.
What data does it return?
Each row represents a source listing or building. It includes its stable listing_id, source URL, name, address components, coordinates, rent and bedroom ranges, bathrooms, available date, amenities and pet information when supplied. Contact phone, agent and brokerage fields are included when the source exposes them. Missing fields remain null or empty.
A building can contain multiple unit types. Its minimum and maximum prices describe the source building range; they do not promise that every unit fits your search filters or remains available. Contact the listing provider to confirm the exact unit and asking terms.
lead_score is a 0–100 heuristic that adds up five listing fields: the Zumper rating (5 points without one, 10–30 with one), a verified feed listing (20, else 5), a highly rated bonus for a rating of 9.0 or more (10), the number of amenities (2–15) and the asking rent tier (2–10, higher rent scores more). It can help sort records, but it does not verify a landlord, qualify a person, establish investment suitability or guarantee that a contact will respond. Source ratings and contact details remain source claims.
Pricing
Free-tier pricing is $0.015 per returned listing, plus $0.01 for each returned listing that contains a contact phone. The contact event is automatic when phone is present; it is not a separate opt-in enrichment request. Plan discounts apply to both events.
At 512 MB, the start event is $0.00005. Larger memory settings charge one start event per GB, with a minimum of one. Before discounts:
| Returned output | Cost |
|---|---|
| 10 listings without phones | $0.15005 |
| 10 listings, all with phones | $0.25005 |
| 20 listings, 5 with phones | $0.35005 |
| No changed rows | $0.00005 |
These examples illustrate the event formula, not predicted output. In monitor mode, result and phone charges apply to emitted change rows. A seed-only baseline or unchanged repeat has no dataset-result charge, but the start event remains. Set maxListings and Apify's maximum run charge before starting a large export.
Input
| Field | Behavior |
|---|---|
mode | search or direct_urls |
locations | One or more city-state slugs, such as san-francisco-ca or austin-tx; each is searched on its own with the filters. Empty: san-francisco-ca |
location | One city-state slug (older single field, still accepted and searched together with locations) |
propertyType | Apartments, houses, condos, townhomes or rooms URL category |
minPrice, maxPrice | Monthly asking-rent filters |
minBeds, maxBeds | Bedroom filters; 0 means studio |
airbnbFriendly | Pass the source's Airbnb-friendly filter; not a legal eligibility check |
listingUrls | Zumper listing URLs for direct mode |
maxListings | Collected listing cap per location (direct mode: per run), default 10; schema maximum 10,000 |
maxPages | Result pages read per search, 10 listings each; default 20, maximum 1,000 |
includePhotos | Include source photo URLs where available |
useApifyProxy | Use Apify residential routing; default true |
onlyChanges | Enable persistent change monitoring; default false |
monitorId | Stable name for a saved search; otherwise derived from search settings |
firstRunMode | emitAll or seedOnly |
resetState | Reset only this monitor once; turn it off afterward |
Small one-off export
{"mode": "search","locations": ["san-francisco-ca", "oakland-ca"],"propertyType": "apartments-for-rent","maxListings": 3,"includePhotos": false,"useApifyProxy": true}
Recurring rental monitor
{"mode": "search","locations": ["austin-tx"],"propertyType": "apartments-for-rent","maxPrice": 3000,"minBeds": 1,"maxListings": 25,"includePhotos": false,"useApifyProxy": true,"onlyChanges": true,"monitorId": "austin-rentals-under-3000","firstRunMode": "seedOnly"}
The first monitor run stores the current baseline without emitting rows. Later runs with the same monitor return newly observed or changed listings. Use emitAll if you want the first run to return its baseline as new rows.
Change events
change_type is new for a previously unseen listing, price_changed when a minimum or maximum asking rent changes, or details_changed when another tracked snapshot field changes. Tracked fields include bedrooms, bathrooms, availability date and canonical listing URL. Changes to every descriptive field, such as a photo or paragraph of text, are not monitored.
Change rows include monitor_id, first_seen_at, detected_at, previous_price_min, previous_price_max, price_change_amount and price_change_percent. The numeric amount and percentage compare the minimum asking rent; a maximum-only price change can therefore have a zero minimum-price delta.
For a rent-cut alert, filter for change_type == "price_changed" and a negative price_change_amount. The current Actor does not emit event_type, price_drop or status_flip fields. It also does not report removals from a capped result window, because a listing missing from one search page is not proof that it was rented or withdrawn.
Output example
Selected fields from an actual September 4, 2026 cloud result:
{"listing_id": 58574913,"name": "Blueground San Francisco","city": "San Francisco","state": "CA","zipcode": "94105","price_min": 2950,"price_max": 16830,"beds_min": 0,"beds_max": 3,"lead_score": 81,"url": "https://www.zumper.com/apartment-buildings/1717500/blueground-san-francisco-soma-san-francisco-ca","scraped_at": "2026-09-04T05:23:26.547170+00:00"}
The dated example describes a building range and is not a current availability quote. The owner run returned 200 listings without warnings; that observation does not establish complete market coverage or future reliability.
Monitor state and scheduling
State lives in a named key-value store in the run user's Apify account. Different users do not share a baseline. Each monitor retains up to 5,000 listings seen in the preceding 90 days. Listings absent longer than that can appear as new when observed again.
Keep one monitorId for one search and avoid overlapping runs on it. If you change the city or filters, choose a new explicit ID; an automatically derived ID changes with the search configuration. resetState: true discards that monitor's baseline, so leaving it on would reseed every run.
Save the input as an Apify Task, inspect the first dataset, then add a schedule. The n8n workflow uses Actor-side state and sends a digest only when output exists. Store the Apify token in the workflow's Header Auth credential; never publish it inside an exported JSON file.
FAQ
How do I track rent drops in a city? Save a monitor for that city: "locations": ["austin-tx"], "onlyChanges": true, a fixed "monitorId": "austin-rent-drops", and "firstRunMode": "seedOnly". The first run stores today's rents. Every later run returns only listings whose asking rent moved, with previous_price_min, price_change_amount and price_change_percent. Keep the rows where change_type == "price_changed" and price_change_amount < 0; those are the rent cuts.
How do I see only new listings under my budget? Set maxPrice (and minBeds if you need it) together with onlyChanges: true and a fixed monitorId. After the baseline run, each run returns the listings Zumper newly shows for that search, as rows with change_type == "new". Listings you have already seen are not returned and not charged.
Do Zumper listings go stale or turn out fake? Some do: a building range can include units that are already rented, and the Actor cannot confirm availability or that a listing is genuine. What it gives you is dates. Each row carries scraped_at, and monitor rows carry first_seen_at and detected_at, so you can see when a listing first appeared in your search and when its rent last changed. A listing whose rent never moves for months is worth a phone call before you trust it. Confirm any unit with the listing provider.
Why do other Zumper scrapers fail so often, and does this one? Apify's public Store page for this Actor showed 457 succeeded runs out of 457 in the 30 days to October 31, 2026, with none failed, aborted or timed out. On the same day another Zumper Actor in the Store showed 137 failed runs out of 454. A clean run state describes past runs, not a promise for future ones, and the source can change.
Run state read from the Store page on October 31, 2026 (last 30 days):
{"succeeded": 457, "failed": 0, "aborted": 0, "timed_out": 0, "total": 457}
How do I get an alert when rent drops on Zumper? Run this Actor on a schedule with onlyChanges: true and a fixed monitorId, then filter the dataset for change_type == "price_changed" and a negative price_change_amount. The n8n template above sends a digest only when such rows exist.
Does the monitor tell me when a listing is rented or taken down? No. It reports new listings and changed rent or details. Removals are not reported, because a listing missing from a capped search page is not proof that it is gone.
Does it handle multi-page results, or every rental in a city? Not every rental by default. A search reads 20 result pages, about 200 listings. Set maxPages (up to 1,000) together with maxListings (up to 10,000) to read further; 3,000 listings take about four minutes to collect. Output still depends on what Zumper serves for that search, and every returned listing is charged, so set Apify's maximum run charge before a large export. A plain export stops collecting at the number of listings that charge limit can pay for, and the log and status message say how many were saved.
Why did a successful monitor return zero rows? A seed-only first run or an unchanged repeat can correctly return an empty dataset. Check the log to distinguish that outcome from a source failure. Monitor state is not advanced when a source page fails.
Can I use it without monitoring? Yes. Leave onlyChanges false for a normal bounded export. No persistent change baseline is needed.
Are phones guaranteed? No. They appear only where the source supplies them, and the automatic contact event applies to those returned rows.
How do I report a problem? Open an Actor issue with the run URL, input and expected behavior. Avoid posting credentials or private tenant information. An honest review after a useful run helps other users assess the tool.
Can I reuse the data? Check source terms and your intended use. Keep collection bounded and retain only fields needed for your work.
For AI agents
Call benthepythondev/zumper-rental-scraper with a city-state slug; no login or cookies are needed. For a rent-change watch, add "onlyChanges": true and a stable "monitorId" and run it on a schedule.
{"mode": "search", "locations": ["austin-tx"], "propertyType": "apartments-for-rent", "maxListings": 10, "onlyChanges": true, "monitorId": "austin-apartments"}
Related Actors
HotPads rentals and Craigslist real estate cover other rental sources. Each has its own output, limits and pricing.
Keywords: Zumper scraper, rental listings API, rental price monitoring, apartment data, asking rent changes, new rental alerts, rental CSV export, Austin rentals, San Francisco rentals, n8n rental workflow.