# RentCafe Property Scraper  $0.9/1K — Apartments & Property (`ahmed_jasarevic/rentcafe-property-scraper`) Actor

Scrape RentCafe.com apartment listings from any search URL: property name, address, phone, rent ranges, beds/baths, sqft, amenities, availability signals, management company, photos and geo coordinates.

- **URL**: https://apify.com/ahmed\_jasarevic/rentcafe-property-scraper.md
- **Developed by:** [Ahmed Jasarevic](https://apify.com/ahmed_jasarevic) (community)
- **Categories:** Real estate, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.90 / 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/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

## RentCafe Property Scraper — Apartments, Rent Ranges & Property Managers

Scrape **apartment listings from [RentCafe.com](https://www.rentcafe.com/)** (Yardi's apartment listing platform) from any search URL. Extracts **property name, full address, phone, rent ranges, beds/baths, square footage, amenities, availability signals, property management company, photos and geo coordinates** — one clean JSON record per property. Runs on the [Apify platform](https://apify.com) with scheduling, API access, proxy rotation and monitoring built in.

Built for **real-estate investors, property managers, PropTech startups, rental market researchers and property-management lead-gen** use cases.

### Why use this actor?

- **Single search URL in, thousands of properties out** — paste a state page (`/apartments-for-rent/us/az/`), a city page (`/apartments-for-rent/new-york-city-ny/`), or any search URL with price/bedroom/type filters already applied. The actor follows pagination automatically.
- **Light and fast (CheerioCrawler)** — no browser is used. RentCafe server-renders the full listing dataset into every search page, and this actor extracts it directly, making runs ~10x cheaper than browser-based scrapers.
- **Investor-ready fields** — numeric `minRent`/`maxRent`, per-bedroom floor plan pricing, sqft ranges, availability labels and the property management company are all captured, not just display text.
- **Proxy rotation included** — runs through Apify Proxy (Residential recommended) to avoid Cloudflare blocking.

### How to use this actor

1. Go to the **Input** tab of this actor in Apify Console.
2. Add one or more RentCafe **search URLs** (see examples below).
3. Optionally set `maxItems` (properties to save) and `maxPagesPerUrl` (pagination depth).
4. Click **Start** and wait for the run to finish.
5. Download the results from the **Dataset** tab as JSON, CSV, Excel, or HTML.

```json
{
  "startUrls": [
    { "url": "https://www.rentcafe.com/apartments-for-rent/us/az/" },
    { "url": "https://www.rentcafe.com/apartments-for-rent/new-york-city-ny/" }
  ],
  "maxItems": 100,
  "maxPagesPerUrl": 5
}
```

### Input

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `startUrls` | array of URLs | required | RentCafe search-result URLs. State pages, city pages or filtered searches all work. |
| `maxItems` | integer | 100 | Maximum property records to save (max 10,000). |
| `maxPagesPerUrl` | integer | 5 | Maximum search-result pages to follow per URL (~25 properties per page). |
| `proxy` | proxy config | Apify Proxy Residential | Proxy used for all requests. |

Free Apify users get a capped preview of **10 properties** per run; paying users get full runs.

### Output

One dataset record per property:

```json
{
  "propertyId": "57873",
  "propertyName": "Estancia",
  "address": "2500 North Desert Links Drive",
  "city": "Tucson",
  "state": "AZ",
  "zipCode": "85715",
  "fullAddress": "2500 North Desert Links Drive, Tucson, AZ 85715",
  "phone": "(833) 285-9883",
  "priceDisplay": "$1,023 - $1,652",
  "minRent": 1023,
  "maxRent": 1062,
  "beds": "1-3 Beds",
  "baths": "1-2 Baths",
  "areaSqft": "618 - 1,128 Sqft",
  "floorplans": [
    { "beds": "1 bd", "rent": "$1,023+" },
    { "beds": "2 bd", "rent": "$1,062+" }
  ],
  "amenities": ["Air Conditioner", "Washer/Dryer", "Dishwasher", "Pool"],
  "listingCardAmenities": ["Apply online", "Pet friendly", "Parking"],
  "availability": {
    "hasAvailabilityLabel": true,
    "unitsAvailable": "Available",
    "unitsAvailableLabel": "",
    "newUnitsLabel": "New Units Available",
    "newListingLabel": ""
  },
  "companyName": "HSL Asset Management LLC",
  "photos": [
    "https://cdngeneral.rentcafe.com/dmslivecafe/2/58822/Kitchen(7).jpg?width=480&quality=90"
  ],
  "photoCount": 16,
  "latitude": 32.2533,
  "longitude": -110.8251,
  "detailsUrl": "https://www.rentcafe.com/apartments/az/tucson/estancia/default.aspx",
  "onlineLeasingUrl": "https://www.rentcafe.com/onlineleasing/...",
  "hasOnlineLeasing": true,
  "starRating": 0,
  "reviewsCount": 0,
  "lastUpdatedDate": "6 days ago",
  "has3dTour": true,
  "hasVideo": true,
  "sourceUrl": "https://www.rentcafe.com/apartments-for-rent/us/az/",
  "scrapedAt": "2026-08-10T08:45:00.000Z"
}
```

You can download the dataset in various formats such as **JSON, HTML, CSV, or Excel**.

### Data table

| Field | Description |
|-------|-------------|
| `propertyName` | Apartment community name |
| `fullAddress` / `city` / `state` / `zipCode` | Full address breakdown |
| `phone` | Leasing office phone number |
| `priceDisplay` / `minRent` / `maxRent` | Advertised rent range + numeric bounds |
| `beds` / `baths` / `areaSqft` | Unit size specs as shown on the listing |
| `floorplans` | Per-bedroom floor plan pricing |
| `amenities` | Community/apartment amenity names |
| `availability` | Availability labels, units available, new units |
| `companyName` | Property management company |
| `photos` / `photoCount` | Photo gallery URLs and count |
| `latitude` / `longitude` | Geo coordinates |
| `detailsUrl` / `onlineLeasingUrl` | Listing and online-leasing URLs |

### How much does it cost to scrape RentCafe?

This is a **CheerioCrawler (HTTP-only)** actor — no browser is used — so runs are cheap. A typical run of ~100 properties across a few search pages finishes in under a minute and consumes well under 1 compute unit on Apify. You can control cost precisely with `maxItems` and `maxPagesPerUrl`. Apify Proxy Residential usage is billed per GB and is included on paid plans.

### Tips and advanced options

- **Use residential proxy** if you hit Cloudflare blocking — keep the default `RESIDENTIAL` group in the proxy config.
- **Filters in the URL carry over** — e.g. add `?Bedroom=1,2` or `&PriceMax=2000` to a search URL to narrow the inventory before scraping.
- **Pagination is capped for safety** — bump `maxPagesPerUrl` only if you need deeper coverage of a large market.
- **Running the same market weekly** gives you a rental-inventory and pricing time series for market research.

### FAQ, disclaimers and support

- **Is this legal?** Scraping publicly available rental listings for research and lead generation is generally permissible, but you should review RentCafe.com's Terms of Service and applicable law before using the data commercially.
- **Why is `description` empty on some records?** The search page embeds short descriptions for some listings only; full descriptions live on detail pages, which are currently out of scope for this draft actor.
- **The actor detected a Cloudflare block** — re-run with Apify Residential proxy enabled (the default) or retry later.
- Found a bug or want a custom field (e.g. full detail-page enrichment, floor-plan sqft, pet policies)? Open an issue on the [Issues](https://apify.com) tab or contact us for a custom solution.

# Actor input Schema

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

RentCafe search-result URLs to scrape. Use state pages (e.g. https://www.rentcafe.com/apartments-for-rent/us/az/), city pages (e.g. https://www.rentcafe.com/apartments-for-rent/new-york-city-ny/) or any search URL with filters already applied. Add as many as you like.

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

Maximum number of property records to save across all URLs.

## `maxPagesPerUrl` (type: `integer`):

Maximum number of search result pages to follow per start URL (each page yields ~25 properties).

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

Apify Proxy with Residential IPs is recommended to avoid Cloudflare blocking.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.rentcafe.com/apartments-for-rent/us/az/"
    }
  ],
  "maxItems": 100,
  "maxPagesPerUrl": 5,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# 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": [
        {
            "url": "https://www.rentcafe.com/apartments-for-rent/us/az/"
        }
    ],
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

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

# Run the Actor and wait for it to finish
run = client.actor("ahmed_jasarevic/rentcafe-property-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": [
    {
      "url": "https://www.rentcafe.com/apartments-for-rent/us/az/"
    }
  ],
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call ahmed_jasarevic/rentcafe-property-scraper --silent --output-dataset

```

## MCP server setup

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