# RentCafe Scraper (`memo23/rentcafe-scraper`) Actor

Scrape US apartment listings from RentCafe.com — property name, address, geo, phone, rent range, per-floor-plan pricing (beds/baths/sqft), full amenities, management company, photos and the property's own website. Optional email enrichment. Search by URL or city. JSON/CSV.

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

## Pricing

from $1.00 / 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.

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

## RentCafe Scraper — US Apartments, Floor Plans, Prices & Contacts

Extract structured US apartment data from **RentCafe.com** at scale. Give the actor a RentCafe search URL (or just a city) and it returns one clean row per property: name, full address, geo-coordinates, phone, rent range, per-floor-plan pricing, the complete amenity list, the management company, the image gallery, and the property's own website — with optional contact-email enrichment.

![How the RentCafe Scraper works](https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/how-it-works-rentcafe.png)

### Why use this RentCafe Scraper

Most RentCafe scrapers hand you a thin listing row — a name and a price. This one opens each property page and returns the data that actually drives rental research and lead generation: **every floor plan with beds, baths, square footage and its own rent range**, the **full amenity list**, the **management company**, and the **property's own website** (which powers optional email discovery). No account, no cookies, no browser automation — a single search URL is enough.

- One row per property, analyst-ready — no padding rows.
- Floor-plan-level pricing, not just a headline range.
- Management company + property website + phone for outreach.
- Optional email enrichment from the property's own site.
- Search by URL **or** by plain location ("Austin, TX").

### Overview

RentCafe (by Yardi) powers apartment marketing sites for thousands of US multifamily communities. This actor pulls RentCafe listing and property data straight from RentCafe's own structured data channel and emits a normalized record per property. It resolves your location, pages through every matching property, deduplicates them, and (optionally) fetches each property's full detail — floor plans, amenities, pet policies and more.

### Supported inputs

| You provide | Example |
|---|---|
| A RentCafe listing/search URL | `https://www.rentcafe.com/apartments-for-rent/us/az/phoenix/` |
| A location keyword | `Austin, TX` · `az/phoenix` |

Other RentCafe verticals work too: houses-for-rent, townhomes-for-rent, condos-for-rent, senior-living, student-housing and storage-unit listing URLs.

### Use cases

- Build a US rental market dataset for pricing and availability analysis.
- Monitor rent ranges and floor-plan availability across a city over time.
- Generate leads: management company, phone, property website and email.
- Compare amenities and floor-plan mixes across competing communities.
- Feed apartment inventory into a search, map or comparison product.

### How it works

1. You supply a RentCafe listing URL or a location ("Austin, TX").
2. The actor resolves it to a search area and pages through every matching property.
3. For each property it pulls the full detail — floor plans (with live unit availability and rent specials), amenities, pet policies, management company and the property's own website.
4. Optionally, it reads that website for contact emails, phones and social links.
5. Each property is written to the dataset as one clean row.

### Input configuration

| Field | Type | Default | Description |
|---|---|---|---|
| `startUrls` | array | — | RentCafe listing or property URLs. |
| `search` | string | — | Location keyword ("City, ST", "st/city", or a URL). |
| `includeMoreDetails` | boolean | `true` | Open each property page for floor plans, full amenities, management company and property website. |
| `enrichEmails` | boolean | `false` | Read the property's own site for emails, phones and socials. Requires `includeMoreDetails`. |
| `useMobileApi` | boolean | `false` | Reserved for the mobile-API source; falls back to the website route. |
| `maxItems` | integer | `1000` | Maximum properties to scrape. |
| `maxConcurrency` | integer | `10` | Properties fetched in parallel. |
| `proxy` | object | built-in | Optional proxy override; the actor ships its own residential proxy. |

### Output overview

One dataset item per property. Example (trimmed) for **Solara**, Phoenix AZ:

