L logiover
business · Jul 9, 2026 · 7 min read

How to Scrape ImmobilienScout24 Germany Real Estate Data

Extract German property listings from ImmobilienScout24 — price, €/m², GPS, address and agent contact via the IS24 mobile JSON API. No browser, no WAF, no key.

ImmobilienScout24 (IS24) is Germany’s largest property portal, with millions of active listings for buying and renting. It’s also a wall: the public website sits behind an AWS WAF JavaScript challenge that turns a naive curl into a challenge page or a 403. IS24 offers no open public listings API either, so most people either click through the site by hand or throw a headless browser at the WAF and fight it every few weeks. This guide covers the approach that actually holds up — reading IS24’s own mobile JSON API — what fields it exposes, and how to pull structured German real-estate data at scale.

What’s worth extracting

The mobile API returns dense records — 70+ fields per listing. Grouped by what you’ll actually query on:

  • Identity and statusid (the IS24 scout ID), detailUrl, title, realEstateType, transactionType (buy/rent), listingType, and flags like isPrivate, isProject, newlyConstructed and publishedRelative.
  • Pricingprice, purchasePrice, currency (EUR), pricePerSqm (the €/m² you’ll heatmap on), and hasCommission. For rentals: baseRent (Kaltmiete), totalRent (Warmmiete), serviceCharge, heatingCosts and deposit.
  • Size and structurelivingSpaceSqm, plotAreaSqm, rooms, floor, numberOfFloors, yearConstructed, condition, interiorQuality, apartmentType, buildingType.
  • Energy and featuresheatingType, firingType, energyEfficiencyClass (A+ to H), plus boolean flags hasBalcony, hasGarden, hasCellar, hasLift, hasKitchen, isBarrierFree.
  • Location — a full German address breakdown: street, houseNumber, postalCode, region, city, district, quarter, fullAddress, plus latitude/longitude.
  • MediamainImageUrl, the full imageUrls list, and imageCount.
  • Agent lead dataagentName, agentCompany, agentPhone, agentRating, agentRatingCount, agentVerified.
  • Search contextsearchLocationInput, searchGeocode, searchGeoLabel and scrapedAt.

For a €/m² market study you only need price, living space and location. For lead generation you cluster on agentCompany and grab agentPhone, or filter isPrivate for direct-owner listings.

How the source actually works

The key insight is that IS24 ships a mobile app, and that app talks to mobile JSON endpoints that are far less defended than the public website. Instead of scraping the WAF-protected HTML (or its __NEXT_DATA__ blob), the actor queries those mobile endpoints directly and gets clean JSON back.

There are two moving parts. First, geocoding: you type a location by name and IS24’s geo-autocomplete resolves it to a numeric geocode. Second, the search query against the mobile API with your filters and sort, paginated at 20 listings per page. A realistic input for apartments to buy in two cities:

{
  "locations": ["Berlin", "München"],
  "realEstateType": "apartmentbuy",
  "priceMin": 200000,
  "priceMax": 600000,
  "livingSpaceMin": 50,
  "livingSpaceMax": 100,
  "roomsMin": 2,
  "roomsMax": 3,
  "sort": "newest",
  "fetchDetails": true,
  "maxListings": 500,
  "proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "DE" }
}

Each entry in locations becomes its own task — you can pass city, district or quarter names (Berlin, Prenzlauer Berg, Frankfurt am Main) or paste a raw numeric geocode directly (Berlin is 1276003001). realEstateType picks one of 12 property types: apartmentbuy, apartmentrent, housebuy, houserent, livingBuySite (plots), garagebuy, garagerent, shortTermAccommodation, flatShareRoom (WG rooms), investment, compulsoryAuction and houseType.

The fetchDetails toggle is worth understanding: when true, the actor fetches each listing’s detail (expose) page for the rich fields — year built, condition, heating, energy class, feature flags, agent contact. That adds one request per listing. Set it to false when you only need the list-level fields and want to run faster and cheaper.

The property-type coverage goes well beyond the obvious apartment/house split. livingBuySite returns plots and land, garagebuy and garagerent cover parking, shortTermAccommodation picks up furnished and temporary stays, and flatShareRoom returns WG (shared-flat) rooms. Two types matter for specialist use cases: investment exposes let-status via the isRented flag for buy-to-let screening, and compulsoryAuction surfaces Zwangsversteigerung listings — foreclosure auctions that rarely appear in mainstream searches. Sorting is flexible too: newest for monitoring fresh inventory, price_asc/price_desc, living_space_asc/living_space_desc, rooms_asc/rooms_desc, or standard for IS24’s own relevance order. Pair newest with a scheduled run and you have a near-real-time feed of new listings in your target districts.

The access reality

The public IS24 website is protected by an AWS WAF JavaScript challenge. That’s the thing that breaks scrapers. This actor sidesteps it entirely by never touching the website — it reads the mobile backend. So you avoid the WAF, but you inherit two other realities.

