Apartments.com Rentals & Leads Scraper avatar

Apartments.com Rentals & Leads Scraper

Pricing

from $1.50 / 1,000 results

Go to Apify Store
Apartments.com Rentals & Leads Scraper

Apartments.com Rentals & Leads Scraper

Extract rental listings, floor plans, leasing contacts, and deal analytics from Apartments.com — structured and ready to analyze.

Pricing

from $1.50 / 1,000 results

Rating

0.0

(0)

Developer

REXREUS D.O

REXREUS D.O

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Categories

Share

Apartments.com Rentals Scraper

Extract rental listings with deal analytics from Apartments.com

Extract rental listings, floor plans, leasing contacts, and deal analytics from Apartments.com — structured and ready to analyze.

HTTP-first CheerioCrawler · No browser overhead · Residential proxy · Public data only

Quick Start Apify Node.js

In one line: Apartments.com search & detail pages → structured JSON with deal analytics for real estate analysts and lead-gen teams.

InputLocation keyword, search URLs, or direct listing URLs
OutputOne JSON record per listing, 35+ fields including floor plans, amenities, fees, scores
Cost$1.50 per 1,000 results + Apify platform compute
Speed~3–5 min for 100 listings on 256 MB
Runs onApify Console · CLI · API

Who it's for

  • Real estate analysts — Compare rent-per-sqft across neighborhoods without manual data entry.
  • Lead-gen teams — Collect management company names, leasing office phone numbers, and property websites at scale.
  • Relocation services — Build curated apartment shortlists with floor plans, pet policies, and transit scores for clients.
  • Market researchers — Track rental pricing trends, concessions, and vacancy signals across US metro areas.

What you get

  • Deal analytics — Computed pricePerSqft and structured concession data, ready for investment analysis.
  • Full unit breakdown — Every floor plan with beds, baths, sqft, price range, and availability.
  • Leasing contacts — Management company, phone, and website extracted from each property.
  • Neighborhood scores — Walk Score, Transit Score, and Bike Score per listing.
  • Amenity & fee inventory — Categorized amenities, itemized fees, and pet policies in structured arrays.
  • All-inclusive pricing — $1.50/1k covers everything. No add-on charges for reviews, scores, or details.

Why this Actor?

FeatureWhat you get
Deal analyticspricePerSqft, structured concessions — no post-processing needed
Floor plansEvery unit type with beds, baths, sqft, price, availability
Leasing contactsManagement company, phone, website per property
Walk/Transit/Bike scoresNeighborhood livability numbers per listing
Amenities & feesCategorized arrays, not raw text blobs
Pet policyStructured allowed boolean + details array
PhotosGallery image URLs per listing
ConcessionsMove-in specials parsed as typed objects (title + description)
HTTP-only256 MB memory, no browser overhead, fast
All-inclusive PPE$1.50/1k — one price, all features

How it compares

CapabilityThis Actormemo23 ($1.30)pro100chok ($2.00)one-api ($3.00)
Deal analytics (pricePerSqft)✅❌❌❌
Structured concessions✅❌❌❌
Floor plans✅✅ (add-on)✅✅
Leasing contacts✅✅✅❌
Walk/Transit/Bike scores✅✅✅✅
All-inclusive pricing✅❌ (add-ons ~$1.70 effective)❌ (3 separate runs)✅
Single-run pipeline✅✅❌ (3 runs)✅

Where it wins: Only actor with computed deal analytics (pricePerSqft, structured concessions). All-inclusive at $1.50/1k.

🚀 Quick start

Apify Console

  1. Open the Actor page and click Start.
  2. Enter a location (e.g. Denver, CO) or paste Apartments.com search URLs.
  3. Click Run — results land in Storage → Dataset.

API

curl -X POST "https://api.apify.com/v2/acts/<YOUR_ACTOR_ID>/runs" \
-H "Authorization: Bearer <YOUR_TOKEN>" \
-H "Content-Type: application/json" \
-d '{"search": "Denver, CO", "maxItems": 50}'

How it works

Input JSON
│
▼
Validate & build seed URLs
│
▼
CheerioCrawler (HTTP-only, session pool, residential proxy)
│
├─► SEARCH handler ──► Parse JSON-LD + HTML cards ──► Enqueue detail URLs
│ (if includeDetails=true)
▼
├─► DETAIL handler ──► Parse JSON-LD + HTML ──► Deal analytics ──► pushData
│
▼
Dataset (JSON / CSV / Excel)

Input

Basic

{
"search": "Denver, CO",
"includeDetails": true,
"maxItems": 100
}

Full

{
"search": "Denver, CO",
"startUrls": [
{ "url": "https://www.apartments.com/apartments/denver-co/" }
],
"listingUrls": [
{ "url": "https://www.apartments.com/the-fremont-denver-co/rbyh3xz/" }
],
"includeDetails": true,
"maxItems": 100,
"maxConcurrency": 5,
"proxyConfiguration": {
"useApifyProxy": true,
"apifyProxyGroups": ["RESIDENTIAL"]
}
}
FieldTypeRequiredDefaultDescription
searchstringNo—Location keyword (e.g. Denver, CO, 80202). Converted to search URL automatically.
startUrlsarrayNo—Apartments.com search page URLs.
listingUrlsarrayNo—Direct listing detail URLs to scrape.
includeDetailsbooleanNotrueCrawl each listing's detail page for floor plans, amenities, scores.
maxItemsintegerNo100Maximum listings to extract.
maxConcurrencyintegerNo5Concurrent requests (1–20). Lower = safer from blocks.
proxyConfigurationobjectNoResidentialProxy settings. Residential proxy strongly recommended.

