🏒 Apartments.com Scraper avatar

🏒 Apartments.com Scraper

Pricing

from $3.99 / 1,000 results

Go to Apify Store
🏒 Apartments.com Scraper

🏒 Apartments.com Scraper

Pricing

from $3.99 / 1,000 results

Rating

0.0

(0)

Developer

ScraperForge

ScraperForge

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Share

Apartments.com Scraper β€” Rental Listings, Rent Ranges, Coordinates & Transit

Extract rental property data from Apartments.com: property name, full address, neighbourhood, GPS coordinates, rent range, rating, verified-listing status and nearby transit with drive times and distances.

Paste listing URLs, search URLs, map URLs β€” or just a city name β€” and the Actor works out what each one is and crawls it.


What is Apartments.com Scraper?

Apartments.com is the largest rental marketplace in the US, and the hardest to read at scale: it runs Akamai Bot Manager, which returns 403 Access Denied to most automated traffic on sight.

This Actor is built around that problem. It uses Firefox TLS impersonation with matching Firefox-shaped headers, hunts for a working US residential exit IP, and then sticks to that IP for the rest of the run β€” because Akamai's bm_* cookies are bound to the IP that received them, and rotating per request invalidates them instantly. Each candidate IP gets its own clean cookie jar, and soft blocks (Access Denied bodies, suspiciously short responses) are detected and retried rather than silently returned as empty data.

Input handling is equally forgiving. startUrls accepts individual property pages, city or neighbourhood search pages, and map URLs with ?bb= bounding boxes, and auto-detects each. Or skip URLs entirely and type Brookline MA into the Search term field β€” the Actor builds the search URL for you.

Two fields do a lot of work in the output: coordinates, which makes every record mappable and joinable to any other geodata you hold, and transportation, which lists nearby transit stops with drive time and distance β€” the commute context that usually explains why one building prices above another.


What data can you extract?

FieldDescription
idApartments.com listing identifier
propertyNameBuilding or community name
urlCanonical listing URL
breadcrumbsNavigation path β€” state β†’ city β†’ neighbourhood β†’ property
lastUpdatedWhen the listing was last updated
location.fullAddressComplete formatted address
location.streetAddressStreet line
location.cityCity
location.stateState name
location.neighborhoodNeighbourhood, derived from the breadcrumb path
location.postalCodeZIP code
coordinates.latitude / .longitudeGPS position
rent.min / rent.maxAdvertised rent range, parsed to integers
ratingProperty rating when published
isVerifiedWhether Apartments.com marks it a Verified Listing
transportation[]Nearby transit: name, drive time, distance, and url when linked

Scope, stated plainly: this Actor returns property-level data. Per-unit floor plans, amenity lists and management phone numbers are not part of the output.


Why teams scrape Apartments.com

For rental market analysis

rent.min and rent.max across a whole city, joined to coordinates and location.neighborhood, produce a real price map β€” not a headline median.

For real estate investment

Rent ranges next to neighbourhood and transit context are the inputs for a yield estimate. lastUpdated shows which listings are live rather than stale.

For proptech and mapping products

Every record ships with latitude and longitude, so listings drop straight onto a map or into a spatial database with no geocoding step or cost.

For competitive analysis

Property managers can pull every competing building in their submarket and compare advertised ranges, ratings and verified status.

For relocation and commute tools

transportation gives named stops with drive time and distance β€” the data behind "how far is this from the train?"

For lead generation

Property names, addresses and neighbourhoods build a territory list for vendors selling to multifamily operators.


How to scrape rentals step by step

  1. Decide your input. Either paste Apartments.com URLs into Apartments.com URLs, or type a city, neighbourhood or ZIP into Search term β€” or do both.
  2. Set Maximum properties to scrape (0 for unlimited).
  3. (Optional) Set a Listing end page to stop pagination early β€” 3 scrapes pages 1–3.
  4. Leave the proxy alone. Residential is enforced because Apartments.com requires it.
  5. Click Start, then export the Output tab as JSON (recommended) or CSV.

⬇️ Input

Example input β€” search term

{
"search": "Brookline MA",
"maxItems": 50,
"endPage": 3
}

Example input β€” mixed URLs

