# Rentcafe Scraper (`shahidirfan/rentcafe-scraper`) Actor

Scrape Rentcafe rental listings instantly. Track property prices, market trends & competitor data. Export to JSON/CSV for real estate analysis, investment research & pricing intelligence. Essential for property managers, brokers & market researchers.

- **URL**: https://apify.com/shahidirfan/rentcafe-scraper.md
- **Developed by:** [Shahid Irfan](https://apify.com/shahidirfan) (community)
- **Categories:** Real estate, Automation, Developer tools
- **Stats:** 16 total users, 3 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: 5.00 out of 5 stars

## 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/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 Scraper

Extract structured apartment listing data from RentCafe city and search pages. Collect property names, addresses, rent ranges, bedroom and bathroom ranges, photos, amenities, availability signals, and listing links for rental market research, lead generation, and inventory monitoring.

### Features

- **Fast listing collection** - Collects RentCafe property data without waiting for a browser session.
- **Pagination support** - Continues across result pages until your requested record count is reached.
- **Clean dataset output** - Removes null and empty values before saving records.
- **Duplicate prevention** - Uses property identity and address fields to avoid repeated records.
- **Rich property details** - Captures pricing text, area ranges, amenities, images, contact details, and source URLs.
- **Recovery on failed pages** - Skips transient failed pages and continues when later pages are available.

### Use Cases

#### Rental Market Research

Track apartment inventory and rent ranges by city. Compare neighborhoods, estimate available supply, and monitor pricing movement.

#### Lead List Building

Create property lists with names, addresses, phone numbers, and listing URLs for CRM or spreadsheet workflows.

#### Competitor Monitoring

Compare advertised rents, bedroom mixes, amenities, and availability signals across target markets.

#### Data Pipelines

Feed RentCafe listing records into dashboards, reports, and automated alerts.

***

### Input Parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `startUrl` | String | No | `https://www.rentcafe.com/apartments-for-rent/new-york-city-ny/` | RentCafe city or listing URL to scrape. |
| `url` | String or Array | No | - | Optional alternate input for one or more RentCafe URLs. |
| `results_wanted` | Integer | No | `20` | Maximum number of records to save. |
| `max_pages` | Integer | No | `1` | Safety cap for page attempts; the actor may infer more pages when needed to satisfy `results_wanted`. |
| `proxyConfiguration` | Object | No | Apify Proxy Residential | Proxy settings for cloud runs. |

***

### Output Data

Each dataset item can include:

| Field | Type | Description |
|-------|------|-------------|
| `property_name` | String | Apartment property name. |
| `property_id` | Number | RentCafe property identifier. |
| `property_code` | String | Property code when available. |
| `address` | String | Street address. |
| `city` | String | City. |
| `state` | String | State abbreviation. |
| `zip_code` | String | Postal code. |
| `full_address` | String | Combined address. |
| `phone` | String | Contact phone number. |
| `site_url` | String | Property website or listing URL. |
| `detail_url` | String | RentCafe detail page URL. |
| `latitude` | Number | Latitude coordinate. |
| `longitude` | Number | Longitude coordinate. |
| `min_bedrooms`, `max_bedrooms` | Number | Bedroom range. |
| `min_bathrooms`, `max_bathrooms` | Number | Bathroom range. |
| `min_rent` | Number | Lowest advertised rent when numeric rent is shown. |
| `max_rent` | Number | Highest advertised rent when numeric rent is shown. |
| `price_display` | String | Original displayed pricing text, such as `$2,500 - $3,200` or `Ask for pricing`. |
| `min_area_sqft`, `max_area_sqft` | Number | Listed area range in square feet. |
| `amenities` | Array | Amenities shown for the listing. |
| `image_url` | String | Primary property image URL. |
| `image_urls` | Array | Additional image URLs. |
| `available_units_count` | Number | Available or waitlist count when supplied. |
| `company_name` | String | Property management company. |
| `source_page_url` | String | RentCafe page that produced the record. |
| `source_api_url` | String | Source response marker used for traceability. |
| `scraped_at` | String | ISO timestamp for extraction. |

***

### Usage Examples

#### Basic Extraction

```json
{
  "startUrl": "https://www.rentcafe.com/apartments-for-rent/new-york-city-ny/",
  "results_wanted": 20
}
```

#### Larger City Run

```json
{
  "startUrl": "https://www.rentcafe.com/apartments-for-rent/new-york-city-ny/",
  "results_wanted": 200,
  "max_pages": 4
}
```

***

### Sample Output

```json
{
  "property_name": "SKY",
  "property_id": 1737527,
  "address": "605 West 42Nd Street",
  "city": "New York",
  "state": "NY",
  "zip_code": "10036",
  "full_address": "605 West 42Nd Street, New York, NY, 10036",
  "phone": "(833) 391-1704",
  "site_url": "https://www.rentcafe.com/apartments/ny/new-york/sky/default.aspx",
  "detail_url": "https://www.rentcafe.com/apartments/ny/new-york/sky/default.aspx",
  "latitude": 40.7615,
  "longitude": -73.9986,
  "min_bedrooms": 0,
  "max_bedrooms": 3,
  "min_rent": 4091,
  "max_rent": 8455,
  "price_display": "$4,091 - $8,455",
  "amenities": ["Washer/Dryer", "Patio/Balcony", "Garage"],
  "image_url": "https://cdngeneral.rentcafe.com/dmslivecafe/example.jpg",
  "source_page_url": "https://www.rentcafe.com/apartments-for-rent/new-york-city-ny/",
  "scraped_at": "2026-07-04T11:58:58.049Z"
}
```

***

### Tips for Best Results

#### Use Valid RentCafe URLs

- Start with city result pages from RentCafe.
- Test one market before running many URLs.

#### Choose Practical Result Counts

- Use `20` for quick checks.
- Increase `results_wanted` for production collection.

#### Review Pricing Fields

- Numeric rent fields are included only when RentCafe shows numeric prices.
- Use `price_display` when a listing says `Ask for pricing`.

***

### Integrations

Connect extracted data with:

- **Google Sheets** - Review listings in a spreadsheet.
- **Airtable** - Build a searchable rental inventory table.
- **Make** - Send records into automated workflows.
- **Zapier** - Trigger updates in business apps.
- **Webhooks** - Deliver records to your own endpoint.

#### Export Formats

- **JSON** - For developers and automation.
- **CSV** - For spreadsheet analysis.
- **Excel** - For business reporting.
- **XML** - For legacy workflows.

***

### Frequently Asked Questions

#### Can I collect more than one page?

Yes. Set `results_wanted` high enough and the actor will continue through pagination.

#### Why are some numeric rent fields missing?

Some listings show `Ask for pricing` instead of a number. In those cases, the text is retained in `price_display`.

#### Does the actor remove duplicate listings?

Yes. It deduplicates records using property identity and address values.

#### Does it save null values?

No. Empty and null fields are removed from saved records.

***

### Support

For issues or feature requests, contact support through the Apify Console.

#### Resources

- [Apify Documentation](https://docs.apify.com/)
- [Apify API Reference](https://docs.apify.com/api/v2)
- [Scheduling Runs](https://docs.apify.com/platform/schedules)

***

### Legal Notice

This actor is designed for legitimate data collection and analytics workflows. You are responsible for complying with applicable laws, website terms, and data usage policies.

# Actor input Schema

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

RentCafe listing/search URL to start from.

## `results_wanted` (type: `integer`):

Maximum number of listing records to save.

## `max_pages` (type: `integer`):

Safety cap for pagination attempts.

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

Residential proxies are strongly recommended for reliable runs.

## Actor input object example

```json
{
  "startUrl": "https://www.rentcafe.com/apartments-for-rent/new-york-city-ny/",
  "results_wanted": 20,
  "max_pages": 1,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `overview` (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 = {
    "startUrl": "https://www.rentcafe.com/apartments-for-rent/new-york-city-ny/",
    "results_wanted": 20,
    "max_pages": 1
};

// Run the Actor and wait for it to finish
const run = await client.actor("shahidirfan/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 = {
    "startUrl": "https://www.rentcafe.com/apartments-for-rent/new-york-city-ny/",
    "results_wanted": 20,
    "max_pages": 1,
}

# Run the Actor and wait for it to finish
run = client.actor("shahidirfan/rentcafe-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 '{
  "startUrl": "https://www.rentcafe.com/apartments-for-rent/new-york-city-ny/",
  "results_wanted": 20,
  "max_pages": 1
}' |
apify call shahidirfan/rentcafe-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/IBM1gbiABm9n1CgP2/builds/YZ01PN1Eoyu5qlCPK/openapi.json
