# Furnished Finder Scraper - Rental Price Monitor (`benthepythondev/furnished-finder-scraper`) Actor

Search monthly furnished rentals with prices, availability and amenities. Monitor newly observed listings and rental price changes.

- **URL**: https://apify.com/benthepythondev/furnished-finder-scraper.md
- **Developed by:** [Ben](https://apify.com/benthepythondev) (community)
- **Categories:** Real estate, Business, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.50 / 1,000 listings

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/actors/running/actors-in-store.md#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

## Furnished Finder Scraper and Rental Price Monitor

Collect public furnished monthly rental listings from Furnished Finder, including advertised rent, bedrooms, bathrooms, availability, amenities and listing links. Use a city search for a current snapshot, or save a monitor to receive newly observed rentals and price changes. Export to JSON/CSV/Excel, run on a schedule, call via API, or connect to Make, Zapier or n8n.

### What does this Actor extract?

This Actor searches US cities on Furnished Finder. It suits rental market research, corporate housing comparisons and recurring searches for furnished accommodation. Choose an entire unit or a room, apply a monthly budget, and require amenities such as pets allowed or utilities included.

The output contains:

- **Rental identity:** source listing ID, title, canonical property URL and city slug.
- **Advertised terms:** monthly price and currency, bedrooms, bathrooms, bathroom type, sleeping capacity and minimum stay.
- **Availability:** the source's availability text, a calendar date when one is supplied, and its available-now flag.
- **Amenities and images:** the public amenity list, laundry type, pets and utilities flags, photo URLs and an image for the overview.
- **Location and source badges:** approximate coordinates, fast-responder and recently-added flags, plus the observation timestamp.

Coordinates are approximate. A source badge is the source's classification, not an independent verification. This Actor does not provide landlord email addresses, private messages, booking confirmation or a history from before your first run.

### Input

| Field | Purpose | Default |
|---|---|---|
| `location` | City slug such as `us--tx--austin`, or an unfiltered Furnished Finder housing URL | Austin, Texas |
| `maxResults` | Maximum listings to collect, between 1 and 1,000 | 10 |
| `minPrice`, `maxPrice` | Inclusive advertised monthly rent bounds in USD | Unrestricted |
| `minBedrooms`, `minBathrooms` | Minimum room counts | Unrestricted |
| `propertyType` | `entire_unit` or `room` | Both |
| `petsAllowed` | Require the pets-allowed amenity | false |
| `utilitiesIncluded` | Require the utilities-included amenity | false |
| `moveInDate`, `moveOutDate` | Optional availability window using `YYYY-MM-DD` | Unrestricted |
| `onlyChanges` | Enable a persistent monitor | false |
| `monitorId` | Your identifier for one saved search | Derived from search input |
| `emitInitial` | Export the first monitor baseline | true |
| `resetMonitor` | Replace this monitor's baseline after a successful run | false |

Set filters in these fields rather than pasting a housing URL with query parameters. `false` for a required-amenity field leaves that amenity unrestricted; it does not mean pets or utilities must be absent. A move-out date requires a move-in date and must be later.

#### Example input

```json
{
  "location": "us--tx--austin",
  "maxResults": 10,
  "maxPrice": 2000,
  "minBedrooms": 2,
  "petsAllowed": true
}
```

This selects advertised pet-friendly rentals with at least two bedrooms and monthly rent up to $2,000. If your conditions match nothing, a successful empty dataset is possible. Invalid inputs and failed source responses fail the run rather than being presented as a successful empty search.

### Output

A public listing observed during development on September 9, 2026 had these fields. Listings and prices can change after that observation:

```json
{
  "listing_id": "1037683_1",
  "title": "French-Inspired Luxury Condo in Walkable Clarksville",
  "url": "https://www.furnishedfinder.com/property/1037683_1",
  "location": "us--tx--austin",
  "price": 3400.0,
  "currency": "USD",
  "price_period": "month",
  "bedrooms": 1,
  "bathrooms": 1,
  "available_date": "2026-09-20"
}
```

The default dataset contains the complete records. Open **Output → Overview** for the main comparison columns, or export all fields to retain images and amenities. `price` is an advertised monthly amount, not the complete cost of a stay. Deposits, cleaning fees and other terms may require reviewing the listing. A source price of zero is not evidence of free accommodation.

The run's key-value store also contains `SUMMARY`, with the number of collected and exported listings. Null dates mean the source did not supply a date in the supported format; consult `availability_text` instead of treating null as immediately available.

### Run a saved monitor

Set `onlyChanges` to `true`, choose a `monitorId`, then save the input as an Apify Task. Schedule that Task at an interval suitable for your use case. Start with a daily schedule and prevent overlapping runs of the same monitor.

On the first run, `emitInitial: true` exports the baseline as `new` observations. Set it to `false` to seed the baseline without exporting those rows. Subsequent runs export `new`, `price_changed` or `details_changed` records. Changed records include `previous_price`, `monitor_id` and `detected_at`. The price comparison uses the last successful observation of that listing.

Each monitor keeps state in a named key-value store belonging to the account that runs it. It remembers up to 5,000 listings for 90 days. A listing seen again after its entry expires can be reported as new. Changing the search input creates a separate automatic monitor unless you provide an explicit ID. Use a new ID when comparing unrelated searches.

This is observation-based monitoring. A newly observed listing may have existed before your first scan. Search ranking, promotions and inventory changes can move records into or out of a limited result window. The Actor does not classify missing listings as rented, removed or unavailable, and it cannot detect a change to a listing that was outside the scanned window. Increase coverage deliberately when a broader comparison is required.

### Pricing

The base result price is **$0.005 per exported listing or change**, equivalent to $5 per 1,000 results. The base start event is $0.00005 per run per allocated GB, with a minimum of one event. At 512 MB, a ten-row run therefore has a base event charge of $0.05005. Higher Apify Store tiers receive progressive discounts; the Pricing tab shows the currently applicable rates and platform usage terms.

Unchanged records and a seed-only baseline are not pushed to the dataset and do not incur result-event charges. Runs can still incur the start event and applicable platform costs. Set a maximum charge in Apify as an additional spending bound. When the result budget is exhausted, unexported changes are not remembered as delivered.

### Use cases

- Compare furnished monthly rental prices across selected US cities.
- Maintain a housing shortlist for relocations or temporary assignments.
- Track asking-price changes within a repeatable rental search.
- Feed source-linked observations into a spreadsheet or your own dashboard.

### FAQ

**Does this book a property?** No. Contact the listing through Furnished Finder and confirm the current terms separately.

**Is a Furnished Finder login required?** No. The Actor collects public search listings and does not use customer login sessions.

**Can I search multiple cities?** Run one saved Task per city. This keeps filters, schedules and monitor baselines easy to manage.

**Can I obtain every listing?** A run is bounded to 1,000 collected records, and source search order can change during pagination. Treat it as a bounded snapshot rather than a guaranteed complete census.

**Why did a monitor return zero rows?** It may have found no tracked changes, seeded its first baseline, or matched no rentals. Check `SUMMARY` and the run log.

**Can two runs share a monitor ID?** Sequential runs can. Concurrent runs can overwrite each other's baseline, so schedule one active run per monitor.

**What happens after an output write fails?** The run fails and does not advance its monitor baseline. Some earlier rows may already exist in the dataset; use `listing_id` when deduplicating retried deliveries.

**What does resetting do?** With `onlyChanges: true`, `resetMonitor: true` replaces only the selected monitor after a successful run. Turn it off after that run.

**Is collecting public rental data legal?** Your use remains subject to applicable law, source terms and data protection obligations. Do not use the output for unsolicited bulk outreach or infer permission to contact someone from a public listing. GDPR and CAN-SPAM obligations can apply to downstream processing and communications.

**How do I get support?** Open an issue with the run URL, input and expected result. If a successful run helped your work, an honest Store review is welcome; no incentive is offered.

### Related Actors

For other rental sources, see [Zumper Rental Scraper](https://apify.com/benthepythondev/zumper-rental-scraper), [Craigslist Real Estate Scraper](https://apify.com/benthepythondev/craigslist-real-estate-scraper) and [SpareRoom Scraper](https://apify.com/benthepythondev/spareroom-scraper).

**Keywords:** Furnished Finder scraper, monthly rental data, furnished rental API, rental price monitor, midterm rentals, corporate housing data, travel nurse housing, furnished apartments, rental CSV export, rental availability, rental market research, Austin rentals, pet friendly rentals, rental change feed, scheduled rental scraper.

# Actor input Schema

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

Use a city slug or unfiltered /housing/ URL, with filters set below.

## `minPrice` (type: `integer`):

Filter advertised source listings by this inclusive bound.

## `maxPrice` (type: `integer`):

Filter advertised source listings by this inclusive bound.

## `minBedrooms` (type: `integer`):

Filter advertised source listings by this inclusive bound.

## `minBathrooms` (type: `number`):

Filter advertised source listings by this inclusive bound.

## `propertyType` (type: `string`):

Leave unset for rooms and entire units.

## `petsAllowed` (type: `boolean`):

False leaves this amenity unrestricted.

## `utilitiesIncluded` (type: `boolean`):

False leaves this amenity unrestricted.

## `moveInDate` (type: `string`):

Optional YYYY-MM-DD. Move-out must be later than move-in. Advertised availability is not a booking.

## `moveOutDate` (type: `string`):

Optional YYYY-MM-DD. Move-out must be later than move-in. Advertised availability is not a booking.

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

Maximum unique source listings inspected per run; a monitor may export fewer.

## `onlyChanges` (type: `boolean`):

Persist a baseline in your own account; export new observations and tracked changes.

## `monitorId` (type: `string`):

Reuse for one search. Leave blank to derive it from the search. Avoid concurrent runs.

## `emitInitial` (type: `boolean`):

Disable to seed a new monitor without exporting its baseline rows.

## `resetMonitor` (type: `boolean`):

Requires onlyChanges. Replaces only this baseline after a successful run; disable for later scheduled runs.

## Actor input object example

```json
{
  "location": "us--tx--austin",
  "petsAllowed": false,
  "utilitiesIncluded": false,
  "maxResults": 10,
  "onlyChanges": false,
  "emitInitial": true,
  "resetMonitor": false
}
```

# 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 = {
    "location": "us--tx--austin",
    "maxResults": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("benthepythondev/furnished-finder-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": "us--tx--austin",
    "maxResults": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("benthepythondev/furnished-finder-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 '{
  "location": "us--tx--austin",
  "maxResults": 10
}' |
apify call benthepythondev/furnished-finder-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,benthepythondev/furnished-finder-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/s4sOX3uDBMsACpJny/builds/WcLkwIOCMcbSDw3V1/openapi.json