A proxy is required, and it should be German residential. The mobile API is served from Germany, so German residential IPs (apifyProxyGroups: ["RESIDENTIAL"], apifyProxyCountry: "DE") are the most reliable. This isn’t optional politeness — it’s what keeps the mobile endpoints answering cleanly at scale. The input exposes requestDelay (keep it at 300 ms or higher) and maxRetries (each retry rotates the proxy IP) so you can tune pacing.

Deep pagination is capped. Like most listing portals, IS24 won’t let you page infinitely into one result set. The README’s guidance: narrow with priceMin/priceMax, livingSpaceMin/livingSpaceMax and room filters, or split a big city into its districts and run each separately. Many tight queries reach far more total inventory than one broad query that hits the pagination ceiling early.

Open the ImmobilienScout24 Scraper on Apify — one run returns thousands of German listings with price, €/m², GPS, full address and agent phone. No browser, no WAF, no API key. Export to JSON, CSV or Excel.

Example output

A trimmed record for a Berlin apartment:

{
  "id": "155123456",
  "title": "Moderne 3-Zimmer-Wohnung mit Balkon in Prenzlauer Berg",
  "realEstateType": "apartmentbuy",
  "price": "545000",
  "currency": "EUR",
  "pricePerSqm": "7267",
  "hasCommission": "false",
  "livingSpaceSqm": "75",
  "rooms": "3",
  "yearConstructed": "1998",
  "energyEfficiencyClass": "C",
  "hasBalcony": "true",
  "hasLift": "true",
  "postalCode": "10435",
  "city": "Berlin",
  "quarter": "Prenzlauer Berg",
  "latitude": "52.5389",
  "longitude": "13.4108",
  "agentName": "Anna Müller",
  "agentCompany": "Berlin Premium Immobilien GmbH",
  "agentPhone": "+49 30 1234567",
  "scrapedAt": "2026-07-06T12:00:00.000Z"
}

Typical use cases

  • Market research — build €/m² heatmaps by city, district and quarter across Germany from pricePerSqm, city, district and quarter.
  • Investment screening — scrape apartmentbuy and apartmentrent for the same city and combine purchasePrice (buy) with baseRent (rent) to compute gross rental yield per district. The isRented flag helps on investment-type listings.
  • Lead generation — filter isPrivate: true for direct-owner listings, or cluster by agentCompany and pull agentPhone to build an agency outreach list.
  • Price tracking — re-run on a schedule and diff against prior datasets on the stable id, using publishedRelative to spot new inventory.
  • New-build monitoring — set newBuildingOnly: true to track Neubau projects and developer inventory over time.
  • Cross-city comparison — pass several locations in one run to benchmark Berlin, München, Hamburg, Köln and Frankfurt side by side.

Cost and effort math

The build-it-yourself version of this is a maintenance treadmill. You’d have to reverse the mobile API’s request signing, keep the geocode-resolution step working, manage a German residential proxy pool, handle the pagination cap gracefully, and normalize 70+ nested fields into a flat schema — then re-verify it whenever IS24 tweaks the mobile backend. And if you go the other route and scrape the website, you’re now maintaining a headless browser that fights an AWS WAF challenge on every run.

The managed actor is pay-per-result: a fraction of a cent per listing plus a tiny per-run start fee. For a typical pull — 500 to 1,000 listings across a few cities with detail enrichment on — you’re at low single-digit dollars per run, residential proxy bandwidth included. Compared to a self-hosted stack (a German residential proxy pool alone runs into the hundreds per month, before VPS and engineering time), the math favors managed unless scraping IS24 is your core product.

Common pitfalls

Source-specific gotchas worth knowing before you commit to a pipeline:

  • Base rent vs. total rent. For rentals, baseRent is the cold rent (Kaltmiete) and totalRent is the warm rent (Warmmiete) including service charges and heating. Store both — comparing a cold rent against a warm rent will wreck any yield calculation.
  • Numeric fields arrive as strings. In the JSON output, price, pricePerSqm, livingSpaceSqm, latitude and the rest come through as strings. Cast them before doing math or geospatial work.
  • fetchDetails is a cost/depth trade. With it on you get energy class, agent phone and feature flags — but one extra request per listing. Turn it off for cheap list-level sweeps where address and price are enough.
  • Don’t skip the DE residential proxy. The mobile API expects German traffic. A datacenter IP or a non-DE country will give you flaky, incomplete results.
  • Pagination ceiling is real. Segment by district or tighten price/size filters rather than expecting one broad city query to return everything.
  • Agent data is a lead, not verified ground truth. agentPhone and agentCompany are what IS24 shows; treat agentVerified as a signal, and comply with GDPR when you process personal contact data.

Wrapping up

IS24 has the best German property inventory on the open web and one of the more annoying WAFs guarding its website. The mobile JSON API is the clean path around it — no browser, no challenge — and it exposes far more per-listing detail than the HTML does. If you need a repeatable, exportable German real-estate feed for research, investment analysis or lead generation, the managed actor turns that API into a CSV without you owning the reverse-engineering or the proxy bill.

Run the ImmobilienScout24 Scraper on Apify — 12 property types, buy or rent, filtered by city, price, m² and rooms; returns price, €/m², GPS, address and agent contact. No API key, no WAF. Start on Apify’s free monthly credit.

Related guides