Apartments.com Scraper — Rentals, Prices & Reviews | 20$/mo avatar

Apartments.com Scraper — Rentals, Prices & Reviews | 20$/mo

Pricing

$20.00/month + usage

Go to Apify Store
Apartments.com Scraper — Rentals, Prices & Reviews | 20$/mo

Apartments.com Scraper — Rentals, Prices & Reviews | 20$/mo

Extract rental listings from Apartments.com with 94+ fields: pricing, scores, reviews, amenities, photos, emails, and contacts. Filter by location, price range & property type. No browser — fast HTTP. Perfect for real estate research & lead generation.

Pricing

$20.00/month + usage

Rating

0.0

(0)

Developer

Raven

Raven

Maintained by Community

Actor stats

1

Bookmarked

3

Total users

1

Monthly active users

8 days ago

Last modified

Share

Apartments.com Scraper — Rental Listings, Scores, Reviews & Email Contacts

Extract every detail from apartments.com listings — pricing, walk/transit/bike/drive/sound scores, renter reviews, floor plans, fees, amenities, schools, photos, and contact emails scraped directly from property websites.

Pricing

PlanPriceBest ForLink
Pay per result$2 / 1,000 resultsOne-time analysis, small batchesApartments Scraper Usage
Monthly subscription$20 / monthRegular monitoring, unlimited usageApartments Scraper

Both plans have identical functionality — choose the one that fits your workflow.

3 Actions — run step by step

The scraper works in 3 steps. Each step produces a dataset that feeds into the next one:

Step 1: Search listings → listing URLs (listingId, url, position)
↓ Dataset ID
Step 2: Scrape property details → full property data (90+ fields)
↓ Dataset ID
Step 3: Extract emails → validated contact emails
StepActionInputOutputCost
1Search listingsSearch URLs from apartments.comlistingId, URL, positionCheapest — 1 request per page
2Scrape property detailsListing URLs or Dataset ID from Step 190+ fields per propertyMedium — 1 request per listing
3Extract emails from websitesWebsite URLs or Dataset ID from Step 2Validated emails per propertyCheapest — 1 request per website

Important: You must run them in order. Step 2 needs listing URLs (from Step 1). Step 3 needs property website URLs (from Step 2). You can stop at any step — for example, only run Step 1 to monitor new listings, or run Steps 1+2 if you don't need emails.

What data do you get?

Search listings output

{
"listingId": "abc123",
"url": "https://www.apartments.com/the-max-new-york-ny/abc123/",
"position": 1,
"_sourceUrl": "https://www.apartments.com/apartments/new-york-ny/"
}

Property details output (90+ fields)

Each listing returns 94+ structured fields organized into clean, nested JSON:

CategoryFields
PropertyName, type, listing ID, description, year built, total units, stories
AddressStreet, city, state, ZIP, county, neighborhood, DMA, full formatted address
PricingMin/max rent, currency
LocationLatitude, longitude
ScoresWalk Score, Transit Score, Bike Score, Drive Score, Sound Score + text labels ("Very Walkable", "Exceptional Public Transit")
Rating & ReviewsAggregate rating (value, count), individual reviews with author name, date, and full text
ContactPhone number, property website URL, languages spoken
Units / RentalsUp to 74 fields per unit — rent, beds, baths, sqft, deposit, lease terms, availability date, interior amenities
Models / Floor PlansModel name, rent range, beds, baths, sqft range, available units count
FeesPet fees, parking fees, general fees — each with name and dollar amount. Lease terms.
AmenitiesGrouped by category: Community Amenities, Apartment Features
SchoolsName, rating (1-10), public/private, type (Elementary/Middle/High), link
TransportationNearby stations, terminals, subway stops
Points of InterestParks, shopping centers, hospitals, museums, libraries
PhotosAll image URLs from the listing
Media CountsPhotos, videos, virtual tours, total images
BreadcrumbFull geo hierarchy (State > County > City > Neighborhood)
FAQQuestions and answers from the listing page
Office HoursToday's hours (open/close) + full weekly schedule
Flags15+ boolean flags: has3DTour, hasVideo, hasRentSpecials, petsAllowed, hasApplyNow, etc.

