Immobilienscout24 (.de|.ch|.at) All-in-one avatar

Immobilienscout24 (.de|.ch|.at) All-in-one

Pricing

$29.00/month + usage

Go to Apify Store
Immobilienscout24 (.de|.ch|.at) All-in-one

Immobilienscout24 (.de|.ch|.at) All-in-one

Extract comprehensive German real estate data: property details (rent, size, rooms, location), high-res images, agent info with verification status, pricing insights, amenities (balcony, kitchen, cellar), contact forms, market analytics, and 40+ targeting parameters for research.

Pricing

$29.00/month + usage

Rating

5.0

(4)

Developer

Muhamed Didovic

Muhamed Didovic

Maintained by Community

Actor stats

3

Bookmarked

32

Total users

3

Monthly active users

9.4 hours

Issues response

6 hours ago

Last modified

Share

ImmobilienScout24 Scraper — DACH Real Estate (DE · CH · AT) · Search + Detail + Agent

The #1-rated ImmobilienScout24 scraper on Apify (★ 5.0). Scrape the full DACH residential real estate market from immobilienscout24.de (Germany), immoscout24.ch (Switzerland), and immobilienscout24.at (Austria) in one actor. Search results, full expose detail pages, and Makler (agent) profiles with all their listings — at $1.75 per 1,000 results. Pure HTTP, no browser.

How it works

How ImmoScout24 Scraper works

✨ Why use this scraper?

ImmobilienScout24 is the largest property portal in the DACH region — over 600,000 active listings, every major German, Swiss, and Austrian city, all three rental and sale tiers. Most ImmoScout scrapers on Apify only handle one country, one URL type, and skip the most valuable surface (agent profiles). This one does all three.

  • 🇩🇪 🇨🇭 🇦🇹 All DACH in one actor. Mix .de + .ch + .at URLs in the same startUrls list. Berlin, München, Hamburg, Wien, Salzburg, Zürich, Genf — same actor, same shape, same price.
  • 🎯 Three URL kinds, three handlers. Search results (/Suche/...), expose detail (/expose/{id}), and Makler profile (/anbieter/profil/{slug}) — most competitors don't crack the agent profile flow.
  • 🤝 Makler API + mobile expose JSON merge. Agent-profile rows merge clientFields (from the public agency API) with the full mobile-app expose JSON, giving you 40+ targeted fields per listing the agent has.
  • 📋 Mobile-app endpoint. Uses ImmoScout24's mobile-app JSON endpoint (the one used by their native iOS/Android apps), not DOM-scraped HTML — faster, less fragile, more accurate.
  • 🔁 Monitoring & change-tracking. monitoringMode: true emits only listings new since the last run. Add detectPriceChanges to catch price cuts / hikes (with days-on-market) and detectRemovedListings to catch sold / delisted — a complete new · price · removed market-change feed, all at the cheaper $0.50/1k check rate. See Change tracking.
  • 🛡 Akamai-cleared. Pure HTTP via Apify Residential. No headless browser. Same backend handles Cloudflare-fronted detail pages and the API endpoints transparently.
  • ⭐️ Customer-rated #1. Top of the Apify Store ranking for ImmoScout24 scrapers by user count, with a perfect 5.0★ rating across 9 reviews.

🎯 Use cases

