# Apartments.com Scraper — Rental Listings & Pricing (`solidcode/apartments-com-scraper`) Actor

\[💰 $1.2 / 1K] Extract rental listings from Apartments.com at scale — 48 fields per listing: advertised rents by bedroom tier, full addresses, leasing phone numbers, amenities, floor plans and GPS coordinates for apartments, houses and condos in any US metro. Export to JSON, CSV or Excel.

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

## Pricing

from $1.20 / 1,000 listings

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#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 — Rental Listings & Pricing

Pull live rental listings from Apartments.com at scale — advertised rents by bedroom tier, full street addresses, leasing phone numbers, amenities, floor plans and map coordinates, 48 fields in all. Built for rental-market analysts, property managers and real-estate lead-generation teams who need a current picture of what a metro is actually asking for rent, without copying listing cards by hand or settling for the few hundred results a single search on the site will show you.

### Why This Scraper?

- **48 fields per listing** — 27 straight from the search results and 21 more when full details are switched on: map coordinates, the complete amenity inventory, floor plan names, year built, unit count, lease and deposit terms, leasing office hours, ratings, and nearby schools, colleges and transit.
- **More than one search's worth of results** — Apartments.com pages through roughly 700 listings for any single search, however many match. When a search hits that wall, this actor re-asks it as narrower bedroom and rent-band searches and merges the answers, de-duplicated by listing — a measured 1,600+ unique listings from a single metro, 2.3× the site's own ceiling.
- **Rent by bedroom tier, not one headline number** — `rentTiers` and `rentPrices` carry every tier a property advertises (`Studio $2,250+`, `1 Bed $2,790+`, `2 Beds+ $3,930+`), and `baseRentPrices` carries base rent before required monthly fees wherever the two differ.
- **Direct leasing phone numbers** — a dialable leasing line on at least 4 in 5 listings in every metro and property category sampled, alongside the management brand that runs the property.
- **Map coordinates on enriched listings** — latitude and longitude on all 18 detail records sampled across Charlotte, Austin and Chicago (an Austin listing lands at 30.36593, -97.64718), ready to join to a GIS layer or a CRM territory map.
- **Move-in specials you can act on** — `specialOffer` captures "2 Months Free"-style concessions and `leaseTerm` the advertised lease length, so you can see which properties are discounting before the asking rent itself moves.
- **Promoted placements are labelled, not hidden** — `isFeaturedUnit` flags every sponsored placard, so a market study can exclude paid placement instead of silently over-weighting it, and a lead list can target it deliberately.
- **Apartments, houses and condos, verified across three metros** — coverage was measured on 360 listings spanning Charlotte NC, Austin TX and Chicago IL across all three property categories. Every one carried a listing ID, a URL, a property name and a full street address, and 100 listings came back in 69 seconds.

### Use Cases

#### Rental Market Research

- Track asking rents by bedroom tier across a metro and watch them move week over week.
- Measure concession pressure — count how many properties advertise free months, and how deep the offers go.
- Compare submarkets on rent per square foot using `rentRange` and `sqftRange` together.
- Build a supply picture from `unitCount` and `yearBuilt` — how much of a metro's inventory is new construction.

#### Lead Generation

- Build prospect lists of leasing offices with a property name, management brand and phone number already attached.
- Segment by `brandName` to find whole portfolios instead of one-off buildings.
- Target properties advertising specials — a discounting property is a property with vacancy.
- Filter to single-unit house and condo listings for landlord-services outreach.

#### Investment & Underwriting

- Pull rent comparables inside a radius using latitude and longitude.
- Sanity-check pro-forma rents against every tier a comparable property is currently advertising.
- Screen for value-add candidates: older `yearBuilt`, large `unitCount`, below-market `rentFrom`.
- Track lease-up pricing at newly built communities as they stabilise.

#### Relocation & Site Selection

- Score neighbourhoods for a corporate relocation package using `schools`, `colleges` and `transit`.
- Filter on the amenities a cohort actually needs — pet policy, parking, in-unit laundry, fitness.
- Compare a shortlist of metros on identical fields in a single run.

#### Data Enrichment & Integration

- Enrich an existing property database with coordinates, photos and amenity lists, keyed on `listingId`.
- Feed a rental search product with fresh inventory on a schedule.
- Push new matches into Slack or Google Sheets the moment a run finishes.
- Join to public datasets on ZIP code — every row carries `zipCode`, `city` and `state`.

### Getting Started

#### Simplest run

```json
{
  "location": "charlotte-nc",
  "maxItems": 100
}
```

#### Paste a filtered search URL from the site

