Apartments.com Scraper at a glance
Apartments.com Scraper is a ready-to-run Apify actor from abotapi for collecting real estate data. Its documented output includes id, change type (incremental mode), name, address and city, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $2.40 per 1,000 results on the Apify Free plan and from $1.50 on paid plans, with smaller per-run or optional feature charges listed on Apify.
- Runs on
- Apify cloud: console, API, schedules and integrations
- Data type
- Real Estate, Automation, Developer Tools
- Pricing
- $2.40 per 1,000 results (Free plan), from $1.50 on paid plans
- Output
- Documented below · JSON, CSV, Excel
- Inputs
- 23 options
From $1.50/1K. Scrape Apartments.com rentals by city, ZIP, neighborhood, address or URL. Extract rent, floorplans, available units, amenities, fees, schools, transit, ratings, reviews, photos, phone numbers and GPS coordinates.
What Apartments.com Scraper can do
- One row per property, not one row per sub-block. Amenities, fees, schools, units and reviews all live inside the same record instead of being split into separate rows you'd otherwise pay for one by one.
- 50+ fields per property, including floorplan models, every available unit with rent and square footage, the full amenity list, pet and parking policy, fee schedule, nearby schools, walk and transit scores, office hours, ratings and recent reviews.
- Three modes: location search with filters, direct URL scraping (result pages and property pages, mixed in one run), and location autocomplete for resolving a term to coordinates.
- Graceful pagination that walks a whole result set on its own, bounded only by a single soft cap (maxListings), with duplicate properties removed automatically.
- Daily/recurring change monitoring. Turn on Incremental mode to track a search over time and receive only the properties that are new, updated or reappeared on each scheduled run.
- A refused run fails loudly with a clear status message instead of quietly returning an empty dataset that looks like a genuine "no results" search.
Choose what to collect
These inputs let you configure Apartments.com Scraper - Rentals, Prices & Property Details. Open the actor on Apify to enter your values and review the current options.
| Input | What it controls |
|---|---|
modestring · required | How to start. 'search' builds result pages from city / ZIP / address terms. 'url' scrapes Apartments.com result or property URLs you paste. 'autocomplete' returns location suggestions (region IDs, coordinates, bounding boxes) for each term, with no listing scrape. |
locationsarray | City, ZIP, neighborhood, or street address terms, one per line (e.g. 'Austin, TX', '78701', 'Brooklyn, NY'). Each is resolved through Apartments.com's location service. Used by 'search' and 'autocomplete' modes; ignored in 'url' mode. |
propertyTypestring | Limit to a rental type. 'Any' returns all types. |
bedroomsstring | Minimum bedroom count. 'Any' applies no bedroom filter. |
minRentinteger | Lowest monthly rent. Leave empty for no minimum. |
maxRentinteger | Highest monthly rent. Leave empty for no maximum. |
lifestylestring | Optional single lifestyle filter. Applied only when property type is 'Any' (Apartments.com does not combine a type prefix with these). 'None' applies no lifestyle filter. |
Show 16 more inputs
| Input | What it controls |
|---|---|
urlsarray | Apartments.com result URLs (e.g. https://www.apartments.com/austin-tx/2-bedrooms/) or property URLs (e.g. https://www.apartments.com/the-grove-houston-tx/9cwjc35/), one per line. Supported: city, paginated (/2/), bedroom/price-filtered, property-type (houses/condos/townhomes), amenity (pet-friendly-dog), city-ZIP (austin-tx-78701), share links (?sk=...) and property pages. Bare /78701/ and m.apartments.com links are skipped with a warning. Multi-URL supported. Search-mode filters are ignored. Pagination starts at the page in the URL and walks forward. |
fetchDetailsboolean | When on, each property is enriched with its detail page: floorplan units, full amenities, pet & parking policy, fees, schools, transit, walk score, office hours, ratings, reviews, and description. When off, only the fast result-card fields are returned (name, address, rent range, beds, phone, rating, photo). |
includeVirtualToursboolean | When on (and Fetch full property details is on), each property also lists its virtual tour, 3D tour and video tour links in virtualTours. Off by default. Only some properties publish a tour (for example a Matterport 3D tour); the list is empty for the rest. No extra requests are made: the links come from the same detail page. |
sortBystring | Order of the search results (Apartments.com's own sort, live-checked: it also holds on later result pages). 'Default' keeps the site's best-match order. Applies to search pages and pasted search links. A pasted link's own query string (for example ?so= or ?bb=) is removed with a warning, so this setting always decides the order. With a Max properties cap the sort decides which properties are kept. |
maxPagesinteger | Safety bound on how many result pages to walk per location or start URL (about 40 properties per page). 0 (default) means unlimited, the walk stops naturally once a page comes back empty or repeats listings already collected, or sooner once Max properties is reached. Set a number only for an explicit page cap below that natural stop. |
maxListingsinteger | The sole soft cap on the run, applied across all locations/URLs. Defaults to 20 so a run stays small unless you raise it. 0 means unlimited (bounded only by the natural stop on maxPages). |
maxReviewsinteger | How many reviews to keep on each property row. The default (1000, the maximum) keeps every review the property page shows; lower it to keep fewer, 0 skips reviews. Every full or partial block of 10 reviews delivered adds one detail-enrichment unit to that property's detail charge. Applies when the property detail page is fetched. |
resumeFromRunIdstring | Optional. Paste a previous run ID or dataset ID to continue a large walk-all pull: properties already saved by that run are loaded before scraping starts and skipped, so this run only appends new properties. For recurring daily monitoring of the same search, use Incremental mode below instead. Leave empty for a normal fresh run. |
incrementalModeboolean | Turn this on for daily or recurring monitoring. The first run returns all matching properties as NEW. Later runs normally return only NEW, UPDATED, and REAPPEARED properties. A property is UPDATED when any extracted field changes (rent, availability, floorplans, units, fees, amenities, photos, reviews, ratings and so on); scrapedAt, rawJsonLd, breadcrumbs, neighborhoodDescription, virtualTours and managementLogo are never compared (nor are the derived copy fields propertyName, location, coordinates, isVerified, rent, beds, baths, sqft, transitAndPOI, scores, models and contact), and you can exclude more with Ignore fields when detecting changes below. Turn on "Emit unchanged" or "Emit expired" only when you also want those properties returned (and billed). State is kept separately for each location/URL, property type, bedroom, rent range, and lifestyle/detail-mode setup; use State key when you want to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from a prior run above. |
stateKeystring | Optional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty to let the actor derive a key automatically from the location/URL and filter settings, different searches then never mix state with each other. |
emitUnchangedboolean | Off by default. Turn on to also return properties that have not changed since the last run, marked UNCHANGED. This returns, and bills, extra rows you already have, so leave it off unless you specifically want the full snapshot every run. |
emitExpiredboolean | Off by default. Turn on to also return properties that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked search, not when Max properties capped it or when Resume was used. This returns, and bills, extra synthetic rows, so leave it off unless you need expiry tracking. |
ignoreFieldsForChangesarray | Optional. Extra fields that must NOT make a property count as UPDATED, e.g. photos, availability or reviews. A plain name matches that field anywhere, including inside floorplans and units; a dotted path such as units.availability matches only that one. The fields stay in the output, they are just not compared. scrapedAt, rawJsonLd, breadcrumbs, neighborhoodDescription, virtualTours and managementLogo are always ignored (so are the derived copy fields propertyName, location, coordinates, isVerified, rent, beds, baths, sqft, transitAndPOI, scores, models and contact). |
mcpConnectorsarray | Optionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify → Settings → Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON, the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com). |
notionParentPageUrlstring | URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors. |
maxNotifyListingsinteger | Cap on items written to each connector per run. Does not affect the dataset. |
Fields in the output
The documented dataset includes the fields below. Availability can depend on the source page and selected mode.
idID (text)changeTypeChange type (incremental mode) (text)nameName (text)addressAddress (text)cityCity (text)stateState (text)zipZIP (text)rentMinRent Min (number)rentMaxRent Max (number)bedsLabelBeds (text)propertyTypeType (text)neighborhoodNeighborhood (text)Show 18 more fields
yearBuiltYear Built (number)phonePhone (text)ratingRating (number)reviewCountReviews (number)latitudeLat (number)longitudeLng (number)urlURL (link)changedFieldsChanged fields (incremental mode) (array)firstSeenAtFirst seen (incremental mode) (date)lastSeenAtLast seen (incremental mode) (date)managementCompanyManagement (text)officeHoursOffice Hours (array)floorplansFloorplans (array)unitsUnits (array)feesFees (array)schoolsSchools (array)amenitiesAmenities (array)reviewsreviewsExample output
An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.
{
"id": "abc1234",
"url": "https://www.apartments.com/sample-apartments-austin-tx/abc1234/",
"name": "Sample Apartments",
"description": "A modern community near downtown with resort-style amenities and easy highway access.",
"address": "100 Example St",
"street": "100 Example St",
"city": "Austin",
"state": "TX",
"zip": "78701",
"latitude": 30,
"longitude": -97,
"rentMin": 1200,
"rentMax": 2600,
"currency": "USD",
"bedsLabel": "Studio - 2 Beds",
"bedsRange": "1 - 2 bd",
"bathsRange": "1 - 2 ba",
"sqftRange": "500 - 1,000",
"propertyType": "rental",
"yearBuilt": 2010,
"unitsInBuilding": 200,
"stories": 4,
"neighborhood": "Sample Neighborhood",
"leaseOptions": "6 - 15 Month Leases",
"managementCompany": "Sample Management Co",
"rentSpecial": "Move-in special: one month free",
"verified": true,
"phone": "(800) 000-0000",
"petsAllowed": true,
"rating": 4.1,
"reviewCount": 12,
"amenities": [
"Pool",
"Fitness Center",
"In Unit Laundry"
],
"floorplans": [
{
"name": "A1",
"rent": "$1,200 - $1,400",
"beds": 1,
"baths": 1,
"sqft": 650
}
],
"units": [
{
"model": "A1",
"unit": "000",
"beds": 1,
"baths": 1,
"rent": 1300,
"sqft": 650,
"availability": "Now"
}
],
"fees": [
"Application Fee $0",
"Admin Fee $0"
],
"parking": [
"Garage - $0/mo"
],
"transit": [
{
"name": "Sample Station",
"distanceMiles": 1,
"driveTimeMin": 5
}
],
"schools": [
{
"name": "Example Elementary",
"type": "Public",
"grades": "PK-5",
"students": 500
}
],
"walkScore": {
"walk": 80,
"transit": 50,
"drive": 90,
"bike": 70
},
"officeHours": [
"Monday, Tuesday, Wednesday, Thursday, Friday: 09:00-18:00"
],
"reviews": [
{
"author": "A. Renter",
"rating": 5,
"title": "Great place",
"body": "Sample review text.",
"date": "2026-01-01"
}
],
"photo": "https://images1.apartments.com/i2/0000/sample-thumb.jpg",
"photos": [
"https://images1.apartments.com/i2/0000/sample-photo.jpg"
],
"detailScraped": true,
"scrapedAt": "2026-01-01T00:00:00.000Z"
}Ways to use this data
- Rental market research and investors: compare rent ranges, unit mixes and amenities across a metro to spot pricing trends over time.
- Listing aggregator and search apps: pull structured floorplans, units and availability to power your own rental search tool.
- Property management competitive intelligence: track competitors' rent specials, fees and policies with Incremental mode so you only see what changed.
- Relocation and leasing services: collect management company names, phone numbers and office hours tied to specific neighborhoods.
- Neighborhood and livability research: pair school, walk score and transit data with rent to study a market beyond price alone.
Before you run
Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.
Questions about this actor
What data does Apartments.com Scraper return?
The documented output for Apartments.com Scraper includes id, change type (incremental mode), name, address, city, state, zip and rent min. Availability of each field depends on the source page and the selected mode.
How much does Apartments.com Scraper cost?
It costs $2.40 per 1,000 results on the Apify Free plan and from $1.50 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.
Can I get only new or changed properties on a schedule?
Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Each run then returns only new and updated properties for the same search; unchanged properties are not returned and not billed at all (no result charge and no detail-enrichment charge) unless you turn emitUnchanged on, in which case a returned unchanged property is billed as a returned property (one result charge and one detail-enrichment unit, no review blocks).
Can I use it with AI agents or MCP?
Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable.
