Apartments.com Scraper — Rentals, Prices & Reviews | 20$/mo
Pricing
$20.00/month + usage
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
Actor stats
1
Bookmarked
3
Total users
1
Monthly active users
8 days ago
Last modified
Categories
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
| Plan | Price | Best For | Link |
|---|---|---|---|
| Pay per result | $2 / 1,000 results | One-time analysis, small batches | Apartments Scraper Usage |
| Monthly subscription | $20 / month | Regular monitoring, unlimited usage | Apartments 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 IDStep 2: Scrape property details → full property data (90+ fields)↓ Dataset IDStep 3: Extract emails → validated contact emails
| Step | Action | Input | Output | Cost |
|---|---|---|---|---|
| 1 | Search listings | Search URLs from apartments.com | listingId, URL, position | Cheapest — 1 request per page |
| 2 | Scrape property details | Listing URLs or Dataset ID from Step 1 | 90+ fields per property | Medium — 1 request per listing |
| 3 | Extract emails from websites | Website URLs or Dataset ID from Step 2 | Validated emails per property | Cheapest — 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:
| Category | Fields |
|---|---|
| Property | Name, type, listing ID, description, year built, total units, stories |
| Address | Street, city, state, ZIP, county, neighborhood, DMA, full formatted address |
| Pricing | Min/max rent, currency |
| Location | Latitude, longitude |
| Scores | Walk Score, Transit Score, Bike Score, Drive Score, Sound Score + text labels ("Very Walkable", "Exceptional Public Transit") |
| Rating & Reviews | Aggregate rating (value, count), individual reviews with author name, date, and full text |
| Contact | Phone number, property website URL, languages spoken |
| Units / Rentals | Up to 74 fields per unit — rent, beds, baths, sqft, deposit, lease terms, availability date, interior amenities |
| Models / Floor Plans | Model name, rent range, beds, baths, sqft range, available units count |
| Fees | Pet fees, parking fees, general fees — each with name and dollar amount. Lease terms. |
| Amenities | Grouped by category: Community Amenities, Apartment Features |
| Schools | Name, rating (1-10), public/private, type (Elementary/Middle/High), link |
| Transportation | Nearby stations, terminals, subway stops |
| Points of Interest | Parks, shopping centers, hospitals, museums, libraries |
| Photos | All image URLs from the listing |
| Media Counts | Photos, videos, virtual tours, total images |
| Breadcrumb | Full geo hierarchy (State > County > City > Neighborhood) |
| FAQ | Questions and answers from the listing page |
| Office Hours | Today's hours (open/close) + full weekly schedule |
| Flags | 15+ 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.
- Go to apartments.com, search any location, apply filters
- Copy the URL from your browser
- Set Action =
Search listings - Paste URL into Search URLs
- Set Max Pages (each page has ~40 listings, max 18 pages)
- 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:
- Set Action =
Scrape property details - Paste listing URLs into Listing URLs
- Set Max Items
- Click Start
Option B — Chain from Search:
- Run Action 1 (Search) first
- Copy the Dataset ID from the Search run
- Set Action =
Scrape property details - Paste Dataset ID into Dataset ID field
- 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:
- Set Action =
Extract emails from websites - Paste property website URLs into Property Website URLs
- Click Start
Option B — Chain from Details:
- Run Action 2 (Details) first
- Copy the Dataset ID from the Details run
- Set Action =
Extract emails from websites - Paste Dataset ID into Dataset ID field
- 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
- Search with your search URLs → get Dataset ID from the run
- Details with that Dataset ID → get a new Dataset ID
- 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:
- Run page → Storage tab — click on the default dataset, the ID is shown at the top
- URL bar — the ID is in the URL:
https://console.apify.com/storage/datasets/<DATASET_ID> - 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 }↓ urlStep 2: Details → { url, listingId, name, address, contact.propertyWebsite, ... }↓ url, listingId, propertyWebsite, propertyName, propertyAddressStep 3: Emails → { url, listingId, propertyWebsite, propertyName, propertyAddress, emails }
| Linking field | From step | To step | Purpose |
|---|---|---|---|
url | Search → Details → Emails | All | apartments.com listing URL — primary key across all 3 steps |
listingId | Search → Details → Emails | All | Unique listing ID (e.g. abc123) |
contact.propertyWebsite | Details | Emails (propertyWebsite) | Property's own website where emails are extracted from |
propertyName | Details (name) | Emails | Property name for easy identification |
propertyAddress | Details (address.full) | Emails | Full 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
| Parameter | Actions | Description | Default |
|---|---|---|---|
| Action | All | What to do: Search, Details, or Emails | Search |
| Search URLs | Search | apartments.com search URLs with filters | required for Search |
| Listing URLs | Details | Direct listing URLs (alternative to Dataset ID) | — |
| Website URLs | Emails | Property website URLs (alternative to Dataset ID) | — |
| Dataset ID | Details, Emails | Chain from a previous run's dataset | — |
| Max Pages | Search | Pages per search URL (~40 listings/page, max 18). 0 = all. | 2 |
| Max Items | Details, Emails | Max items to process. 0 = all. | 10 |
| Concurrency | All | Parallel requests (1-20) | 10 |
| Proxy | All | Residential 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:
| Feature | Others | This scraper |
|---|---|---|
| 3 separate actions (Search / Details / Emails) | No | Yes |
| Chaining actions via Dataset ID | No | Yes |
| Email extraction from property websites | No | Yes |
| Drive Score | No | Yes |
| Score labels ("Very Walkable") | No | Yes |
| Full review texts with author & date | No | Yes |
| FAQ from listing | No | Yes |
| Office hours | No | Yes |
| Lease terms | No | Yes |
| Year built, units, stories | No | Yes |
| Property website URL | No | Yes |
| Languages spoken | No | Yes |
| Amenities by category | 1 scraper | Yes |
| Async concurrency (10 parallel) | Varies | Yes |
| Native async TLS (primp) | No | Yes (fastest) |
How it works (technical)
The scraper has 3 independent actions:
- Search — Fetches search result pages and extracts listing URLs with pagination
- Details — Visits each listing page and extracts data from:
startup.init()JavaScript object (94+ fields)- Schema.org JSON-LD (
@graphwith Product, BreadcrumbList, FAQPage) - HTML elements (scores, amenities, fees, schools, transportation)
- 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:
- Go to Apify Security Settings
- Find "Share run data with developers"
- In the "Manage list of Actors" section, check this Actor (or All Actors)
- 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
| Scenario | Action | Items | Requests | ~Time |
|---|---|---|---|---|
| Quick search | Search | 1 page (40 listings) | ~1 | ~5s |
| City search | Search | 5 pages (200 listings) | ~5 | ~15s |
| Small details | Details | 5 listings | ~5 | ~30s |
| Medium details | Details | 50 listings | ~50 | ~3 min |
| Full city details | Details | 720 listings | ~720 | ~15 min |
| Email extraction | Emails | 50 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