At least one of search, startUrls, or listingUrls is required.

Output

Sample record

{
"listingId": "rbyh3xz",
"url": "https://www.apartments.com/the-fremont-denver-co/rbyh3xz/",
"name": "The Fremont",
"address": "2929 N Federal Blvd",
"city": "Denver",
"state": "CO",
"zipCode": "80211",
"latitude": 39.7623,
"longitude": -104.9802,
"neighborhood": "Highland",
"priceMin": 1475,
"priceMax": 3150,
"priceDisplay": "$1,475 - $3,150",
"bedsMin": 0,
"bedsMax": 3,
"bathsMin": 1,
"bathsMax": 2,
"sqftMin": 487,
"sqftMax": 1320,
"pricePerSqft": 2.53,
"concessions": [
{ "title": "Move-In Special", "description": "1 month free on select units" }
],
"floorPlans": [
{ "name": "Studio A", "beds": 0, "baths": 1, "sqft": 487, "priceMin": 1475, "priceMax": 1625, "availability": "Available Now" }
],
"amenities": [
{ "category": "Community", "amenities": ["Pool", "Fitness Center", "Clubhouse"] }
],
"fees": [
{ "name": "Application Fee", "amount": "$50" }
],
"petPolicy": { "allowed": true, "details": ["Dogs Allowed", "Cats Allowed", "Weight Limit: 75 lbs"] },
"walkScore": 82,
"transitScore": 56,
"bikeScore": 90,
"managementCompany": "Greystar",
"phone": "(720) 555-0123",
"website": "https://www.thefremontdenver.com",
"description": "Modern apartments in Denver's Highland neighborhood...",
"yearBuilt": 2019,
"totalUnits": 246,
"photos": ["https://images1.apartments.com/..."],
"rating": 4.2,
"reviewCount": 38,
"scrapedAt": "2026-10-22T02:30:00.000Z"
}
FieldTypeDescription
listingIdstringApartments.com internal ID
urlstringListing detail URL
namestringProperty name
addressstringStreet address
citystringCity
statestringState code (e.g. CO)
zipCodestringZIP/postal code
latitudenumber | nullGPS latitude
longitudenumber | nullGPS longitude
neighborhoodstring | nullNeighborhood name
priceMinnumber | nullLowest rent
priceMaxnumber | nullHighest rent
priceDisplaystring | nullPrice as displayed (e.g. "$1,475 - $3,150")
bedsMinnumber | nullMinimum bedrooms
bedsMaxnumber | nullMaximum bedrooms
bathsMinnumber | nullMinimum bathrooms
bathsMaxnumber | nullMaximum bathrooms
sqftMinnumber | nullMinimum square footage
sqftMaxnumber | nullMaximum square footage
pricePerSqftnumber | nullComputed: avg rent ÷ avg sqft
concessionsarrayMove-in specials: { title, description }
floorPlansarrayFloor plans: { name, beds, baths, sqft, priceMin, priceMax, availability }
amenitiesarrayGrouped amenities: { category, amenities[] }
feesarrayFees: { name, amount }
petPolicyobject | null{ allowed: boolean, details: string[] }
walkScorenumber | nullWalk Score (0–100)
transitScorenumber | nullTransit Score (0–100)
bikeScorenumber | nullBike Score (0–100)
managementCompanystring | nullProperty management company
phonestring | nullLeasing office phone
websitestring | nullProperty website
descriptionstring | nullProperty description
yearBuiltnumber | nullYear of construction
totalUnitsnumber | nullTotal apartment units
photosarrayImage URLs
ratingnumber | nullResident rating (0–5)
reviewCountnumber | nullNumber of reviews
scrapedAtstringISO 8601 timestamp

Key-Value Store: INPUT — run configuration. OUTPUT — { status, itemCount }.

Cost, limits, proxy

ItemValue
Memory256 MB (minimum)
ProxyResidential required — datacenter IPs blocked by Akamai
Max concurrency5 recommended (up to 20, higher = more blocks)
Retries3 per request
PPE pricing$0.00005/start + $0.0015/result
1,000 listings~$1.50 + platform compute

Proxy options (pick the one that fits your budget)

Proxy group403-block rateCostUse when
RESIDENTIAL (default)Low (~10–30%)~$0.3–0.6/GiBReliable daily runs; best value per result
UNBLOCKERVery low (~0–5%)~$0.5–1.5/GiBLarge batches / time-sensitive scraping, automatic anti-bot bypass
AUTO (Apify chooses)MediumvariesOne-off small runs, mixed targets
None / datacenterHigh (~40%+)freeLocal testing only — will get blocked quickly

