October DealsAmazon USOctober deal check: compare before you payAmazon US: current deals, useful picks and tech finds.Check DealsWindows FixRecommendedWindows errors stealing your time? Find the fix fastScan stability, cleanup and performance issues.Fix NowOctober DealsAmazon USDeal season is back - check today's better picksAmazon US: current deals, useful picks and tech finds.See Picks×
Skip to content
CSV

How to Scrape ImmoScout24.ch Real Estate Property Data—Legally and Reliably

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Do not start by writing a scraper. ImmoScout24.ch listings are content of SMG Swiss Marketplace Group’s marketplaces, and Section 7 of SMG’s current General Terms and Conditions prohibits systematically selecting marketplace content “e.g. by scraping,” copying, publishing, reproducing it, or linking it with other data without the relevant rights-holder’s consent. For a recurring, commercial, redistributed, or large-scale dataset, obtain written permission or an official partner feed first. Only then choose a low-volume client, collect the minimum fields, and document retention, deletion, and attribution rules.

You may encounter JSON requests behind listing pages, but that is an implementation detail reported by a technical guide—not a public, stable API or permission to collect data. The first request can also trigger a CAPTCHA. Never bypass CAPTCHA, access controls, fingerprints, WAFs, or rate limits.

Is there an official ImmoScout24.ch API?

No public API with documented terms, quotas, and version guarantees is established here. A technical implementation report observes that listing pages obtain data through an internal JSON service. Treat that observation as a debugging clue only: do not publish or depend on a reverse-engineered endpoint, and do not assume that data visible in a browser is free to copy.

For bulk or commercial work, ask SMG/ImmoScout24 about an authorized data-access or partnership arrangement. Availability, pricing, and affiliate treatment are not publicly established in the material available for this article, so verify them directly. Request the written scope before building software.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Permission and privacy are the first engineering decisions

What SMG’s terms restrict

SMG’s General Terms and Conditions, Section 7, state: “In particular, it is prohibited to systematically select the Content available on the Marketplaces (e.g. by scraping), to copy, publish or otherwise reproduce it (e.g. on the Internet) in any form or to link it with other data.” The same terms describe marketplace listings, text, graphics, and software as legally protected. Read the current GTC, insertion rules, and privacy notices immediately before making requests; terms can change.

Public does not mean unrestricted

A joint statement from the Federal Data Protection and Information Commissioner (FDPIC/EDÖB) and co-signatory authorities, published 24 August 2023, says: “Personal information that is publicly accessible is subject to data protection and privacy laws in most jurisdictions.” The statement warns that mass scraping of personal information can constitute a reportable data breach in many jurisdictions. That is a risk statement, not a case-specific legal opinion; obtain Swiss counsel for a commercial launch.

Personal-data duties

If your dataset contains names, phone numbers, email addresses, exact addresses, photographs, or identifying free text, document a lawful basis, purpose, retention period, notice, access/deletion process, and security controls. FDPIC duty-to-inform guidance generally expects people to be informed in advance when their personal data is collected, including when collection is indirect; exceptions are narrow and should not be assumed.

If a cloud scraper, proxy, or storage vendor handles the data, you remain responsible as controller. Select, instruct, and monitor the processor. Contracts should address confidentiality, security, processing locations, and deletion or return of data.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Define a permissioned project before touching the site

  1. Write the use case. Specify Switzerland as the geography, the exact fields, refresh interval, users, and retention period. Separate market attributes such as advertised price, room count, floor area, canton, and listing type from personal or identifying material.
  2. Obtain written scope. Ask whether the agreement permits copying, display, enrichment, combination with other datasets, attribution, internal analytics, resale, and onward sharing. Record allowed geography, request rate, quota, retention, deletion procedure, and a contact for corrections.
  3. Choose the documented source. Use an official feed or endpoint supplied under the agreement. If no feed is offered and a page client is expressly permitted, use only the approved pages and fields.
  4. Install a stop switch. A configuration flag or kill switch must halt all requests immediately when terms change, errors spike, or SMG asks you to stop.
  5. Keep provenance. Store the listing URL or feed record ID, retrieval timestamp, source locale, and parser version with every record. This lets you correct, delete, or explain a value later.
  6. Test safely. Validate parsers against saved, permissioned fixtures. Do not test by increasing live traffic. Expect JSON fields and page structures to change.

Official feed versus a permitted page client

Decision factor Official feed or partnership Permitted page client
Contractual rights Defined in the agreement; confirm copy, display, enrichment, redistribution, and attribution. Must be explicitly granted for the pages and fields you request.
Field completeness Ask the provider for a field catalog and semantics. Limited to fields rendered or exposed by the approved page.
Update latency Defined by feed schedule or webhook terms. Depends on polling and page availability.
Rate and quota Contractual or documented; record the limit. Set a conservative rate approved in writing.
Stability Versioning and deprecation terms may be available. HTML/JSON changes can break parsers without notice.
Privacy operations Ask for deletion signals, retention support, and attribution rules. You must implement correction, deletion, access control, and retention handling.
Total cost Subscription, integration, and storage costs are agreement-specific. Engineering, monitoring, proxy, and compliance costs are yours.

