# Apartments.com Scraper — Rentals, Fees, Reviews & Media (`axlymxp/apartments-com-scraper`) Actor

Scrape US rental listings from Apartments.com at scale — rent, beds/baths, per-unit availability, fees, amenities, leasing phone, ratings, reviews, walk scores and 3D tours — as structured JSON. Runs on the official mobile API for reliability. Pay only for the results you get.

- **URL**: https://apify.com/axlymxp/apartments-com-scraper.md
- **Developed by:** [axly](https://apify.com/axlymxp) (community)
- **Categories:** Real estate, Lead generation
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 dataset items

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Apartments.com Scraper — Rentals, Fees, Reviews & Media

Extract **US rental listings from Apartments.com** at scale as clean, structured
JSON. Search any city, ZIP, neighborhood, coordinate, URL or listing key and get
pricing, **per-unit availability**, **fees & recurring expenses**, amenities,
**leasing phone numbers**, ratings, renter **reviews**, **walk/transit/bike
scores**, photos, videos and **3D tours** — everything the apartment's own mobile
app sees.

Built on Apartments.com's **official mobile API** (not fragile HTML scraping), so
it stays reliable at volume and enumerates the **entire market** in an area, not
just the first search page.

### Who uses this

- **Lead-generation agencies** — pull property names, addresses, GPS and **leasing
  phone numbers** for whole metros to build outbound lists.
- **Real-estate investors & analysts** — rent ranges, **per-unit pricing**, fees,
  year built, unit counts and ratings for rent-comp and underwriting models.
- **PropTech & SaaS teams** — a stable JSON schema (reviews, scores, media) to
  power apps, dashboards and pipelines without fighting anti-bot.
- **Researchers** — reproducible, filterable rental-market snapshots by city, ZIP
  or bounding box.

### Output fields

Each row is one property. Enrichment fields are populated when their toggle is on.

| Field | Type | Description |
| --- | --- | --- |
| `listingKey` | string | Apartments.com listing key (7 chars). |
| `name` | string | Property name. |
| `url` | string | Canonical property profile URL. |
| `oneLineAddress` | string | Formatted single-line address. |
| `address` | object | `line1, line2, city, state, zip, country`. |
| `location` | object | GPS `{ lat, lng }`. |
| `phone` | string | Leasing / contact phone number. |
| `propertyManager` | string | Management company. |
| `listingType` | string | apartment / condo / house / townhome. |
| `rating` | number | Star rating (0–5). |
| `rentRange` / `rentMin` / `rentMax` | string / int | Advertised rent range and parsed bounds. |
| `bedRange` | string | e.g. `Studio - 2 Beds`. |
| `yearBuilt` / `unitCount` / `storyCount` | int | Building facts. |
| `leaseTerms` / `minLeaseTermMonths` / `maxLeaseTermMonths` | string / int | Lease-length options. |
| `units` | array | **Per-unit availability**: model, beds, baths, area, rent, deposit, availability date, floor-plan image. |
| `fees` | object | `profileFees`, `oneTimeExpenses`, `recurringExpenses`. |
| `amenities` / `amenityCategories` | array | Flat + structured amenity lists. |
| `petPolicies` / `parkingPolicies` / `officeHours` | array | Policies and hours. |
| `schools` / `colleges` / `transit` | array | Nearby schools (with ratings), colleges, transit. |
| `walkScore` / `transitScore` / `bikeScore` | int | Location scores. |
| `specialOffer` | object | Current concession `{ header, body, expires }`. |
| `primaryImage` / `photoCount` / `threeDTourUrl` | string / int | Cover image, media count, 3D tour. |
| `media` | array | Full gallery: photos, **videos**, 3D tours. |
| `reviews` / `reviewCount` | array / int | Renter reviews (title, text, rating, date). |
| `scrapedAt` | string | ISO-8601 scrape timestamp. |

### Use cases

- **Build a rental lead list** for a metro: set `location`, keep `includeDetails`
  on, export name + address + phone to your CRM.
- **Rent-comp analysis**: filter by beds/baths/price and read `units[]` for
  live per-unit rents and availability dates.
- **Concession tracking**: monitor `specialOffer` across a city over time.
- **Amenity & fee benchmarking**: compare `fees` and `amenities` across competitors.
- **Reputation monitoring**: enable `includeReviews` to track ratings and feedback.

### Input parameters

| Field | Type | Default | Notes |
| --- | --- | --- | --- |
| `location` | string | — | City / ZIP / neighborhood. One input is required. |
| `startUrls` | array | — | Search or property URLs. |
| `listingKeys` | array | — | Explicit property keys. |
| `coordinates` | object | — | `{ lat, lng, radiusMiles }` point search. |
| `maxItems` | integer | 100 | Max properties (rows). |
| `minPrice` / `maxPrice` | integer | — | Monthly rent range. |
| `minBeds` / `maxBeds` | integer | — | Bedroom range (0 = studio). |
| `minBaths` / `maxBaths` | number | — | Bathroom range. |
| `minSqft` / `maxSqft` | integer | — | Area range. |
| `propertyType` | array | all | apartments / condos / houses / townhomes. |
| `petPolicy` | enum | any | cats / dogs / any. |
| `minRating` | integer | — | Minimum star rating. |
| `keywords` | string | — | Free-text keyword filter. |
| `sortBy` | enum | best\_match | best\_match / price\_low / price\_high / newest. |
| `includeDetails` | boolean | true | Units, fees, policies, schools, transit. |
| `includeReviews` | boolean | false | Renter reviews. |
| `includeWalkScore` | boolean | true | Walk / transit / bike scores. |
| `includeMedia` | boolean | false | Photos, videos, 3D tours. |
| `proxyConfiguration` | object | Apify Residential (US) | Recommended for large runs. |

### Example input

```json
{
    "location": "Austin, TX",
    "maxItems": 100,
    "minBeds": 2,
    "maxPrice": 3000,
    "includeDetails": true,
    "includeWalkScore": true,
    "includeReviews": false,
    "includeMedia": false
}
```

### Example output (truncated)

```json
{
    "listingKey": "s286zb6",
    "name": "The Watson",
    "url": "https://www.apartments.com/the-watson-austin-tx/s286zb6/",
    "oneLineAddress": "11901 Burnet Rd, Austin, TX 78758",
    "location": { "lat": 30.405, "lng": -97.715 },
    "phone": "(832) 730-2535",
    "propertyManager": "MORGAN",
    "rating": 3,
    "rentRange": "$1,904 - 4,884",
    "bedRange": "Studio - 2 Beds",
    "yearBuilt": 2026,
    "unitCount": 345,
    "leaseTerms": "12 - 18 Month Leases",
    "units": [
        { "modelName": "S3.1", "beds": "Studio", "baths": "1 Bath", "area": "554SF", "rent": "$2,304", "availabilityText": "Now" }
    ],
    "walkScore": 60,
    "transitScore": 30,
    "bikeScore": 50,
    "scrapedAt": "2026-09-05T00:00:00Z"
}
```

### Scheduling & integrations

- **Schedule** runs (hourly/daily/weekly) from the Apify Console to keep a dataset
  fresh.
- **Webhooks** fire on run completion — push new listings straight into your own
  systems.
- Export to **Google Sheets, Excel, CSV, JSON** or stream to **Make, Zapier,
  Airbyte, S3** via the Apify API.

### Use it from an AI assistant (MCP)

This actor is callable from AI agents through the **Apify MCP server**, so an
assistant (Claude, ChatGPT, etc.) can fetch live rental data on demand. Point your
MCP client at Apify and call `apartments-com-scraper` with the same input JSON.

### FAQ

**How many listings can I get?** Set `maxItems`. The actor pages past the map API's
500-per-request cap by subdividing the search area, so it can enumerate an entire
metro.

**How fresh is the data?** Every run is live against Apartments.com's mobile API;
`scrapedAt` records the moment each row was captured.

**Is this reliable?** It uses the app's official backend rather than parsing HTML,
so it does not silently break when the website's markup or anti-bot changes.

**Do I need proxies?** Apify Residential (US) is enabled by default and recommended
for larger runs. You can supply your own proxy configuration.

**Which locations are supported?** The US (Apartments.com's coverage). Search by
city, ZIP, neighborhood, coordinates, URL or listing key.

**Is scraping this legal?** The actor collects publicly available listing data. You
are responsible for using the output in compliance with applicable laws and terms.

**Support?** Open an issue on the actor's Issues tab — reported problems are
triaged promptly.

# Actor input Schema

## `location` (type: `string`):

Free-text location to search: a city ("Austin, TX"), a ZIP code, or a neighborhood. Resolved automatically to the matching geography.

## `startUrls` (type: `array`):

Apartments.com search-results or property URLs. Property URLs are scraped directly; search URLs are resolved to their location. Use instead of, or alongside, Location.

## `listingKeys` (type: `array`):

Explicit 7-character Apartments.com listing keys (e.g. "s286zb6"), the trailing segment of a property URL. Scrapes exactly these properties.

## `coordinates` (type: `object`):

Point search around a GPS coordinate: {"lat": 30.27, "lng": -97.74, "radiusMiles": 5}.

## `maxItems` (type: `integer`):

Stop after this many listings (properties). Each listing is one dataset row.

## `minPrice` (type: `integer`):

Only listings with rent at or above this monthly price.

## `maxPrice` (type: `integer`):

Only listings with rent at or below this monthly price.

## `minBeds` (type: `integer`):

Minimum bedroom count (0 = studio).

## `maxBeds` (type: `integer`):

Maximum bedroom count.

## `minBaths` (type: `integer`):

Minimum bathroom count.

## `maxBaths` (type: `integer`):

Maximum bathroom count.

## `minSqft` (type: `integer`):

Minimum unit area in square feet.

## `maxSqft` (type: `integer`):

Maximum unit area in square feet.

## `propertyType` (type: `array`):

Restrict to one or more property types. Leave empty for all.

## `petPolicy` (type: `string`):

Filter by pet-friendliness.

## `minRating` (type: `integer`):

Only listings with at least this star rating (1–5).

## `keywords` (type: `string`):

Free-text keyword filter (e.g. "pool", "loft").

## `sortBy` (type: `string`):

Order in which listings are returned.

## `includeDetails` (type: `boolean`):

Fetch per-unit availability & rent, one-time and recurring fees, lease terms, amenities, pet & parking policies, schools and transit for each listing.

## `includeReviews` (type: `boolean`):

Fetch renter reviews (title, text, rating, date) for each listing.

## `includeWalkScore` (type: `boolean`):

Fetch Walk Score, Transit Score and Bike Score for each listing.

## `includeMedia` (type: `boolean`):

Fetch the full media gallery: photos, videos and 3D tour links.

## `proxyConfiguration` (type: `object`):

Proxy used for API calls. Apify Residential (US) is recommended for large runs.

## Actor input object example

```json
{
  "location": "Austin, TX",
  "startUrls": [],
  "listingKeys": [],
  "maxItems": 100,
  "sortBy": "best_match",
  "includeDetails": true,
  "includeReviews": false,
  "includeWalkScore": true,
  "includeMedia": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "location": "Austin, TX",
    "startUrls": [],
    "listingKeys": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("axlymxp/apartments-com-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "location": "Austin, TX",
    "startUrls": [],
    "listingKeys": [],
}

# Run the Actor and wait for it to finish
run = client.actor("axlymxp/apartments-com-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "location": "Austin, TX",
  "startUrls": [],
  "listingKeys": []
}' |
apify call axlymxp/apartments-com-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,axlymxp/apartments-com-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/l0WfYMF6vs4q81Rxo/builds/nle7vL481J3vOVIGs/openapi.json