TeamWhat they build
Real estate market analystsDaily inventory snapshots for DE / CH / AT — track void rates, price-per-m², new-listings velocity by city and sub-market
Property tech (proptech) platformsPower your listings UI with a structured DACH feed without negotiating direct API access with Scout24
Compensation & rent benchmarkingCity-level rent-per-m² benchmarks for HR / corporate relocation teams
Agency competitive intelligenceScrape competing Makler (agent) portfolios — how many listings, in what sub-markets, at what price points
Investor / fund sourcingBuild deal-flow pipelines filtered by yield, total return, m², year built, EPC class
Geospatial analyticsEvery detail row carries coordinates.lat + coordinates.lng (Scout24's verified geocoding)

📥 Supported inputs

URL patternRegionHandlerBehaviour
immobilienscout24.de/Suche/de/{state}/{city}/{type}-{mode}🇩🇪 DESearchPaginates all result pages, then fans out to each expose. Filters in URL are honoured.
immobilienscout24.de/expose/{id}🇩🇪 DEDetailSingle expose row, full mobile JSON shape
immobilienscout24.de/anbieter/profil/{slug}🇩🇪 DEAgentLoads residential BUY then RENT listings via agency API, merges clientFields + full mobile expose JSON. Tip: if the profile HTML is blocked, add ?realtorEncryptedId=... (opaque ID from /anbieter/contact/{slug}/{id}).
immobilienscout24.at/regional/{state}/{city}/{type}-{mode}🇦🇹 ATSearchAustrian search results
immobilienscout24.at/expose/{id}🇦🇹 ATDetailAustrian expose
immoscout24.ch/de/{type}/{mode}/region-{city}🇨🇭 CHSearchSwiss search results
immoscout24.ch/de/d/{type}-{mode}/{id}🇨🇭 CHDetailSwiss expose

Easiest workflow: apply filters in the browser, copy the URL out of the address bar, paste into startUrls. The actor classifies each URL automatically.

🔄 How it works (step by step)

  1. Classify each startUrl — country (DE/CH/AT) × kind (Search / Detail / Agent).
  2. Search URLs: walk all result pages (no 500-row cap — ImmoScout's API gives the full inventory), collect every expose ID.
  3. Detail URLs: hit the mobile-app expose JSON endpoint directly — no HTML scraping, no JS.
  4. Agent URLs: call the agency API twice (BUY + RENT), merge clientFields, then enrich each listing with the mobile expose JSON. If the public profile HTML is rate-limited, support ?realtorEncryptedId=... (a 32-char opaque ID from the contact endpoint) as a fallback.
  5. (Monitoring mode) dedupe against previously-scraped IDs and emit only fresh listings — optionally also diff prices (price_changed rows) and detect sold/removed listings with days-on-market. See Change tracking.
  6. Push to dataset — one row per listing or agent profile. JSON during the run, CSV at end.

⚙️ Input parameters

ParameterTypeDefaultDescription
startUrlsarray of {url}(required)DE / CH / AT URLs (search, expose, or agent). Mix freely.
monitoringModebooleanfalseEmit only listings new since the last run. Costs $0.50/1k for change-detection checks (per-item, separate event).
detectPriceChangesbooleanfalseMonitoring add-on. Reports price movements between runs as price_changed rows (old→new price, delta, %, direction) into a named changes-<runId> dataset — no detail re-fetch, billed at $0.50/1k. With detectRemovedListings also on, removed rows gain firstSeenAt + daysOnMarket. Requires monitoringMode. See Change tracking.
detectRemovedListingsbooleanfalseMonitoring add-on. Reports sold / delisted listings (present in a prior run, gone now) as removed rows into a named removed-<runId> dataset, billed at $0.50/1k. Fires only on a fully-enumerated search (≤ ~2000 pages) to avoid false positives. Requires monitoringMode.
maxConcurrencyinteger10Parallel HTTP request limit. Sweet spot 5–10 via Apify Residential.
minConcurrencyinteger1Minimum parallel workers.
maxRequestRetriesinteger100Per-URL retry budget on Akamai 403s + proxy CONNECT failures.
proxyobjectApify ResidentialApify proxy config. Note: default pool works cleanly for all three DACH locales.
excludeSectionsbooleanfalseDrop the per-listing sections array (~70% of DE row size). Everything downstream-useful inside it is already lifted into normalized.* (see Normalized fields), so turning this on is safe for most consumers.
excludeZipCodeShapesbooleanfalseDrop just the zipCodeShapes polygon coordinates inside sections (4–5 KB per listing). Independent of excludeSections.
excludeTrackingbooleanfalseDrop the per-listing tracking block (small but usually unused).
allowApproximateCoordsbooleanfalseDefault-off honesty switch for coordinates. With it OFF, address.latitude/longitude are filled only when the source provides a per-listing point (e.g. ImmoScout singleton markers); cluster-center coords (shared across many listings) are left null. Every coord-bearing row also carries address.coordinatePrecision'exact' | 'rooftop' | 'street' | 'approximate' | null so you can filter. Turn this on to also fill in cluster-center coords (~hundreds of metres off) — they'll be tagged 'approximate'.
geocodeAddressesbooleanfalseWhen ON, listings where we decoded the street + house number but couldn't get coords from ImmoScout are run through a geocoder (default Photon, free). Rooftop / street-level hits are kept (coordinatePrecision: 'rooftop' | 'street'); city-level hits are rejected as too coarse. Combines with the Telekom base64 decoder + free-text scan to push trustworthy-coord coverage from ~25% to ~95%+ without any 'approximate' fakes. Two-layer cache (in-memory + Apify KV geocoder-cache) keeps repeat addresses from re-hitting the provider.
geocoderProviderenumphotonWhich geocoder. photon (free, Komoot OSM, 10 req/sec — the right default). mapbox ($0.50/1k, set geocoderApiKey to your pk.… token). google (~$5/1k, set geocoderApiKey to your Maps API key).
geocoderApiKeystring (secret)Required when geocoderProvider is mapbox or google. Ignored for Photon.

Example input — DACH mixed (search across all three)

{
"startUrls": [
{ "url": "https://www.immobilienscout24.de/Suche/de/berlin/berlin/wohnung-mieten?pricetype=rentpermonth" },
{ "url": "https://www.immobilienscout24.at/regional/wien/wien/wohnung-mieten" },
{ "url": "https://www.immoscout24.ch/de/wohnung/mieten/region-zuerich" }
],
"proxy": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}

Example input — Makler (agent) profile

{
"startUrls": [
{ "url": "https://www.immobilienscout24.de/anbieter/profil/engel-voelkers-berlin-mitte-50-2543" }
]
}

Example input — incremental monitoring

{
"startUrls": [
{ "url": "https://www.immobilienscout24.de/Suche/de/berlin/berlin/wohnung-kaufen" }
],
"monitoringMode": true
}

🔁 Change tracking and market monitoring

Turn a search URL into a daily change feed. With monitoringMode on you get new listings; add the two flags below and you get the full set of market signals — each written to its own run-scoped named dataset and billed at the cheaper additional-data $0.50/1k rate (not the $1.75/1k result rate), because no listing detail is re-fetched.

SignalFlagWhere it landsBilled
New listingsmonitoringModedefault dataset (full rows)$1.75/1k (new rows)
Price change (cut / hike)detectPriceChangeschanges-<runId>$0.50/1k
Removed (sold / delisted)detectRemovedListingsremoved-<runId>$0.50/1k
Days-on-marketboth add-ons onon each removed row
{
"startUrls": [
{ "url": "https://www.immobilienscout24.de/Suche/de/berlin/berlin/wohnung-kaufen" }
],
"monitoringMode": true,
"detectPriceChanges": true,
"detectRemovedListings": true
}

price_changed row (in changes-<runId>):

{
"status": "price_changed",
"listingId": "169186727",
"oldPrice": 500000, "newPrice": 475000,
"priceDelta": -25000, "pctChange": -5, "direction": "decrease",
"isPrivate": false,
"firstSeenAt": "2026-07-01T09:12:44.000Z",
"detectedAt": "2026-07-09T06:00:11.000Z",
"url": "https://www.immobilienscout24.de/expose/169186727",
"searchUrl": "…", "market": "DE"
}

removed row (in removed-<runId>, with both add-ons on):

{
"status": "removed",
"listingId": "162554901",
"firstSeenAt": "2026-06-04T08:30:00.000Z",
"daysOnMarket": 35,
"detectedRemovedAt": "2026-07-09T06:00:12.000Z",
"url": "…", "searchUrl": "…", "market": "DE"
}

How to read each run: new rows are in the run's default dataset; price changes and removed are in the named datasets changes-<runId> / removed-<runId> (open them from the run's Storage → Datasets tab, or by name via the API). The stores that back the diff (seen-IDs, last-price, first-seen) are keyed per search URL, so keep the same startUrls between runs.

Tracking a whole market (~200k+ listings). A single ImmoScout search enumerates reliably up to ~2,000 pages (~90k listings); beyond that, slice the market into sub-searches (by state → city → price band → property type), each under that cap, and run them together. The first run is a one-time baseline (full $1.75/1k); every run after is a cheap delta — you only pay $1.75/1k for genuinely new listings, and $0.50/1k for the price-change and removed checks. Removal detection is skipped (and says so in the log) for any slice that exceeds the page cap, so partial enumerations never emit false "removed" rows.

📊 Output overview

Three row shapes, classified by the input URL:

  • Search-result row — one row per expose ID discovered on a search page. Has the listing's title, price, size, location, agent reference. Lightweight; ~100 fields.
  • Expose detail row — full mobile-app shape. ~150 fields including marketing description, all photos, energy data, agent contact, location coordinates, courtage, neighbourhood metadata.
  • Makler (agent) row — agent's profile + their full listings portfolio merged. ~200 fields per listing × N listings, plus the agent's metadata (realtorName, clientFields, contact details).

All three are pushed to the same dataset. Filter by kind field (or by URL pattern) to split them downstream.

📦 Output sample — Expose detail row (mobile JSON shape)

{
"kind": "expose",
"id": "138123456",
"exposeUrl": "https://www.immobilienscout24.de/expose/138123456",
"country": "DE",
"title": "Lichtdurchflutete 3-Zimmer Altbauwohnung mit Balkon · Berlin Prenzlauer Berg",
"type": "apartment-rent", // apartment-rent / apartment-buy / house-rent / house-buy / land / commercial
"address": {
"fullAddress": "Schönhauser Allee 123, 10437 Berlin",
"street": "Schönhauser Allee 123",
"postcode": "10437",
"city": "Berlin",
"district": "Prenzlauer Berg",
"region": "Berlin",
"country": "Germany"
},
"coordinates": { "lat": 52.5485, "lng": 13.4126 },
// ── Price ──
"price": { "amount": 1850, "currency": "EUR", "period": "month", "raw": "1.850 € warm" },
"priceDetails": { "kalt": 1450, "warm": 1850, "nebenkosten": 280, "heizkosten": 120, "deposit": "3 Monatskaltmieten" },
"courtage": { "amount": 0, "isCourtageFree": true, "note": "provisionsfrei" },
// ── Size + rooms ──
"livingSpace": 78.5, // m²
"rooms": 3.0,
"bedrooms": 2,
"bathrooms": 1,
"floor": "3 / 5",
"lotSize": null, // null for apartments
// ── Building ──
"yearBuilt": 1908,
"yearRefurbished": 2019,
"buildingType": "Altbau",
"condition": "Modernisiert",
"objectCondition": "mint_condition",
"interiorQuality": "luxury",
"lastRefurbishment": "2019",
// ── Energy (EU EPC) ──
"energy": {
"energyCertificateAvailable": true,
"energyCertificateType": "Verbrauchsausweis",
"energyConsumption": 87.5,
"energyClass": "C",
"primaryEnergyCarrier": "gas",
"thermalCharacteristic": "energieausweis_neu"
},
// ── Amenities (boolean flags + descriptive) ──
"amenities": {
"balcony": true, "terrace": false, "garden": false,
"kitchen": true, "guestToilet": true, "cellar": true,
"elevator": true, "wheelchairAccess": false,
"parking": "Tiefgaragen-Stellplatz",
"heating": "Zentralheizung",
"flooring": ["Parkett", "Fliesen"]
},
// ── Description + media ──
"description": "Charmante Altbauwohnung in bester Prenzlberg-Lage…", // full HTML
"objectDescription": "Im 3. OG eines saniertes Gründerzeithaus…",
"locationDescription": "Schönhauser Allee — Lebendigste Strasse Berlins…",
"equipmentDescription": "Parkett · Einbauküche · Echtholzdielen…",
"photos": [
{ "url": "https://pictures.immobilienscout24.de/.../1.jpg", "caption": "Wohnzimmer" },
{ "url": "https://pictures.immobilienscout24.de/.../2.jpg", "caption": "Küche" }
],
"photosCount": 18,
"floorPlan": "https://pictures.immobilienscout24.de/.../grundriss.pdf",
"video": null,
"virtualTour": "https://my.matterport.com/show/?m=abc",
// ── Agent / Makler ──
"agent": {
"realtorId": "12345",
"realtorEncryptedId": "abc123def456...",
"name": "Engel & Völkers Berlin Mitte",
"profileUrl": "https://www.immobilienscout24.de/anbieter/profil/engel-voelkers-berlin-mitte-50-2543",
"phone": "+49 30 1234567",
"email": "kontakt@engelvoelkers.de",
"logoUrl": "https://logos.immobilienscout24.de/12345.png",
"isVerified": true,
"memberSince": "2014-03-15"
},
// ── Listing metadata ──
"datePosted": "2026-05-12T08:30:00Z",
"dateUpdated": "2026-05-15T14:22:00Z",
"listingState": "active",
"viewCount": 412,
"favouriteCount": 28,
"premiumListing": false,
"isNew": true,
"isProjectShowcase": false,
// ── Tracking + ads ──
"adTargetingParameters": { /* … */ },
"tracking": { /* … */ },
"scrapedAt": "2026-05-17T10:00:00.000Z"
}

📦 Output sample — Makler (agent) profile row

{
"kind": "agent",
"realtorId": "50-2543",
"realtorName": "Engel & Völkers Berlin Mitte",
"realtorProfileUrl": "https://www.immobilienscout24.de/anbieter/profil/engel-voelkers-berlin-mitte-50-2543",
"header": {
"logoUrl": "https://logos.immobilienscout24.de/50-2543.png",
"bannerUrl": "https://...",
"isVerified": true,
"memberSince": "2014-03-15",
"totalListings": 47
},
"contact": {
"name": "Maximilian Schäfer",
"title": "Senior Real Estate Consultant",
"phone": "+49 30 1234567",
"email": "max@engelvoelkers.de",
"address": "Friedrichstraße 123, 10117 Berlin"
},
"clientFields": {
"shortDescription": "Premium real estate consultancy specialising in luxury apartments...",
"longDescription": "Engel & Völkers is the world's leading service provider in the brokerage...",
"officeAreas": ["Berlin Mitte", "Prenzlauer Berg", "Charlottenburg"],
"specializations": ["Luxury apartments", "Pre-1900 buildings", "Investment properties"]
},
"basicInfo": { /* … */ },
"sections": {
"buyListings": [ /* array of full expose-shape rows for properties this agent has for SALE */ ],
"rentListings": [ /* array of full expose-shape rows for properties this agent has for RENT */ ]
},
"adTargetingParameters": { /* … */ },
"tracking": { /* … */ },
"sourceProfileUrl": "https://www.immobilienscout24.de/anbieter/profil/engel-voelkers-berlin-mitte-50-2543",
"scrapedAt": "2026-05-17T10:00:00.000Z"
}

🗂 Key output fields (expose detail)

GroupFields
Identityid, kind, exposeUrl, country (DE / CH / AT), type
Address + geoaddress.{fullAddress,street,postcode,city,district,region,country}, coordinates.{lat,lng}
Priceprice.{amount,currency,period,raw}, priceDetails.{kalt,warm,nebenkosten,heizkosten,deposit}, courtage.{amount,isCourtageFree,note}
SizelivingSpace, rooms, bedrooms, bathrooms, floor, lotSize
BuildingyearBuilt, yearRefurbished, buildingType, condition, objectCondition, interiorQuality
Energyenergy.{energyCertificateAvailable,energyCertificateType,energyConsumption,energyClass,primaryEnergyCarrier}
Amenitiesamenities.{balcony,terrace,garden,kitchen,guestToilet,cellar,elevator,wheelchairAccess,parking,heating,flooring}
Content + mediadescription (HTML), objectDescription, locationDescription, equipmentDescription, photos[], floorPlan, video, virtualTour
Agentagent.{realtorId,realtorEncryptedId,name,profileUrl,phone,email,logoUrl,isVerified,memberSince}
TimingdatePosted, dateUpdated, scrapedAt (ISO 8601)
EngagementviewCount, favouriteCount, listingState, premiumListing, isNew, isProjectShowcase
Targeting / adsadTargetingParameters.*, tracking.* (raw Scout24 telemetry, useful for matching against ad campaigns)

🧬 normalized block — cross-country canonical shape

Every detail row carries a normalized object alongside the raw payload. It's the same schema across DE / AT / CH, so you can write your downstream code once. If you set excludeSections: true to shrink the output, everything below stays intact — it's lifted into normalized before the source sections get stripped.

Groupnormalized.* fieldNotes
IdentitylistingId, title, description, url, detailApiUrl, countryCode, transferType (BUY/RENT), realEstateType, categories[]
Priceprice.{amount, currency, formatted, kind}kindBUY/RENT_NET/RENT_GROSS/RENT_TOTAL
Areaarea.{livingSpace, plotArea, usableArea} in m²
Roomsrooms.{total, bedrooms, bathrooms}DE typically only reports total; bedrooms/bathrooms populated when the listing's attribute list breaks them out (~60% of DE listings)
Floor / agefloor.{current, total}, construction.{yearBuilt, condition, isNew}
Addressaddress.{street, houseNumber, zip, city, region, country, latitude, longitude, coordinatePrecision, coordinateSource, formatted}DE listings often redact street + house number on the public expose. We unredact ~58% of them by decoding adTargetingParameters.obj_telekomInternetUrlAddition (a base64-encoded JSON blob with the real address). Coordinates default to honest mode: lat/lng filled only when ImmoScout returns a per-listing point (coordinatePrecision: 'exact'); cluster-center coords are skipped (lat/lng null). Set input allowApproximateCoords: true to also fill in cluster-center coords, flagged as 'approximate'. coordinateSource always tells you where the coord came from ('is24-map-singleton', 'is24-map-cluster', 'expose-map-section', 'at-expose', 'ch-expose').
Contactcontact.{name, company, phone, email, website, logoUrl}
Mediaimages[] (URLs only, back-compat) and media[] ({url, caption, type} per picture — captions are German room labels like Wohnzimmer, Küche, Bad)
Documentsdocuments[] ({url, title})Floor plans, energy certificates, PDFs
TimingpublishedAt, updatedAt, availableFromavailableFrom is the "Bezugsfrei ab" / move-in date when declared (raw German label like "ab sofort" or an ISO date)
fairPricefairPrice.{status, label, level}ImmoScout's own price-fairness rating widget (DE only). level is 1–5 (5 = best deal).
financeCostsfinanceCosts.{purchasePrice, additionalCosts, totalCosts, brokerCommission, landTransferTax, notaryCosts, landRegistryEntry}Each sub-field is {value, text} (BUY) plus percentage where applicable (broker/tax rates). Null on RENT listings.
priceComparablespriceComparables.{minPricePerM2, maxPricePerM2, minSimilarPricePerM2, maxSimilarPricePerM2, actualObjectPerM2, positionInPercent}ImmoScout's "Preis- und Lageinformationen" widget. actualObjectPerM2 is this listing's €/m², positionInPercent is its position on the regional price bar (0.0 = at min, 1.0 = at max, 0.5 = median).

🇨🇭 Switzerland — DataDome notice

api.immoscout24.ch is gated by DataDome's interactive-captcha tier. The scraper consumes browser sessions (cookies + sticky-proxy IP) from a shared Apify KV store named browser-sessions, populated by a sibling actor (memo23/session-warmer) running headed Camoufox locally. You'll see one of these in the CH branch logs each run:

[swiss-warm] using external pool session id=… ageMin=… failureCount=… cookies=_cfuvid,cf_clearance,__cf_bm,datadome
[CH_SEARCH] HTTP 200 deeplink from=0 size=20 total=… hits=20

If the pool is empty the scraper attempts an in-actor warmup (headless Camoufox); this fails ~100% on Apify cloud and the run surfaces the failure honestly in the status banner. Keep the warmer cron running (every 20 min on a Mac via launchd, or on a small Linux VPS with Xvfb) and the pool stays fresh.

💰 Pricing

$1.75 per 1,000 results. Pay only for rows in the dataset.

EventCharged whenRate
apify-default-dataset-item (Result)A row is written to the dataset$1.75 / 1,000
apify-actor-start (Infrequent)Each run starts$0.005 / run
additional-data (Monitoring)Each monitoring check — new-listing dedup, price-change, and removed detection in monitoringMode$0.50 / 1,000

Cost examples:

  • 500 Berlin rental apartments → ~$0.88
  • 5,000 listings across DE + CH + AT → ~$8.75
  • Daily monitoring of 2,000 listings → ~$1.00 / day = ~$30 / month
  • Daily change-tracking of a 50k-listing market → one baseline (~$88), then ~$0.50/1k/day of checks + $1.75/1k only on the day's new listings

What makes this richer than the competition

CapabilityOther ImmoScout scrapersThis actor
DACH coverageUsually .de only.de + .ch + .at in one actor
Agent (Makler) profilesNot offeredFull profile + all their BUY and RENT listings via agency API
Mobile-app endpointDOM-scraping HTML (fragile)ImmoScout's own mobile-app JSON (stable, faster, richer)
Energy fields (EPC)Often missingenergyClass, energyConsumption, energyCertificateType, primaryEnergyCarrier — full EU EPC compliance
Monitoring & change trackingNot offeredIncremental new-only runs plus price-change, sold/removed, and days-on-market signals — all at the $0.50/1k check rate
Customer rating5.0 ★ (some) / 0 (most)5.0 ★ across 9 reviews — #1 in category by users (87 u30d)
realtorEncryptedId fallbackn/aWorks around HTML rate-limiting on agent profiles
Pricing$0.90–$3.00 / 1,000$1.75 / 1,000

❓ FAQ

Why does this actor cover DE + CH + AT in one listing? ImmoScout24 is a single Scout24 SE-owned property portal that operates across all three DACH markets with consistent UI and a unified mobile API. Same backend, same fields, same actor. Pasted URLs are classified by hostname; the rest is identical.

What's a "Makler profile" and why scrape it? A Makler is a German real-estate agent. Each agent has a public profile page on ImmoScout24 listing all their current BUY + RENT properties. Scraping the agent gives you a complete portfolio snapshot in one row — useful for competitive intelligence, agency rankings, deal-flow sourcing.

What's realtorEncryptedId? A 32-char opaque ID Scout24 sometimes requires to access agent listings via the public API. You'll find it on the agent's /anbieter/contact/{slug}/{id} page. Pass it as a query param to the profile URL if the actor reports "agent profile HTML is rate-limited".

Can it bypass the Cloudflare challenge on expose detail pages? The expose endpoint is API-fronted (no JS challenge). Apify Residential default pool returns clean 200 OK. No browser needed.

Does monitoring mode cost extra? monitoringMode: true adds $0.50/1,000 change-detection checks (the additional-data event). For a daily monitor of 2,000 listings: ~$0.001/check × 2,000 × 30 days = ~$60/month all-in. Without monitoring: full re-scrape every run at the standard $1.75/1k.

How do I track price changes and sold listings? Turn on detectPriceChanges and/or detectRemovedListings alongside monitoringMode. Each run then compares against the previous run and writes price_changed rows to a changes-<runId> dataset and removed (sold/delisted) rows to a removed-<runId> dataset — both at the $0.50/1k check rate, no detail re-fetch. With both on, removed rows also carry firstSeenAt + daysOnMarket. Keep the same startUrls between runs so the diff lines up. See Change tracking.

Can I track the whole DE/CH/AT market for price + sold signals? Yes — slice the market into sub-searches each under ImmoScout's ~2,000-page enumeration limit (state → city → price band → type) and run them together with the monitoring flags on. The first run is a one-time baseline; every run after only pays $1.75/1k for genuinely new listings plus $0.50/1k for the checks. For very large daily runs with price history + analytics, an external database (e.g. Mongo) is the better state store than the built-in KV — reach out if you want that build.

Can I get historical Scout24 data (closed deals, transaction prices)? No. ImmoScout24 doesn't publish closed-deal data publicly — this actor only sees the currently-active inventory. For transaction history, you'd need a separate data partner (Empirica, ImmoScout24 Insights paid product).

What's the realistic throughput? Default maxConcurrency: 10. ~10–20 listings/sec sustained on Apify Residential. So 1,000 listings in 1–2 min; 10,000 in 10–15 min.

💬 Support

🛠 Additional services

  • Custom output shape, additional fields, or a private build: muhamed.didovic@gmail.com
  • Need other DACH property platforms (Immowelt, Immonet, Immobilien.de, Wohnungsbörse, Comparis, Homegate, willhaben.at)? Drop an email — most are already in the portfolio.
  • For API access (no Apify fee, just a usage fee for the API): muhamed.didovic@gmail.com

🔎 Explore more scrapers

If this ImmoScout24 scraper was useful, see other real-estate scrapers at memo23's Apify profile — Immowelt (DE), Immonet (DE), Immobiliare (IT), Immoweb (BE), LoopNet US + UK, Rightmove UK, and more.


⚠️ Disclaimer

This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by ImmobilienScout24 GmbH, Scout24 SE, or any of their subsidiaries or related entities. All ImmobilienScout24-, ImmoScout24-, and Scout24-related trademarks, service marks, trade names, and logos are the property of their respective owners and are used here solely for descriptive purposes — to identify the public property listings from which this scraper extracts data.

This Actor accesses only publicly available property-listing and agent-profile pages on immobilienscout24.de, immobilienscout24.at, and immoscout24.ch. You are solely responsible for ensuring that your use of the data complies with each site's Terms of Service, applicable copyright law, the EU Database Directive, GDPR, the German Telemediengesetz, the Swiss Federal Act on Data Protection (revFADP), the Austrian Datenschutzgesetz, and any other regulations that may apply to your jurisdiction or use case. Do not use this Actor to bulk-republish copyrighted content, to harass landlords / tenants / agents, to circumvent any rate-limiting or technical protection measure intentionally imposed by the source sites, or to enable unsolicited outreach in violation of GDPR / e-Privacy consent rules.

The author provides this Actor "as is", without warranty of any kind, and disclaims any liability for damages arising from its use.


SEO Keywords

immobilienscout24 scraper, immoscout24 scraper, immobilienscout24.de scraper, immobilienscout24.at scraper, immoscout24.ch scraper, immobilienscout24 api, immoscout api, germany real estate scraper, switzerland real estate scraper, austria real estate scraper, dach real estate api, berlin wohnung scraper, münchen wohnung scraper, hamburg wohnung scraper, wien immobilien scraper, zürich wohnung scraper, makler scraper, immobilien makler api, scout24 agent scraper, eu epc data, energy class scraper, immobilien monitoring, deutsche immobilien daten, mietpreis benchmarks, kaufpreis-pro-quadratmeter scraper, apify immoscout actor, real estate price change tracking, price drop monitoring, days on market scraper, sold listings detection, delisted property tracker, immobilien preisänderung, price history real estate api, market change feed