Emails output

{
"url": "https://www.apartments.com/the-max-new-york-ny/abc123/",
"listingId": "abc123",
"propertyWebsite": "https://www.themax.com",
"emails": ["leasing@themax.com", "info@themaxapts.com"],
"emailCount": 2,
"propertyName": "The Max",
"propertyAddress": "100 W 57th St, New York, NY, 10019",
"scrapedAt": "2026-04-08T12:00:00Z"
}

Fields url, listingId, propertyName, propertyAddress are passed from the Details dataset — use url or listingId to match emails back to properties.

Who is this for?

  • Real estate investors — Compare rental pricing, scores, and fees across markets to find undervalued opportunities
  • Property managers — Monitor competitor listings, track rent changes, analyze amenity offerings
  • Relocation services — Get walk/transit/bike scores, schools, transportation for client recommendations
  • Lead generation agencies — Extract property management emails and phone numbers for outreach campaigns
  • Market researchers — Bulk data on rent trends, vacancy rates, property types across US cities
  • Data analysts — Clean, structured JSON/CSV ready for dashboards, spreadsheets, and BI tools
  • Rental aggregators — Build your own rental search platform with comprehensive listing data

How to use

Action 1: Search listings

Find listing URLs from apartments.com search pages. Fast and cheap — no detail fetching.

  1. Go to apartments.com, search any location, apply filters
  2. Copy the URL from your browser
  3. Set Action = Search listings
  4. Paste URL into Search URLs
  5. Set Max Pages (each page has ~40 listings, max 18 pages)
  6. Click Start

Input example:

{
"action": "search",
"startUrls": [
{ "url": "https://www.apartments.com/apartments/new-york-ny/" },
{ "url": "https://www.apartments.com/2-bedrooms-under-3000/chicago-il/" }
],
"maxPages": 2
}

Action 2: Scrape property details

Get full property data (90+ fields) for specific listings. Use listing URLs directly or chain from a Search run.

Option A — Direct URLs:

  1. Set Action = Scrape property details
  2. Paste listing URLs into Listing URLs
  3. Set Max Items
  4. Click Start

Option B — Chain from Search:

  1. Run Action 1 (Search) first
  2. Copy the Dataset ID from the Search run
  3. Set Action = Scrape property details
  4. Paste Dataset ID into Dataset ID field
  5. Click Start

Input example (direct):

{
"action": "details",
"listingUrls": [
{ "url": "https://www.apartments.com/the-max-new-york-ny/abc123/" }
],
"maxItems": 10
}

Input example (chained):

{
"action": "details",
"datasetId": "abc123def456",
"maxItems": 50
}

Action 3: Extract emails from websites

Visit property websites and extract validated contact emails. Use website URLs directly or chain from a Details run.

Option A — Direct URLs:

  1. Set Action = Extract emails from websites
  2. Paste property website URLs into Property Website URLs
  3. Click Start

Option B — Chain from Details:

  1. Run Action 2 (Details) first
  2. Copy the Dataset ID from the Details run
  3. Set Action = Extract emails from websites
  4. Paste Dataset ID into Dataset ID field
  5. Click Start

Input example (chained):

{
"action": "emails",
"datasetId": "xyz789ghi012",
"maxItems": 100
}

Chaining actions with Dataset ID

Run all 3 actions in sequence for a complete pipeline:

Search listings → Dataset ID → Scrape property details → Dataset ID → Extract emails
  1. Search with your search URLs → get Dataset ID from the run
  2. Details with that Dataset ID → get a new Dataset ID
  3. Emails with the Details Dataset ID → final email list

This gives you full control: pay only for what you need, stop at any step.

Where to find Dataset ID

After a run finishes, find the Dataset ID in one of these places:

  1. Run page → Storage tab — click on the default dataset, the ID is shown at the top
  2. URL bar — the ID is in the URL: https://console.apify.com/storage/datasets/<DATASET_ID>
  3. API — the run result contains defaultDatasetId

Copy the ID and paste it into the Dataset ID field of the next action.

How records are linked between steps

Each step passes key fields to the next, so you can always match records back:

