# Apartments.com API & Scraper — US Rentals + Walk Score (`sian.agency/apartments-com-property-scraper`) Actor

Apartments.com scraper and US rental data API. Search by location, ZIP, coordinates, address, URL or listing key; return rent, beds, baths, floor plans, property manager and contact details, amenities, pet policies, lease terms, walk scores, schools and reviews.

- **URL**: https://apify.com/sian.agency/apartments-com-property-scraper.md
- **Developed by:** [SIÁN OÜ](https://apify.com/sian.agency) (community)
- **Categories:** Real estate, Lead generation, Automation
- **Stats:** 10 total users, 3 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 property extracteds

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 API & Scraper — US Rentals + Walk Score 🚀

[![SIÁN Agency Store](https://img.shields.io/badge/Store-SI%C3%81N%20Agency-1AE392)](https://apify.com/sian.agency?fpr=sian) [![SIÁN Realtor Property Scraper](https://img.shields.io/badge/SI%C3%81N-Realtor%20Property%20Scraper-D92228)](https://apify.com/sian.agency/realtor-property-scraper?fpr=sian) [![SIÁN Redfin Property Scraper](https://img.shields.io/badge/SI%C3%81N-Redfin%20Property%20Scraper-A02021)](https://apify.com/sian.agency/redfin-property-scraper?fpr=sian) [![SIÁN Zillow Property Scraper](https://img.shields.io/badge/SI%C3%81N-Zillow%20Property%20Scraper-1F4E79)](https://apify.com/sian.agency/zillow-property-scraper?fpr=sian)

#### 🎉 The Apartments.com API your PropTech stack has been missing — 45+ fields per listing, median rent + $/bed + walk score API built into every run

##### Apartments.com scraper for PropTech engineers, multifamily underwriters, and rental-concierge tools across all 50 US states.

**Independent tool — not affiliated with CoStar Group, Inc.** Apartments.com® is a registered trademark of CoStar Group, Inc.; this actor is an independent data utility that reads only publicly published listings.

***

### 📋 Overview

**Need apartments.com data without building (and maintaining) your own apartments.com scraper?** This is the only apartments.com API on the Apify store that ships **built-in market-rent KPIs and a walk score API in a single run**.

**Why thousands of rental-data professionals choose us:**

- ✅ **50-state US coverage**: every active rental on apartments.com, including studios, multi-family, and corporate units
- ⚡ **Direct apartments.com API** — not a fragile browser scraper. **45+ structured fields per listing**, faster runs, no anti-bot risk
- 🏎️ **High-throughput large-area pulls**: each query returns up to **500 listings in a single request** (the upstream maximum per search) — big metros like NYC, LA, and Austin come back in far fewer round-trips instead of trickling 50 at a time
- 🎯 **Built-in market-rent KPIs**: median rent, $/bed, and rent-distribution percentiles per query — no post-processing required
- 💰 **Best price on the market**: 6-tier auto-ladder from $0.005 BRONZE down to $0.003 GOLD per listing. Fully enriched (walk score + schools + pet policy + lease terms) charged as **ONE** event — competitors split this into 5–7 separate charges
- 💎 **BigInt-safe JSON** — `amenitiesBitmap` and 64-bit identifiers preserved as strings (most apartments.com data extractors silently corrupt these)
- ✨ One-click enrichment bundle bundling walk score API, schools, amenities, photo gallery, pet policy, lease terms, rental costs, and per-unit availability in a single parallel fetch
- 💬 Renter reviews (full text + 1–5 ratings) and fee/expense schedules (application, admin, pet, parking fees + management phone + office hours) as per-listing add-ons — or enrich known listings directly by listing key/URL
- 🆕 **NEW**: Skip the search entirely — look up ONE listing directly by its **listing URL** or **street address**, plus an opt-in **similar listings** add-on (apartments.com's own comps by neighborhood/price/bedrooms)

***

### ✨ Features

- 🔍 **10 search modes** — by location, by zip, by coordinates (radial), by URL, NEW polygon boundaries, NEW region-ID targeting, bulk-location batches (PAID), direct listing keys/URLs (PAID), or direct-by-listing-URL / direct-by-address lookups
- 🏎️ **High-throughput pulls** — up to 500 listings per query in a single request (the upstream per-search ceiling), so large metros return their full result set fast
- 🏷️ **45+ structured fields per listing** — pricing range, bed range, manager, contact, geo, media, market signals
- 📊 **Built-in Market Rent KPIs** — median midpoint rent, median rent per bed, distribution percentiles, inventory tally by city and zip
- ⭐ **One-click enrichment bundle** — walk score API + transit + bike + schools + amenities + photo gallery + pet policy + lease terms + rental costs in parallel, charged as ONE `enrichment-fetched` event
- 💬 **Renter reviews add-on** — review title, full text, 1–5 rating, submission date, and helpful-vote count per listing; only listings that actually have reviews are charged
- 💵 **Fees & costs add-on** — one-time expenses, custom/admin fees, and profile fees with amounts, refundability, and recurrence — plus the property-management company (name + phone) and leasing-office hours in the same charge
- 🏘 **NEW: Similar listings add-on** — apartments.com's own comparable-listings recommendations (neighborhood, price band, bedroom count) per listing; only charged when comps were actually found
- 🔑 **Direct listing mode** — paste listing keys or apartments.com listing URLs to enrich known buildings without re-running a search (PAID)
- 🔗 **NEW: Direct-by-URL lookup** — paste one full apartments.com listing URL, get the full property record back, no search required
- 🏠 **NEW: Direct-by-address lookup** — paste a street address, get the matching listing back if apartments.com has one
- 🗺️ **Radial search** — lat/lng + miles radius for hyperlocal rent comps
- 📋 **Bulk-location mode** — batch dozens of US markets in one PAID run
- 🎨 **HTML KPI report** — KPI cards, distribution stats, methodology block saved to key-value store, ready for client decks
- 🛡️ **BigInt precision** — apartments.com data preserved 1:1 (no silent integer corruption)
- 💸 **Pay-per-result** — zero charge for empty runs or failed lookups

***

### 🎬 Quick Start

Run the actor with one curl command — get apartments.com data flowing into your stack in under 60 seconds.

```bash
curl -X POST https://api.apify.com/v2/acts/sian.agency~apartments-com-property-scraper/runs?token=YOUR_TOKEN \
  -H 'Content-Type: application/json' \
  -d '{"searchMode": "byZip", "zip": "10001", "maxResults": 25}'
```

***

### 🚀 Getting Started (3 Simple Steps)

#### Step 1: Pick a search mode

Choose **By Location** for free-text city/neighborhood, **By Zip** for precise 5-digit US targeting, **By Coordinates** for hyperlocal radial search, **By URL** to paste any apartments.com region/city page, or the NEW **By Listing URL** / **By Address** modes to look up ONE known listing directly — no search step at all.

#### Step 2: (Optional) Toggle the enrichment bundle

PAID-tier users: flip **Include enrichment bundle** ON to add walk score, schools, pet policy, lease terms, and rental costs to every listing — charged as ONE event per listing.

#### Step 3: Run it

Hit **Start**. You'll see real-time progress, a structured JSON dataset, and an HTML KPI report saved to the key-value store the moment the run finishes.

**That's it! In under 2 minutes, you'll have:**

- A clean dataset of fully structured apartments.com rental listings
- Market-rent KPIs (median, $/bed, distribution) per query
- A shareable HTML report ready for client decks

***

### 📥 Input Configuration

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `searchMode` | string | Yes | `byLocation`, `byZip`, `byCoordinates`, `byUrl`, `byPolygon` (NEW), `byRegionId` (NEW), `bulkLocations`, `byListingKeys`, `byListingUrl`, or `byAddress` |
| `maxResults` | integer | No | Hard cap per query (1–500; 500 is the upstream max per search, pulled in one high-throughput request; FREE auto-capped at 25). Default `100` |
| `location` | string | No\* | Free-text city/neighborhood — used in `byLocation` mode |
| `zip` | string | No\* | 5-digit US zip — used in `byZip` mode |
| `latitude` | number | No\* | Center latitude — used in `byCoordinates` mode |
| `longitude` | number | No\* | Center longitude — used in `byCoordinates` mode |
| `radius` | integer | No | Search radius in miles (1–50). Default `5` |
| `url` | string | No\* | apartments.com region/city URL — used in `byUrl` mode |
| `polygon` | string | No\* | NEW: closed ring of `lon lat` pairs separated by commas — used in `byPolygon` mode |
| `geographyId` | integer | No\* | NEW: apartments.com geography ID — used in `byRegionId` mode |
| `geographyType` | integer | No | NEW: geography type code matching the ID (city = 3, default) |
| `locations` | array | No\* | Array of US locations — used in `bulkLocations` mode (PAID) |
| `listingKeys` | array | No\* | Listing keys (e.g. `"7zg13yw"`) or apartments.com listing URLs — used in `byListingKeys` mode (PAID) |
| `listingUrl` | string | No\* | NEW: full apartments.com LISTING URL (not region/city) — used in `byListingUrl` mode. Not paid-only |
| `address` | string | No\* | NEW: full street address (street + city + state, ZIP optional) — used in `byAddress` mode. Not paid-only |
| `includeEnrichment` | boolean | No | Toggle the 9-fetch enrichment bundle (now includes amenities + photo gallery). Default `false` |
| `includeReviews` | boolean | No | Add renter reviews (title, text, rating, date) per listing (PAID). Default `false` |
| `includeFees` | boolean | No | Add fee/expense schedule + management company + office hours per listing (PAID). Default `false` |
| `includeSimilar` | boolean | No | NEW: Add apartments.com's own similar-listings recommendations per listing (PAID). Default `false` |

\*Required for the matching search mode.

**Example:**

```json
{
  "searchMode": "byZip",
  "zip": "10001",
  "maxResults": 25,
  "includeEnrichment": false
}
```

**Bulk Processing (PAID):**

```json
{
  "searchMode": "bulkLocations",
  "locations": ["Brooklyn, NY", "Austin, TX", "Seattle, WA"],
  "maxResults": 50,
  "includeEnrichment": true
}
```

**Direct listing enrichment — reviews + fees for known buildings (PAID):**

```json
{
  "searchMode": "byListingKeys",
  "listingKeys": [
    "7zg13yw",
    "https://www.apartments.com/the-eugene-new-york-ny/0smfmv0/"
  ],
  "includeReviews": true,
  "includeFees": true
}
```

**NEW — direct lookup by listing URL (no search, no listing key needed):**

```json
{
  "searchMode": "byListingUrl",
  "listingUrl": "https://www.apartments.com/the-eugene-new-york-ny/0smfmv0/",
  "includeSimilar": true
}
```

**NEW — direct lookup by street address:**

```json
{
  "searchMode": "byAddress",
  "address": "9 Homestead Pl, Jersey City, NJ"
}
```

***

### 📤 Output

Results are saved to the Apify dataset with **45+ structured fields** including:

| Field | Type | Description |
|-------|------|-------------|
| `listingKey` | string | Unique apartments.com property identifier |
| `listingTitle` | string | Building/property name or formatted address |
| `address` | object | Street, city, state, postal code, full one-line address |
| `pricing` | object | `rentRange` + parsed `rentMin`/`rentMax`/`rentMidpoint` |
| `specs` | object | `bedRange`, parsed `bedsMin`/`bedsMax`, `isMultifamily`, `isFurnished` |
| `location` | object | Latitude + longitude (decimal degrees) |
| `market` | object | `availabilityText`, `hasAvailabilities`, `rentDeals`, building rating |
| `media` | object | Primary image, multimedia URL, 3D scan URL |
| `propertyManager` | object | Manager name + apartments.com company ID |
| `contact` | object | Phone number + lead-email availability flag |
| `amenitiesBitmap` | string | BigInt-encoded amenity flags (string-preserved) |
| `details` | object | *(Enriched, PAID)* description + amenities + fees + leaseTerms + photos |
| `info` | object | *(Enriched, PAID)* yearBuilt, unitCount, storyCount, apartmentStyle |
| `walkScores` | object | *(Enriched, PAID)* walk score API + transit + bike scores |
| `schools` | array | *(Enriched, PAID)* Nearby schools grouped by category |
| `petPolicies` | array | *(Enriched, PAID)* Per-pet-type fees, deposits, weight limits |
| `rentalCosts` | object | *(Enriched, PAID)* Per-unit rent breakdown + monthly costs |
| `availabilities` | array | *(Enriched, PAID)* Per-floorplan availability detail |
| `amenitiesDetail` | array | *(Enriched, PAID, NEW)* Full amenities list — category / group / items |
| `photos` | array | *(Enriched, PAID, NEW)* Full-resolution photo gallery — url, caption, width, height, type |
| `reviews` | array | *(Add-on, PAID)* Renter reviews: title, full text, 1–5 rating, date, helpful votes |
| `reviewsTotal` | integer | *(Add-on, PAID)* Total review count for the listing |
| `fees` | object | *(Add-on, PAID)* One-time expenses + custom fees + profile fees with amounts and refundability |
| `management` | object | *(Add-on, PAID)* Property-management company name, phone, and submarket |
| `officeHours` | array | *(Add-on, PAID)* Leasing-office hours per weekday |
| `similarListings` | array | *(Add-on, PAID, NEW)* Comparable listings — listingKey, title, city/state, bedRange, rentRange, rating, image |
| `scrapedAt` | string | ISO timestamp of when this record was extracted |

**Example:**

```json
{
  "listingKey": "0smfmv0",
  "listingTitle": "The Eugene",
  "address": {
    "street": "435 W 31st St",
    "city": "New York",
    "state": "NY",
    "postalCode": "10001",
    "full": "435 W 31st St, New York, NY 10001"
  },
  "pricing": { "rentRange": "$4,500 - 10,000", "rentMin": 4500, "rentMax": 10000, "rentMidpoint": 7250 },
  "specs": { "bedRange": "Studio - 1 Bed", "bedsMin": 0, "bedsMax": 1, "isMultifamily": true },
  "location": { "lat": 40.7517, "lng": -73.9985 },
  "amenitiesBitmap": "1660381037712900511",
  "walkScores": { "walk": 98, "transit": 100, "bike": 89 },
  "scrapedAt": "2026-05-15T09:30:00.000Z"
}
```

***

### 💼 Use Cases & Examples

#### 1. PropTech rental-tool builders

**Stop maintaining a fragile apartments.com scraper — use the apartments.com API directly.**

**Input:** Target markets as `locations` (bulk mode).
**Output:** Fully structured listings + walk score API + schools — ready to power a tenant-search product.
**Use:** Drop into your backend; replace 800 lines of scraping code with one webhook call.

#### 2. Multifamily underwriting & rent-comp research

**Pull median rent and $/bed for any zip in seconds.**

**Input:** `byZip` for each comp zip in your underwriting model.
**Output:** Inventory count, median midpoint rent, and distribution percentiles per zip.
**Use:** Drop the KPI block into your DCF model; sanity-check sponsor rent assumptions.

#### 3. Rental concierges prospecting buildings

**One run returns contact, manager, amenities, pet policy, lease terms, and walk score.**

**Input:** `byCoordinates` for a 2-mile radius around your client's office.
**Output:** Every active building with manager contact, lead-email flag, pet rules, and lease terms.
**Use:** Build curated shortlists for relocation clients in under 30 minutes.

#### 4. Multi-market portfolio analysts

**Compare 30 US markets in one PAID run.**

**Input:** `bulkLocations` with 30 city/state pairs.
**Output:** Side-by-side market KPIs — median rent, $/bed, inventory by zip.
**Use:** Identify under-priced markets for cross-market portfolio expansion.

#### 5. Tenant-facing apps and AI chatbots

**Get apartments.com data into your LLM context window in clean JSON, not HTML.**

**Input:** User query → `byLocation` or `byZip` lookup.
**Output:** Clean structured JSON, ready to feed an LLM or display in a chat UI.
**Use:** Power "find me a 2-bed under $3000 in Brooklyn" conversational search.

#### 6. Academic researchers studying rental markets

**Reliable, structured apartments.com data — without writing a scraper.**

**Input:** Time-series runs across the same zips, scheduled weekly.
**Output:** Longitudinal rent dataset with timestamps and market signals.
**Use:** Track rent growth, vacancy proxies, and inventory shifts over time.

#### 7. Real-estate market-intelligence agencies

**Deliver client reports with apartments.com data underneath.**

**Input:** Client market list as bulk locations.
**Output:** HTML KPI report saved to key-value store + structured dataset.
**Use:** White-label the HTML report or pipe the dataset into your client's BI stack.

***

### 🔗 Integration Examples

#### JavaScript / Node.js

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });

const run = await client.actor('sian.agency/apartments-com-property-scraper').call({
  searchMode: 'byZip',
  zip: '10001',
  maxResults: 25,
  includeEnrichment: true
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Got ${items.length} listings — median rent:`, items[0].pricing.rentMidpoint);
```

#### Python

```python
from apify_client import ApifyClient
client = ApifyClient('YOUR_TOKEN')

run = client.actor('sian.agency/apartments-com-property-scraper').call(
    run_input={
        'searchMode': 'byLocation',
        'location': 'Austin, TX',
        'maxResults': 100,
        'includeEnrichment': False
    }
)

for item in client.dataset(run['defaultDatasetId']).iterate_items():
    print(item['listingTitle'], item['pricing']['rentMidpoint'])
```

#### cURL

```bash
curl -X POST 'https://api.apify.com/v2/acts/sian.agency~apartments-com-property-scraper/runs?token=YOUR_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{"searchMode": "byLocation", "location": "Brooklyn, NY", "includeEnrichment": true}'
```

#### Automation Workflows (N8N / Zapier / Make)

1. **Trigger**: Schedule (weekly market refresh) or webhook (on-demand client request)
2. **HTTP Request**: Call the actor's run endpoint with your search input
3. **Process**: Parse JSON results — every listing has a consistent 45+ field schema
4. **Action**: Save to Airtable / Google Sheets, ping Slack with KPI summary, or pipe into your BI

***

### 📊 Performance & Pricing

#### FREE Tier (Try It Now)

- **Up to 25 listings per run** — full feature access, same 45+ field schema as PAID
- No credit card required
- Perfect for testing, prototyping, and small validation projects

#### PAID Tier (Production Ready)

- **Up to 500 listings per query** in a single high-throughput request (the upstream per-search ceiling) — fast full pulls for big metros
- Run multiple queries per run via bulk-location mode to scale beyond one search area
- **Enrichment bundle unlocked** — walk score API, schools, pet policy, lease terms in one charge
- **Bulk-location mode** for multi-market batches
- **Pay-per-result** — zero charge for failed lookups or empty results

#### 6-Tier Pricing Ladder (auto-scales with your monthly volume)

| Event | FREE | BRONZE | SILVER | GOLD | PLATINUM | DIAMOND |
|---|---|---|---|---|---|---|
| Run start (one-time) | $0.12 | $0.012 | $0.012 | $0.012 | $0.012 | $0.012 |
| **Per listing extracted** (headline) | $0.030 | $0.005 | $0.004 | $0.003 | $0.003 | $0.003 |
| Enrichment bundle (per listing) | $0.030 | $0.008 | $0.006 | $0.005 | $0.004 | $0.004 |

💰 **Best price on the market** — at GOLD tier and up, you pay **$0.008 per fully enriched listing** (rent + walk score + schools + amenities + photo gallery + pet policy + lease terms + rental costs). Competitors charge $0.005+ for raw listings alone and fragment enrichment into 5–7 separate $0.001+ events.

📌 **Add-on charging** — the reviews add-on, the fees & costs add-on, and the NEW similar-listings add-on are each charged as **one** enrichment-bundle event per listing where data was actually found. Listings without reviews (or without published fee data, or without comps) are never charged for that add-on. In `byListingKeys` mode there is no per-listing extraction charge at all — you pay only for the add-on data delivered. The NEW `byListingUrl` / `byAddress` direct-lookup modes charge the same headline **per-listing-extracted** price as any search mode (one charge per resolved listing) — no new pricing tier.

🔗 [View current pricing](https://apify.com/sian.agency/apartments-com-property-scraper?fpr=sian)

***

### ❓ Frequently Asked Questions

**Q: What does the apartments.com API actually return?**
A: 45+ structured fields per listing — pricing range, bed range, address, manager, contact, geo, media, market signals — plus an optional enrichment bundle (walk score API + schools + amenities + photo gallery + pet policy + lease terms + rental costs). All in clean JSON.

**Q: How is this different from other apartments.com scrapers on Apify?**
A: We're the only one that ships **built-in market-rent KPIs** (median, $/bed, distribution per city/zip) and bundles walk score + schools + amenities + pet policy into a **single enrichment event** — plus direct-by-URL and direct-by-address lookups that skip the search step entirely. Competitors fragment enrichment into 5–7 separate charges and never compute KPIs. We also BigInt-preserve `amenitiesBitmap` so your downstream stack gets 1:1 fidelity.

**Q: How many listings can I process?**
A: FREE tier: 25 listings per run. PAID tier: up to 500 listings per query — the upstream maximum per search, pulled in a single high-throughput request (default `maxResults` 100). Need deeper coverage of a huge metro? Split it into tighter zip or coordinate searches, or run several queries in bulk-location mode.

**Q: Does this work with private or login-walled apartments.com data?**
A: No — only publicly accessible apartments.com data is supported. Personal contact details appear only when the listing itself publishes them.

**Q: What output formats are available?**
A: JSON (default), CSV, Excel — export directly from the Apify dataset console. The HTML KPI report is saved separately to the key-value store.

**Q: Can I get the walk score API without the rest of the enrichment bundle?**
A: Today, walk score is part of the bundled `enrichment-fetched` event (alongside schools, amenities, photos, pet policy, lease terms, and rental costs). Granular per-fetch toggles are on the roadmap — open an issue with your use case.

**Q: Can I get renter reviews, the full fee schedule, or similar listings?**
A: Yes — flip `includeReviews`, `includeFees`, and/or `includeSimilar` ON (PAID). Reviews return title, full text, 1–5 rating, submission date, and helpful-vote count; fees return the one-time/custom/profile fee schedule (application, admin, pet, parking, storage) plus the management company's name + phone and office hours; similar listings return apartments.com's own comps by neighborhood, price band, and bedroom count. Already know which building you care about? Use `byListingKeys`, `byListingUrl`, or `byAddress` mode to skip the search entirely.

**Q: How fresh is apartments.com data?**
A: Listings are fetched live at run time. Every record carries a `scrapedAt` ISO timestamp so you know exactly when the data was current.

**Q: Is this a rental property API I can build a product on?**
A: Yes — stable schema, pay-per-result pricing, 50-state coverage, direct API. PropTech teams, rental concierges, and multifamily underwriters use it in production.

***

### 🐛 Troubleshooting

**Search returned 0 listings**

- For `byLocation`: use a more specific form like `"Brooklyn, NY"` instead of just `"Brooklyn"`
- For `byZip`: verify the zip is 5 digits and a valid US zip
- For `byCoordinates`: increase the `radius` (try 10 miles)

**Enrichment fields are empty on FREE tier**

- The enrichment bundle is PAID-only. Upgrade your Apify plan or set `includeEnrichment: false`.

**Walk score / schools missing on some listings**

- Apartments.com does not publish walk score or school data for every listing. The actor still returns the listing record; the optional enrichment fields are simply absent for those rows.

**Bulk-location mode says "PAID tier required"**

- Bulk processing requires the PAID tier. Use `byLocation` or `byZip` in single-mode for FREE-tier runs.

**`byListingKeys` says "No data returned for this listing key"**

- Double-check the key — it's the short alphanumeric `listingKey` on every search-result row (also the last URL path segment on a listing page). Delisted buildings return no data; you are never charged for those.

**`byListingUrl` rejects my URL as invalid**

- It must be a full LISTING url ending in the property's listing-key segment (e.g. `.../the-eugene-new-york-ny/0smfmv0/`), not a region/city url. For region/city urls, use `byUrl` mode instead — it returns a full list of listings for that area.

**`byAddress` says "No property found for this address"**

- apartments.com only knows about properties it has an active listing for. Unlisted single-family homes and off-market buildings return no data — and you are never charged for that lookup. Try `byLocation` or `byZip` to search the surrounding area instead.

**`includeSimilar` shows 0 similar listings for some rows**

- Not every listing has comps — corporate/furnished housing and unique properties often return zero. This is normal apartments.com behavior, not an error, and you are never charged for a listing with no comps.

**`amenitiesBitmap` looks like a string instead of a number**

- That's intentional — `amenitiesBitmap` is a 64-bit unsigned integer that loses precision when parsed as a JS `Number`. We preserve it as a string for 1:1 fidelity. Parse with `BigInt()` if you need numeric ops.

***

### ⚖️ Trademarks & Compliance

**Independent tool — not affiliated with CoStar Group, Inc.** Apartments.com® is a registered trademark of CoStar Group, Inc. We use the name only to identify the public data source this independent tool reads from. There is no affiliation, endorsement, or business relationship.

***

### ⚖️ Is it legal to scrape data?

Our actors are ethical and do not extract any private user data, such as email addresses, gender, or location. They only extract what the user has chosen to share publicly. We therefore believe that our actors, when used for ethical purposes by Apify users, are safe.

However, you should be aware that your results could contain personal data. Personal data is protected by the **GDPR** in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.

You can also read Apify's blog post on the [legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

***

### 🤝 Support

[![Telegram Support](https://img.shields.io/badge/Telegram-Support%20Group-0088cc?logo=telegram)](https://t.me/+vyh1sRE08sAxMGRi)

**Join our active support community**

- For issues or questions, open an issue in the actor's repository
- Check [SIÁN Agency Store](https://apify.com/sian.agency?fpr=sian) for more automation tools
- 📧 <apify@sian-agency.online>

***

**Built by [SIÁN Agency](https://www.sian-agency.online)** | **[More Tools](https://apify.com/sian.agency?fpr=sian)**

# Actor input Schema

## `searchMode` (type: `string`):

How to find rental listings.

• **byLocation** — free-text city/neighborhood (e.g. "Brooklyn, NY")
• **byZip** — 5-digit US zip code (e.g. "10001")
• **byCoordinates** — lat/lng + radius (miles)
• **byUrl** — paste any apartments.com region or city URL
• **bulkLocations** — batch dozens of locations in one run (PAID)
• **byListingKeys** — enrich known listings directly by listing key or listing URL (PAID)
• **byListingUrl** — NEW: look up ONE listing directly by its full apartments.com listing URL, no search needed
• **byAddress** — NEW: look up ONE listing directly by its street address, no search needed
• **byPolygon** — closed polygon ring of `lon lat` pairs
• **byRegionId** — apartments.com geography ID (from its autocomplete: id + typeCode)

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

Hard cap on listings returned per query. Each query pulls up to 500 listings in a single high-throughput page (500 is the upstream maximum per search — narrow the area for deeper coverage). FREE tier is always capped at 25 listings per run.

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

Free-text US city or neighborhood. Examples:
• "Brooklyn, NY"
• "Capitol Hill, Seattle"
• "Austin, TX"
• "Williamsburg"

The API will fuzzy-match — your run summary will echo the matched location.

## `zip` (type: `string`):

5-digit US zip code (e.g. "10001", "78704").

## `latitude` (type: `number`):

Center latitude for a radial search.

## `longitude` (type: `number`):

Center longitude for a radial search.

## `radius` (type: `integer`):

Search radius in miles around the lat/lng center (1-50).

## `url` (type: `string`):

Paste any apartments.com region, city, or neighborhood URL. Examples:
• https://www.apartments.com/new-york-ny/
• https://www.apartments.com/brooklyn-ny/
• https://www.apartments.com/austin-tx/

## `polygon` (type: `string`):

Closed polygon as `lon lat, lon lat, …` (at least 4 points, lon first). First and last point must match (auto-closed if not).

Example (central Austin, TX): `-97.78 30.35, -97.68 30.35, -97.68 30.22, -97.78 30.22, -97.78 30.35`

## `geographyId` (type: `integer`):

apartments.com geography ID (e.g. 6062 = Austin, TX). Get it from apartments.com's location autocomplete: each suggestion carries `id` and `typeCode`.

## `geographyType` (type: `integer`):

The suggestion's `typeCode` (city = 3, the default). Must match the geography ID's type or the search returns 0 results.

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

Array of US location strings (one search per item). PAID tier only. Examples: \["Brooklyn, NY", "Austin, TX", "Seattle, WA"].

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

Known apartments.com listings to enrich directly — bare listing keys (e.g. "7zg13yw", the `listingKey` field on every search-result row) or full apartments.com listing URLs (e.g. "https://www.apartments.com/the-eugene-new-york-ny/0smfmv0/"). Combine with the enrichment / reviews / fees toggles below — if none is selected, reviews + fees are fetched by default. PAID tier only.

## `listingUrl` (type: `string`):

Full apartments.com LISTING url (not a region/city url) — must end in the listing's key segment. Example: "https://www.apartments.com/the-eugene-new-york-ny/0smfmv0/". Resolved server-side, so any URL form apartments.com itself links to will work — you don't need to already know the internal listing key.

## `address` (type: `string`):

Full property street address — street + city + state, ZIP optional. Example: "9 Homestead Pl, Jersey City, NJ". apartments.com only knows properties it has an active listing for — unlisted single-family homes return no data (and no charge).

## `includeEnrichment` (type: `boolean`):

When ON, fetches the full enrichment bundle for each listing in parallel: details (description + amenities + fees + lease terms + photos), info (year built, unit count, story count), walk/transit/bike scores, schools, pet policy, rental costs, unit-level availabilities, a standalone amenities list, and the full photo gallery. 9 extra API calls per listing run in parallel. Adds one enrichment-fetched charge per listing where at least one enrichment fetch succeeded. Disabled on FREE tier.

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

When ON, fetches renter reviews for each listing: title, full review text, 1–5 rating, submission date, owner flag, and helpful-vote count, plus the listing's total review count. 1 extra API call per listing. Adds one enrichment-fetched charge per listing that has at least one review — listings without reviews are never charged. Disabled on FREE tier.

## `includeFees` (type: `boolean`):

When ON, fetches the full fee/expense schedule for each listing (application, admin, pet, parking, and storage fees with amounts, refundability, and recurrence), the property-management company (name + phone), and leasing-office hours. 3 extra API calls per listing run in parallel, charged as one enrichment-fetched event per listing where data was found. Disabled on FREE tier.

## `includeSimilar` (type: `boolean`):

When ON, fetches apartments.com's own comparable-listings recommendations for each listing (matched by neighborhood, price band, and bedroom count) — up to a handful of lightweight comps per listing. 1 extra API call per listing. Adds one enrichment-fetched charge per listing that actually has comps — listings with zero comps are never charged. Disabled on FREE tier.

## Actor input object example

```json
{
  "searchMode": "byLocation",
  "maxResults": 100,
  "location": "Brooklyn, NY",
  "zip": "10001",
  "latitude": 40.7481,
  "longitude": -73.9886,
  "radius": 5,
  "url": "https://www.apartments.com/new-york-ny/",
  "geographyType": 3,
  "listingUrl": "https://www.apartments.com/the-eugene-new-york-ny/0smfmv0/",
  "address": "9 Homestead Pl, Jersey City, NJ",
  "includeEnrichment": false,
  "includeReviews": false,
  "includeFees": false,
  "includeSimilar": false
}
```

# Actor output Schema

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

Apartments.com rental listings with parsed pricing, beds, and optional enrichment.

## `htmlReport` (type: `string`):

Run summary with KPIs, distribution stats, and per-query totals.

# 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": "Brooklyn, NY"
};

// Run the Actor and wait for it to finish
const run = await client.actor("sian.agency/apartments-com-property-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": "Brooklyn, NY" }

# Run the Actor and wait for it to finish
run = client.actor("sian.agency/apartments-com-property-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 '{
  "location": "Brooklyn, NY"
}' |
apify call sian.agency/apartments-com-property-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

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