Use proxyConfiguration in the input:

{
"proxyConfiguration": {
"useApifyProxy": true,
"apifyProxyGroups": ["RESIDENTIAL"]
}
}

Or to use Apify Unblocker (strongest anti-bot, but pricier):

{
"proxyConfiguration": {
"useApifyProxy": true,
"apifyProxyGroups": ["UNBLOCKER"]
}
}

[!TIP] If a run shows many 403s, first switch apifyProxyGroups from RESIDENTIAL to UNBLOCKER, then lower maxConcurrency to 2–3. The Actor auto-retries failed requests 3×, so a 2/3 successful pass still returns most listings. A 403 means the detail page was never parsed — the record stays a search-only stub with most fields null.

Recipes

{
"search": "Austin, TX",
"maxItems": 200,
"includeDetails": true
}

Scrapes up to 200 listings in Austin with full detail pages.

Bulk search URLs (multiple neighborhoods)

{
"startUrls": [
{ "url": "https://www.apartments.com/apartments/downtown-denver-co/" },
{ "url": "https://www.apartments.com/apartments/capitol-hill-denver-co/" },
{ "url": "https://www.apartments.com/apartments/lodo-denver-co/" }
],
"maxItems": 500,
"maxConcurrency": 3
}

Scrapes three Denver neighborhoods. Lower concurrency to reduce blocks.

{
"listingUrls": [
{ "url": "https://www.apartments.com/the-fremont-denver-co/rbyh3xz/" },
{ "url": "https://www.apartments.com/modera-cap-hill-denver-co/b5p8j2m/" }
]
}

Scrapes only these two specific properties. No search crawling.

Troubleshooting

SymptomCauseFix
0 results, all requests failed with 403Akamai blocking datacenter proxySwitch to RESIDENTIAL or UNBLOCKER proxy group
Partial results, some 403sRate limitedReduce maxConcurrency to 2–3; switch to UNBLOCKER
Record is a stub with all detail fields null (floorPlans [], scores null, no phone)Detail request got a 403 → detail page never parsed, only search data keptRe-run with UNBLOCKER proxy or listingUrls of the affected properties; increase retries via maxRequestRetries
photos emptyPhotos are lazy-loaded via JS on the live page — raw SSR has no <img> tags, only aptsState JSONKnown limitation; may add in v2
Empty city/state/zipCodeAddress parsing edge caseReport the listing URL as an issue
Missing floor plansProperty has no published floor plansExpected — not all listings have floor plan data
pricePerSqft is nullMissing price or sqftExpected — computed only when both values exist
description nullDescription only exists as <meta name="description">, not in visible HTMLSelector in detail-html.parser.ts uses .description which isn't on live pages
Timeout errorsTarget server slow or blockingRetries handle this automatically (3 attempts)

FAQ

Q: Does this work with Canadian listings? A: No. Apartments.com is US-only. Canadian listings are on rentals.ca (a separate CoStar brand). Canada support is planned for v2.

Q: Do I need residential proxy? A: Yes. Apartments.com uses Akamai Bot Manager which blocks datacenter IPs. Use RESIDENTIAL proxy group for reliable runs.

Q: What's the effective cost for 10,000 listings? A: $15.00 in PPE charges ($0.0015 × 10,000) plus Apify platform compute ($2–5 depending on speed). Total ~$17–20.

Q: Can I scrape without detail pages? A: Yes. Set includeDetails: false to get basic listing data (name, price, address) from search pages only — much faster, fewer requests.

Q: Is this legal? A: This Actor collects publicly available data. You are responsible for complying with Apartments.com's Terms of Service and all applicable privacy laws in your jurisdiction.

Q: How often does the HTML structure change? A: Apartments.com updates its frontend periodically. The Actor uses JSON-LD as primary source (more stable) with HTML fallback. If parsing breaks, open an issue.

Q: Why are some fields null? A: Two reasons. (1) The property genuinely doesn't publish that data (newer buildings have no yearBuilt, some areas have no walkScore). (2) The detail request was blocked (403) — then the record only has search-page data and everything from the detail page (floor plans, scores, phone, management company) is null. The highest-null items in any run are almost always the 403-blocked ones. Re-run those with UNBLOCKER proxy or via listingUrls.

Q: Which proxy should I use for the lowest null rate? A: UNBLOCKER gives ~0–5% 403s (best coverage), RESIDENTIAL ~10–30%. Start with RESIDENTIAL (cheaper); switch to UNBLOCKER for large/time-sensitive runs.

Limitations

  • US only — Canada (rentals.ca) not supported in v1.
  • Public data only — No login, no private/unlisted properties.
  • Akamai rate limits — High concurrency may trigger blocks. Keep maxConcurrency at 3–5.
  • No email enrichment in v1 — Leasing office phone and website are extracted; email enrichment planned for v2.
  • HTML parser may drift — If Apartments.com changes their markup, report parsing issues as bugs.
  • You are responsible for complying with applicable Terms of Service and privacy laws.

Run it

Open on Apify Console and click Start →


Copyright © 2026 REXREUS. Licensed under the MIT License.