Step 1: Search → { listingId, url, position }
↓ url
Step 2: Details → { url, listingId, name, address, contact.propertyWebsite, ... }
↓ url, listingId, propertyWebsite, propertyName, propertyAddress
Step 3: Emails → { url, listingId, propertyWebsite, propertyName, propertyAddress, emails }
Linking fieldFrom stepTo stepPurpose
urlSearch → Details → EmailsAllapartments.com listing URL — primary key across all 3 steps
listingIdSearch → Details → EmailsAllUnique listing ID (e.g. abc123)
contact.propertyWebsiteDetailsEmails (propertyWebsite)Property's own website where emails are extracted from
propertyNameDetails (name)EmailsProperty name for easy identification
propertyAddressDetails (address.full)EmailsFull address for easy identification

Example: To match emails back to property details, join on url or listingId — both are present in Details and Emails output.

Input parameters

ParameterActionsDescriptionDefault
ActionAllWhat to do: Search, Details, or EmailsSearch
Search URLsSearchapartments.com search URLs with filtersrequired for Search
Listing URLsDetailsDirect listing URLs (alternative to Dataset ID)
Website URLsEmailsProperty website URLs (alternative to Dataset ID)
Dataset IDDetails, EmailsChain from a previous run's dataset
Max PagesSearchPages per search URL (~40 listings/page, max 18). 0 = all.2
Max ItemsDetails, EmailsMax items to process. 0 = all.10
ConcurrencyAllParallel requests (1-20)10
ProxyAllResidential US recommended for Search/Details. Auto for Emails.Residential US

Property details output example

{
"url": "https://www.apartments.com/the-max-new-york-ny/abc123/",
"listingId": "abc123",
"name": "The Max",
"propertyType": "Apartment",
"address": {
"full": "100 W 57th St, New York, NY, 10019",
"street": "100 W 57th St",
"city": "New York",
"state": "NY",
"zip": "10019",
"neighborhood": "Midtown West",
"county": "New York County"
},
"location": {
"latitude": 40.7648,
"longitude": -73.9798
},
"pricing": {
"min": 3200,
"max": 8500,
"currency": "USD"
},
"contact": {
"phone": "+1-212-555-0100",
"propertyWebsite": "https://www.themax.com",
"languages": ["English", "Spanish"]
},
"scores": {
"walkScore": 98,
"transitScore": 100,
"driveScore": 45,
"bikeScore": 82,
"soundScore": 70,
"walkScoreLabel": "Walker's Paradise",
"transitScoreLabel": "Rider's Paradise"
},
"rating": {
"value": 4.5,
"count": 12
},
"reviews": [
{
"author": "Sarah M.",
"date": "2025-11-15",
"text": "Amazing location, responsive management..."
}
],
"models": [
{
"name": "1 Bedroom / 1 Bathroom",
"rentMin": 3200,
"rentMax": 4100,
"beds": 1,
"baths": 1.0,
"sqftMin": 550,
"sqftMax": 720
}
],
"fees": {
"pet": [{"name": "Monthly Pet Fee", "amount": "$75 / mo"}],
"parking": [{"name": "Garage", "amount": "$350 / mo"}],
"general": [{"name": "Application Fee", "amount": "$50"}],
"lease": ["12 - 14 Month Leases"],
"propertyInfo": {"yearBuilt": 2019, "totalUnits": 230, "stories": 42}
},
"amenities": {
"Community Amenities": ["Pool", "Fitness Center", "Rooftop Terrace", "Doorman", "Concierge"],
"Apartment Features": ["Washer/Dryer", "Dishwasher", "Hardwood Floors", "Walk-In Closets"]
},
"schools": [
{"name": "PS 111", "rating": 8, "type": "Elementary School", "visibility": "Public"}
],
"faq": [
{"question": "Is parking available?", "answer": "Yes, garage parking is available for $350/month."}
],
"officeHours": {
"today": {"open": "09:00", "close": "18:00", "isClosed": false}
},
"media": {
"photos": ["https://images1.apartments.com/i2/..."],
"photoCount": 45,
"videoCount": 2,
"virtualTourCount": 3
},
"breadcrumb": [
{"name": "New York", "url": "https://www.apartments.com/ny/"},
{"name": "New York County", "url": "https://www.apartments.com/new-york-county-ny/"},
{"name": "New York", "url": "https://www.apartments.com/new-york-ny/"}
]
}

