# ForRent Scraper (`maximedupre/forrent-scraper`) Actor

Scrape ForRent.com rental listings from search URLs, property URLs, or city/state inputs. Export rent ranges, floor plans, photos, amenities, policies, schools, nearby places, and source URLs.

- **URL**: https://apify.com/maximedupre/forrent-scraper.md
- **Developed by:** [Maxime Dupré](https://apify.com/maximedupre) (community)
- **Categories:** Real estate
- **Stats:** 2 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.65 / 1,000 scraped properties

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

### 🏠 ForRent scraper for rental property data

ForRent Scraper collects public rental property listings from [ForRent.com](https://www.forrent.com/) and saves them as structured rows you can export, schedule, or use through the Apify API. Paste ForRent search URLs or direct property URLs, or build a search with city and state inputs, then get rent ranges, floor plans, photos, amenities, policies, schools, nearby places, contact details, source URLs, and scrape timestamps.

Use this ForRent scraper when you need rental listing data for market research, apartment supply checks, pricing analysis, lead research, local inventory tracking, or recurring property monitoring. For a small first run, keep the prefilled Austin search URL and `Maximum properties` set to `25`, then review the dataset before raising the limit.

### 🔎 What this ForRent data scraper does

- Scrapes public ForRent.com search result pages.
- Accepts ForRent search URLs and direct property URLs.
- Builds a ForRent search from city and state fields, with optional ZIP code or ForRent path.
- Saves one dataset row per accepted rental property.
- Automatically paginates search results until the requested property limit is reached.
- Fetches full property details by default for floor plans, media, policies, schools, nearby places, and scores.
- Can save faster search-card rows when full details are turned off.
- Supports a new-listings-only mode for scheduled monitoring.
- Stops at the hard `Maximum properties` cap across all targets.
- Works with Apify exports, schedules, webhooks, integrations, and API clients.

The Actor focuses on public ForRent.com rental listing data. It does not log in, use user-provided cookies, contact leasing offices, submit lead forms, scrape private dashboards, scrape other rental sites, or maintain a cross-run price history database.

### 📦 Data you can extract

Each dataset item is one ForRent property listing. Some fields can be empty when ForRent does not show or return that value for a property.

- `propertyId`, `listingKey`, and `aptsListingKey`
- `name`, `url`, `sourceUrl`, `targetType`, `sourcePage`, and `sourcePosition`
- `isActive`, `propertyType`, and `propertyStyle`
- `address` with street, city, state, ZIP code, latitude, longitude, and formatted text
- `rent`, `bedrooms`, `bathrooms`, and `squareFeet` ranges
- `availability` summary and available-unit count when shown
- `contact` with phone, website, property manager, and leasing office data
- `media` with primary photo, image URLs, image count, video flag, and tour flag
- `floorPlans` with beds, baths, rent, square feet, deposit, availability, image, and unit data
- `amenities` and community features
- `policies` for fees, pets, parking, lease terms, and other policy groups when returned
- `nearbyPlaces`, including schools and points of interest when available
- `scores` for walk, bike, transit, and sound data when available
- `source` evidence, including profile path, search URL, source update time, ad level, and badges
- `scrapeStatus`, `degradedReason`, and `scrapedAt`

### 🚀 How to run it

1. Open the Input tab.
2. Keep the prefilled ForRent Austin search URL, paste your own ForRent URLs, or enter a city and state.
3. Keep **Fetch full property details** on when you need floor plans, media, schools, policies, nearby places, and scores.
4. Set **Maximum properties** to control cost and runtime.
5. Turn on **Only new listings** only for scheduled runs where you want to skip properties saved by earlier runs.
6. Run the Actor and open the dataset.

You can export the finished dataset as JSON, CSV, Excel, XML, RSS, or HTML. You can also call the Actor through the Apify API, schedule repeated checks, or send results to another tool with webhooks.

### ⚙️ Input options

- `ForRent URLs` - ForRent search result URLs or direct property URLs.
- `City` - optional city for a generated ForRent search, such as Austin or Atlanta.
- `State` - two-letter US state code for the generated search.
- `ZIP code` - optional ZIP code refinement when using generated city and state search inputs.
- `ForRent path` - optional ForRent path such as `/find/TX/metro-Austin/Austin/extras-Rentals`.
- `Fetch full property details` - keep on for rich property rows; turn off for faster search-card rows.
- `Maximum properties` - hard cap for accepted property rows across all targets.
- `Only new listings` - skip properties already saved by previous runs of this Actor.

### 🧾 Example input

```json
{
	"startUrls": [
		{
			"url": "https://www.forrent.com/find/TX/metro-Austin/Austin/extras-Rentals"
		}
	],
	"fetchDetails": true,
	"maxItems": 25,
	"newListingsOnly": false
}
```

You can also start from a direct property URL:

```json
{
	"startUrls": [
		{
			"url": "https://www.forrent.com/tx/austin/foxtail-by-banyan/b75czr8"
		}
	],
	"maxItems": 1
}
```

### 📊 Example output

```json
{
	"propertyId": "b75czr8",
	"name": "Foxtail by Banyan",
	"url": "https://www.forrent.com/tx/austin/foxtail-by-banyan/b75czr8",
	"sourceUrl": "https://www.forrent.com/find/TX/metro-Austin/Austin/extras-Rentals",
	"targetType": "search",
	"sourcePage": 1,
	"sourcePosition": 1,
	"address": {
		"street": "2611 E Braker Ln",
		"city": "Austin",
		"state": "TX",
		"zipCode": "78754",
		"latitude": 30.3659255,
		"longitude": -97.6471804,
		"formatted": "2611 E Braker Ln, Austin, TX, 78754"
	},
	"rent": {
		"low": 1290,
		"high": 2400,
		"formatted": "$1,290 - $2,400"
	},
	"bedrooms": {
		"low": 1,
		"high": 3,
		"formatted": "1 - 3 Beds"
	},
	"media": {
		"primaryPhotoUrl": "https://images1.forrent.com/i2/RJRu3-pOyhF4RDh58dwqngddJLOMXx5oCWJj5jaL6Uk/117/image.jpg",
		"imageCount": 6,
		"hasVideo": false,
		"hasTours": false
	},
	"floorPlans": [
		{
			"name": "A1",
			"beds": 1,
			"baths": 1,
			"availability": "Available Now"
		}
	],
	"scrapeStatus": "ok",
	"scrapedAt": "2026-06-09T00:00:00.000Z"
}
```

### 💳 Pricing

This Actor uses pay-per-event pricing. You are charged only for accepted ForRent property rows saved by the Actor.

The current local pricing artifact sets the property price to `$0.00065` per saved property, or `$0.65 per 1,000 properties`. Failed inputs, empty searches, skipped known listings, and unsupported targets do not create charged property rows.

### ⚠️ Limits and caveats

- ForRent can omit fields on some properties. Missing source values are returned as `null` or empty arrays instead of being invented.
- Full details are richer but slower because each property may need a detail fetch.
- Search result order follows ForRent's returned order for the submitted URL or generated location search.
- ZIP code is a refinement for generated city and state searches. For exact source filters, paste the ForRent URL or path you want to reuse.
- **Only new listings** uses this Actor's storage. It skips properties seen by previous runs of the same Actor storage, not listings seen by another Actor or another account.

### ❓ FAQ

#### 🔐 Does this ForRent scraper need a ForRent account?

No. It collects public ForRent.com listing data and does not ask for a ForRent login, cookie, API key, or account.

#### 🔗 Can I scrape direct ForRent property URLs?

Yes. Paste direct property URLs in **ForRent URLs**. The Actor saves one row per accepted property and fetches full details when that option is enabled.

#### 🕒 Can I monitor only new ForRent listings?

Yes. Turn on **Only new listings** for scheduled runs. The Actor stores seen property IDs and skips properties it saved before.

#### 🧩 Can I use the dataset through the Apify API?

Yes. Like other Apify Actors, finished runs can be exported from the dataset, fetched through the Apify API, scheduled, or connected to webhooks and integrations.

### 📝 Changelog

- 0.1: Initial release.

### 🆘 Support

For issues, questions, or feature requests, [file a ticket](https://console.apify.com/actors/maximedupre~forrent-scraper/issues) and I'll fix or implement it in less than 24h 🫡

### 🔗 Other actors

- [Realtor Scraper ↗](https://apify.com/maximedupre/realtor-scraper) - Scrape Realtor.com sale, rent, sold, and pending property listings.
- [Idealista Agency Scraper ↗](https://apify.com/maximedupre/idealista-agency-scraper) - Find real estate agencies from Idealista listing result pages.
- [Yellow Pages Scraper ↗](https://apify.com/maximedupre/yellowpages-scraper) - Build local business lead lists with phones, websites, and addresses.
- [BusinessesForSale Scraper ↗](https://apify.com/maximedupre/businessesforsale-scraper) - Collect business opportunity listings, prices, locations, and seller links.
- [Autotrader Scraper ↗](https://apify.com/maximedupre/autotrader-scraper) - Scrape US vehicle listings with prices, VINs, sellers, and photos.

**Made with ❤️ by Maxime Dupré**

# Actor input Schema

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

Paste ForRent search result URLs or direct property URLs. You can mix URLs with the guided location fields.

## `city` (type: `string`):

City for a generated ForRent search, such as Austin, Atlanta, or Los Angeles.

## `state` (type: `string`):

Two-letter US state code for a generated city search, such as TX, GA, or CA.

## `zipCode` (type: `string`):

Optional ZIP code refinement for a generated city and state search.

## `forRentPath` (type: `string`):

Optional ForRent path such as /find/TX/metro-Austin/Austin/extras-Rentals. Use this to reuse a source path without the domain.

## `fetchDetails` (type: `boolean`):

Turn this off only when faster search-card rows are enough and you do not need floor plans, policies, media, schools, or nearby places.

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

Maximum property rows to save across all targets. The Actor stops when this many properties are accepted.

## `newListingsOnly` (type: `boolean`):

Skip properties already saved by earlier runs of this Actor. Use this for scheduled rental listing monitoring.

## `__isDebug` (type: `boolean`):

Internal operator-only debug mode.

## `__maxConcurrency` (type: `integer`):

Internal operator-only source request concurrency.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.forrent.com/find/TX/metro-Austin/Austin/extras-Rentals"
    }
  ],
  "city": "Austin",
  "state": "TX",
  "fetchDetails": true,
  "maxItems": 25,
  "newListingsOnly": false,
  "__isDebug": false
}
```

# Actor output Schema

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

Open the dataset with ForRent rental listings, rent ranges, floor plans, photos, amenities, policies, schools, nearby places, contact details, source URLs, and scrape timestamps.

# 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.forrent.com/find/TX/metro-Austin/Austin/extras-Rentals"
        }
    ],
    "city": "Austin",
    "state": "TX"
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/forrent-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.forrent.com/find/TX/metro-Austin/Austin/extras-Rentals" }],
    "city": "Austin",
    "state": "TX",
}

# Run the Actor and wait for it to finish
run = client.actor("maximedupre/forrent-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 '{
  "startUrls": [
    {
      "url": "https://www.forrent.com/find/TX/metro-Austin/Austin/extras-Rentals"
    }
  ],
  "city": "Austin",
  "state": "TX"
}' |
apify call maximedupre/forrent-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/7tFIGlcUffYi2Z411/builds/2EW9qh4OWdJhGSo8T/openapi.json
