Zumper Scraper — Rentals, Buildings & Rent Data avatar

Zumper Scraper — Rentals, Buildings & Rent Data

Pricing

from $3.95 / 1,000 results

Go to Apify Store
Zumper Scraper — Rentals, Buildings & Rent Data

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

ShhhLabs

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 days ago

Last modified

Share

Zumper Rental Scraper

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

FieldTypeDefaultDescription
modeSEARCH | DETAIL | RENT_RESEARCHSEARCHWhat to scrape (see below).
startUrlsstring[][]DETAIL mode only — Zumper building/listing page URLs.
citiesstring[]["new-york-ny"]SEARCH / RENT_RESEARCH — city slugs ({city}-{state}, e.g. los-angeles-ca).
propertyTypesstring[]["apartments"]SEARCHapartments, houses, condos, rooms.
maxPagesinteger10Max search-result pages per city + property-type combo (25 listings/page).
includeNeighborhoodsbooleanfalseAlso scrape each neighborhood within each city.
includeMarketDatabooleanfalseIn SEARCH mode, also scrape rent-research data per city.
maxConcurrencyinteger5Max parallel browser pages.
proxyobjectApify ResidentialProxy configuration.

Modes

  • SEARCH — builds URLs from cities × propertyTypes, paginates, and emits one listing record per unit/building.
  • DETAIL — visits each URL in startUrls and 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"
]
}
{ "mode": "RENT_RESEARCH", "cities": ["san-francisco-ca"] }

City slug format

{city-name-hyphenated}-{state-abbrev-lowercase}

CitySlug
New York, NYnew-york-ny
Los Angeles, CAlos-angeles-ca
San Francisco, CAsan-francisco-ca
Chicago, ILchicago-il
Austin, TXaustin-tx
Miami, FLmiami-fl

Output

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):

  1. Builds seed URLs from the input (or uses startUrls in DETAIL mode).
  2. Loads each page in a browser, which automatically executes the challenge and reloads with the real content.
  3. 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).
  4. 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 maxPages to 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 install
npm run build
npm 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.