What makes this scraper different?

Compared to other apartments.com scrapers on Apify:

FeatureOthersThis scraper
3 separate actions (Search / Details / Emails)NoYes
Chaining actions via Dataset IDNoYes
Email extraction from property websitesNoYes
Drive ScoreNoYes
Score labels ("Very Walkable")NoYes
Full review texts with author & dateNoYes
FAQ from listingNoYes
Office hoursNoYes
Lease termsNoYes
Year built, units, storiesNoYes
Property website URLNoYes
Languages spokenNoYes
Amenities by category1 scraperYes
Async concurrency (10 parallel)VariesYes
Native async TLS (primp)NoYes (fastest)

How it works (technical)

The scraper has 3 independent actions:

  1. Search — Fetches search result pages and extracts listing URLs with pagination
  2. Details — Visits each listing page and extracts data from:
    • startup.init() JavaScript object (94+ fields)
    • Schema.org JSON-LD (@graph with Product, BreadcrumbList, FAQPage)
    • HTML elements (scores, amenities, fees, schools, transportation)
  3. Emails — Follows the property website link and extracts validated emails with strict filtering (junk domains, placeholder addresses, file extensions excluded)

The scraper uses primp — a TLS client that generates browser-identical fingerprints, bypassing Akamai Bot Manager without Playwright or Selenium overhead. Each request gets a unique proxy session ID for IP rotation.

Tips for best results

  • Use Residential US proxies (pre-configured) for Search and Details. Auto proxies work fine for Emails.
  • Start with small runs (maxPages: 1, maxItems: 5) to verify your setup before scaling.
  • Multiple cities in one run — add several search URLs to scrape New York, Chicago, and Miami simultaneously.
  • Search-only mode — use the Search action to quickly grab listing URLs. Great for monitoring new listings.
  • Concurrency 5-10 is the sweet spot. Going above 15 may increase block rate.
  • Chain actions for a complete pipeline: Search → Details → Emails. Pay only for what you need.

Limits

  • apartments.com shows max 18 pages (~720 listings) per search query
  • Some listings may not have scores, reviews, or property websites
  • Email extraction depends on whether the property website is reachable and contains a contact email
  • The site uses Akamai Bot Manager — occasional 403 blocks are expected and handled automatically with session rotation

Having issues? Help me fix them faster

If you experience any problems, please share your run data with me so I can debug and improve the Actor:

  1. Go to Apify Security Settings
  2. Find "Share run data with developers"
  3. In the "Manage list of Actors" section, check this Actor (or All Actors)
  4. Save

This data is used only for debugging and helps me resolve issues much faster. Thank you!

Support

Having issues or need a custom feature? Contact: africanec@gmail.com

Cost estimate

ScenarioActionItemsRequests~Time
Quick searchSearch1 page (40 listings)~1~5s
City searchSearch5 pages (200 listings)~5~15s
Small detailsDetails5 listings~5~30s
Medium detailsDetails50 listings~50~3 min
Full city detailsDetails720 listings~720~15 min
Email extractionEmails50 websites~50~2 min

Tags

Apartments.com Scraper, Rental Listings Scraper, Real Estate Data Extractor, Walk Score Extractor, Transit Score Scraper, Property Reviews Scraper, Apartment Contact Emails, Lead Generation Real Estate, Floor Plans Data, Rental Market Research, Property Management Analytics, Apartments.com API, Rent Price Tracker, Amenities Extractor, School Ratings Scraper, Neighborhood Data, Property Photos Scraper, Real Estate Lead Generation, How to Scrape Apartments.com, Extract Rental Data, Housing Market Data, Property Listings Scraper, Real Estate Web Scraping, Rental Price Comparison, US Rental Market Data, Email Extractor Real Estate, Apartment Fees and Deposits, Drive Score, Sound Score, Renter Reviews Extractor