# Property Listings: ImmoScout24, Rightmove, Property Finder (`tacps126/property-listings`) Actor

Property listings from ImmoScout24 (DE, AT), Rightmove (UK) and Property Finder (UAE, KSA, Qatar, Bahrain, Egypt) in one format: price, area, rooms, price per m², coordinates, features, agent, photos. New-listing and price-drop monitoring. From $1 per 1,000 listings.

- **URL**: https://apify.com/tacps126/property-listings.md
- **Developed by:** [Tapaswai Ashok Choudhary](https://apify.com/tacps126) (community)
- **Categories:** Real estate, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.80 / 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?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Property Listings Scraper

One actor, one data format, three of the biggest property portals: **ImmobilienScout24** (Germany and Austria), **Rightmove** (United Kingdom) and **Property Finder** (UAE, Saudi Arabia, Qatar, Bahrain, Egypt). Apartments and houses to rent or buy, each with price and period, size, rooms, **price per m²**, address with **GPS coordinates**, features, the agent, photos and dates. Export to JSON, CSV or Excel, send to Google Sheets, or call it as an API.

**Built for** property investors comparing markets, agencies and proptech teams that need one schema across countries, relocation services, and anyone who wants new listings or price cuts the moment they appear.

### Why this scraper

- **Pick a country, get its portal.** Germany/Austria → ImmoScout24, United Kingdom → Rightmove, UAE/Saudi Arabia/Qatar/Bahrain/Egypt → Property Finder. Or paste a search URL from any of them and the portal is detected.
- **Same fields everywhere.** `price {amount, currency, period}`, `livingArea`, `rooms`, `pricePerSqm`, `address`, `latitude`/`longitude`, `features`, agent and photos look the same whichever portal they came from.
- **Plain-word locations.** `Berlin`, `Wien`, `Manchester`, `Dubai Marina`, `Riyadh`. The Actor finds the portal's own area for you.
- **Filters.** Price, area, rooms, newest first; on ImmoScout24 also private landlords vs. agents. Skipped listings are never charged.
- **Monitoring.** *Only new listings*, *Changes only* (old and new values, removed listings, `priceHistory`) and *Price drops only*, on a schedule.
- **Fast and resilient.** Results are read directly after the first page; robot checks get a fresh connection; a moved run resumes without charging twice.

Prefer one portal with its own extra fields? See [ImmobilienScout24 Scraper](https://apify.com/tacps126/immobilienscout24-scraper), [Rightmove Scraper](https://apify.com/tacps126/rightmove-scraper) and [Property Finder Scraper](https://apify.com/tacps126/propertyfinder-scraper).

### How to use it

1. Pick the **Country** and add **Locations** (e.g. `Berlin`, `London`, `Dubai Marina`), then choose **Property type** and **Rent or buy**.
2. Optionally set **price**, **area** and **rooms** filters and **Sort by: Newest first**.
3. Press **Start**. One run searches one portal; start another run for another country.

#### Example input

```json
{
  "country": "gb",
  "locations": ["Manchester"],
  "propertyType": "apartment",
  "offerType": "rent",
  "maxItems": 100
}
```

### What you get

| Field | Description |
|-------|-------------|
| `title`, `url`, `id` | Listing headline, link and the portal's id |
| `portal` | `immoscout24`, `immoscout24-at`, `rightmove`, `propertyfinder-ae` (… `-sa`, `-qa`, `-bh`, `-eg`) |
| `offerType`, `propertyType` | `rent` / `sale`; `apartment` / `house` (and the portal's own type) |
| `price` | `{amount, currency, period}`: rent per month or year, or purchase price, in local currency |
| `livingArea`, `rooms`, `pricePerSqm` | Size in m² and price per m² where the listing gives a size (often missing on Rightmove); bedrooms and bathrooms where listed |
| `address`, `latitude`, `longitude` | Address parts and coordinates when the listing shows them |
| `features` | Balcony, lift, parking, garden, pool… as simple English names (ImmoScout24 and Property Finder) |
| `agentCompany`, `agentName`, contact fields | Who's offering it (Property Finder and Rightmove include agent phone where listed) |
| `images`, `imageCount` | Photos |
| `publishedAt`, `updatedAt` | Dates from the portal |

ImmoScout24 listings also carry warm rent, energy class, construction year and floor plan flags; Property Finder listings carry furnishing, the verified badge, broker WhatsApp and email.

Example (shortened):

```json
{
  "title": "Wohnen mit Herz – wie geschaffen für zwei",
  "offerType": "rent",
  "propertyType": "apartment",
  "price": { "amount": 594.78, "currency": "EUR", "period": "month" },
  "totalRent": 800.94,
  "livingArea": 51.72,
  "rooms": 2,
  "pricePerSqm": 11.5,
  "address": { "street": "Hellersdorfer Straße", "houseNumber": "91B", "postcode": "12619", "city": "Berlin", "district": "Kaulsdorf (Hellersdorf)", "country": "DE" },
  "latitude": 52.52485,
  "longitude": 13.58695,
  "energyClass": "B",
  "features": ["balcony", "cellar", "lift"],
  "agentCompany": "GESOBAU AG",
  "imageCount": 10,
  "url": "https://www.immobilienscout24.de/expose/168986388",
  "publishedAt": "2026-07-01T13:55:14.933+02:00"
}
```

### Pricing

Pay per result: about **$1 per 1,000 listings** (lower on higher Apify plans) plus a small start fee per run. Duplicates, skipped listings and (with *Only new listings*) already-delivered listings are free. See the **Pricing** tab for exact rates, and set a maximum charge per run to cap spend.

On Apify's **free plan** each run returns up to 200 listings, enough to try it out. Any paid Apify plan removes the limit.

### FAQ

**How many listings can I get?** As many as the search has. Raise *Max pages per search* (about 20 listings per page, more when new-build projects list several units).

**Which countries?** Germany and Austria (ImmoScout24), the United Kingdom (Rightmove), and the UAE, Saudi Arabia, Qatar, Bahrain and Egypt (Property Finder). Switzerland (immoscout24.ch) isn't supported yet.

**Can one run cover several countries?** One run searches one portal. Start one run per country, or schedule one task each.

**Why do some listings have no coordinates?** Some landlords hide the exact address until you contact them; those listings come with postcode, city and district only.

**Is it legal?** The Actor collects publicly listed property ads. You're responsible for how you use the data, including contact names, under GDPR and the other laws that apply to you.

### Support

Found a problem or need a field that isn't there yet? Open an issue on the **Issues** tab with your input and what you expected. Requests decide what gets built next.

# Actor input Schema

## `country` (type: `string`):

The country to search; it picks the portal. With search URLs, the portal comes from the URLs.

## `locations` (type: `array`):

Cities, districts or areas in plain words, one per line: `Berlin`, `Wien`, `Manchester`, `London Camden`, `Dubai Marina`, `Riyadh`.

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

What kind of property.

## `offerType` (type: `string`):

Listings for rent or for sale.

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

Or paste search result pages from ImmoScout24, Rightmove or Property Finder, with any filters you set there. One run searches one portal.

## `minPrice` (type: `number`):

Lowest price or monthly cold rent.

## `maxPrice` (type: `number`):

Highest price or monthly cold rent.

## `minArea` (type: `number`):

Min living area (m²).

## `maxArea` (type: `number`):

Max living area (m²).

## `minRooms` (type: `number`):

Min rooms.

## `maxRooms` (type: `number`):

Max rooms.

## `sort` (type: `string`):

Order of results (Newest first applies to Germany).

## `seller` (type: `string`):

ImmoScout24 only: keep listings from everyone, only private sellers, or only agents. Skipped listings are never charged.

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

Maximum number of listings to return in total.

## `maxPagesPerSearch` (type: `integer`):

Result pages to read for each location or search URL (about 20 listings per page, more when new-build projects group their units).

## `onlyNew` (type: `boolean`):

Return only listings that no earlier run with the same input has delivered. Ideal for alerts — you pay only for new listings.

## `changesOnly` (type: `boolean`):

Return only listings that are new, changed or gone since the last run with the same input (or monitor name): changed listings carry `changeType: "changed"` and `changes` with the old and new price, rent, size, rooms or title; listings that disappeared come as `changeType: "removed"`. Schedule it to track price cuts. The first run returns everything as new.

## `priceDropsOnly` (type: `boolean`):

Only listings whose price went down since the last run with the same input (or monitor name), each with `changes` (old → new price) and `priceHistory`. Schedule it daily for a price-cut feed. The first run records prices and returns nothing.

## `monitorName` (type: `string`):

Optional name for the “only new” history, so several monitors can run side by side.

## `delivery` (type: `object`):

Webhook: {"webhookUrl": "https://…", "format": "json" | "slack" | "discord", "onlyWhenResults": true, "includeItems": 10}. Google Sheets: {"spreadsheetId": "<id from the sheet URL>", "sheetName": "Sheet1"} plus the service account key below; share the sheet with the service account's e-mail first. Leave empty to only save results in the dataset.

## `googleServiceAccountJson` (type: `string`):

Only for Google Sheets delivery: paste the service account's JSON key. Stored encrypted; the account sees only sheets you share with it.

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

Germany: a German residential proxy is used by default (the site blocks cloud IPs). Austria: Apify's standard proxy is enough.

## `portal` (type: `string`):

Which portal to search.

## `tenantId` (type: `string`):

Optional label used to keep separate histories for different clients or teams.

## `debug` (type: `boolean`):

Save extra diagnostics with the run.

## Actor input object example

```json
{
  "country": "de",
  "locations": [
    "Berlin"
  ],
  "propertyType": "apartment",
  "offerType": "rent",
  "sort": "default",
  "seller": "all",
  "maxItems": 200,
  "maxPagesPerSearch": 10,
  "onlyNew": false,
  "changesOnly": false,
  "priceDropsOnly": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "DE"
  },
  "debug": false
}
```

# Actor output Schema

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

The produced items (default dataset items).

# 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 = {
    "locations": [
        "Berlin"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "DE"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("tacps126/property-listings").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 = {
    "locations": ["Berlin"],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "DE",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("tacps126/property-listings").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 '{
  "locations": [
    "Berlin"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "DE"
  }
}' |
apify call tacps126/property-listings --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,tacps126/property-listings"
        }
    }
}
```

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/UQAdSD5SimLkdNCm6/builds/ggrfcwe6K0mKDFbF6/openapi.json