Set your filters on the site, then copy the address bar URL — every filter in it is
carried through.

```json
{
  "searchUrls": [
    "https://www.apartments.com/charlotte-nc/"
  ],
  "maxItems": 720
}
```

#### Everything, with full details

```json
{
  "searchUrls": [
    "https://www.apartments.com/charlotte-nc/"
  ],
  "maxItems": 720,
  "enrichDetails": true
}
```

### Input Reference

#### What to Scrape

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `searchUrls` | array | — | Apartments.com search result URLs. Set your filters on Apartments.com, then paste the address bar URL here. Overrides the individual filters below when provided. |
| `location` | string | `charlotte-nc` | Area to search. Used only when Search URLs is empty. |
| `maxItems` | integer | `100` | Maximum listings per search URL (0 = collect everything each search returns). Apartments.com pages through at most 720 listings per search, so use several narrower searches to collect more. |

#### Options

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `enrichDetails` | boolean | `false` | Add 21 extra fields per listing. Adds one request per listing and is billed at the higher rate. |
| `concurrency` | integer | `8` | How many requests to run in parallel. Lower this if you see failures. |
| `proxyConfiguration` | object | Apify Proxy | Proxy settings for the run. |

### Output

Every listing is one dataset row. Enabling `enrichDetails` adds 21 further fields to the same row — there is no second record type to join.

The example below is a real captured listing. The leasing phone number is a placeholder, and the description and floor plan list are shortened for readability; your dataset carries the published values in full.

```json
{
  "listingId": "the-artisan-charlotte-nc/pe3k5kr",
  "propertyCode": "pe3k5kr",
  "url": "https://www.apartments.com/the-artisan-charlotte-nc/pe3k5kr/",
  "propertyName": "The Artisan",
  "isFeaturedUnit": true,
  "unitSpec": null,
  "beds": null,
  "baths": null,
  "squareFeet": null,
  "address": "510 W Tremont Ave, Charlotte, NC 28203",
  "streetAddress": "510 W Tremont Ave",
  "unitNumber": null,
  "city": "Charlotte",
  "state": "NC",
  "zipCode": "28203",
  "countryCode": "US",
  "rentFrom": 2250,
  "rentTiers": ["Studio", "1 Bed", "2 Beds+"],
  "rentPrices": ["$2,250+", "$2,790+", "$3,930+"],
  "baseRentPrices": null,
  "leaseTerm": null,
  "specialOffer": "2 Months Free",
  "phone": "9805550100",
  "brandName": "Northwood Ravin",
  "photo": "https://images1.apartments.com/i2/MH_0jKg5ZX97YWPyMmobXq9L9zfP3I_vuuM2dnsODSE/118/the-artisan-charlotte-nc-building-photo.jpg?p=1",
  "photoCount": 31,
  "amenityHighlights": ["Pets Allowed", "Fitness Center", "Pool", "Refrigerator", "Kitchen", "Balcony"],
  "latitude": 35.21177,
  "longitude": -80.86852,
  "description": "A boutique community offering studio to 3 bedrooms homes, designed with the attention of a craftsperson. Perfectly positioned in South End, this prime location offers a rare balance of calm and connectivity, just steps from the Rail Trail, the East/West Boulevard Light Rail Station, and Uptown. …",
  "bedroomRange": "Studio - 3 bd",
  "bathroomRange": "1 - 3 ba",
  "sqftRange": "697 - 2,357 sq ft",
  "availability": null,
  "floorplanNames": ["S1", "S2", "A1", "A2", "A3", "B1", "B2", "C1P", "…"],
  "yearBuilt": 2026,
  "unitCount": 157,
  "rentRange": "$2,250 - $8,585",
  "leaseInfo": "Lease Options 12 - 15 Month Leases",
  "utilitiesIncluded": null,
  "photos": [
    "https://images1.apartments.com/i2/MH_0jKg5ZX97YWPyMmobXq9L9zfP3I_vuuM2dnsODSE/111/the-artisan-charlotte-nc-primary-photo.jpg?p=1",
    "https://images1.apartments.com/i2/jD8IZgWX63Zt6UyhO5K2Nwk3fO9MzXmNDWOUFoSEwu4/117/the-artisan-charlotte-nc-building-photo.jpg?p=1",
    "https://images1.apartments.com/i2/K7vEqGwnsDy8v8yZtnfgkcwd8tMEyM2k69xWT0M_qU4/117/the-artisan-charlotte-nc-building-photo.jpg?p=1",
    "https://images1.apartments.com/i2/jbAv7hX5JDez0n_lLXsPrhuOqysNrHC_HF5cliKJOlM/117/the-artisan-charlotte-nc-building-photo.jpg?p=1",
    "https://images1.apartments.com/i2/DAqRHD4dbUXh_HsnPRvm4cF381lxzGL268hDvZ6nzXY/117/the-artisan-charlotte-nc-building-photo.jpg?p=1"
  ],
  "amenities": ["Controlled Access", "24 Hour Access", "Fitness Center", "Sauna", "Spa", "Pool", "Roof Terrace", "Sundeck", "Air Conditioning", "Heating", "Fireplace", "Kitchen", "Oven", "Range", "Refrigerator", "Freezer", "Quartz Countertops", "Views", "Balcony"],
  "officeHours": "Monday - Sunday, 12am - 12am",
  "ratingValue": null,
  "ratingCount": null,
  "schools": ["Sedgefield Elementary", "Barringer Academic Center", "Harding University High"],
  "colleges": ["Johnson & Wales U., Charlotte", "Queens University of Charlotte"],
  "transit": ["East/West", "Bland Street", "New Bern", "Carson", "Morehead"]
}
```

