# HousingAnywhere Scraper (`crawlerbros/housinganywhere-scraper`) Actor

Scrape HousingAnywhere.com mid- to long-term rental listings by city - rooms, studios and apartments with price, rating, availability and full listing details across 400+ cities worldwide.

- **URL**: https://apify.com/crawlerbros/housinganywhere-scraper.md
- **Developed by:** [Crawler Bros](https://apify.com/crawlerbros) (community)
- **Categories:** Real estate, Travel, Automation
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## HousingAnywhere Scraper

Scrape mid- to long-term rental listings from [HousingAnywhere](https://housinganywhere.com) — rooms, studios and apartments across 400+ cities worldwide. Search any city with rich filters (property type, price, furniture, gender, bills included, cancellation policy, and more), or fetch full details for specific listing URLs. No login, no cookies, no paid proxy required.

### What this actor does

- **Two modes:** `search` (by city) and `listingDetails` (by direct listing URL)
- **Global coverage** — any city HousingAnywhere lists (Europe, US, and more); just type a city name
- **Rich filters** — property type, bedroom count, tenant type, furniture, gender, bills included, registration possible, cancellation policy, recently added, price range, move-in/move-out dates, sort order
- **Optional deep enrichment** — turn on `includeDetails` to pull full descriptions, facilities, tenant preferences and photo galleries for every search result
- **Empty fields are omitted** — every record only contains data that was actually found

### Output per listing

**Search mode** (list view):

- `listingId`, `listingKind` (`room` or `property`)
- `title`, `sourceUrl`, `imageUrl`
- `priceFrom`, `priceTo`, `priceCurrency`, `pricePeriod`, `billsIncluded`, `priceText`
- `rating`, `reviewCount`
- `availabilityText`, `isAvailableNow`, `availableFrom`
- `facilitiesSummary`
- `placesText` plus, depending on how HousingAnywhere labels the card, either `spaceForPersons` (occupancy, e.g. `"For 1 person"` → `1`) or `bedroomCount` (e.g. `"2 Bedrooms"` → `2`)
- `sizeText`, `propertySizeM2` — only shown on cards HousingAnywhere tags with a floor area
- `advertiserVerified` — `true` when the card carries a "Tenant-verified" badge
- `city`, `country`, `searchLocation`
- `recordType: "listing"`, `scrapedAt`

**With `includeDetails: true` or `listingDetails` mode**, additionally:

- `description`, `advertiserName`, `propertyKind`
- `propertySizeM2`, `bedroomCount`, `spaceForPersons`, `furnished`
- `addressStreet`, `facilitiesText`
- `tenantAge`, `tenantGenderPreference`, `tenantType`, `couplesAllowed`
- `cancellationPolicyText`, `contractTypeText`, `registrationInfo`
- `images[]` (full photo gallery)

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | string | `search` | `search` / `listingDetails` |
| `location` | string | `Berlin, Germany` | City to search (mode=search) — e.g. `Berlin`, `Amsterdam`, `New York` |
| `listingUrls` | array | – | Listing URLs to fetch (mode=listingDetails) |
| `propertyTypes` | array | – | `private-rooms` / `shared-rooms` / `apartment-for-rent` / `studio-for-rent` |
| `bedroomCounts` | array | – | `1` / `2` / `3` / `3+` (apartments) |
| `suitableFor` | array | – | `students` / `working-professionals` / `couples` |
| `furniture` | string | – | `furnished` / `unfurnished` |
| `gender` | string | – | `male` / `female` |
| `billsIncluded` | string | – | `included` / `excluded` |
| `registrationPossible` | string | – | `possible` / `not-possible` |
| `cancellationPolicy` | string | – | `strict` / `flexible-30d` |
| `recentlyAdded` | string | – | `1-day` / `3-days` / `7-days` / `14-days` |
| `minPrice` / `maxPrice` | int | – | Monthly rent range, in the searched city's local currency |
| `minRating` | number | – | Drop listings below this advertiser rating (0–5) |
| `moveInDate` / `moveOutDate` | string | – | `YYYY-MM-DD` |
| `sortBy` | string | `bestMatch` | `bestMatch` / `mostRecent` / `lowToHigh` / `highToLow` / `advertiserRating` |
| `includeDetails` | boolean | `false` | Fetch each result's full detail page too (slower) |
| `maxItems` | int | `30` | Hard cap (1–500) |

#### Example: furnished studios in Amsterdam, cheapest first

```json
{
  "mode": "search",
  "location": "Amsterdam",
  "propertyTypes": ["studio-for-rent"],
  "furniture": "furnished",
  "sortBy": "lowToHigh",
  "maxItems": 50
}
```

#### Example: student rooms with bills included, full details

```json
{
  "mode": "search",
  "location": "Berlin, Germany",
  "propertyTypes": ["private-rooms", "shared-rooms"],
  "suitableFor": ["students"],
  "billsIncluded": "included",
  "includeDetails": true,
  "maxItems": 20
}
```

#### Example: fetch details for specific listings

```json
{
  "mode": "listingDetails",
  "listingUrls": [
    "https://housinganywhere.com/room/ut899723/de/Berlin/osnabr-cker-stra-e"
  ]
}
```

### Use cases

- **Relocation & study-abroad services** — surface current listings for clients moving to a new city
- **Rent price benchmarking** — track monthly rent ranges by city, property type and furnishing
- **Market research** — monitor supply and availability windows across HousingAnywhere's city network
- **Real-estate aggregators** — feed structured listing data into a comparison site
- **Lead generation** — find recently-added listings matching a specific tenant profile

### FAQ

**Which cities are supported?** Any city HousingAnywhere lists — the actor resolves your free-text `location` (e.g. `"Berlin"`) to the matching city automatically. If a city isn't recognized, the run finishes with a clear status message and 0 records instead of failing.

**What currency are prices in?** Whatever the searched city's local currency is (EUR for most of Europe, USD for US cities, etc.) — see `priceCurrency` on each record.

**Why do some listings show a price range (`priceFrom` ≠ `priceTo`)?** Some properties list several available rooms at different prices; the card shows the range and the actor captures both bounds.

**What's the difference between `listingKind: "room"` and `"property"`?** `room` is a single rentable unit page (`/room/...`); `property` is a multi-unit building/residence with several rooms available (`/s/.../<slug>-<id>`) — both link to a real bookable listing.

**Does `includeDetails` slow things down?** Yes — it adds one extra page fetch per listing. Use it when you need descriptions/photos/tenant preferences; leave it off for fast price/availability scans.

**Is a login or proxy required?** No. All data comes from HousingAnywhere's public, server-rendered pages.

# Actor input Schema

## `mode` (type: `string`):

What to fetch.

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

City to search, e.g. `Berlin`, `Berlin, Germany`, `Amsterdam`, `New York`. Resolved automatically to the matching HousingAnywhere city.

## `listingUrls` (type: `array`):

Full HousingAnywhere listing URLs (`/room/...` or `/s/.../<property-slug>-<id>`).

## `propertyTypes` (type: `array`):

Filter to specific property types. Leave empty for all types.

## `bedroomCounts` (type: `array`):

Filter apartments by number of bedrooms.

## `suitableFor` (type: `array`):

Filter by intended tenant type.

## `furniture` (type: `string`):

Filter by furnishing status.

## `gender` (type: `string`):

Filter listings restricted to a specific gender.

## `billsIncluded` (type: `string`):

Filter by whether utility bills are included in the rent.

## `registrationPossible` (type: `string`):

Filter by whether municipal address registration is possible at this address.

## `cancellationPolicy` (type: `string`):

Filter by the booking cancellation policy.

## `recentlyAdded` (type: `string`):

Only show listings added within this time window.

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

Minimum monthly rent, in the searched city's local currency (e.g. EUR for Berlin, USD for New York).

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

Maximum monthly rent, in the searched city's local currency.

## `minRating` (type: `number`):

Drop listings whose advertiser rating is below this value (0-5). Listings without a rating yet are kept.

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

Earliest move-in date, format YYYY-MM-DD.

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

Latest move-out date, format YYYY-MM-DD.

## `sortBy` (type: `string`):

Result ordering.

## `includeDetails` (type: `boolean`):

For each search result, also fetch its detail page (description, facilities, tenant preferences, images). Slower — one extra request per listing.

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

Hard cap on emitted records.

## Actor input object example

```json
{
  "mode": "search",
  "location": "Berlin, Germany",
  "listingUrls": [],
  "propertyTypes": [],
  "bedroomCounts": [],
  "suitableFor": [],
  "furniture": "",
  "gender": "",
  "billsIncluded": "",
  "registrationPossible": "",
  "cancellationPolicy": "",
  "recentlyAdded": "",
  "sortBy": "bestMatch",
  "includeDetails": false,
  "maxItems": 30
}
```

# Actor output Schema

## `listings` (type: `string`):

Dataset containing all scraped HousingAnywhere listings.

# 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 = {
    "mode": "search",
    "location": "Berlin, Germany",
    "listingUrls": [],
    "propertyTypes": [],
    "bedroomCounts": [],
    "suitableFor": [],
    "sortBy": "bestMatch",
    "includeDetails": false,
    "maxItems": 30
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawlerbros/housinganywhere-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 = {
    "mode": "search",
    "location": "Berlin, Germany",
    "listingUrls": [],
    "propertyTypes": [],
    "bedroomCounts": [],
    "suitableFor": [],
    "sortBy": "bestMatch",
    "includeDetails": False,
    "maxItems": 30,
}

# Run the Actor and wait for it to finish
run = client.actor("crawlerbros/housinganywhere-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 '{
  "mode": "search",
  "location": "Berlin, Germany",
  "listingUrls": [],
  "propertyTypes": [],
  "bedroomCounts": [],
  "suitableFor": [],
  "sortBy": "bestMatch",
  "includeDetails": false,
  "maxItems": 30
}' |
apify call crawlerbros/housinganywhere-scraper --silent --output-dataset

```

## MCP server setup

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