```json
{
  "source": "mobile-api",
  "url": "https://www.rentcafe.com/apartments/az/phoenix/solara-apartments/default.aspx",
  "propertyId": "2018771",
  "name": "Solara",
  "managementCompany": "CIM Group, LLC.",
  "phone": "(623) 471-1968",
  "street": "7007 W Indian School Rd",
  "city": "Phoenix",
  "state": "AZ",
  "zip": "85033",
  "country": "us",
  "latitude": 33.4923,
  "longitude": -112.2088,
  "rentMin": 908,
  "rentMax": 1900,
  "currency": "USD",
  "propertyType": ["Apartment"],
  "bedsRange": "1 - 2",
  "bathsRange": "1 - 2",
  "rating": 3,
  "reviewCount": 2,
  "reviews": [
    { "reviewer": "Jose D.", "title": "David", "text": "Es muy bueno pero el Parking está muy lejos", "rating": 2.5, "date": "Apr 30, 2026", "verified": "Verified Resident" },
    { "reviewer": "Debra M.", "title": "Review", "text": "Name changed but hard to log on to portal at times.", "rating": 3.5, "date": "Oct 1, 2025", "verified": "Verified Resident" }
  ],
  "categoryRating": { "Parking": 2.2, "Amenities": 3.2, "Staff": 3.2 },
  "walkScore": 68,
  "verified": true,
  "topRatedLabel": "Resident Rated",
  "floorPlans": [
    { "name": "LUNA", "beds": "1", "baths": "1", "sqft": "626 sqft", "rentText": "$908 - $1590", "rentMin": 908, "rentMax": 1590, "hasSpecials": true, "availableUnits": 24, "rentSpecials": ["$100 Apply Today and receive ONE MONTH RENT FREE!"] },
    { "name": "SOL", "beds": "2", "baths": "2", "sqft": "885 sqft", "rentText": "$1218 - $1900", "rentMin": 1218, "rentMax": 1900, "hasSpecials": false, "availableUnits": 3 }
  ],
  "amenities": ["Air Conditioner", "Dishwasher", "Pool", "Fitness Center", "Washer/Dryer"],
  "petPolicies": [
    { "petType": "Pet Friendly", "maxAllowed": 2, "fee": 150, "monthlyRent": 35, "comment": "Maximum of 2 pets per residence.", "restrictions": "We do not allow exotic animals." }
  ],
  "images": ["https://cdnilscf.rentcafe.com/dmslivecafe/2/248276/CIM_Solara_dsc04283.jpg"],
  "propertyWebsite": "https://www.cimgroup.com/",
  "socialLinks": { "facebook": "https://www.facebook.com/livesolaraapartments/", "instagram": "https://www.instagram.com/livesolara/" },
  "googleMapsUrl": "https://www.google.com/maps?cid=3289394725447106699",
  "applicationUrl": "https://www.rentcafe.com/onlineleasing/apartmentsforrent/oleapplication.aspx?propleadsource_2018771=rentcafe&stepname=Apartments&myOlePropertyId=2018771",
  "lastUpdated": "2026-09-28T00:00:00Z",
  "scrapedAt": "2026-09-28T00:00:00.000Z"
}
```

### Key output fields

| Field | Description |
|---|---|
| `name`, `propertyId` | Property name and RentCafe property id. |
| `managementCompany` | The company that manages the community. |
| `street`, `city`, `state`, `zip`, `country` | Full postal address. |
| `latitude`, `longitude` | Property coordinates. |
| `phone` | Leasing phone number. |
| `rentMin`, `rentMax`, `currency` | Advertised rent range. |
| `propertyType`, `bedsRange`, `bathsRange` | Property type label(s) and the bed/bath ranges. |
| `rating`, `reviewCount`, `categoryRating` | Overall resident rating, review count, and per-category ratings (with `includeMoreDetails`). |
| `reviews[]` | Individual resident reviews: reviewer, title, text, rating, date, verified status (with `includeMoreDetails`). |
| `walkScore`, `verified`, `topRatedLabel`, `videos`, `propertyLogo` | Walk score, verified-listing flag, badge label, video URLs and the property logo (with `includeMoreDetails`). |
| `floorPlans[]` | Per-plan name, beds, baths, sqft, rent range, live `availableUnits`, and `rentSpecials`. |
| `amenities[]` | Community and unit amenities, resolved to human names. |
| `petPolicies[]` | Per pet type: max allowed, deposit, fee, monthly pet rent, weight limit, restrictions. |
| `images[]` | Property photo URLs. |
| `description` | Full marketing description. |
| `propertyWebsite` | The management company's own website. |
| `socialLinks` | Facebook / Instagram / X / Yelp / Pinterest / Google links, when present. |
| `googleMapsUrl`, `lastUpdated` | Google Maps place link and the property's last-updated date. |
| `applicationUrl` | Direct link to the property's RentCafe online rental application. |
| `emails`, `contactPhones`, `socials` | Present when `enrichEmails` is on and the site exposes them. |

