Zumper Scraper — Rentals, Buildings & Rent Data
Pricing
from $3.95 / 1,000 results
Zumper Scraper — Rentals, Buildings & Rent Data
Extract rental listings, building details, and rent-market data from Zumper — apartments, houses, condos, and rooms with prices, amenities, photos, floorplan units, and 24-month rent trends.
Pricing
from $3.95 / 1,000 results
Rating
0.0
(0)
Developer
ShhhLabs
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
5 days ago
Last modified
Categories
Share

Zumper Rental Listings Scraper
Scrape rental listings, building details, and rent-market data from Zumper.com — one of the largest US rental platforms. Extract apartments, houses, condos, and rooms with prices, amenities, photos, neighborhood data, individual floorplan units, and historical rent trends.
Features
- Search mode — Scrape city listing pages with full pagination (25 listings/page).
- Detail mode — Scrape individual building pages for the full description and every rentable unit (floorplan-level prices, beds, baths, sqft, availability).
- Rent research mode — Market data: median & average rent, 24-month history, and rent distribution by bedroom count (studio → 4+ bed).
- Property types — Apartments, houses, condos, rooms.
- Neighborhood drill-down — Optionally enumerate and scrape every neighborhood within each city.
- Deduplication — The same listing appearing in city + neighborhood views is pushed only once.
- Anti-bot handling — Runs a real browser to clear Zumper's JavaScript challenge automatically.
Input
| Field | Type | Default | Description |
|---|---|---|---|
mode | SEARCH | DETAIL | RENT_RESEARCH | SEARCH | What to scrape (see below). |
startUrls | string[] | [] | DETAIL mode only — Zumper building/listing page URLs. |
cities | string[] | ["new-york-ny"] | SEARCH / RENT_RESEARCH — city slugs ({city}-{state}, e.g. los-angeles-ca). |
propertyTypes | string[] | ["apartments"] | SEARCH — apartments, houses, condos, rooms. |
maxPages | integer | 10 | Max search-result pages per city + property-type combo (25 listings/page). |
includeNeighborhoods | boolean | false | Also scrape each neighborhood within each city. |
includeMarketData | boolean | false | In SEARCH mode, also scrape rent-research data per city. |
maxConcurrency | integer | 5 | Max parallel browser pages. |
proxy | object | Apify Residential | Proxy configuration. |
Modes
SEARCH— builds URLs fromcities×propertyTypes, paginates, and emits one listing record per unit/building.DETAIL— visits each URL instartUrlsand emits one building record (full description + all floorplan units).RENT_RESEARCH— emits one market-data record per city.
Example: NYC apartments
{ "mode": "SEARCH", "cities": ["new-york-ny"], "propertyTypes": ["apartments"], "maxPages": 5 }
Example: Full building details
{"mode": "DETAIL","startUrls": ["https://www.zumper.com/apartment-buildings/p1528434/the-highland-east-new-york-new-york-ny"]}
Example: SF rent trends
{ "mode": "RENT_RESEARCH", "cities": ["san-francisco-ca"] }
City slug format
{city-name-hyphenated}-{state-abbrev-lowercase}
| City | Slug |
|---|---|
| New York, NY | new-york-ny |
| Los Angeles, CA | los-angeles-ca |
| San Francisco, CA | san-francisco-ca |
| Chicago, IL | chicago-il |
| Austin, TX | austin-tx |
| Miami, FL | miami-fl |
Output
Listing output (SEARCH)
38 fields per listing. sqftMin/sqftMax/leaseMinDays/leaseMaxDays are null when Zumper doesn't publish them.
{"listingId": 63457759,"buildingId": 2022915,"buildingName": "The Highland","address": "2840 Atlantic Avenue","city": "New York","state": "NY","zipcode": "11207","neighborhood": "East New York","lat": 40.6763085,"lng": -73.8890418,"priceMin": 2300,"priceMax": 3688,"previousPrice": null,"bedroomsMin": 0,"bedroomsMax": 2,"bathroomsMin": 0,"bathroomsMax": 2,"sqftMin": null,"sqftMax": null,"leaseMinDays": null,"leaseMaxDays": null,"floorplanCount": 9,"propertyType": "apartment","dateAvailable": null,"listedOn": "2026-06-11","modifiedOn": "2026-06-15","rating": 9.4,"petsAllowed": [],"amenities": ["Granite Countertop", "Stainless Steel Appliances", "Floor-To-Ceiling Windows"],"buildingAmenities": ["Fitness Center", "Rooftop Lounge", "Co-working lounge"],"phone": "(516) 619-3153","agentName": "Bushburg Properties","brokerageName": null,"isFeatured": false,"hasFees": false,"images": ["https://img.zumpercdn.com/873992950/1280x960"],"url": "https://www.zumper.com/apartment-buildings/p1528434/the-highland-east-new-york-new-york-ny","description": null}
Building output (DETAIL)
One record per building, with a nested units array (one entry per rentable floorplan).
{"buildingId": 2022915,"name": "The Highland","description": "Housed in what was formerly the Empire State Dairy Company, The Highland …","address": "2840 Atlantic Avenue","formattedAddress": "2840 Atlantic Avenue, New York, NY 11207, USA","city": "New York","state": "NY","zipcode": "11207","neighborhood": "East New York","citySlug": "new-york-ny","lat": 40.6763085,"lng": -73.8890418,"yearBuilt": null,"floors": null,"phone": "(516) 619-3153","agentName": "Bushburg Properties","brokerageName": null,"petsAllowed": ["Large Dogs", "Cats"],"amenities": ["Fitness Center", "Rooftop Lounge"],"hasFees": false,"images": ["https://img.zumpercdn.com/873992950/1280x960"],"unitCount": 9,"units": [{"listingId": 63457779,"title": "Unit 324","priceMin": 2300,"priceMax": 2300,"bedrooms": 0,"bathrooms": 0,"halfBathrooms": 0,"sqft": null,"dateAvailable": null,"propertyType": "apartment","amenities": ["Floor-To-Ceiling Windows", "Vinyl Plank Flooring"],"images": ["https://img.zumpercdn.com/873993321/1280x960"],"url": "https://www.zumper.com/apartment-buildings/p1528434/the-highland-east-new-york-new-york-ny"}],"url": "https://www.zumper.com/apartment-buildings/p1528434/the-highland-east-new-york-new-york-ny"}
Market data output (RENT_RESEARCH)
{"city": "New York","state": "NY","citySlug": "new-york-ny","scrapedAt": "2026-06-15","rentData": {"studio": { "medianRent": 3895, "averageRent": 4048.12, "averageSqft": 412, "count": 1470, "rentRanges": [{ "label": "$0 - $1,500", "percent": 1.85 }], "monthlyHistory": [{ "date": "2024-06", "medianRent": 3800 }] },"oneBed": { "medianRent": 4750, "averageRent": 4912.02, "averageSqft": 600, "count": 3147, "rentRanges": [], "monthlyHistory": [] },"twoBed": { "medianRent": 5600, "averageRent": 6182.17, "averageSqft": 900, "count": 2381, "rentRanges": [], "monthlyHistory": [] },"threeBed": { "medianRent": 6195, "averageRent": 7130.08, "averageSqft": 1200, "count": 1196, "rentRanges": [], "monthlyHistory": [] },"fourBedPlus": { "medianRent": 7300, "averageRent": 8839.63, "averageSqft": 1500, "count": 315, "rentRanges": [], "monthlyHistory": [] }}}
Any bedroom type with no data is null.
How it works
Zumper is a React app served behind a non-interactive JavaScript anti-bot challenge — a plain HTTP request only ever returns a small "Client Challenge" shell, never the real content. This actor therefore drives a real headless browser (Playwright + Chromium):
- Builds seed URLs from the input (or uses
startUrlsin DETAIL mode). - Loads each page in a browser, which automatically executes the challenge and reloads with the real content.
- Reads the server-rendered
window.__PRELOADED_STATE__JSON embedded in the page and parses it with a brace-matching scanner (robust to the ~400 KB blob and trailing scripts). - Normalizes records (deduplicating by ID, cleaning Zumper's sentinel "unknown" values), then paginates and optionally enqueues neighborhoods / rent research.
A JSON-LD extraction utility is included as a resilience aid if the embedded-state format ever changes.
Pricing
Designed for Pay Per Result — e.g. $0.015 per listing, building, or market-data record (configure in the Apify console). Because each page runs a browser, residential proxy + compute costs are higher than a plain HTTP scraper; per-result pricing keeps that predictable for you.
Limitations & notes
- 25 listings per search page (Zumper's pagination size); use
maxPagesto control depth. - Residential proxies are strongly recommended — datacenter IPs are challenged far more aggressively.
- DETAIL expects building pages (
/apartment-buildings/p…). The full description and per-unit prices live only on these pages, not in search results. - Polite by default: capped concurrency and request rate.
Development
npm installnpm run buildnpm test # 38 unit tests (extraction + normalization)npm start # runs locally against ./storage with an INPUT.json
The unit tests cover the pure extraction/normalization logic (no network). To smoke-test the browser pipeline locally, drop an INPUT.json into storage/key_value_stores/default/ and run npm start.