A feed with fewer anti-bot failures is still unsuitable if its license does not cover your intended downstream use.

Build a small, respectful client (Python)

The following client assumes your agreement supplies a documented feed URL and permits the fields returned. It reads the endpoint from an environment variable instead of guessing an ImmoScout24 URL. The code rate-limits requests, retries transient failures, caches responses, records provenance, and writes a CSV. Adapt the field names to the licensed schema.

import csv
import hashlib
import json
import os
import time
from pathlib import Path
from urllib.parse import urlparse

import requests

FEED_URL = os.environ['IMMO_FEED_URL']
ACCESS_TOKEN = os.environ.get('IMMO_ACCESS_TOKEN')
OUT = Path('immo_records.csv')
CACHE = Path('immo_cache')
REQUEST_INTERVAL = 2.0
TIMEOUT = 30

session = requests.Session()
if ACCESS_TOKEN:
    session.headers['Authorization'] = f'Bearer {ACCESS_TOKEN}'

CACHE.mkdir(exist_ok=True)

def cache_path(url):
    key = hashlib.sha256(url.encode()).hexdigest()
    return CACHE / f'{key}.json'

def fetch(url):
    path = cache_path(url)
    if path.exists():
        return json.loads(path.read_text())
    time.sleep(REQUEST_INTERVAL)
    for attempt in range(3):
        try:
            response = session.get(url, timeout=TIMEOUT)
            if response.status_code in (429, 500, 502, 503, 504):
                wait = min(60, 2 ** attempt * 5)
                time.sleep(wait)
                continue
            response.raise_for_status()
            payload = response.json()
            path.write_text(json.dumps(payload, ensure_ascii=False))
            return payload
        except (requests.RequestException, ValueError):
            if attempt == 2:
                raise
            time.sleep(2 ** attempt * 5)
    raise RuntimeError('unreachable')

def rows(payload):
    # Change this mapping to the fields your agreement authorizes.
    for item in payload.get('items', []):
        yield {
            'record_id': item.get('id'),
            'listing_url': item.get('url'),
            'retrieved_at_utc': time.strftime('%Y-%m-%dT%H:%M:%SZ', time.gmtime()),
            'price': item.get('price'),
            'rooms': item.get('rooms'),
            'floor_area_m2': item.get('floor_area_m2'),
            'canton': item.get('canton'),
            'parser_version': '1.0.0',
        }

payload = fetch(FEED_URL)
with OUT.open('w', newline='', encoding='utf-8') as handle:
    writer = csv.DictWriter(handle, fieldnames=['record_id', 'listing_url', 'retrieved_at_utc', 'price', 'rooms', 'floor_area_m2', 'canton', 'parser_version'])
    writer.writeheader()
    writer.writerows(rows(payload))
print(f'Wrote {OUT}')

Run it only after exporting the values supplied by your agreement:

export IMMO_FEED_URL='the-documented-feed-url-from-your-agreement'
export IMMO_ACCESS_TOKEN='token-issued-by-the-provider'
python export_immo.py

The cache prevents duplicate downloads, but it does not extend your license. Apply the shortest retention period required by the agreement and delete cached copies when a record is withdrawn.

Free tools Windows power users keep installed

One-click scans. No signup required.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Equivalent cURL request

curl --fail --retry 2 --max-time 30 
  -H "Authorization: Bearer $IMMO_ACCESS_TOKEN" 
  "$IMMO_FEED_URL" 
  -o response.json

Equivalent Node.js request

const endpoint = process.env.IMMO_FEED_URL;
const token = process.env.IMMO_ACCESS_TOKEN;
if (!endpoint) throw new Error('Set IMMO_FEED_URL');
const res = await fetch(endpoint, {
  headers: token ? { Authorization: `Bearer ${token}` } : {}
});
if (!res.ok) throw new Error(`${res.status} ${res.statusText}`);
const payload = await res.json();
console.log(JSON.stringify(payload));

Schema, quality, and deletion controls

Normalize without over-collecting

  • Keep currency and numeric units explicit; do not infer missing values.
  • Store the source locale and retrieval time so Swiss formatting changes are traceable.
  • Prefer stable provider IDs over names or addresses as keys.
  • Do not copy descriptions, photos, or contact details unless the written scope requires them.

Detect change instead of increasing traffic

Validate required keys and data types against fixtures. Alert on schema failures, sudden empty responses, duplicate IDs, or unusual status-code rates. Pause the job for investigation rather than raising concurrency. Keep parser versions alongside records so a correction can be reproduced.

Publish only what the license permits

Before displaying or reselling an export, check rights for copying, enrichment, combination, attribution, and onward sharing. Provide a privacy notice and a contact route for data-subject requests when identifiable data is processed.

Troubleshooting authorized collections

CAPTCHA or bot-check response

Cause: automated traffic was challenged, or the provider changed its controls. Fix: stop requests, capture the response for your operator, and contact the rights-holder. Do not solve, outsource, or bypass the challenge.

401 or 403 response