{
"startUrls": [
"https://www.apartments.com/sobe-apartment-rentals-miami-beach-fl/26xc7jb/",
"https://www.apartments.com/brookline-ma/"
],
"maxItems": 100
}

Input reference

FieldTypeDefaultDescription
startUrlsarray[]Optional. Bulk Apartments.com URLs β€” individual listings, city/neighbourhood searches, or map URLs with ?bb=. The Actor auto-detects which is which. Use this, or search, or both.
searchstringβ€”Optional free-text query: a city, neighbourhood or ZIP (Brookline MA, Miami Beach FL, 10001). Converted into a search URL and crawled like any other start URL.
maxItemsinteger10Cap on total property records returned. 0 for unlimited, up to whatever the page set contains.
endPageinteger0Stop pagination at this page number. 0 means continue until results run out β€” Apartments.com itself caps a search at 28 pages.
includeAllImagesbooleanfalse⚠️ Roadmap flag. Image extraction is not yet implemented; enabling this adds an empty images array and returns no URLs.
includeVirtualToursbooleanfalse⚠️ Roadmap flag. Virtual-tour extraction is not yet implemented; enabling this adds an empty virtualTours array.
proxyConfigurationobjectResidentialThe Actor always runs on Apify Residential proxy with three retry rounds and IP refresh β€” Apartments.com is too aggressive for direct or datacenter traffic. Custom proxy URLs pasted here are tried first (three rounds) before falling back to Residential. The Use Apify Proxy toggle and group selection are ignored; Residential is enforced.

The two image flags are reserved, not functional. They are documented here honestly: toggling them today changes the output shape (an empty array appears) but produces no image or tour URLs.


⬆️ Output

Example output

{
"id": "wqc416h",
"propertyName": "Forte at 1440 Beacon",
"url": "https://www.apartments.com/forte-at-1440-beacon-brookline-ma/wqc416h",
"breadcrumbs": ["Massachusetts", "Brookline", "Coolidge Corner", "Forte at 1440 Beacon"],
"lastUpdated": "2026-08-08T11:20:00Z",
"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.1265 },
"rating": 4.2,
"isVerified": true,
"rent": { "min": 2450, "max": 5900 },
"transportation": [
{ "name": "Summit Ave Station", "drive": "2 min", "distance": "0.5 mi", "url": "https://www.apartments.com/…" },
{ "name": "Boston Logan International", "drive": "18 min", "distance": "8.1 mi" }
]
}

Illustrative values β€” a live run returns current Apartments.com data.


Usage recipes

Map a city's rental market

{
"search": "Austin TX",
"maxItems": 0
}

Every record has coordinates, so the export goes straight into a mapping tool or PostGIS.

Compare neighbourhoods

Run several searches, then group by location.neighborhood and compare median rent.min. The breadcrumb-derived neighbourhood is more consistent than free-text address parsing.

Track a competitive set

Put the listing URLs of competing buildings in startUrls, schedule a weekly run, and watch rent.min / rent.max move.

Filter the export for properties whose transportation contains a stop under a 5-minute drive. That is a commute filter Apartments.com's own UI does not offer.

Quick sample before a big run

{
"search": "Miami Beach FL",
"maxItems": 10,
"endPage": 1
}

Verified listings only

Filter on isVerified: true β€” verified properties are generally the better-maintained records.


How does this compare to an official Apartments.com API?

There is no public Apartments.com API. The site (part of CoStar Group) offers no developer programme, no public endpoints and no data feed for general use; commercial data licensing goes through CoStar's sales process at enterprise prices.

That leaves the public website as the only broadly available source, which is what this Actor reads β€” with the anti-bot handling that makes reading it reliably possible.


Integrate and automate

Python

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_API_TOKEN>")
run = client.actor("scraperforge/apartments-com-scraper").call(run_input={
"search": "Brookline MA",
"maxItems": 50,
})
for p in client.dataset(run["defaultDatasetId"]).iterate_items():
rent = p.get("rent") or {}
coords = p.get("coordinates") or {}
print(p["propertyName"], "|", rent.get("min"), "-", rent.get("max"),
"|", coords.get("latitude"), coords.get("longitude"))

JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_API_TOKEN>' });
const run = await client.actor('scraperforge/apartments-com-scraper').call({
search: 'Brookline MA',
maxItems: 50,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

REST API

curl -X POST "https://api.apify.com/v2/acts/scraperforge~apartments-com-scraper/runs?token=<YOUR_APIFY_API_TOKEN>" \
-H "Content-Type: application/json" \
-d '{"search":"Brookline MA","maxItems":50}'

n8n, Make, Zapier and AI agents

Call the Actor from n8n, Make, Zapier or an MCP-capable agent β€” a common pattern is new listings β†’ filter by rent and commute β†’ Slack alert.

Schedules and webhooks

Attach a Schedule for weekly market tracking and deduplicate on id, then route results with webhooks or the Google Sheets / Airtable / BigQuery integrations.


Pricing and what you are charged for

Billing details for this Actor are shown on the Pricing tab of its page β€” check there for the current model and rates before a large run. Apify shows a cost estimate before and during every run.

maxItems is your ceiling on records. Residential proxy traffic is billed separately by the platform and is unavoidable here, because Apartments.com does not tolerate direct or datacenter traffic.

A note on billing accuracy: version 0.8 removed a leftover duplicate charge call, so each result is charged once.


Limits, reliability and blocking

  • Residential proxy is mandatory and enforced. The proxy toggle and group selection are ignored. Custom proxy URLs are tried first, then the Actor falls back to Residential.
  • Apartments.com caps its own searches at 28 pages. No setting gets past that β€” split a large market into several narrower searches or map bounding boxes instead.
  • includeAllImages and includeVirtualTours are roadmap flags. They reserve the output keys but return no image or tour URLs today.
  • The output is property-level. Individual floor plans, unit-level pricing, amenity lists and management phone numbers are not returned.
  • rent is the advertised range, parsed from the listing's rent line. Some listings publish a single figure, in which case min and max are equal; some publish "Call for rent" and both come back null.
  • Anti-bot handling shapes run behaviour. The Actor hunts for a good residential IP and then sticks with it; a run may spend its first requests finding one.
  • A genuinely empty run still writes one diagnostic record (not charged), so the dataset is never empty and health checks stay meaningful. Do not mistake that record for a property.
  • rating is null when the property has no published rating, and neighborhood is empty when the breadcrumb path does not include one.
  • Default run options are 4 GB memory and a 1-hour timeout; raise the timeout for unlimited runs.

This Actor collects publicly available rental listing information β€” property names, addresses, advertised rent ranges and transit context that any visitor can read without logging in. It does not log in, access private landlord dashboards, or collect renter or applicant data.

Listing content belongs to the property managers and to Apartments.com. Using it for market analysis, research and internal decision-making is the ordinary case; republishing listings wholesale as your own inventory is not. Comply with Apartments.com's Terms of Use, and with fair housing law wherever you apply this data to advertising or tenant selection.


❓ Frequently asked questions

Do I need to supply URLs?

No. Type a city, neighbourhood or ZIP into search and the Actor builds the search URL itself.

What URL types are supported?

Individual listing pages, city and neighbourhood search pages, and map URLs with a ?bb= bounding box β€” auto-detected, mixable in one run.

Why is residential proxy forced?

Apartments.com runs Akamai Bot Manager, which blocks direct and datacenter traffic on sight. Residential is what makes the run work.

Why did my search stop before I expected?

Apartments.com caps a single search at 28 pages, or your endPage / maxItems limit was reached first.

Do I get photos?

Not yet. includeAllImages is a reserved roadmap flag β€” enabling it adds an empty images array and no URLs.

Do I get per-unit floor plans and pricing?

No. Output is property-level, including the advertised rent range.

Why is rent null on some properties?

The listing advertises "Call for rent" or publishes no figure. Nothing to parse.

What is the single record in an otherwise empty run?

A deliberate, un-charged diagnostic record so the dataset is never empty. It is not a property.

Are coordinates accurate?

They come from the listing's own published location metadata β€” accurate to the property, and ready to map without a geocoding step.

Which export format should I use?

JSON β€” location, coordinates, rent and transportation are nested. CSV flattens them into columns if you prefer a spreadsheet.


Browse the full collection on the ScraperForge profile.


πŸ’¬ Feedback

Need floor-plan data, amenity lists, or image extraction sooner? Open an issue on the Issues tab of this Actor.