ImmoScout24.ch Scraper — Switzerland Property Listings
Pricing
from $1.14 / 1,000 property searches
ImmoScout24.ch Scraper — Switzerland Property Listings
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.
Pricing
from $1.14 / 1,000 property searches
Rating
0.0
(0)
Developer
SIÁN OÜ
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
ImmoScout24.ch Scraper — Swiss Property Listings, Prices & Agencies 🇨🇭
🎉 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 for the German portal immobilienscout24.de, which is a different company and a different site. Use SeLoger Scraper for French listings with the same price, surface and coordinate fields. Use Immobiliare.it Scraper 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? 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, so an agent can discover it, run it and settle the bill over x402 (USDC on Base) or Skyfire — 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:
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.
📋 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.
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:
{"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:
{"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:
{"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
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
from apify_client import ApifyClientclient = 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
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)
- Trigger: a daily schedule, or a webhook from your CRM
- HTTP Request: call this Actor with your standing locations
- Process: diff
listingIdagainst yesterday's run to isolate new adverts - 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.
❓ 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. 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ürichresolves,Zurichdoes not. German spellings work for French- and Italian-speaking towns too, soGenfis fine. - Try the 4-digit postcode instead —
8001on 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
includeDetailstotrue, or use thedetailoperation 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.
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
Join our active support community
- For issues or questions, open an issue in the actor's repository
- Check SIÁN Agency Store for more automation tools
- 📧 apify@sian-agency.online
Built by SIÁN Agency | More Tools