# ImmoScout24.ch Scraper — Switzerland Property Listings (`sian.agency/immoscout24-ch-property-scraper`) Actor

Scrape immoscout24.ch, Switzerland's largest property portal. Rent and buy listings with CHF net and gross rent, rooms, m2, GPS, photos and the advertising agency.

- **URL**: https://apify.com/sian.agency/immoscout24-ch-property-scraper.md
- **Developed by:** [SIÁN OÜ](https://apify.com/sian.agency) (community)
- **Categories:** Real estate, Lead generation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.14 / 1,000 property searches

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

## ImmoScout24.ch Scraper — Swiss Property Listings, Prices & Agencies 🇨🇭

[![Store - SIÁN Agency](https://img.shields.io/badge/Store-SI%C3%81N%20Agency-1AE392)](https://apify.com/sian.agency?fpr=sian) [![Store - ImmobilienScout24 Germany](https://img.shields.io/badge/Store-ImmobilienScout24%20Germany-1AE392)](https://apify.com/sian.agency/immobilienscout24-property-scraper?fpr=sian) [![Store - SeLoger France](https://img.shields.io/badge/Store-SeLoger%20France-1AE392)](https://apify.com/sian.agency/seloger-property-scraper?fpr=sian) [![Store - Immobiliare Italy](https://img.shields.io/badge/Store-Immobiliare%20Italy-1AE392)](https://apify.com/sian.agency/immobiliare-property-scraper?fpr=sian)

#### 🎉 Twenty complete Swiss listings per request, with the Nettomiete and Nebenkosten split out

##### For analysts, relocation teams and agencies working the Swiss market in German, French or Italian

### 🔎 What is the ImmoScout24.ch Scraper — and when should you use it?

The **ImmoScout24.ch Scraper** turns Swiss property listings from immoscout24.ch, the country's largest portal into clean, structured rows you can filter, export and feed straight into a spreadsheet, database or AI agent. No account, no portal API key, no browser automation to maintain.

**Use it when you need:** Swiss rent and sale listings with the CHF price and the Nettomiete / Nebenkosten / Bruttomiete split. Rooms come back as the halves Swiss adverts use. Each row also carries living space, plot size, year built, floor, the amenity flags, and the walking distances to transport and schools that advertisers publish. Address, postcode, municipality, canton, coordinates and every photo are on the same row, alongside the list of other Swiss portals running the same advert. Switch on details and each listing adds the advertising agency's legal name, postal address and website, the move-in date, the advertiser's reference, and the federal EGID and EGRID building-register identifiers.

**Use something else when:** you need a market outside Switzerland. Use [ImmobilienScout24 Scraper](https://apify.com/sian.agency/immobilienscout24-property-scraper?fpr=sian) for the German portal immobilienscout24.de, which is a different company and a different site. Use [SeLoger Scraper](https://apify.com/sian.agency/seloger-property-scraper?fpr=sian) for French listings with the same price, surface and coordinate fields. Use [Immobiliare.it Scraper](https://apify.com/sian.agency/immobiliare-property-scraper?fpr=sian) for Italian listings across the whole country. This Actor covers immoscout24.ch, the Swiss portal, plus the handful of Liechtenstein adverts it carries.

### 🤖 Use with AI agents

Already connected to the [Apify MCP server](https://mcp.apify.com)? Just ask for this Actor by name: sian.agency/immoscout24-ch-property-scraper

**Your agent can pay for its own runs.** This Actor is eligible for [agentic payments](https://docs.apify.com/platform/actors/publishing/monetize), so an agent can discover it, run it and settle the bill over [x402](https://www.x402.org/) (USDC on Base) or [Skyfire](https://www.skyfire.xyz/) — without an Apify account or API token of its own. Billing is the same either way: per successful row, never for errors.

Otherwise copy this prompt into Claude, ChatGPT, Cursor or any MCP-enabled assistant:

```text
I want Swiss property data from immoscout24.ch using the Apify Actor `sian.agency/immoscout24-ch-property-scraper`.

Use it when I need: Swiss rent and sale listings with the CHF price and the Nettomiete / Nebenkosten / Bruttomiete split. Rooms come back as the halves Swiss adverts use. Each row also carries living space, plot size, year built, floor, the amenity flags, and the walking distances to transport and schools that advertisers publish. Address, postcode, municipality, canton, coordinates and every photo are on the same row, alongside the list of other Swiss portals running the same advert. Switch on details and each listing adds the advertising agency's legal name, postal address and website, the move-in date, the advertiser's reference, and the federal EGID and EGRID building-register identifiers.

Don't use it when: you need a market outside Switzerland — use immobilienscout24-property-scraper or seloger-property-scraper or immobiliare-property-scraper instead.

How to call it: pick an `operation`. `search` takes `locations` — municipality names such as Zürich or Genf, 4-digit postcodes such as 8001, canton names such as Kanton Zürich, or a pasted immoscout24.ch search URL in any of the four site languages. `detail` takes `listingUrls`, which accepts listing URLs or bare listing IDs. Set `transactionType` to `rent` or `buy`, and `propertyCategory` to `all`, `apartment` or `house`. Narrow with `minPrice`/`maxPrice`, `minRooms`/`maxRooms`, `minLivingSpace`/`maxLivingSpace` or `petsAllowed`. Choose `descriptionLanguage` to get the description in German, French, Italian or English where the portal has that translation. Switch on `includeDetails` to add the advertising agency and the EGID/EGRID register keys to every row.

Start with this input:
{
  "operation": "search",
  "locations": [
    "Zürich",
    "8001"
  ],
  "transactionType": "rent",
  "propertyCategory": "apartment",
  "minRooms": 3,
  "maxPrice": 3500,
  "maxResults": 100
}

Ask me which Swiss municipality, postcode or canton, and whether you want rentals or properties for sale, then run the Actor and summarise the results as a table.
```

**Things you can ask your agent for:**

- *Pull every 3.5-room flat to rent in Zürich under CHF 3,500 and rank them by price per square metre.*
- *Compare median asking price per m² for houses across Kanton Zürich, Kanton Zug and Kanton Aargau.*
- *Build an agency list for Geneva: who advertises the most rental stock, with their legal name and postal address.*

Machine-readable API, MCP config and OpenAPI definition for this Actor are published at [apify.com/sian.agency/immoscout24-ch-property-scraper.md](https://apify.com/sian.agency/immoscout24-ch-property-scraper.md).

### 📋 Overview

**Switzerland's property market lives on one portal, and that portal does not hand out its data.** This Actor reads immoscout24.ch and gives you clean rows: every canton, every municipality, rentals and sales.

**What you get:**

- ✅ **The real Swiss rent split**: gross rent, net rent and Nebenkosten as separate columns wherever the advertiser published them, so a CHF 2,400 flat and a CHF 2,400 plus CHF 250 flat stop looking identical.
- ⚡ **Twenty listings per request**: each search page already carries the full record, so a 1,000-row sweep is a normal run rather than a thousand page loads.
- 🎯 **Room counts that survive**: Swiss adverts are 2.5, 3.5 and 4.5 rooms. Those halves come back as numbers, not rounded away.
- 💰 **Pay per listing, never per attempt**: a location that matched nothing costs you nothing, and neither does an input we could not read.
- 💎 **EGID and EGRID**: the federal building and parcel identifiers. They join a live advert to Swiss cadastral and energy records.
- ✨ **Cross-portal distribution**: each row lists the other Swiss portals the same advert runs on, from Homegate and ImmoStreet to Anibis and Tutti.

### ✨ Features

- 🔍 **Search by name, not by URL**: type Zürich, Genf, 8001 or Kanton Waadt. No internal location codes, no pasted URLs required.
- 🔗 **Pasted URLs still work**: copy a filtered search out of your browser in German, French, Italian or English and it runs as-is.
- 🏢 **Rent or buy, flats or houses**: three property categories and both transaction types from the same input.
- 🎚️ **Filters that are actually applied**: price band, room range, living-space range and pets-allowed. Nothing is offered that the portal ignores.
- 🗣️ **Descriptions in four languages**: German, French, Italian or English, with a flag telling you when you got a translation rather than the original.
- 📄 **Optional agency enrichment**: the advertiser's legal name, postal address, website and portal profile, billed only for the listings you enrich.
- 📍 **Coordinates on every row**: latitude, longitude and the portal's own accuracy grade, ready to map.
- 📸 **Every photo, full resolution**: the complete image list plus the virtual-tour and video links where the advertiser added them.
- 📊 **Derived price per m²**: computed only when both the price and the living space are real numbers.
- 📈 **Advertiser package signals**: which advertising tier a listing runs on, and its completeness score.

### 🎬 Quick Start

Pick a Swiss location, choose rent or buy, press Start. Rows land in your dataset with prices, sizes, coordinates and photos. Nothing else to configure — no key, no proxy, no browser.

```bash
curl -X POST 'https://api.apify.com/v2/acts/sian.agency~immoscout24-ch-property-scraper/runs?token=YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"operation": "search", "locations": ["Zürich"], "transactionType": "rent"}'
```

### 🚀 Getting Started (3 Simple Steps)

#### Step 1: Name your locations

Municipality names (Zürich, Genf, Basel, Lugano), 4-digit postcodes (8001, 1204), canton names (Kanton Zürich), or a search URL copied from the portal.

#### Step 2: Choose rent or buy

Then narrow it if you want — price band, rooms, living space, pets allowed. Leave a filter at its default and it is not sent at all.

#### Step 3: Press Start

Twenty listings arrive per request. Switch on **Add agency and building-register details** if you also need the advertiser behind each advert.

**That's it! In under a minute, you'll have:**

- A dataset of Swiss listings with CHF prices, sizes and coordinates
- The gross rent, and the net rent and Nebenkosten wherever the advertiser split them
- Every photo URL, ready to pull into a sheet or a slide

### 📥 Input Configuration

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `operation` | string | No | `search` (default) or `detail` |
| `locations` | array | No | Municipalities, postcodes, cantons or pasted search URLs. Used by `search` |
| `listingUrls` | array | No | Listing URLs or bare listing IDs. Used by `detail` |
| `transactionType` | string | No | `rent` (default) or `buy` |
| `propertyCategory` | string | No | `all` (default), `apartment` or `house` |
| `maxResults` | integer | No | Listings to stop at, across every location. Default 60 |
| `descriptionLanguage` | string | No | `original` (default), `de`, `fr`, `it` or `en` |
| `includeDetails` | boolean | No | Add the agency and the EGID/EGRID register keys. Default `false` |
| `minPrice` / `maxPrice` | integer | No | CHF band. 0 means no bound |
| `minRooms` / `maxRooms` | integer | No | Room range. 0 means no bound |
| `minLivingSpace` / `maxLivingSpace` | integer | No | Wohnfläche in m². 0 means no bound |
| `petsAllowed` | boolean | No | Only adverts that allow animals |

**Example:**

```json
{
  "operation": "search",
  "locations": ["Zürich", "8001"],
  "transactionType": "rent",
  "propertyCategory": "apartment",
  "minRooms": 3,
  "maxPrice": 3500,
  "maxResults": 100
}
```

**One listing, with the agency and the register keys:**

```json
{
  "operation": "detail",
  "listingUrls": ["https://www.immoscout24.ch/mieten/4002086141"]
}
```

### 📤 Output

Results are saved to the Apify dataset with **100+ fields** including:

| Field | Type | Description |
|-------|------|-------------|
| `listingId` | string | The portal's own listing identifier |
| `url` | string | Canonical listing URL |
| `propertyTitle` | string | Advert headline |
| `price` | number | CHF — gross rent for rentals, asking price for sales |
| `priceOnRequest` | boolean | True when the advertiser published no price |
| `rentGross` / `rentNet` / `rentExtraCosts` | number | Bruttomiete, Nettomiete, Nebenkosten |
| `pricePerSqm` | number | Derived, only when price and living space are both real |
| `numberOfRooms` | number | The Swiss halves: 2.5, 3.5, 4.5 |
| `livingSpace` / `lotSize` / `cubage` | number | Wohnfläche m², plot m², volume m³ |
| `street` / `postalCode` / `locality` / `canton` | string | Address, with the two-letter canton code |
| `latitude` / `longitude` | number | Coordinates, plus `geoAccuracy` |
| `descriptionText` | string | Plain text in the language you asked for |
| `crossPostedPlatforms` | array | The other Swiss portals carrying the same advert |
| `agencyName` / `agencyWebsite` | string | The advertiser, when details are switched on |
| `egid` / `egrid` | string | Federal building and property register keys |
| `images` | array | Every photo URL |

**Example:**

```json
{
  "listingId": "4002086141",
  "url": "https://www.immoscout24.ch/mieten/4002086141",
  "propertyTitle": "Helle 3.5-Zimmer-Wohnung mit Balkon",
  "offerType": "RENT",
  "price": 2650,
  "priceCurrency": "CHF",
  "rentGross": 2650,
  "rentNet": 2400,
  "rentExtraCosts": 250,
  "pricePerSqm": 30.11,
  "numberOfRooms": 3.5,
  "livingSpace": 88,
  "yearBuilt": 2019,
  "street": "Rotbuchstrasse 9",
  "postalCode": "8006",
  "locality": "Zürich",
  "canton": "ZH",
  "latitude": 47.386583,
  "longitude": 8.548509,
  "hasBalcony": true,
  "hasElevator": true,
  "distancePublicTransport": 180,
  "crossPostedPlatforms": ["homegate", "immoscout24", "anibis", "tutti"],
  "descriptionLanguage": "de",
  "descriptionIsMachineTranslated": false,
  "imageCount": 19
}
```

### 💼 Use Cases & Examples

#### 1. Swiss rent and price benchmarking

**Market analysts measuring a canton rather than eyeballing a portal.**

**Input:** a canton or a cluster of postcodes, plus a room range
**Output:** gross rent, net rent, living space and price per m² for every matching advert
**Use:** median asking rent by municipality, and how much of it is actually Nebenkosten

#### 2. Relocation and corporate housing shortlists

**HR and relocation teams placing an assignee in Zürich, Geneva or Basel.**

**Input:** the destination, a price ceiling, a minimum room count
**Output:** listings with coordinates, walking distances to transport and schools, and photos
**Use:** a mappable shortlist that works for a German-speaking and a French-speaking assignee, because the description comes back in the language you choose

#### 3. Agency and advertiser intelligence

**Proptech and agency-services firms mapping who holds the stock.**

**Input:** a canton, with details switched on
**Output:** the advertising agency's legal name, postal address, website and advertising tier on every row
**Use:** rank agencies by live inventory, and see which ones pay for premium placement

#### 4. Cross-portal distribution mapping

**Portal and marketplace teams studying how Swiss advertisers distribute.**

**Input:** any location
**Output:** the `crossPostedPlatforms` list on every listing
**Use:** find the stock that appears on one portal only, and measure how much of a market is genuinely exclusive

#### 5. Valuation work against the federal registers

**Valuers and data teams joining live adverts to official records.**

**Input:** listing URLs, or a search with details switched on
**Output:** EGID and EGRID alongside the asking price and the building attributes
**Use:** join to cantonal cadastral and energy datasets, turning an advert into a valuation input

#### 6. New-build and development tracking

**Developers and investors watching what is coming to market.**

**Input:** a canton, filtered to sales
**Output:** the new-construction project type and the developer's own project website
**Use:** a running list of Swiss residential projects, with coordinates to plot

#### 7. Daily new-listing monitoring

**Buyers, brokers and relocation agents who need to be first.**

**Input:** the same locations, on a schedule
**Output:** listing IDs and first-published dates to diff against yesterday
**Use:** Swiss city rental stock moves fast. A daily run is the difference between seeing a flat and seeing it after twenty viewings were booked

### 🔗 Integration Examples

#### JavaScript/Node.js

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });

const run = await client.actor('sian.agency/immoscout24-ch-property-scraper').call({
  operation: 'search',
  locations: ['Zürich'],
  transactionType: 'rent',
  maxResults: 100,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items[0]);
```

#### Python

```python
from apify_client import ApifyClient
client = ApifyClient('YOUR_TOKEN')

run = client.actor('sian.agency/immoscout24-ch-property-scraper').call(
    run_input={
        'operation': 'search',
        'locations': ['Genève', 'Lausanne'],
        'transactionType': 'rent',
        'maxResults': 200,
    }
)

for item in client.dataset(run['defaultDatasetId']).iterate_items():
    print(item['locality'], item['price'], item['numberOfRooms'])
```

#### cURL

```bash
curl -X POST 'https://api.apify.com/v2/acts/sian.agency~immoscout24-ch-property-scraper/runs?token=YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"operation": "search", "locations": ["Kanton Zug"], "transactionType": "buy", "propertyCategory": "house"}'
```

#### Automation Workflows (N8N / Zapier / Make)

1. **Trigger**: a daily schedule, or a webhook from your CRM
2. **HTTP Request**: call this Actor with your standing locations
3. **Process**: diff `listingId` against yesterday's run to isolate new adverts
4. **Action**: write to a sheet, push to a database, or alert a channel

### 📊 Performance & Pricing

#### FREE Tier (Try It Now)

- **25 listings** per run — every field, same quality
- No credit card required
- Enough to check the data before you commit a market study to it

#### PAID Tier (Production Ready)

- **Unlimited** listings per run
- Pay per listing returned, never per attempt
- The agency and register enrichment is billed separately, so you only pay for it when you ask for it

💰 **Priced under the field leader.** The closest competitor charges $1.75 per 1,000 rows for a scraper where Switzerland is one of three countries. This one is Swiss-only and starts lower.

🔗 [View current pricing](https://apify.com/sian.agency/immoscout24-ch-property-scraper?fpr=sian)

### ❓ Frequently Asked Questions

**Q: Is this the German ImmobilienScout24?**
A: No. This reads immoscout24.ch, the Swiss portal run by SMG Swiss Marketplace Group. The German portal immobilienscout24.de belongs to a different company and has its own Actor: [ImmobilienScout24 Scraper](https://apify.com/sian.agency/immobilienscout24-property-scraper?fpr=sian). The two brands share a name and nothing else.

**Q: How many listings can I get?**
A: FREE tier: 25 per run. PAID tier: unlimited. One search has a ceiling of its own — the portal stops paging at 1,000 listings per query, so split a large sweep by postcode or price band.

**Q: How do I name a location?**
A: The way the portal writes it: Zürich, Genf, Basel, Bern, Lausanne, Lugano, St. Gallen. A 4-digit postcode such as 8001 works on its own. So does a canton name, and so does a search URL pasted from your browser in any of the four site languages.

**Q: Does the language change what I get?**
A: Only the description and the title. The portal serves the same listings and the same fields on its German, French, Italian and English URLs. Each advert stores the text in the language the advertiser wrote, plus machine translations into the other three, and `descriptionIsMachineTranslated` tells you which one you received.

**Q: Why is a price sometimes empty?**
A: Swiss advertisers often list a sale "on request". Those rows carry `priceOnRequest: true` and an empty price rather than a zero, because a zero would quietly ruin any average computed from the column.

**Q: What is the difference between net rent and gross rent?**
A: Swiss adverts quote Nettomiete (the rent) and Nebenkosten (service charges) separately, and Bruttomiete is the two together. Every row carries the gross figure; `rentNet` and `rentExtraCosts` are filled in wherever the advertiser published the split.

**Q: Do all rows get the agency and register fields when I switch details on?**
A: Most do. The listing pages are guarded more tightly than the search pages, and a small share of lookups get turned away on any given run — around one in six in our own measurements. Those rows still arrive with everything the search page publishes; they simply carry no `agencyName`, `egid` or `egrid`, and the detail event is not charged for them. The run log counts them.

**Q: Can I get the agency's contact details?**
A: You get the agency's legal name, postal address, website and portal profile. Email addresses are not published on the public pages — enquiries go through the portal's own contact form — so this Actor does not return any, and it does not return the individual contact person some adverts name either. If you need to reach an advertiser, the agency website in each row is the route.

**Q: Does it cover Liechtenstein?**
A: The portal indexes Liechtenstein and so does this Actor, but the stock is very thin — a handful of adverts at a time. Treat it as covered, not as a market.

**Q: What output formats are available?**
A: JSON, CSV and Excel, exported straight from the Apify dataset, plus an HTML run report in the key-value store.

### 🐛 Troubleshooting

**A location returns nothing**

- Check the spelling the portal uses: `Zürich` resolves, `Zurich` does not. German spellings work for French- and Italian-speaking towns too, so `Genf` is fine.
- Try the 4-digit postcode instead — `8001` on its own is a valid location.
- If the run log says the location has no matches, that is the portal's own answer. Nothing was charged.

**Fewer rows than the match count**

- The portal stops paging at 1,000 listings per query. The run log says so when it happens.
- Split the search: by postcode, by price band, or by room range.

**A run says the portal refused the visit**

- It is intermittent. Run the same input again in a few minutes.
- Searching many locations at once makes it more likely; spread them across scheduled runs.

**A listing ID comes back as "refused" rather than "not found"**

- immoscout24.ch does not always answer a wrong ID with a clean "not found"; sometimes it turns the visit away instead. Check the ID against a real listing URL before assuming the advert is gone.

**No agency name on my rows**

- The agency arrives with the detail record. Set `includeDetails` to `true`, or use the `detail` operation with listing URLs.
- If details were already on, check the run log: it counts the lookups the portal turned away. Those rows were not charged the detail event, and re-running the same listing usually gets them.

### ⚖️ Is it legal to scrape data?

Our actors are ethical and do not extract any private user data, such as email addresses, gender, or location. They only extract what the user has chosen to share publicly. We therefore believe that our actors, when used for ethical purposes by Apify users, are safe.

However, you should be aware that your results could contain personal data. Personal data is protected by the **GDPR** in the European Union, by the **revised Swiss Federal Act on Data Protection (revFADP)** in Switzerland, and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.

You can also read Apify's blog post on the [legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

ImmoScout24 and immoscout24.ch are trademarks of SMG Swiss Marketplace Group AG. This Actor is not affiliated with, endorsed by or sponsored by SMG Swiss Marketplace Group. It reads only publicly visible listing pages.

### 🤝 Support

[![Telegram Support](https://img.shields.io/badge/Telegram-Support%20Group-0088cc?logo=telegram)](https://t.me/+vyh1sRE08sAxMGRi)

**Join our active support community**

- For issues or questions, open an issue in the actor's repository
- Check [SIÁN Agency Store](https://apify.com/sian.agency?fpr=sian) for more automation tools
- 📧 <apify@sian-agency.online>

***

**Built by [SIÁN Agency](https://www.sian-agency.online)** | **[More Tools](https://apify.com/sian.agency?fpr=sian)**

# Actor input Schema

## `operation` (type: `string`):

Search Swiss listings by location and filters, or read one listing's full record including the advertising agency and the federal building-register IDs.

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

Where to search in Switzerland. Give city or municipality names (Zürich, Genf, Basel, Bern, Lausanne, Lugano), 4-digit postcodes (8001, 1204, 4051), canton names (Kanton Zürich, Kanton Waadt) or `Liechtenstein`. German spelling is what the portal indexes, so Zürich and Genf both work; a full immoscout24.ch search URL pasted from your browser works too, in any of the four languages. Each entry is resolved against the portal's own location index, so a wrong name comes back as a clear message…

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

Only for the Listing Detail operation. Paste immoscout24.ch listing URLs (https://www.immoscout24.ch/mieten/4002086141 or https://www.immoscout24.ch/de/d/wohnung-mieten-zuerich/4002086141) or the bare listing IDs. Ignored by the Property Search operation, which takes locations instead.

## `transactionType` (type: `string`):

Rentals carry a monthly gross rent and, where the advertiser published the split, the net rent and the Nebenkosten on top. Sales carry an asking price; Swiss advertisers often publish a sale 'on request', which comes back as an empty price rather than a made-up number.

## `propertyCategory` (type: `string`):

Which section of the portal to search. 'Everything residential' is the widest net and is what most market studies want; the other two map to the portal's own apartment and house sections.

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

Stop after this many listings across every location in the run. One request returns 20 listings, so a run finishes at the first request that crosses your limit. The portal itself stops paging at page 50, so a single location yields at most 1,000 listings — split a big search by postcode or price band to go past that.

## `descriptionLanguage` (type: `string`):

Swiss advertisers write in German, French or Italian, and the portal machine-translates most listings into the other three. Pick a language and every row carries that version where it exists, falling back to the original otherwise; `descriptionIsMachineTranslated` tells you which you got. This changes only the description and title text — the listings that match, and every other field, are identical in all four languages.

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

Open each listing's own page to add the advertising agency's legal name, postal address, website and profile, the move-in date, the advertiser's reference number and the Swiss federal building and property register IDs (EGID and EGRID) that let you join a listing to cadastral and energy records. Costs one extra request per listing and bills the Listing Detail event on top of the listing row, so nobody pays for detail they did not ask for.

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

Lowest price to include, in Swiss francs. 0 means no lower bound. For rentals this is the monthly gross rent.

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

Highest price to include, in Swiss francs. 0 means no upper bound. Pairing this with a minimum is also how you split a search that would otherwise hit the portal's 1,000-listing paging ceiling.

## `minRooms` (type: `integer`):

Only listings with at least this many rooms. Swiss room counts are halves (2.5, 3.5, 4.5) and the portal rounds this filter to the nearest half itself. 0 means no minimum.

## `maxRooms` (type: `integer`):

Only listings with at most this many rooms. 0 means no maximum.

## `minLivingSpace` (type: `integer`):

Minimum Wohnfläche in square metres. 0 means no minimum.

## `maxLivingSpace` (type: `integer`):

Maximum Wohnfläche in square metres. 0 means no maximum.

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

Restrict to listings the advertiser has marked as allowing animals. Swiss rental adverts state this explicitly, which is why it is a filter here rather than a keyword search.

## Actor input object example

```json
{
  "operation": "search",
  "locations": [
    "Zürich"
  ],
  "listingUrls": [],
  "transactionType": "rent",
  "propertyCategory": "all",
  "maxResults": 60,
  "descriptionLanguage": "original",
  "includeDetails": false,
  "minPrice": 0,
  "maxPrice": 0,
  "minRooms": 0,
  "maxRooms": 0,
  "minLivingSpace": 0,
  "maxLivingSpace": 0,
  "petsAllowed": false
}
```

# Actor output Schema

## `immoscout24SwitzerlandListings` (type: `string`):

Every listing this run returned.

## `scrapingSummary` (type: `string`):

HTML summary showing successful and failed results with key metrics

# 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 = {
    "operation": "search",
    "locations": [
        "Zürich"
    ],
    "listingUrls": [],
    "transactionType": "rent",
    "propertyCategory": "all",
    "maxResults": 60,
    "descriptionLanguage": "original",
    "includeDetails": false,
    "minPrice": 0,
    "maxPrice": 0,
    "minRooms": 0,
    "maxRooms": 0,
    "minLivingSpace": 0,
    "maxLivingSpace": 0,
    "petsAllowed": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("sian.agency/immoscout24-ch-property-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 = {
    "operation": "search",
    "locations": ["Zürich"],
    "listingUrls": [],
    "transactionType": "rent",
    "propertyCategory": "all",
    "maxResults": 60,
    "descriptionLanguage": "original",
    "includeDetails": False,
    "minPrice": 0,
    "maxPrice": 0,
    "minRooms": 0,
    "maxRooms": 0,
    "minLivingSpace": 0,
    "maxLivingSpace": 0,
    "petsAllowed": False,
}

# Run the Actor and wait for it to finish
run = client.actor("sian.agency/immoscout24-ch-property-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 '{
  "operation": "search",
  "locations": [
    "Zürich"
  ],
  "listingUrls": [],
  "transactionType": "rent",
  "propertyCategory": "all",
  "maxResults": 60,
  "descriptionLanguage": "original",
  "includeDetails": false,
  "minPrice": 0,
  "maxPrice": 0,
  "minRooms": 0,
  "maxRooms": 0,
  "minLivingSpace": 0,
  "maxLivingSpace": 0,
  "petsAllowed": false
}' |
apify call sian.agency/immoscout24-ch-property-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,sian.agency/immoscout24-ch-property-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/R9HIUfKeKYAzFSnF9/builds/hK0e7eIfvftDHukgJ/openapi.json
