Apartments.com Scraper 🏡 Rentals + Manager Phones | from $5/1k
Pricing
from $3.50 / 1,000 listing scrapeds
Apartments.com Scraper 🏡 Rentals + Manager Phones | from $5/1k
Apartments.com scraper for US rentals — rent by bed count, concessions, availability, leasing phone and the property management company. Enrich for 66 fields: amenities, floor plans, units, schools, transit, walk scores, fees, photos. Managers mode returns a company directory.
Pricing
from $3.50 / 1,000 listing scrapeds
Rating
0.0
(0)
Developer
Jura Moshkov
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
22 days ago
Last modified
Categories
Security
Limited permissionsShare
Apartments.com Scraper — Rentals, Property Managers & Phones
Apartments.com scraper for US rental data. Search by ZIP code, City, ST, or a map radius and get one flat row per rental building with rent by bed count, current concessions, availability, the leasing phone number, and the property management company behind each property. Turn on enrichment and every building comes back as a 66-field record: amenities, floor plans, individually available units, schools, transit, walk scores, fees, pet and parking policies, office hours, and the full photo gallery. Switch to managers mode and the same search returns a deduplicated property manager directory with phones instead of a listing feed.
It is built for rent research, B2B lead generation, and AI agents. Two things set it apart from the near-identical Apartments.com scrapers in this niche:
- Pay per result, three honest event types. You pay per building for a base listing, a bit more only for buildings you choose to enrich, and per company in managers mode. Empty results and error rows are never charged, and a failed enrichment still delivers the base row at the base rate.
- It is agent-ready. It runs as a tool through the Apify MCP server, and every input field carries a description, so an AI agent can fill the input from the schema alone and run it with no hand-holding.
What is an Apartments.com scraper?
It is a tool that searches Apartments.com the way you would, by ZIP code, city, or a point on the map, and returns each matching rental building as a structured record. A plain Apartments.com search gives you a page of listings you still have to read one by one. This Actor returns the same inventory as clean rows you can sort, filter, and load into a spreadsheet or CRM: rent bands per bed count, live availability, the leasing office phone, and the management company that runs the building. Set enrich to true and it also pulls the complete building record. Set mode to managers and it rolls the buildings up into a company directory.
What you get per building
Base listing rows (locations and radius modes) return 30 fields:
| Field | Example |
|---|---|
name, listingKey | Placemakr Downtown Austin, wkkr1zj |
streetAddress, city, state, zipcode, country | 710 E 3rd St, Austin, TX 78701, US |
latitude, longitude | 30.2637, -97.7364 |
phone (leasing office) | (737) 204-4980 |
propertyManager, propertyManagerId | Placemakr, 100626781 |
minRent, maxRent, minBeds, maxBeds | $1,517 to $1,924, 0 to 2 beds |
minFees, maxFees | one-time and recurring fee range |
topDealPct | best current concession, null when nothing is discounted |
totalUnitsAvailable, hasAvailabilities, availabilityText | 10 units, Available Now |
unitSummaries[] | per bed count: baths, rent, size, availability count, first-available date, deal % |
rating, imageUrl, photoCount, tourUrl | 5.0, 77 photos, 3D tour link |
searchLocation, resolvedLocation, scrapedAt | 78701, "78701, Austin, TX", ISO timestamp |
Example output row
One building comes back as one flat JSON object:
{"listingKey": "wkkr1zj","name": "Placemakr Downtown Austin","streetAddress": "710 E 3rd St, Austin, TX 78701","city": "Austin","state": "TX","zipcode": "78701","country": "US","latitude": 30.2637474,"longitude": -97.736387,"phone": "(737) 204-4980","propertyManager": "Placemakr","propertyManagerId": 100626781,"minRent": 1517,"maxRent": 1924,"minBeds": 0,"maxBeds": 2,"topDealPct": null,"totalUnitsAvailable": 10,"rating": 5,"availabilityText": "Available Now","photoCount": 77,"searchLocation": "78701","resolvedLocation": "78701, Austin, TX","scrapedAt": "2026-08-17T08:35:46.140Z"}
What enrichment adds
Set enrich to true and each row grows from 30 fields to 66. This costs one extra upstream request per building and is billed as LISTING_ENRICHED instead of LISTING_SCRAPED, so you pay for depth only where you ask for it.
| Block | What comes back |
|---|---|
amenities, amenityCount | Flat list of every amenity across community and interior categories, often 60+ per building |
floorPlans | Every plan with beds, baths, area, rent range, and a floor-plan image |
availableUnits | The actual vacant units: apartment number, plan, beds, baths, area, rent |
schools | Assigned and nearby schools with 1 to 10 rating, grades, enrollment, district |
transit | Airports, rail and bus stops with distance, drive time, walk time |
walkScore, transitScore, bikeScore, carScore, quietScore | Five separate scores |
oneTimeCosts, recurringFees | Itemized and deduplicated: application fees, deposits, admin fees, monthly charges |
petPolicies | Per pet type: deposit, monthly rent, fee, limit, restrictions |
parkingPolicies, officeHours | Parking rules and leasing-office hours per day |
photos | Full gallery with type and caption |
yearBuilt, unitCount, storyCount, leaseTerms, submarket, description | Building fundamentals |
listingUrl, propertyWebsiteUrl | Canonical Apartments.com page and the property's own site |
The cheapest way to work a large area is a two-pass workflow: sweep wide with enrichment off, then rerun with enrich: true on a filtered shortlist of the buildings you actually care about.
The property manager directory
Every Apartments.com scraper returns listings. This one also answers the question a listing feed cannot: who controls the leasing decisions in a market?
Set mode to managers and the Actor reads the buildings for your locations, groups them by management company, and returns one row per company:
| Field | What it tells you |
|---|---|
propertyManager, propertyManagerId | Company name and stable id, e.g. Greystar, 54205 |
propertyCount | How many buildings it runs in your search area |
cities, states | Its geographic footprint within the search |
phones | Every leasing number tied to it |
minRent, maxRent | The rent range it operates across |
totalUnitsAvailable | Live vacancy across the portfolio |
propertiesDiscounting | How many of its buildings are running concessions |
avgRating | Average resident rating across its buildings |
sampleProperties | A few building names, so you can recognize the company |
One downtown Austin ZIP returns a directory where Greystar leads with 5 buildings and 236 available units, 2 of them currently discounting. Rows are sorted biggest portfolio first, which is the order a prospecting list should be worked in. This is the difference between "here are 500 apartments" and "here are the companies that control them, with phone numbers."
How much does it cost?
Pricing is pay per result, so you pay for output, not for run time. A tiny apify-actor-start charge (about $0.00005) covers the first few seconds of a run, then results bill on three event types, because the three outputs are not the same product:
LISTING_SCRAPED— one rental building, 30 fields.LISTING_ENRICHED— one rental building, 66 fields, whenenrichis on.MANAGER_PROFILED— one management company, aggregated from every building it runs in your search.
Every event is discounted by Apify plan, down to roughly 40% off on the top plans. A managers run bills only per company, never per building it read on the way to rolling them up. If an enrichment call fails, the building is still delivered and billed at the base rate, never the enriched one. Empty results and error rows are never charged. Filters are applied upstream, so a narrow search returns fewer rows and costs less.
How do I use it with an AI agent (MCP)?
This Actor is available as a tool through the Apify MCP server. An agent can call it by name with a plain input and fill every field straight from the schema, because each input property carries a description:
{ "mode": "locations", "locations": ["78701"], "maxResults": 20 }
The output is one flat JSON object per building or per company, with no nesting to unwrap for the base fields, so an agent can read phone, propertyManager, minRent, and topDealPct directly off each row. Enriched arrays like floorPlans and schools are there when an agent asks for depth with enrich: true.
Is it legal / compliant?
The Actor collects publicly available rental listing data from Apartments.com. It does not log in, access private data, or bypass paywalls, and it returns building-level information (leasing office phone, management company, rents, availability), not tenant personal data. As with any data tool, you are responsible for how you use the results: respect the source platform's terms of service, and follow the marketing, privacy, and fair-housing laws in your market when you act on them. It is designed for market research and B2B outreach to property management companies, not for consumer profiling.
Why is it reliable?
It is built on a stable rental-data API rather than a browser scraper, so it is not broken by Apartments.com layout or anti-bot changes the way page-scraping actors are. Two design choices keep runs clean when you schedule them:
- Graceful degradation. If an enrichment request fails for a building, the base row is still delivered (and billed at the base rate), so one bad upstream response never drops a building or fails the run.
- Deduplication before billing. Listings are deduplicated by
listingKeyacross pages and across overlapping radius searches before anything is charged, so you never pay twice for the same building.
Because the base output is a flat, stable set of fields, a daily or weekly schedule keeps returning comparable rows instead of silently changing shape.
Input
Pick a mode:
locations— one row per rental building for each ZIP orCity, STyou pass.radius— the same, around a map point.managers— one row per property management company, rolled up from the buildings it operates.
Search by ZIP code:
{"mode": "locations","locations": ["78701", "78704"],"maxResults": 100,"minBeds": 1,"maxRent": 2500}
Property manager directory for a city:
{"mode": "managers","locations": ["Austin, TX"],"maxResults": 300}
Only buildings currently discounting rent:
{"mode": "locations","locations": ["78701"],"onlyDiscounted": true,"maxResults": 50}
Full 66-field records for every building:
{"mode": "locations","locations": ["78701"],"enrich": true,"maxResults": 50}
Map radius:
{"mode": "radius","geoPoint": "30.2672, -97.7431","radiusMiles": 5,"maxResults": 100}
Filters available on every mode: minBeds, maxBeds, minBaths, minRent, maxRent, minSqft, maxSqft, pets (none, dog, cat, dog_and_cat), and sort (default, lowest_rent, highest_rent, newest, recently_updated, has_video). Filters are applied upstream, so a narrow search costs fewer rows. Leave rapidApiKey empty to use the Actor's provider key, or pass your own.
Common use cases
- B2B prospecting. Property management companies buy software, insurance, maintenance, cleaning, and renovation services.
managersmode is a sourced, deduplicated list of them with phones and portfolio size. - Rent comparables. Rent bands by bed count per building, timestamped, for a ZIP or a whole city.
- Concession tracking.
topDealPctflags who is discounting. Run it weekly and you have a market-softness time series nobody publishes. - Vacancy monitoring.
totalUnitsAvailableandavailabilityTextper building. - Rental site and app content. Listings with photos, tours, ratings, and coordinates.
- Market entry research. Which operators dominate a metro, and at what price points.
Scheduling and integrations
Rent and concession data is most useful as a time series, since a single snapshot cannot tell you whether a market is softening.
- Use Apify Schedules to run weekly. Every row carries
scrapedAt, so history is queryable with no extra bookkeeping. - Export to CSV, JSON, or Excel, or push to Google Sheets, S3, or a webhook through Apify integrations.
- Call the Actor from the Apify API to feed an existing CRM or rent-comp dashboard.
FAQ
Does this Apartments.com scraper return contact details?
Yes: a leasing office phone number for every building, plus the property management company name and id. Rental listings do not expose agent email addresses the way for-sale listings do, so no email field is promised here.
How do I get a list of property management companies?
Set mode to managers and pass one or more ZIP codes or cities. Each row is one company with its portfolio size, footprint, phones, and rent range, sorted biggest first.
Can I find apartments that are offering a discount?
Yes. topDealPct carries the current concession percentage, and onlyDiscounted: true filters the run down to buildings that have one.
How many listings does one run return?
As many as maxResults. The upstream provider pages 50 buildings at a time and the Actor pages through automatically. A single downtown ZIP typically has several hundred buildings.
Do I need an API key?
No. Run it as-is. If you have your own provider subscription you can pass rapidApiKey to use it instead.
Can I search by map area instead of ZIP?
Yes. Use radius mode with geoPoint (paste coordinates in the 30.2672, -97.7431 form Google Maps copies) and set radiusMiles.
Are duplicate buildings billed twice?
No. Listings are deduplicated by listingKey across pages and overlapping radius searches before anything is charged.
Does it cover rentals outside the US?
No. Apartments.com is US inventory only.
Is there a per-unit floor plan feed?
Yes, with enrich on: floorPlans lists every plan with rent and a floor-plan image, and availableUnits lists the actual vacant apartments with their unit numbers. Without enrichment you get unitSummaries, one entry per bed count.
Do I get walk scores?
Yes, with enrichment: five of them, for walk, transit, bike, car, and quiet. Quiet legitimately comes back as 0 for the noisiest locations. That is a real score, not a missing value.
Notes
locationsaccepts ZIP codes andCity, ST. The provider resolves the value server-side and echoes the match back inresolvedLocation, so you can confirm what was actually searched.amenitiesis validated upstream: an unknown slug fails the whole request. Leave it empty unless you know the exact value.topDealPctisnullrather than0when a building has no concession. Absence and a zero-percent deal are different facts.- Base rows carry
listingKey. The canonicallistingUrlarrives only with enrichment, straight from the source rather than constructed. - This Actor returns public listing data. It does not estimate rents or provide tenant information.