#### Core Fields

| Field | Type | Description |
|-------|------|-------------|
| `listingId` | string | Listing key |
| `propertyCode` | string | Property code |
| `url` | string | Listing URL |
| `propertyName` | string | Property name |
| `isFeaturedUnit` | boolean | Promoted placement |
| `unitSpec` | string | Unit specification |
| `beds` | number | Bedrooms |
| `baths` | number | Bathrooms |
| `squareFeet` | number | Square feet |

#### Price & Value

| Field | Type | Description |
|-------|------|-------------|
| `rentFrom` | number | Rent from |
| `rentTiers` | array | Bedroom tiers |
| `rentPrices` | array | Rent by tier |
| `baseRentPrices` | array | Base rent by tier (before required fees) |
| `leaseTerm` | string | Lease term |
| `specialOffer` | string | Move-in special |

#### Location & Contacts & Media & Details & Timestamps

| Field | Type | Description |
|-------|------|-------------|
| `address` | string | Full address |
| `streetAddress` | string | Street address |
| `unitNumber` | string | Unit number |
| `city` | string | City |
| `state` | string | State |
| `zipCode` | string | ZIP code |
| `countryCode` | string | Country |
| `phone` | string | Phone |
| `brandName` | string | Management brand |
| `photo` | string | Primary photo |
| `photoCount` | number | Photos in gallery |
| `amenityHighlights` | array | Amenity highlights |

#### With `enrichDetails` enabled

| Field | Type | Description |
|-------|------|-------------|
| `latitude` | number | Latitude |
| `longitude` | number | Longitude |
| `description` | string | Description |
| `bedroomRange` | string | Bedrooms offered |
| `bathroomRange` | string | Bathrooms offered |
| `sqftRange` | string | Square feet offered |
| `availability` | string | Availability |
| `floorplanNames` | array | Floor plan names |
| `yearBuilt` | number | Year built |
| `unitCount` | number | Units in community |
| `rentRange` | string | Rent range |
| `leaseInfo` | string | Lease and deposit |
| `utilitiesIncluded` | string | Utilities included |
| `photos` | array | Photo URLs (preview) |
| `amenities` | array | All amenities |
| `officeHours` | string | Leasing office hours |
| `ratingValue` | number | Rating |
| `ratingCount` | number | Ratings |
| `schools` | array | Nearby schools |
| `colleges` | array | Nearby colleges |
| `transit` | array | Nearby transit |

### Tips for Best Results

- **Plan around the ~700-per-search ceiling** — Apartments.com stops any one search at roughly 700 listings, no matter how many match. A saturated search is automatically re-asked as narrower bedroom and rent-band searches and merged, so a single metro run returns well past that; to cover a whole state, still paste several city URLs into `searchUrls`. Rows are de-duplicated across them and never billed twice.
- **Filter on Apartments.com first, then copy the address bar** — bedrooms, rent band, property category and neighbourhood are all encoded in the URL and carried through unchanged, so a heavily filtered search needs no extra configuration here.
- **`photos` is a five-image preview; `photoCount` is the real gallery size** — every enriched row carries the listing's first five images plus the true count of photos the property has published (16 to 105 across the sample). Rank by `photoCount` to find well-documented listings, and use `photos` for thumbnails.
- **`beds`, `baths`, `squareFeet` and `unitSpec` are single-unit fields** — a house or condo listing is one unit and carries all four. A multi-unit community genuinely has no single bedroom count, so it ships `bedroomRange`, `rentTiers` and `rentPrices` instead. Both shapes are correct; filter on whichever your analysis needs.
- **`rentFrom` is the advertised starting rent, not a computed minimum** — it is the first tier the property shows. On 117 of 119 multi-tier listings sampled it was also the numeric low; `rentPrices` carries every tier if you need to compute the true minimum yourself.
- **Turn on full details when you need location, amenities or lease terms** — the enriched half is a strict superset of 21 fields that appear nowhere in search results. Leave it off for a fast price-only sweep at a third of the cost.
- **Drop `isFeaturedUnit` rows for an unbiased market sample** — sponsored placards are what the site pads long result sets with, so an asking-rent study should exclude them while a lead list probably wants them first.