Cause: an expired credential, missing scope, or an endpoint outside your agreement. Fix: verify the token and documented URL with the provider; never rotate through unapproved accounts.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

429 rate limit

Cause: your request rate exceeded the contractual limit. Fix: honor the server’s retry guidance, lower concurrency, lengthen the interval, and obtain a written limit before scaling.

Empty or malformed JSON

Cause: a schema/version change, an unavailable listing, or an error document returned with a success status. Fix: log status and content type, validate against fixtures, quarantine the batch, and ask the feed owner for the current schema.

Duplicate or stale CSV rows

Cause: polling without a stable ID or reusing old cache entries. Fix: key records by the provider’s ID, retain retrieval timestamps, set a documented cache TTL, and process deletion or update signals.

Privacy request or takedown

Cause: a person or rights-holder asks for correction or removal. Fix: suspend the affected record, locate copies by provenance and ID, apply the contractual/legal response deadline, and document completion.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Performance, reliability, and cost planning

  • Start with one worker. Measure response time, error classes, and parser failures before considering parallelism.
  • Use incremental updates. Fetch only records changed since the last approved watermark when the feed supports it.
  • Cache deliberately. A cache reduces load but must respect freshness and retention terms.
  • Separate raw and curated data. Restrict raw access, encrypt storage, and delete raw content sooner than derived aggregates when permitted.
  • Budget compliance work. Legal review, processor contracts, monitoring, deletion handling, and incident response are part of total cost—not optional extras.
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Or skip the browser setup: ScreenshotNeo for visual captures

ScreenshotNeo is a website screenshot API and MCP server, not an ImmoScout24 data-access license. Use it to archive an authorized page’s visual state, check a listing layout, or let an AI agent inspect a page; it does not authorize copying listing content or bypass a CAPTCHA.

One GET request returns PNG, JPEG, WebP, or PDF. Before capture, it can accept consent banners and remove more than 60 known consent platforms, newsletter popups, and chat widgets; each step can be disabled. Bot checks/CAPTCHAs, blank pages, timeouts, failed loads, and cache hits are not billed, and response headers identify the page verdict and billing status. Its MCP server provides take_screenshot, get_page_info, and capture_pdf for Claude, Cursor, and other MCP clients.

Relevant controls include full-page capture with lazy images loaded, CSS-selector element capture, dark mode, 12 device presets plus custom viewports, retina scale, PDF paper size/margins/landscape/page ranges, custom CSS and JavaScript, pre-capture clicks, selector hiding, waits for selectors/delays/network idle, request or resource blocking, custom headers/cookies/user agent/Authorization, timezone and geolocation, transparent backgrounds, resizing, configurable-TTL caching, signed links, asynchronous jobs with signed webhooks, bulk capture of up to 100 URLs per call, a usage API, an OpenAPI specification, and compatible parameter names used by other screenshot APIs.

curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://www.immoscout24.ch -o shot.webp

See the ScreenshotNeo documentation for options and response headers. The same request in Python:

What’s actually slowing this PC down?

Pick the symptom - the matching free tool is one click away.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
import requests
r = requests.get("https://api.screenshotneo.com/v1/shot", params={"access_key": "YOUR_API_KEY", "url": "https://www.immoscout24.ch"}, timeout=90)
open("shot.webp", "wb").write(r.content)

And Node.js:

const q = new URLSearchParams({ access_key: 'YOUR_API_KEY', url: 'https://www.immoscout24.ch' });
const res = await fetch(`https://api.screenshotneo.com/v1/shot?${q}`);
Plan Included shots Price
Free 1,000/month $0, no card
Starter 3,000 $5
Growth 15,000 $15
Pro 60,000 $39
Scale 250,000 $99
Business 1,000,000 $249

Yearly billing gives two months free, and every feature is available on every plan. Start with 1,000 free screenshots a month with no card.

Frequently Asked Questions

Can I rely on robots.txt as permission to scrape ImmoScout24.ch?

No. A robots.txt file is a technical crawler preference, not a license to copy, republish, or combine marketplace content. Obtain written rights from the relevant rights-holder.

Does exporting a CSV change my obligations?

No. CSV is only a storage format. The same contractual, copyright, privacy, attribution, retention, and deletion rules apply to the underlying records.

Should I use a proxy service to avoid blocks?

Not to evade controls. A proxy or cloud provider may process personal data and becomes a processor that you must select, instruct, secure, and monitor; it cannot override SMG’s terms or a CAPTCHA.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Can ScreenshotNeo provide the listing data itself?

No. ScreenshotNeo returns screenshots or PDFs and page information. It does not grant permission to collect ImmoScout24 data or replace an authorized feed.

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.

Leave a Reply

Your email address will not be published. Required fields are marked *

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Read next

Recommended PC Tool
Recommended PC Tool
Windows Errors? Fix Them Before They SpreadFree repair scan
Outdated Drivers Are Slowing You DownFree scan - exact matches

Two free Windows tools

One Free Minute Could Fix That PC

Before you go - each of these free tools takes about a minute and tackles what quietly slows a Windows PC down.

Special offer. View Outbyte info, uninstall instructions, EULA, and Privacy Policy.