### FAQ

**Do I need a RentCafe account or cookies?** No. Public listing and property pages only.

**Will every property have emails?** No. Emails come from the property's own website; many communities route contact through a form and expose no address. `emails` is present only when one is found.

**How does pagination work?** The actor reads the total result count for your area and pages through all of it, up to your `maxItems`.

**Does it work outside Phoenix?** Yes — any RentCafe location. Pass a listing URL for the city/state you want, or a `search` keyword.

**Can I pass a single property URL?** Use a listing/search URL or a location; the actor collects every property in that area. A location keyword like "Austin, TX" works too.

### Support

Found a bug or need a field added? Open an issue on the actor's Issues tab and it will be addressed.

### Additional services

Need contact enrichment on another site, or a scraper for a directory not yet covered? These same patterns apply to most listing and directory sites.

### Explore more scrapers

This actor is part of a family of US rental scrapers covering Apartments.com, Rent.com, ForRent, ApartmentFinder, Zumper and more.

### 🤖 For AI agents & LLM apps

This actor is MCP- and agent-friendly. It takes a single URL or location string and returns clean, typed JSON — no HTML, no pagination handling, no anti-bot logic for the caller to manage. Point an agent at a city and get back a structured list of properties with pricing, floor plans, amenities and contacts, ready to reason over.

### ⚠️ Disclaimer

This actor collects only publicly available information from RentCafe.com. It does not access private, gated, or personal data, and it does not bypass authentication. Use the data in compliance with RentCafe's terms and all applicable laws, including data-protection regulations where you operate. You are responsible for how you use the output.

### SEO keywords

RentCafe scraper, RentCafe API, scrape RentCafe, RentCafe apartments, US apartment data, apartment listings scraper, rental listings API, floor plan pricing, apartment amenities data, property management leads, multifamily data, apartment rent prices, rental market data, Yardi RentCafe, apartments for rent scraper.

# Actor input Schema

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

RentCafe listing/search URLs to scrape (e.g. https://www.rentcafe.com/apartments-for-rent/us/az/phoenix/) — every property in that area is collected. Optional if you supply a "Search" keyword instead.

## `search` (type: `string`):

Location to scrape instead of (or in addition to) a URL. Accepts "City, ST" (e.g. "Austin, TX"), a "ST/City" pair ("az/phoenix"), or a full RentCafe URL. Converted to a RentCafe listing URL and crawled alongside any Start URLs.

## `includeMoreDetails` (type: `boolean`):

Fetch each property's detail page to add floor plans (name, beds, baths, sqft, rent range, specials), the full amenity list, the management company, the image gallery and the property's own website. Off = faster, listing-level fields only (name, address, geo, phone, price range, top amenities). One extra request per property when on.

## `enrichEmails` (type: `boolean`):

Best-effort: reads the property's own website (captured on the detail page) and its contact pages for emails, phones and social links. Adds emails, contactPhones and socials. Requires "Include full property details". Works mainly for communities that publish an email on their own site; billed per property that returns an email.

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

Maximum number of properties to scrape across all Start URLs.

## `maxConcurrency` (type: `integer`):

Maximum number of properties fetched in parallel.

## `proxy` (type: `object`):

Leave empty — the actor already routes traffic through its own built-in residential proxy. Only set this to use your own proxies.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.rentcafe.com/apartments-for-rent/us/az/phoenix/"
  ],
  "includeMoreDetails": true,
  "enrichEmails": false,
  "maxItems": 1000,
  "maxConcurrency": 10
}
```

# Actor output Schema

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

No description

# API

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

## JavaScript example

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

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

// Prepare Actor input
const input = {
    "startUrls": [
        "https://www.rentcafe.com/apartments-for-rent/us/az/phoenix/"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/rentcafe-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 = { "startUrls": ["https://www.rentcafe.com/apartments-for-rent/us/az/phoenix/"] }

# Run the Actor and wait for it to finish
run = client.actor("memo23/rentcafe-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 '{
  "startUrls": [
    "https://www.rentcafe.com/apartments-for-rent/us/az/phoenix/"
  ]
}' |
apify call memo23/rentcafe-scraper --silent --output-dataset

```

## MCP server setup

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