# Apartments.com Scraper - Rentals, Prices & Leads (`scrapesage/apartments-com-scraper`) Actor

Scrape Apartments.com by city: rent prices, floor plans with per-unit rents, beds/baths/sqft, amenities, pet policy, ratings & reviews, walk score, photos, the leasing-office phone and the property-management company. Turn every property into a B2B lead. No login, no key, no browser.

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

## Pricing

from $5.00 / 1,000 property scrapeds

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/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 — Rentals, Prices & Property Management Leads

Extract **complete Apartments.com rental data** — for any US city, get **real rent prices, floor plans with per-unit rents, beds/baths/sqft, amenities, pet policy, ratings & reviews, walk score, photos, the leasing-office phone** — and the field other scrapers leave empty: the **property-management company** behind each property. Every record is also a ready-to-use **B2B lead**, scored 0–100.

No login and no API key — extraction straight from Apartments.com (CoStar's #1 US rental marketplace) over US residential proxies, with a real browser engine that reliably clears Apartments.com's Akamai bot protection.

### Why this Apartments.com scraper?

Most Apartments.com scrapers return the listing card and stop. This actor merges the search results, the full property page **and** schema.org data into the **richest record in the category** — and it's the only one that surfaces the **management company** as a contactable lead, with a built-in **new-listing / rent-drop monitor**.

| Data | Typical scrapers | This actor |
|---|---|---|
| Property name, full address, geo | partial | ✅ |
| Rent min/max + price text | ✅ | ✅ |
| Floor plans with per-unit rent, beds, baths, sqft | ❌ | ✅ |
| Leasing-office **phone** | partial | ✅ |
| **Property-management company** | ❌ | ✅ |
| Property's own **website** + management **emails** | ❌ | ✅ opt-in |
| Amenities, fees, pet policy | partial | ✅ |
| Ratings & review count | ❌ | ✅ |
| Office hours, nearby schools, description | partial | ✅ |
| Photos & floor-plan layouts | partial | ✅ |
| Lead score (0–100) per property | ❌ | ✅ |
| New-listing & rent-drop **monitor** | ❌ | ✅ |

### Use cases

- **B2B lead generation** — property-management companies and leasing offices are active buyers of proptech, maintenance, insurance, accounting, smart-home, staffing and marketing services. Export them with phone, website and (opt-in) email, scored by `leadScore`.
- **Rental market & pricing intelligence** — track asking rents, concessions/specials, availability and floor-plan mix by city and property type.
- **Rent-drop & new-listing alerts** — schedule the actor in monitor mode to capture only properties that are new or whose rent changed.
- **Competitive research** — see which management companies run which properties, their ratings and amenities, across any market.
- **CRM & aggregation** — feed rental search apps, dashboards and outreach sequences with clean, structured data.

### How to use

1. [Sign up for Apify](https://console.apify.com/sign-up) — the free plan is enough to try this actor.
2. Open the **Apartments.com Scraper**, add one or more locations as `City, ST` (e.g. `Austin, TX`), choose property types, and click **Start**.
3. Watch results stream into the dataset table.
4. **Export** as JSON, CSV, Excel, XML, or RSS — or pull results programmatically via the [Apify API](https://docs.apify.com/api/v2).

### Input

```json
{
    "locations": ["Austin, TX", "Denver, CO"],
    "propertyTypes": ["apartments"],
    "maxResults": 100,
    "includeListingDetails": true,
    "enrichContactEmails": false,
    "monitorMode": false
}
```

- **locations** — US cities as `City, ST` (e.g. `Austin, TX`). Combined with every selected property type.
- **propertyTypes** — `apartments` (default), `houses`, `condos`, `townhomes`.
- **startUrls** — optional Apartments.com city/search URLs (e.g. `https://www.apartments.com/austin-tx/`) or single property pages; use these to apply Apartments.com's own filters via the URL.
- **maxResults / maxResultsPerSearch** — caps (default 100 total).
- **includeListingDetails** *(default true)* — open each property page for the management company, website, full description, full amenity list, pet policy, fees, nearby schools, office hours, all floor plans (with beds/baths/sqft) and photos.
- **minPrice / maxPrice / minBeds / maxBeds / petFriendlyOnly** — client-side filters.
- **enrichContactEmails** *(default false)* — crawl the property's own website (home + contact/about, max 3 pages) for the management company's emails, phones and socials. Apartments.com never exposes emails — this is the only way to get them.
- **monitorMode** *(default false)* — return only properties that are new or whose rent changed since the last run (tagged `monitorReason`).
- **proxyConfiguration** — US residential proxy by default (Apartments.com blocks datacenter IPs).

### Output

One record per property (`type: "property"`):

```json
{
    "type": "property",
    "propertyId": "p9z8x7w",
    "propertyName": "The Ashton Austin",
    "url": "https://www.apartments.com/the-ashton-austin-tx/p9z8x7w/",
    "propertyType": "apartments",
    "streetAddress": "2207 Leon St",
    "city": "Austin",
    "state": "TX",
    "zip": "78705",
    "fullAddress": "2207 Leon St, Austin, TX 78705",
    "latitude": 30.2861,
    "longitude": -97.7394,
    "phone": "(512) 555-0142",
    "managementCompany": "Greystar",
    "propertyWebsite": "https://www.theashtonaustin.com",
    "rentMin": 1695,
    "rentMax": 3250,
    "priceText": "$1,695 - $3,250",
    "bedsMin": 0,
    "bedsMax": 2,
    "bedText": "Studio - 2 Beds",
    "bathsMin": 1,
    "bathsMax": 2,
    "rating": 4.3,
    "reviewCount": 184,
    "floorPlans": [
        { "name": "A1", "beds": 1, "baths": 1, "sqft": 685, "rent": 1695 }
    ],
    "amenities": ["Pool", "Fitness Center", "In Unit Washer & Dryer", "Garage"],
    "petFriendly": true,
    "schools": ["Bryker Woods Elementary"],
    "officeHours": "Mon-Fri 9:00 AM - 6:00 PM; Sat 10:00 AM - 5:00 PM",
    "photos": ["https://images1.apartments.com/..."],
    "contactEmails": ["leasing@theashtonaustin.com"],
    "leadScore": 84,
    "searchLocation": "Austin, TX",
    "scrapedAt": "2026-06-24T12:00:00.000Z"
}
```

#### What to expect (field coverage)

Apartments.com is advertiser-entered data, so a few fields appear only when the property published them.

| Always present | Usually present (with details on) | Present when published / opted in |
|---|---|---|
| propertyName, url, city, state, leadScore, scrapedAt | streetAddress, rent range, beds/baths/sqft, phone, amenities, floor plans, photos, office hours | managementCompany, propertyWebsite, rating/reviews, schools, `contactEmails` (with enrichment) |

A blank field means the property didn't publish it — nothing is dropped, so you always get the richest record available.

**Property type matters.** Apartment communities carry the richest data (floor plans with per-unit beds/baths/sqft, fees, nearby schools, the management company, office hours). Individually-listed **houses and condos** on Apartments.com are often posted without a per-unit floor-plan breakdown, fees, or schools block, so those fields can be blank for the `houses`/`condos` types — that's the source, not the scraper. Core fields (name, address, rent, beds, photos, lead score) are populated across all types.

### Automate & schedule

Run this actor on autopilot and pull results into your own stack:

- **[Apify API](https://docs.apify.com/api/v2)** — start runs, fetch datasets, and manage schedules over REST.
- **[apify-client for JavaScript](https://docs.apify.com/api/client/js/)** and **[apify-client for Python](https://docs.apify.com/api/client/python/)** — official SDKs.
- **[Schedules](https://docs.apify.com/platform/schedules)** — run it daily/weekly with `monitorMode` to capture only new properties and rent drops.
- **[Webhooks](https://docs.apify.com/platform/integrations/webhooks)** — trigger downstream actions (CRM import, Slack alert, email sequence) the moment a run finishes.

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

const client = new ApifyClient({ token: 'MY_APIFY_TOKEN' });

const run = await client.actor('scrapesage/apartments-com-scraper').call({
    locations: ['Austin, TX'],
    propertyTypes: ['apartments'],
    maxResults: 100,
    includeListingDetails: true,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Got ${items.length} properties & leads`);
```

### Integrate with any app

Connect the dataset to 5,000+ apps — no code required:

- **[Make](https://docs.apify.com/platform/integrations/make)** — multi-step automation scenarios.
- **[Zapier](https://docs.apify.com/platform/integrations/zapier)** — push new property-management leads straight into your CRM.
- **[Slack](https://docs.apify.com/platform/integrations/slack)** — get notified when a monitored city gets new listings or rent drops.
- **[Google Drive / Sheets](https://docs.apify.com/platform/integrations/drive)** — auto-export every run to a spreadsheet.
- **[Airbyte](https://docs.apify.com/platform/integrations/airbyte)** — pipe results into your data warehouse.
- **[GitHub](https://docs.apify.com/platform/integrations/github)** — trigger runs from commits or releases.

### Use with AI assistants (MCP)

The output is clean, LLM-ready JSON. Call this actor from Claude, ChatGPT, or any agent framework through the **[Apify MCP server](https://docs.apify.com/platform/integrations/mcp)** — ask your assistant to "find apartments in Austin under $2,000 and list the management companies" and let it run the scraper for you.

### Agent-ready: autonomous payments (x402 & Skyfire)

This actor is **agent-ready** — AI agents can discover it, run it, and **pay for it autonomously**, with no Apify account and no human in the loop. It uses [pay-per-event](https://docs.apify.com/platform/actors/publishing/monetize/pay-per-event) pricing and [limited permissions](https://docs.apify.com/platform/actors/development/permissions), so it qualifies for Apify's agentic-payment standards:

- **[x402](https://docs.apify.com/platform/integrations/x402)** — an open, HTTP-native payment protocol. Agents pay per run in USDC on the Base network directly through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp) — no account, no API key.
- **[Skyfire](https://docs.apify.com/platform/integrations/skyfire)** — agent-to-service payments for fully autonomous AI-agent workflows.

Building an AI agent, MCP tool, or autonomous data pipeline? This scraper is ready to plug in and pay as it goes.

### More scrapers from scrapesage

Build a complete **real-estate & property lead-gen stack**:

- **[Rent.com Scraper](https://apify.com/scrapesage/rent-com-scraper)** — apartments, rentals and property leads from Rent.com.
- **[Zillow Scraper](https://apify.com/scrapesage/zillow-scraper)** — for-sale, for-rent and sold listings with agent leads.
- **[Redfin Scraper](https://apify.com/scrapesage/redfin-scraper)** — listings, prices and price history.
- **[Realtor.com Scraper](https://apify.com/scrapesage/realtor-com-scraper)** — properties, prices and agent leads.
- **[Crexi Scraper](https://apify.com/scrapesage/crexi-scraper)** — commercial real-estate listings and broker leads.
- **[FastExpert Scraper](https://apify.com/scrapesage/fastexpert-scraper)** — real estate agent leads, reviews and production stats.
- **[Google Maps Scraper](https://apify.com/scrapesage/google-maps-scraper)** — local business leads with contacts.
- **[Website Contact Scraper](https://apify.com/scrapesage/website-contact-scraper)** — emails, phones and socials from any website.
- **[Yellow Pages Scraper](https://apify.com/scrapesage/yellow-pages-scraper)** — local business listings and contacts.
- **[BBB Scraper](https://apify.com/scrapesage/bbb-scraper)** — accredited-business profiles and ratings.

### Tips

- **Keep `includeListingDetails` on** for the management company, floor plans and amenities — it's the difference between a listing and a lead. It adds one fast page per property.
- **Management leads**: turn on `enrichContactEmails` to crawl the property's own website for the management company's email — the only way to get a contact email, since Apartments.com doesn't publish them.
- **Big cities**: split very large markets by property type and use `maxResultsPerSearch` to keep runs fast.
- **Recurring monitoring**: combine [Schedules](https://docs.apify.com/platform/schedules) with `monitorMode` to track only new listings and rent drops.
- **Proxies**: keep the default US residential proxy — Apartments.com blocks datacenter IPs.
- **Reliability**: Apartments.com (CoStar) is behind Akamai and aggressively rotates IP blocks. This actor runs a real browser and automatically churns residential IPs until one clears, so the vast majority of runs return full data. During occasional short windows when Apartments.com blocks the whole residential pool, a run may end early with a clear message — simply re-run it a few minutes later.

### FAQ

**How do I scrape Apartments.com for a specific city?** Put it in `locations` as `City, ST` (e.g. `Austin, TX`), or paste a city URL like `https://www.apartments.com/austin-tx/` into `startUrls`. Combine with property types and filters to narrow.

**Does it work without an API key or login?** Yes. This actor extracts the same data a visitor sees from public Apartments.com pages — no key or login needed.

**Where do the emails come from?** Never from Apartments.com (they don't publish emails). With `enrichContactEmails` on, the actor visits the property's own public website and extracts publicly listed contact emails.

**Can I export to Google Sheets, CSV, or Excel?** Yes — one click in the dataset view, or automatically on every run via the [Google Drive integration](https://docs.apify.com/platform/integrations/drive).

**How do I monitor new listings or rent drops?** Create a [Schedule](https://docs.apify.com/platform/schedules), turn on `monitorMode`, and optionally add a [webhook](https://docs.apify.com/platform/integrations/webhooks) to push new properties into your CRM as they appear.

**A field is null — why?** Some properties don't publish a rating, website, or full amenity list. Fields are blank only when the data doesn't exist, not because the scraper skipped them.

**Is scraping Apartments.com legal?** This actor collects publicly available data only. You're responsible for using the data in compliance with applicable laws (e.g. GDPR/CCPA for personal data) and Apartments.com's terms.

### Need help?

Open an issue on the actor's **Issues** tab, or visit the [Apify help center](https://help.apify.com/). Feature requests are welcome — this actor is actively maintained.

# Actor input Schema

## `locations` (type: `array`):

US cities to scrape, as `City, ST` — e.g. `Austin, TX`, `Denver, CO`, `Miami, FL`. Combined with every selected property type.

## `propertyTypes` (type: `array`):

Which rental types to search per location.

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

Optional Apartments.com URLs to scrape directly — a city/search results page (e.g. `https://www.apartments.com/austin-tx/`) or a single property page. Use these to apply Apartments.com's own filters via the URL.

## `maxResults` (type: `integer`):

Total number of properties to return across all searches (0 = no limit — use with care).

## `maxResultsPerSearch` (type: `integer`):

Cap per (location × property type) search.

## `includeListingDetails` (type: `boolean`):

Open each property page to also capture the property-management company, property website, full description, full amenity list, fees, pet policy, nearby schools, office hours, all floor plans (with beds/baths/sqft) and photos. Adds one request per property.

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

Only keep properties whose top advertised rent is at least this.

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

Only keep properties whose lowest advertised rent is at most this.

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

0 = studio.

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

Only keep properties with at most this many bedrooms.

## `petFriendlyOnly` (type: `boolean`):

Only keep properties that allow pets.

## `enrichContactEmails` (type: `boolean`):

When a property links its own website, crawl it (home + contact/about, max 3 pages) for the management company's emails, phones and social links. Apartments.com itself never exposes emails — this is the only way to get them. Adds an extra charge only for properties that actually have a website.

## `maxPhotosPerListing` (type: `integer`):

Limit the number of photo URLs captured per property.

## `deduplicateListings` (type: `boolean`):

Skip duplicate properties within a run (same property listed across pages/types).

## `monitorMode` (type: `boolean`):

Remember properties from previous runs in a named key-value store and return ONLY properties that are new or whose rent changed (tagged with a `monitorReason` of new / priceDrop / priceChange). Perfect for scheduled rent-drop and new-listing alerts. Works alongside Apify Schedules (the schedule starts the run; monitor mode filters out what you've already seen).

## `monitorStoreName` (type: `string`):

Named key-value store used to remember seen properties across runs. Use a distinct name per monitored search.

## `debugDump` (type: `boolean`):

Diagnostic only — saves the raw HTML and a structure report of the first search and first property page to the key-value store. Leave off for normal runs.

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

Apartments.com (CoStar) is behind Akamai and blocks datacenter IPs, so US Datacenter is the default and clears Apartments.com fine on the anti-detect browser; switch to Residential only if you see repeated blocks.

## Actor input object example

```json
{
  "locations": [
    "Austin, TX"
  ],
  "propertyTypes": [
    "apartments"
  ],
  "maxResults": 100,
  "maxResultsPerSearch": 120,
  "includeListingDetails": true,
  "petFriendlyOnly": false,
  "enrichContactEmails": false,
  "maxPhotosPerListing": 25,
  "deduplicateListings": true,
  "monitorMode": false,
  "monitorStoreName": "apartments-monitor",
  "debugDump": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

Every scraped property in the default dataset. Switch to the Leads view for the B2B contact columns (management company, phone, website, emails, lead score).

# 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 = {
    "locations": [
        "Austin, TX"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapesage/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 = { "locations": ["Austin, TX"] }

# Run the Actor and wait for it to finish
run = client.actor("scrapesage/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 '{
  "locations": [
    "Austin, TX"
  ]
}' |
apify call scrapesage/apartments-com-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

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