Zumper Scraper [$2💰] | Rental Listings | US Market Data avatar

Zumper Scraper [$2💰] | Rental Listings | US Market Data

Pricing

from $1.90 / 1,000 results

Go to Apify Store
Zumper Scraper [$2💰] | Rental Listings | US Market Data

Zumper Scraper [$2💰] | Rental Listings | US Market Data

Scrape US rental listings from Zumper: rent, beds/baths, sqft, amenities and availability across thousands of apartment listings. Built for rental price monitoring, rent comparables and rental market research. Structured JSON rows via API, schedule or webhook.

Pricing

from $1.90 / 1,000 results

Rating

0.0

(0)

Developer

Ahmed Jasarevic

Ahmed Jasarevic

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 days ago

Last modified

Categories

Share

Zumper Scraper — Scrape US Zumper Rental Listings As JSON

Scrape US rental listings from Zumper into 48-field JSON rows — rent range, beds/baths, square footage, address, neighborhood, ZIP, amenities, pet policy, photos, agent contact, ratings and availability dates — using Zumper's own internal JSON APIs instead of its bot-protected HTML, so no browser is required. Built for rent comparables, rental price monitoring and rental market analysis at US city level.

Main Use Cases: Rental Price Monitoring, Rent Comparables And Market Data

  • Rental price monitoring — schedule recurring runs on the same city slug and diff the exports to track rent prices over time.
  • Rent comparables — every row carries address, lat/lng, rent range, beds/baths, square footage and listedAt: the raw ingredients of a comp set.
  • Rental market analysis — export a city run to CSV and compute median rent, $/sqft and listing counts; two runs give you rental market trends.
  • Rental lead generation — rows include agent/brokerage name and phone (and e-mail with includeDetails) whenever Zumper exposes them.
  • Budget-filtered searches — price and bedroom filters narrow a run to apartments under $2000, studios or 1-bedroom comps.
  • City-by-city apartment data pulls — the same input shape works for new-york-ny, los-angeles-ca, chicago-il and san-francisco-ca.

How The Zumper Scraper Works

The actor runs as a plain CheerioCrawler — HTTP plus JSON parsing, no headless browser, 256 MB memory. For each target city it POSTs Zumper's search endpoint (50 results per page, offset pagination), enriches rows with one building-detail request per building (standalone listings fall back to listing detail), applies price and bedroom filters in-process, and writes one dataset row per listing. Photo URLs are rebuilt from image ids; includeDetails adds extra detail for a per-request charge.

Zumper Scraper Input Parameters

FieldTypeRequiredDefaultNotes
startUrlsarrayOne of*https://www.zumper.com/apartments-for-rent/austin-tx (prefill)Zumper search page URLs — one US city per entry; entries are {"url": "..."} objects.
locationstringOne of*"" (empty)Alternative to startUrls: a Zumper slug (austin-tx) or a city (Austin, TX). Merged with any start URLs.
maxItemsintegerNo50Hard cap on listings per run (min 1, max 5000).
maxConcurrencyintegerNo4Requests processed in parallel (min 1, max 20).
minPriceintegerNo—Keep listings whose cheapest unit is at least this rent; applied client-side because Zumper's API accepts but ignores price filters.
maxPriceintegerNo—Keep listings whose cheapest unit is at most this rent (also client-side).
minBedroomsintegerNo—Keep listings with at least this many bedrooms (0 = studio); client-side.
maxBedroomsintegerNo—Keep listings with at most this many bedrooms; client-side.
includeDetailsbooleanNofalseAlso fetch extra listing details (pet policy, agent e-mail, photos). Billed per extra request via the include-details charge event.
maxRequestsPerCrawlintegerNo1000Safety cap on total HTTP requests — search plus detail (min 10, max 20000).
proxyobjectNo{"useApifyProxy": false}Standard Apify proxy picker — recommended for large runs; the search API rate-limits ~10–15 req/min per IP.

