# Apartments.com Scraper 🔥 $0.8/1K (`azzouzana/apartments-com-scraper`) Actor

From $0.8/1K 💰 Paste an Apartments.com search URL -> city, beds, price & amenity filters included. Rent by bed, address, phone, photos, specials, virtual tour flags & & much more! Optional full listing details and/or property photo gallery. JSON/CSV/API. US rentals. 🚀

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

## Pricing

from $0.80 / 1,000 results

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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

**Apartments.com rental search scraper 🔥 Fast & Bypass the 720-limit ⚡** Paste any **search results URL** - city, beds, baths, price, pets, map bounds & sort - and get **clean JSON/CSV** in seconds. Every row includes **rent by bed**, **phone**, **photos**, **amenities**, **specials**, **virtual tour links** & **listing URL**. Turn on **`fetchFullDetails`** for **rich property fields** (description, units, policies, reviews, transit & more), or **`fetchListingMedia`** for the **full property photo gallery** - each optional add-on is **charged separately**. **Need 1,000+ listings?** Raise **`maxItems`**. **US rentals - start now!**

👉 [Start free on Apify](https://apify.com/sign-up?fpr=cbgdsf) - **no credit card required.**

***

### 🤩 What you get

One **search URL** in → export-ready rental rows out. Antibot, pagination and deduplication are handled for you.

**Search cards (default)** - everything on the results placard:

`listingId` · `url` · `propertyName` · `address` · `streetAddress` · `phone` · `phoneRaw` · `rentRollup` · `amenities` · `specials` · `specialsBadges` · `primaryImage` · `images` · `logoUrl` · `photoCount` · `hasVirtualTour` · `has3dTour` · `virtualTourLinks` · `placardTier` · `scrapedAt`

**Optional full details** (`fetchFullDetails: true`) - **charged separately**. Adds deep listing fields to each row, including `availabilities`, `petPolicies`, `parkingPolicies`, `officeHours`, `transits`, `schools`, `colleges`, `profileFees`, `onetimeExpenses`, plus `desc`, `rating`, `reviews`, `managementCompany`, `location`, and more when the listing supports them.

**Optional listing media** (`fetchListingMedia: true`) - **charged separately**, independent of full details. Fetches the property-level **`attachments`** array on each row (`url`, `width`, `height`, `caption`, optional `au` for 3D/Matterport).

**Built for real workflows:**

- ✅ **Filter-preserving** - your URL’s beds, price, pets, and map area stay intact

- ✅ **Large exports** - Bypasses the 720 listings limit & duplicate listings are skipped automatically

- ✅ **Lead-gen ready** - phones, addresses, and links in every row

- ✅ **CRM-friendly** - one property per row for Airtable, HubSpot, or your pipeline

- ✅ **Pay for what you save** - each listing row is billed when saved; optional full details and listing media are **separate charges** when those toggles are on

***

### 🎯 Ready-to-run tasks

Pick a **pre-built task** - **`startUrl`** and **`maxItems`** are already set. One click to run; export JSON or CSV. Or run any search on [Apartments.com](https://www.apartments.com) and paste your own URL into the actor.

| Task | What it collects |
|------|------------------|
| [Austin, TX rentals - 100 listings](https://apify.com/azzouzana/apartments-com-scraper-search/examples/austin-tx-rentals-market-scan-100?fpr=cbgdsf) | City-wide Austin inventory: rent rollups, phone, photos, amenities |
| [Los Angeles 1 bed under $2,500 - rent low to high](https://apify.com/azzouzana/apartments-com-scraper-search/examples/los-angeles-1-bed-under-2500-rent-low-to-high?fpr=cbgdsf) | Filtered LA search with map bounds and `so=2` sort |

**Not supported:** single property detail URLs (e.g. `…/property-name/abc123/`). Always paste a **search results** page.

***

### 📚 How to use - 5-second setup

1. 👉 [Create a free Apify account](https://apify.com/sign-up?fpr=cbgdsf) - **no credit card required**

2. Open this actor → paste a **task URL** (or your own search URL) into **`startUrl`**

3. Set **`maxItems`** (default **500**)

4. Optional: **`fetchFullDetails`** and/or **`fetchListingMedia`** - independent toggles, each **charged separately**

5. Hit **Start** → download JSON, CSV, Excel, or pull via API

**Where to get `startUrl`:** Run your filters on Apartments.com, copy the address bar - that’s your input.

***

### 🛠️ Input

| Field | Type | Description | Default |
|-------|------|-------------|---------|
| `startUrl` | string | Apartments.com **search results** URL | Austin example in schema |
| `maxItems` | integer | Max unique listings to save | `500` |
| `fetchFullDetails` | boolean | Merge full property details into each row (separate charge) | `false` |
| `fetchListingMedia` | boolean | Fetch full property photo gallery per row (separate charge) | `false` |

Apartments.com shows about **40 listings per page**. Set **`maxItems`** to how many unique rows you want in the dataset.

***

### 💰 Pricing

You pay for what the run produces. **Search results** are billed per listing row saved. **`fetchFullDetails`** and **`fetchListingMedia`** are optional add-ons - each is **billed separately** when enabled (you can use one, both, or neither). See the actor **Pricing** tab on Apify for current rates.

***

### 💡 Why scrape Apartments.com?

- **Market rent surveys** - rollups by bed/bath across cities and submarkets
- **Lead lists** - property name, address, phone, and listing link at scale
- **Comp tracking** - re-run the same task URL on a schedule and spot new specials
- **Relocation & proptech** - structured feeds for apps, maps, and alerts
- **Deep dives** - `fetchFullDetails` for units, policies, reviews, and transit without manual clicks
- **Full galleries** - `fetchListingMedia` for every marketing photo URL, not just the search-card carousel

***

#### 🧐 Output sample (both `fetchFullDetails` & `fetchListingMedia` enabled)

```json

{
  "listingid": "vbxtzkg",
  "url": "https://www.apartments.com/1604-w-pico-blvd-los-angeles-ca/vbxtzkg/",
  "streetaddress": "1604 W Pico Blvd",
  "countrycode": "US",
  "feedvendorid": "173",
  "unitnumber": null,
  "featuredunit": "0",
  "listingId": "vbxtzkg",
  "streetAddress": "1604 W Pico Blvd",
  "countryCode": "US",
  "ck": null,
  "unitNumber": "",
  "featuredUnit": "0",
  "propertyName": "1604 W Pico Blvd",
  "propertyTitle": null,
  "address": {
    "cc": "US",
    "lineOne": "1604 W Pico Blvd",
    "lineTwo": "Los Angeles, CA 90015",
    "l": "Los Angeles",
    "s": "CA",
    "pc": "90015"
  },
  "addressTitle": "1604 W Pico Blvd, Los Angeles, CA 90015",
  "phone": "(323) 377-4961",
  "phoneRaw": "3233774961",
  "photoCount": null,
  "photoIndex": null,
  "images": [
    {
      "src": "https://images1.apartments.com/i2/sMwNA8aOKtmQ2b9fGf_8yxwok2-4nTP_1q2MWR6-pI4/118/1604-w-pico-blvd-los-angeles-ca-building-photo.jpg?p=1",
      "alt": "Building Photo - 1604 W Pico Blvd",
      "title": "Building Photo - 1604 W Pico Blvd"
    }
  ],
  "primaryImage": "https://images1.apartments.com/i2/sMwNA8aOKtmQ2b9fGf_8yxwok2-4nTP_1q2MWR6-pI4/118/1604-w-pico-blvd-los-angeles-ca-building-photo.jpg?p=1",
  "logoUrl": null,
  "logoLabel": null,
  "rentRollup": [
    {
      "bed": "1 Bed, 2 Baths, 16,570 sq ft",
      "price": "$1,600"
    }
  ],
  "amenities": [
    {
      "t": 3,
      "name": "Interior Amenities",
      "categoryId": 5,
      "groups": [
        {
          "i": 6,
          "name": "Kitchen",
          "amenities": [
            "Microwave"
          ]
        },
        "..."
      ]
    }
  ],
  "specials": null,
  "specialsBadges": [],
  "hasVirtualTour": false,
  "has3dTour": false,
  "virtualTourLinks": [],
  "hasMessageButton": true,
  "isStudentHousing": false,
  "placardTier": "placard-option-prosumer",
  "placardTemplate": "tmpl-basic-io",
  "placardClasses": [
    "placard",
    "placard-option-prosumer",
    "..."
  ],
  "hasHeader": false,
  "scrapedAt": "2026-09-24T18:01:32.825Z",
  "key": "vbxtzkg",
  "i": 40913615,
  "id": 40913615,
  "oneLineAddress": "1604 W Pico Blvd, Los Angeles, CA 90015",
  "adLevel": 0,
  "type": 2,
  "desc": "Studio units available starting at $1600 per month. Furnished or unfurnished available. Larger units with 2 baths starting at $2200 Parking MIGHT be available for the first tenants in the building. Furnished units and Great student housing based upon the convenient location to USC Village (30 minute walk) and Loyola (15 minute walk) MLS ID 26716193",
  "freshText": "1 day ago",
  "leaseTerms": "Call Office for Lease Terms",
  "location": [
    -118.2771933,
    34.044488
  ],
  "managementCompany": {
    "name": "eXp Realty of Greater Los Angeles",
    "agentFirstName": "John",
    "agentLastName": "Matukas"
  },
  "bedRange": "1 Bed",
  "rentRange": "$1,600",
  "hasLeadEmail": true,
  "hasEmail": true,
  "isFromFeed": true,
  "feedTypeId": 3,
  "feedLeaseStatus": "Active",
  "submarket": {
    "i": 29136,
    "name": "Pico-Union"
  },
  "prosumerLevel": 1,
  "listingStyle": "Apartment Unit For Rent",
  "specialties": 4,
  "specialtiesText": "Student",
  "isFurnished": false,
  "unitCount": 1,
  "status": 1,
  "lastModifiedDate": "2026-09-23T22:46:41.943-04:00",
  "vendorId": 173,
  "hasFeeTransparency": true,
  "priceRange": "$1,600",
  "hasText": false,
  "transits": [
    {
      "t": 1,
      "n": "Transit / Subway",
      "stops": [
        {
          "name": "Pico Station",
          "dist": "0.9 mi",
          "drive": "1 min",
          "walk": "16 min",
          "location": [
            -118.26613,
            34.04071
          ],
          "logoAttachments": [
            {
              "Logo": "http://ahprd1cdn.csgpimgs.com/i2/DpeI1iwqJi7eThKIRO9vWuiEWgvwLEIkvf-bZLvbwy0/1/image.png",
              "LogoType": 3
            },
            "..."
          ]
        },
        "..."
      ]
    }
  ],
  "colleges": [
    {
      "collegeId": 194,
      "assignmentType": 2
    },
    "..."
  ],
  "profileFees": [
    {
      "feeType": 17,
      "apartmentFeeTypeDesc": "Security Deposit - Refundable",
      "feeAmount": 1800,
      "isReducedWaved": false,
      "isRefundable": true,
      "isFeeRecurring": false,
      "monetaryUnitId": 1
    }
  ],
  "onetimeExpenses": [
    {
      "amount": "$1,800",
      "type": "Security Deposit"
    }
  ],
  "availabilities": [
    {
      "name": "1 Bed",
      "bedCount": 1,
      "details": [
        {
          "area": "16,570SF",
          "rentRange": "$1,600",
          "uk": "0wg1ne0",
          "availabilityText": "Now",
          "availabilityDate": "2026-09-23T00:00:00-04:00",
          "beds": "1 Bed",
          "baths": "2 Baths",
          "bedNum": "1",
          "bathNum": "2",
          "rentPricingType": 1,
          "desc": "Studio units available starting at $1600 per month. Furnished or unfurnished available. Larger units with 2 baths starting at $2200 Parking MIGHT be available for the first tenants in the building. Furnished units and Great student housing based upon the convenient location to USC Village (30 minute walk) and Loyola (15 minute walk) MLS ID 26716193",
          "deposit": 1800,
          "priceRange": "$1,600"
        }
      ],
      "matchType": 2
    }
  ],
  "uiFlags": 1,
  "fullDetails": true,
  "attachments": [
    {
      "url": "https://images1.apartments.com/m2/gY6KrAfBVa1H3egbLdQQU3A8jxvFA7i_lJiU4yspXoA/H800W800/map.jpg",
      "width": 800,
      "height": 800,
      "caption": "Map image of the property"
    },
    "..."
  ],
  "mediaFetched": true
}

```

With **`fetchFullDetails: true`**, the same row also includes extra property fields (e.g. `availabilities`, `petPolicies`, `parkingPolicies`, `officeHours`, `transits`, `schools`, `colleges`, `profileFees`, `onetimeExpenses`, `desc`, `reviews`) and `fullDetails: true` when enrichment succeeds.
With **`fetchListingMedia: true`**, you also get an **`attachments`** array on each row and `mediaFetched: true` when the gallery fetch succeeds.

***

### ❓ FAQ

**What URLs work?**

Any **search results** URL on `www.apartments.com` - city, neighborhood, filters, map bounds, and sort query params.

**How many listings can I pull?**

Set `maxItems` to your cap. THis actor bypass the 720 listings limitation. Duplicate listing IDs across the run are only saved once.

**What is `fetchFullDetails`?**

Optional per-listing enrichment (description, units, policies, reviews, etc.). **Charged separately** from search rows.

**What is `fetchListingMedia`?**

Optional property-level photo gallery. Works with or without full details. **Charged separately** - not bundled with full details or search rows.

**Single apartment page?**

Use a search URL, then open each property from the `url` field in your dataset.

***

### 🔎 SEO keywords

Apartments.com scraper, rental listings scraper, apartment search URL scraper, US rentals data, rent rollup scraper, apartment lead generation, property phone scraper, virtual tour listings, JSON CSV export, Apify Apartments actor, multifamily rent survey, Los Angeles apartments scrape, Austin rentals scrape, apartment availabilities, pet policies, parking policies, office hours, transit nearby, schools and colleges, rental profile fees, one-time move-in expenses

***

### 🔍 Looking for something else?

Browse more scrapers on [Apify Store](https://apify.com/store).

#### 📞 Contact us

**Need a custom solution, a tweak for your workflow, or just want to chat?**

- 💬 **Discord**: `@azzouzana`
- 📧 **Email**: <labs@azzouzana.com>

### ⚠️ Disclaimer

This actor is an **independent tool** and is **not affiliated with, endorsed by, or sponsored by** Apartments.com, CoStar Group, or their subsidiaries. **Apartments.com** and related marks are trademarks of their respective owners.

The actor collects **publicly visible** search-result data (and optional enriched listing fields when enabled). You are responsible for using exported data in line with **Apartments.com’s terms of use**, applicable **privacy laws**, and your local regulations. For general guidance on scraping, see [Apify’s legality article](https://blog.apify.com/is-web-scraping-legal?fpr=cbgdsf).

# Actor input Schema

## `startUrl` (type: `string`):

Apartments.com search URL, e.g. https://www.apartments.com/austin-tx/ or a filtered search with bedrooms or price.

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

Maximum number of unique listing cards to scrape

## `fetchFullDetails` (type: `boolean`):

Add rich fields for each listing (description, pets, parking, availability, transit, fees, and more). Billed separately.

## `fetchListingMedia` (type: `boolean`):

Fetch the full media gallery for each listing. Independent from full details. Billed separately.

## Actor input object example

```json
{
  "startUrl": "https://www.apartments.com/austin-tx/",
  "maxItems": 1000,
  "fetchFullDetails": false,
  "fetchListingMedia": false
}
```

# Actor output Schema

## `listings` (type: `string`):

Search card fields plus the complete native listing JSON merged into each row when full details are enabled.

# 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 = {
    "startUrl": "https://www.apartments.com/austin-tx/",
    "maxItems": 1000,
    "fetchFullDetails": false,
    "fetchListingMedia": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("azzouzana/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 = {
    "startUrl": "https://www.apartments.com/austin-tx/",
    "maxItems": 1000,
    "fetchFullDetails": False,
    "fetchListingMedia": False,
}

# Run the Actor and wait for it to finish
run = client.actor("azzouzana/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 '{
  "startUrl": "https://www.apartments.com/austin-tx/",
  "maxItems": 1000,
  "fetchFullDetails": false,
  "fetchListingMedia": false
}' |
apify call azzouzana/apartments-com-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,azzouzana/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/Q0bbbbz865DAMx6rs/builds/Ucr1ZicIRfEHCdH7v/openapi.json
