π’ Apartments.com Scraper
Pricing
from $3.99 / 1,000 results
π’ Apartments.com Scraper
Pricing
from $3.99 / 1,000 results
Rating
0.0
(0)
Developer
ScraperX
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
π’ Apartments.com Scraper β Rental Listings, Rent Ranges, Locations & Transit Data
Scrape rental property data from Apartments.com by pasting listing URLs, search or map URLs, or simply a free-text location β a city, neighborhood or ZIP code. Each property comes back with its name, full address with coordinates, rent range, rating, verified-listing status, breadcrumb category path, last-updated date, and nearby public-transport options with drive times and distances.
Apartments.com is aggressively bot-protected. This Actor is built around that: it runs on US residential proxies with Firefox TLS impersonation and sticky good-IP hunting, so runs actually complete.
What you get
| π Property | π Location | π Context |
|---|---|---|
| Property name and listing ID | Full address | Nearby transit stops and stations |
| Listing URL | Street, city, state, state code | Drive time to each |
| Rent range (min / max) | ZIP / postal code | Distance to each |
| Rating | Neighborhood | Transit link where available |
| Verified-listing flag | Latitude / longitude | Breadcrumb category path |
| Last-updated timestamp |
Key features
- Three ways in. Direct listing URLs, search/map URLs (including
?bb=bounding-box map views), or a plain search term likeBrookline MA,Miami Beach FLor10001. The Actor auto-detects which is which and crawls accordingly β and you can combine them in one run. - Rent parsed into numbers.
rent.minandrent.maxare real integers, not a display string, so you can sort, filter and average immediately. - Transit data with drive times. Every nearby transport option is returned with a name, drive time, distance and link where published β genuinely useful for commute-based analysis and rarely available elsewhere.
- Coordinates on every property, so listings drop straight onto a map or into a geo query.
- Purpose-built anti-blocking. Firefox TLS impersonation with matching Firefox-shaped headers, sticky good-IP hunting on US residential proxies (each candidate IP gets its own clean cookie jar, and a working IP is reused rather than rotated), soft-block detection and per-page content validation. This is what makes Apartments.com scrapable at all.
- Pagination control.
endPagestops the crawl early; by default it continues until Apartments.com runs out of results (its own hard cap is 28 pages per search). - Never an empty dataset. A run that legitimately finds nothing emits a single un-charged diagnostic record, so downstream automations and health checks never see an empty result and guess.
- Custom proxies supported. Paste your own proxy URLs and they are tried first, with residential as automatic fallback.
Use cases
- Rental market research β measure rent ranges across neighborhoods, cities or ZIP codes.
- Investment analysis β compare asking rents against property prices in target markets.
- Competitive pricing β property managers can benchmark their rents against comparable listings nearby.
- Relocation and commute analysis β combine coordinates with transit drive times to find genuinely convenient properties.
- Real-estate data products β build rental price indices with location and transit context attached.
- Lead generation for proptech β verified listings indicate professionally managed properties.
- Academic and policy research β housing affordability datasets with geographic precision.
- Site-selection work β rent levels and transit access by neighborhood.
How it works
- You supply URLs, a search term, or both.
- Each input is classified β listing page, search/map page, or free-text search (converted into an Apartments.com search URL).
- Search pages are validated and paginated, and the individual listing URLs behind them are collected.
- Each listing page is fetched through a sticky good residential IP with Firefox TLS impersonation.
- The page is parsed into a flat record: name, address, coordinates, rent range, rating, verified status, breadcrumbs and transit options.
- Rows stream into the dataset until your
maxItemscap orendPagelimit is reached.
Quick start
- Open the Actor and either paste an Apartments.com URL or type a location into Search term β e.g.
Brookline MA. - Set Maximum properties (start with 10β20;
0= unlimited). - Click Start, then export the Output tab as CSV, Excel or JSON.
Minimal input
{"search": "Brookline MA","maxItems": 20}
Input configuration
| Field | Type | Default | Description |
|---|---|---|---|
startUrls | array | β | Apartments.com URLs in bulk β listing URLs (/sobe-apartment-rentals-miami-beach-fl/26xc7jb/), search URLs (/brookline-ma/) or map URLs with ?bb=β¦. Auto-detected. |
search | string | β | Free-text query β city, neighborhood or ZIP (Brookline MA, Miami Beach FL, 10001). Converted into a search URL and crawled like any other start URL. Use on its own or alongside startUrls. |
maxItems | integer | 10 | Cap on total property records returned. 0 = unlimited, up to what the page set contains. |
endPage | integer | 0 | Stop pagination at this page. Default 0 means continue until results run out. Apartments.com's own hard cap is 28 pages per search. |
includeAllImages | boolean | false | Reserved flag for the upcoming image-gallery release. Image extraction is on the roadmap β enabling it today returns an empty images array. |
includeVirtualTours | boolean | false | Reserved flag for the upcoming virtual-tour release. Virtual-tour extraction is on the roadmap β enabling it today returns an empty virtualTours array. |
proxyConfiguration | object | Apify Residential | The Actor always runs on Apify Residential proxy (3 retry rounds with IP refresh) β Apartments.com is too aggressive for direct or datacenter traffic. Custom proxy URLs are tried first (3 rounds) before falling back to residential. The Apify-proxy toggle and group selection are ignored. |
Honest note on images and virtual tours: both flags exist so integrations built today keep validating when those features ship. Right now they return empty arrays rather than pretending to work.
Output data
One row per property.
| Field | Type | Description |
|---|---|---|
id | string | Apartments.com listing ID. |
propertyName | string | Property name. |
url | string | Canonical listing URL. |
rent | object | { min, max } β rent range as integers. Both values are equal when a single price is shown. |
rating | number | Property rating, when published. |
isVerified | boolean | Whether Apartments.com marks it a Verified Listing. |
location | object | { fullAddress, streetAddress, city, state, neighborhood, postalCode }. |
coordinates | object | { latitude, longitude }. |
transportation | array | { name, drive, distance, url } per nearby transit option. |
breadcrumbs | array | Category path from the listing page. |
lastUpdated | string | When the listing was last updated. |
images | array | Empty until image extraction ships (only present when the flag is on). |
virtualTours | array | Empty until virtual-tour extraction ships (only present when the flag is on). |
Example output
{"id": "wqc416h","propertyName": "Forte at 1440 Beacon","url": "https://www.apartments.com/forte-at-1440-beacon-brookline-ma/wqc416h","rent": { "min": 2650, "max": 5400 },"rating": 4.2,"isVerified": true,"location": {"fullAddress": "1440 Beacon St, Brookline, MA 02446","streetAddress": "1440 Beacon St","city": "Brookline","state": "Massachusetts","neighborhood": "Coolidge Corner","postalCode": "02446"},"coordinates": { "latitude": 42.3418, "longitude": -71.1289 },"transportation": [{"name": "Summit Ave Station","drive": "2 min","distance": "0.2 mi","url": "https://www.apartments.com/transit/summit-ave-station"},{ "name": "Brookline Village", "drive": "6 min", "distance": "1.1 mi" }],"breadcrumbs": ["Massachusetts", "Brookline", "Coolidge Corner"],"lastUpdated": "2026-08-08T11:20:00Z"}
Illustrative values β a live run returns current Apartments.com data.
Usage examples
Whole neighborhood by search term
{"search": "Coolidge Corner Brookline MA","maxItems": 0}
Several markets in one run
{"startUrls": ["https://www.apartments.com/brookline-ma/","https://www.apartments.com/cambridge-ma/","https://www.apartments.com/somerville-ma/"],"maxItems": 300}
Map-area search
Draw the area on Apartments.com's map, copy the URL with its ?bb= parameter, and paste it:
{"startUrls": ["https://www.apartments.com/?bb=β¦"],"maxItems": 200}
Specific properties only
{"startUrls": ["https://www.apartments.com/sobe-apartment-rentals-miami-beach-fl/26xc7jb/","https://www.apartments.com/forte-at-1440-beacon-brookline-ma/wqc416h/"]}
Quick sample of the first pages
{"search": "Miami Beach FL","endPage": 3,"maxItems": 0}
Rent benchmarking
Run several neighborhoods, export to CSV, then average rent.min and rent.max per location.neighborhood for an instant market comparison.
Run it from your own code
Python
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_API_TOKEN>")run = client.actor("scraperx/apartments-com-scraper").call(run_input={"search": "Brookline MA","maxItems": 100,})for p in client.dataset(run["defaultDatasetId"]).iterate_items():rent = p.get("rent", {})print(p.get("propertyName"), "|", rent.get("min"), "-", rent.get("max"),"|", p.get("location", {}).get("neighborhood"))
JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_API_TOKEN>' });const run = await client.actor('scraperx/apartments-com-scraper').call({search: 'Brookline MA',maxItems: 100,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
cURL
curl -X POST "https://api.apify.com/v2/acts/scraperx~apartments-com-scraper/runs?token=<YOUR_APIFY_API_TOKEN>" \-H "Content-Type: application/json" \-d '{"search":"Brookline MA","maxItems":100}'
Integrations
Push listings into Google Sheets, Airtable, Slack, Make, Zapier, Google Drive or your own endpoint via webhooks, and use Schedules to track rent changes over time.
Pricing
Pay-per-event: a small Actor-start charge plus a charge per property row delivered to your dataset. The diagnostic record emitted when a run finds nothing is not charged.
Current rates are on the Pricing tab of this Actor's page, and Apify shows an estimate before and during every run.
Because the Actor always runs on Apify Residential proxies, that proxy traffic is billed separately by the platform according to your plan.
Limits & good to know
- Residential proxy is enforced. Apartments.com's bot protection rejects direct and datacenter traffic outright, so the Apify-proxy toggle and group selection are ignored.
- 28 pages per search is Apartments.com's own cap. To go deeper into a large market, split it into neighborhoods or ZIP codes rather than one broad search.
maxItemsis a run-wide total across all inputs.0means unlimited β check the cost estimate first.- Images and virtual tours are not extracted yet. The flags are reserved for an upcoming release and currently return empty arrays.
- Not every field is published. Ratings, neighborhoods and transit sections are missing from some listings, and come back empty rather than guessed.
- Rent is the advertised range, which can span several floor plans β treat
minandmaxas the property's advertised span, not a single unit's price. - Default run options are 4 GB memory and a 1-hour timeout β raise the timeout for unlimited runs.
FAQ
Do I need an Apartments.com account? No. The Actor reads publicly visible listing and search pages.
Can I search by city without building a URL?
Yes β use the search field with a city, neighborhood or ZIP code.
Do map searches work?
Yes. Draw the area on Apartments.com, copy the URL including its ?bb= parameter, and paste it into startUrls.
Why is residential proxy forced? Apartments.com uses aggressive bot protection that blocks direct and datacenter traffic instantly. Residential with sticky good-IP hunting is what makes runs complete.
Are photos included? Not yet. Image and virtual-tour extraction is on the roadmap; the flags exist so your input stays valid when it ships.
How deep can a single search go? Apartments.com caps its own pagination at 28 pages. Split large markets into neighborhoods for fuller coverage.
Why did my dataset contain a single record with no property? That is the diagnostic row emitted when a run legitimately returns nothing. It is not charged, and it exists so automated checks can tell "no results" from "run failed".
Which export format should I use?
JSON keeps rent, location, coordinates and transportation nested. CSV works well for rent comparisons.
Legal & responsible use
This Actor collects only publicly available Apartments.com listing information β the same details any visitor can see. It does not log in, submit enquiries, or access private data. Listing content and images remain the property of their owners. Ensure your use complies with Apartments.com's terms and applicable law, particularly if you republish listing data.
Support
Need images, floor plans, amenities, or a custom rental-data pipeline? Open an issue on the Issues tab of this Actor.