* The schema marks no field as formally required, but a run needs a target: startUrls (prefilled with the Austin, TX page) or location.

Geography: US city-level slugs only (austin-tx, new-york-ny) — neighborhood slugs such as austin-tx/chestnut return 0 results; there is no ZIP-level or non-US input. Free users get a capped 10-listing preview; paying users get full runs.

Rental Listings As Structured JSON: All 48 Output Fields

One dataset row per Zumper listing. The dataset ships an Overview view (title, rentMin, rentMax, bedroomsMin, bathroomsMin, squareFeetMin, address, neighborhood, zip, brokerageName, dateAvailable, url) and exports as JSON, CSV or Excel from the console or the Apify API.

Identity & provenance (7) — source (always "zumper"), listingId (the row key for diffs), buildingId (null for standalone homes), url, feedName (upstream syndication feed), enrichedWithDetail (true when extra details were merged in), scrapedAt (ISO 8601).

Listing text (2) — title (unit/floorplan title or building name), description.

Pricing (3) — rentMin / rentMax (cheapest and most expensive unit rent per month), currencyCode (1 = USD).

Unit size (7) — bedroomsMin / bedroomsMax, bathroomsMin / bathroomsMax, squareFeetMin / squareFeetMax (min/max ranges across the listing's units), floorplanCount.

Location (8) — address, neighborhood, buildingName, city, state, zip, latitude, longitude.

Amenities & pets (5) — amenities (unit tags), buildingAmenities, petPolicy (structured per species — authoritative pet info), petsAllowed, petCodes (raw codes: 1 = cat, 2 = dog, 3 = bird).

Photos (2) — photos (absolute img.zumpercdn.com URLs, reconstructed as https://img.zumpercdn.com/{image_id}/1280x960), photoCount.

Contacts (4) — agentName, agentPhone, agentEmail (arrives with detail enrichment), brokerageName.

Ratings & reviews (3) — rating (Zumper score 0–10), externalRating, reviewsSummary.

Key dates (4) — dateAvailable (ISO 8601 YYYY-MM-DD; often null because Zumper only populates it for some listings), listedAt, modifiedAt, createdAt (ISO 8601).

Classification codes (3) — propertyType, leaseType, listingStatus (raw Zumper numeric codes).

Example Input And Output: Zumper Rental Listings

Example input:

{
"startUrls": [
{ "url": "https://www.zumper.com/apartments-for-rent/austin-tx" },
{ "url": "https://www.zumper.com/apartments-for-rent/chicago-il" }
],
"maxItems": 100,
"maxConcurrency": 4,
"minPrice": 1000,
"maxPrice": 2000,
"minBedrooms": 1,
"maxBedrooms": 2,
"includeDetails": true,
"maxRequestsPerCrawl": 300,
"proxy": { "useApifyProxy": true }
}

Example output (one dataset row, values illustrative):

{
"source": "zumper",
"listingId": 3456789,
"buildingId": 123456,
"url": "https://www.zumper.com/apartments/austin-tx/123-main-st-3456789",
"title": "2 bed, 2 bath - 123 Main St",
"description": "Modern downtown 2-bedroom with in-unit washer/dryer.",
"rentMin": 1645,
"rentMax": 2410,
"currencyCode": 1,
"bedroomsMin": 2,
"bedroomsMax": 2,
"bathroomsMin": 2,
"bathroomsMax": 2,
"squareFeetMin": 950,
"squareFeetMax": 1100,
"floorplanCount": 4,
"address": "123 Main St, Austin, TX 78701",
"neighborhood": "Downtown",
"buildingName": "Main Street Lofts",
"city": "Austin",
"state": "TX",
"zip": "78701",
"latitude": 30.2695,
"longitude": -97.742,
"amenities": ["in-unit washer/dryer", "dishwasher", "balcony"],
"buildingAmenities": ["pool", "fitness center", "parking"],
"petPolicy": [
{ "species": "dog", "allowed": true },
{ "species": "cat", "allowed": true }
],
"petsAllowed": true,
"petCodes": [1, 2],
"photos": ["https://img.zumpercdn.com/1122334455/1280x960"],
"photoCount": 18,
"agentName": "Jordan Example",
"agentPhone": "+1-512-555-0143",
"agentEmail": "jordan@example.com",
"brokerageName": "Example Realty",
"rating": 4.2,
"externalRating": null,
"reviewsSummary": "Residents like the pool and staff.",
"dateAvailable": null,
"listedAt": "2026-09-14T10:15:00Z",
"modifiedAt": "2026-10-01T08:02:00Z",
"createdAt": "2025-06-02T12:00:00Z",
"propertyType": 2,
"leaseType": 1,
"listingStatus": 1,
"feedName": null,
"enrichedWithDetail": true,
"scrapedAt": "2026-10-07T09:30:00Z"
}

Zumper API Access: Scrape Zumper Rentals Without A Browser

Zumper's public HTML pages are served behind a Fastly client challenge (_fs_ch_st_* cookie) that blocks plain HTTP clients. Instead of fighting that, this actor uses Zumper's own internal JSON APIs, served without any anti-bot protection:

  1. Search — POST https://www.zumper.com/api/svc/inventory/v1/listables/search

    • Body: {"url":"<slug>","limit":50,"offset":0,"external":true,"countListings":true,"descriptionLength":580}
    • Returns { listables[], matching, listing_count } — the same data the search page renders.
    • limit is capped at 50 by the API (51+ returns 422); paginate with offset.
    • minPrice/maxPrice are accepted but ignored server-side, so price and bedroom filters are applied client-side inside the actor.
    • Each listable carries listing/building ids, address, city/state/ZIP, lat/lng, neighborhood, rent and beds/baths/sqft ranges, date_available, photo ids, amenity tags, pet codes, agent/brokerage contact, ratings and timestamps.
  2. Building detail — GET https://www.zumper.com/api/t/1/pages/buildings/{building_id}

    • One request per building; listings in the same building share it.
    • Adds full description, structured pet_policy per species, agent e-mail, media photo ids, floorplan_listings, amenity_tags, brokerage_name and reviews_summary.
    • Keys on building_id, not the pb_id used in Zumper URLs.
  3. Listing detail (fallback) — GET https://www.zumper.com/api/t/1/pages/listings/{listing_id}

    • Used for standalone listings that have no building.

Why this bypasses the anti-bot: the challenge only protects the HTML document. The JSON APIs the site's own frontend calls are open — no cookies, no challenge, no browser required. The actor is therefore a plain CheerioCrawler: fast, cheap, testable without a browser.

Known limitations and troubleshooting

  • The search API rate-limits aggressively per IP (~10–15 req/min) — enable the Apify proxy for large runs, or lower maxConcurrency.
  • dateAvailable is often null — Zumper only populates it for some listings.
  • Neighborhood slugs (e.g. austin-tx/chestnut) return 0 results — use city-level slugs.
  • petCodes are raw (1=cat, 2=dog, 3=bird); the structured petPolicy array is authoritative.
  • Cost: CheerioCrawler and JSON APIs only — no browser. Runs at 256 MB; a 50-listing run is roughly 1 search request plus ~40 detail requests.

Rent Comparables, Rental Market Analysis And Rental Price Monitoring

Build rent comps from one city run

Run one city slug and filter the export: each row gives address, latitude/longitude, rentMin/rentMax, beds/baths, square footage and listedAt — the checklist the comp guides prescribe: same bedrooms, square footage within roughly 15–20%, within about half a mile to a mile, recent listings, and a median rather than an average. Be explicit about what these are: asking rents from live listings, not signed leases.

Export a run to CSV and compute median rent, rent per square foot and listing counts by neighborhood or ZIP; two runs months apart show month-over-month movement. One run cannot replace an official index or enterprise multifamily market data from the likes of CoStar or Yardi Matrix — it is a snapshot of Zumper's current asking-rent inventory. The same honesty applies to "average rent in [city]": you get the listings to compute a median from, not an official average. Against rent estimate tools (Rentometer, RentCast, HomeUnion RENTestimate) the trade-off is a model estimate versus your own comp set.

Rental price monitoring with scheduled runs

Set a weekly or daily schedule on the same city slug, then diff two dataset exports on listingId using rentMin/rentMax plus modifiedAt/scrapedAt to see which rents moved. Honest caveat: this actor stores no built-in monitor state — competitor benthepythondev/zumper-rental-scraper exposes an onlyChanges mode; here change detection is a comparison between two exports.

Budget-filtered and multi-city pulls

An "apartments under $2000" search is just maxPrice: 2000 (add minPrice or maxBedrooms to narrow further) — filters run client-side, so they hold even though Zumper's API ignores price parameters. Repeat the input for new-york-ny, los-angeles-ca, chicago-il and san-francisco-ca for a multi-market dataset. Contact rows carry agent/brokerage name and phone only when Zumper exposes them (agentEmail needs includeDetails), so lead-gen coverage is partial.

Integrations & Automation

  • Apify API — start runs remotely, poll run states and fetch dataset items as JSON; the output results field links to the default dataset items endpoint. Console exports: JSON, CSV, Excel.
  • Webhooks — fire on run success or failure to push new rows into your pipeline or Slack channel.
  • Zapier and Make — trigger workflows on new dataset items (append to Google Sheets, create CRM records, alert on new rentals).
  • Schedules — for rental price monitoring, run daily or weekly against the same city slug and keep one dataset per period for diffs; spaced-out runs also respect Zumper's per-IP rate limits better than one huge crawl.

FAQ

Is there an official Zumper API?

No. Zumper publishes no official public API — which is why API-directory products fill the gap (HousingFeed's rental-data API, ReefAPI's Apartments.com-style wrapper). This actor calls the same internal JSON endpoints Zumper's own frontend uses, served without anti-bot protection.

Why use this actor instead of the official Zumper API?

No official one exists — the real comparison is building it yourself, and the actor already handles what you would reverse-engineer: the Fastly HTML challenge, the 50-item limit cap with offset pagination, filters Zumper's API ignores server-side, detail keyed on building_id (not pb_id) and photo-id URL reconstruction. You also get a fixed 48-field schema, scheduling, webhooks, API access and a free 10-listing preview.

Can you scrape Zumper without getting blocked?

Yes. Plain HTTP clients get the Fastly challenge (_fs_ch_st_* cookie) on Zumper's HTML, so the actor never touches HTML — it calls the JSON APIs the frontend uses, via CheerioCrawler with no browser. The constraint is rate, not blocks: ~10–15 search requests per minute per IP, so large runs should use the Apify proxy.

How do I find rental comps with this actor?

Run the city slug, then filter rows to comparables: same bedroom count, square footage within ~15–20%, within about 0.5–1 mile (use latitude/longitude), recent listings (listedAt). Take the median of rentMin/rentMax, not the mean — these are asking rents, not executed leases.

How do I track apartment rent prices over time?

Schedule recurring runs on the same city slug (daily or weekly), then diff two exports on listingId, comparing rentMin/rentMax and modifiedAt/scrapedAt. The actor keeps no built-in monitor state, so change detection is a diff between two exports; Apify webhooks can trigger each run.

What is the average rent in [city]?

You get the individual listings, so you can compute a median or average for any city you scrape — but the actor publishes no official figure, and asking rents are not signed-lease rents. Published averages come from Apartment List, Zillow median-rent pages or HUD FMR tables.

What are the alternatives to this Zumper scraper?

On the Apify Store: automation-lab/zumper-rental-listings-scraper, bujhmml/zumper-rentals-scraper, benthepythondev/zumper-rental-scraper, abotapi/zumper-scraper and housingfeed/zumper-scraper, plus azzouzana/zumper-scraper and browser-based shhh_lab/apify-zumper. Beyond Zumper: Zillow (Rental Manager, Rent Zestimate), Apartments.com (official customer API) and RentCast. For market research the choice is live raw rows (this actor) or cleaned aggregate databases (HousingFeed, RentCast); this actor covers Zumper only.

SEO Keywords

zumper scraper, scrape zumper, zumper rentals scraper, zumper api, rental listings api, apartment data, rental price monitoring, track rent prices over time, rent comparables, how to find rental comps, rental market analysis, rental market trends, multifamily market data, average rent in [city], rent estimate tools, rental lead generation, rental listing data for market research, apartments under $2000, zumper scraper new york, zillow rental data, apartments.com rental data

For AI Agents & LLM Apps

Purpose: fetch structured US rental listing data — one JSON object per Zumper listing, 48 fields — for a given US city slug, without a browser.

Minimal working input:

{
"startUrls": [
{ "url": "https://www.zumper.com/apartments-for-rent/austin-tx" }
]
}

Output fields (one dataset object per listing): source, listingId, buildingId, url, title, description, rentMin, rentMax, currencyCode, bedroomsMin, bedroomsMax, bathroomsMin, bathroomsMax, squareFeetMin, squareFeetMax, floorplanCount, address, neighborhood, buildingName, city, state, zip, latitude, longitude, amenities, buildingAmenities, petPolicy, petsAllowed, petCodes, photos, photoCount, agentName, agentPhone, agentEmail, brokerageName, rating, externalRating, reviewsSummary, dateAvailable, listedAt, modifiedAt, createdAt, propertyType, leaseType, listingStatus, feedName, enrichedWithDetail, scrapedAt.

Behaviors an agent should know:

  • Locations are US city-level Zumper slugs only (austin-tx, new-york-ny); neighborhood slugs such as austin-tx/chestnut return 0 results. No ZIP-level or non-US input.
  • The search endpoint serves at most 50 listings per request (limit > 50 returns HTTP 422); the actor paginates internally with offset.
  • minPrice, maxPrice, minBedrooms and maxBedrooms are applied client-side because Zumper's API accepts but ignores them server-side.
  • includeDetails defaults to false; set it only when you need pet policy, agent e-mail and photos — each extra detail request is charged via the include-details event, and enriched rows carry enrichedWithDetail: true.
  • Building detail is fetched once per building (building_id, not the URL's pb_id); standalone listings use the listing-detail endpoint.
  • Search rate-limits ~10–15 requests/minute per IP — enable proxy beyond quick tests; maxConcurrency caps at 20.
  • Defaults: maxItems 50 (max 5000), maxConcurrency 4, maxRequestsPerCrawl 1000. Free accounts get a capped 10-listing preview; paying accounts get full runs.
  • dateAvailable is frequently null; petCodes are raw — treat petPolicy as authoritative.
  • No built-in monitor state: run twice and diff on listingId using rentMin/rentMax and modifiedAt/scrapedAt.

Billing: pay-per-event — the documented charge event is include-details (per extra detail request while includeDetails is true).

  • This is an independent third-party tool. It is not affiliated with, endorsed by, sponsored by or connected to Zumper.
  • The actor reads only publicly available rental listings — Zumper's public search pages and the JSON endpoints those pages call. It uses no user accounts or authentication bypass; it does not log in or defeat login walls.
  • Zumper's Terms of Service may change. You are solely responsible for ensuring your runs and use of the output comply with Zumper's ToS and applicable data-protection and scraping law.
  • Output can include listing-agent contact details (name, phone, and e-mail where Zumper publishes them). That contact data must not be used for unsolicited commercial outreach in violation of applicable law.
  • Data is provided as-is with no warranty of completeness or accuracy; listings change constantly.