### Pricing

**From $1.20 per 1,000 results** (search only) or **from $4.20 per 1,000 results** (with full details).

| Results | Search Only | With Full Details |
|---------|-------------|-------------------|
| 100 | $0.12 | $0.42 |
| 1,000 | $1.20 | $4.20 |
| 10,000 | $12.00 | $42.00 |
| 100,000 | $120.00 | $420.00 |

Those are the rates on Gold and above. Higher-volume plans pay less per result:

| Your Apify plan | Search Only | With Full Details |
|-----------------|-------------|-------------------|
| No discount | $1.44 | $5.04 |
| Bronze | $1.35 | $4.75 |
| Silver | $1.30 | $4.50 |
| **Gold and above** | **$1.20** | **$4.20** |

Per 1,000 results.

A "result" is any listing row in the output dataset. When you run several searches at once, a listing matching more than one of them is de-duplicated before it reaches the dataset, so you are never charged twice for the same listing. The full-details rate applies only to rows that actually came back enriched — if a listing's detail record is unavailable, the row is still delivered and charged at the search-only rate. Platform fees (compute, storage) are additional and depend on your Apify plan.

### Integrations

Export data in JSON, CSV, Excel, XML, or RSS. Connect to 1,500+ apps via:

- **Zapier** / **Make** / **n8n** — Workflow automation
- **Google Sheets** — Direct spreadsheet export
- **Slack** / **Email** — Notifications on new results
- **Webhooks** — Trigger custom APIs on run completion
- **Apify API** — Full programmatic access

### Legal & Ethical Use

**This is an unofficial scraper. It is not affiliated with, endorsed by, or connected to Apartments.com or its operators in any way.** All trademarks belong to their respective owners.

This actor is intended for legitimate market research and analytics. You are responsible for complying with applicable laws and with Apartments.com's Terms of Service.

Results may include personal data such as contact details. Treat them accordingly: do
not use them for spam, harassment, or any unlawful purpose, and follow applicable
privacy rules when storing or processing them. Rental listings are also subject to
fair-housing rules — do not use this data to discriminate in the rental, sale, or
financing of housing.

# Actor input Schema

## `searchUrls` (type: `array`):

Apartments.com search result URLs. Set your filters on Apartments.com, then paste the address bar URL here. Overrides the individual filters below when provided.

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

Area to search. Used only when Search URLs is empty.

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

Maximum listings per search URL (0 = collect everything each search returns). Apartments.com pages through at most 720 listings per search, so use several narrower searches to collect more.

## `enrichDetails` (type: `boolean`):

Add 21 extra fields per listing. Adds one request per listing and is billed at the higher rate.

## `concurrency` (type: `integer`):

How many requests to run in parallel. Lower this if you see failures.

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

Proxy settings for the run.

## Actor input object example

```json
{
  "searchUrls": [
    "https://www.apartments.com/charlotte-nc/"
  ],
  "location": "charlotte-nc",
  "maxItems": 100,
  "enrichDetails": false,
  "concurrency": 8,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `core` (type: `string`):

Core Fields for each listing.

## `financial` (type: `string`):

Price & Value for each listing.

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

Location for each listing.

## `contact` (type: `string`):

Contacts for each listing.

## `media` (type: `string`):

Media for each listing.

## `meta` (type: `string`):

Details & Timestamps for each listing.

# 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 = {
    "searchUrls": [
        "https://www.apartments.com/charlotte-nc/"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("solidcode/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 = { "searchUrls": ["https://www.apartments.com/charlotte-nc/"] }

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

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

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

```

## CLI example

```bash
echo '{
  "searchUrls": [
    "https://www.apartments.com/charlotte-nc/"
  ]
}' |
apify call solidcode/apartments-com-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=solidcode/apartments-com-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/ezLhlfG946dBUcTlA/builds/1GDnrEwBa4sqhcHei/openapi.json
