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.
#1 Best Overall
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.
Define a permissioned project before touching the site
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
Rank #2
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.
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.
Rank #3
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.
The Tool Desk
Outbyte PC Repair FREEClear out junk files and repair common Windows errorsFree Scan →Outbyte Driver Updater FREEFix the driver behind crashes, sound loss and screen glitchesFind Drivers →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.
Rank #4
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.
Quick wins for a faster PC:
Fix the driver behind crashes, sound loss and screen glitchesFind Drivers →Clear out junk files and repair common Windows errorsFree Scan →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.
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.
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.
Best Value
- Essential economics the way they think how to
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.
Do these 3 things before closing this tab:
1Clear out junk files and repair common Windows errors2Scan for outdated or missing drivers - takes under a minute3Repair Windows errors before they cause bigger problemsCan 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.
Quick Recap
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.




