ImmobilienScout24.de Scraper - Properties, Prices & Agents
Pricing
from $0.90 / 1,000 results
ImmobilienScout24.de Scraper - Properties, Prices & Agents
$0.9💰/1K for Gold discount. Extract property listings from immobilienscout24.de, Germany's #1 real estate platform with 9,000+ active listings per city. Get fully-detailed listings including price, GPS coordinates, amenities, images, agent contacts, and more.
Pricing
from $0.90 / 1,000 results
Rating
5.0
(1)
Developer
Abot API
Maintained by CommunityActor stats
1
Bookmarked
52
Total users
3
Monthly active users
6 days ago
Last modified
Categories
Share
ImmobilienScout24 Scraper: Property Listings, Prices & Coordinates for Germany
ImmobilienScout24 Scraper turns immobilienscout24.de into structured data. Type a city, town or district name, or paste any search link, and get price, full address, GPS coordinates, rooms, living space, construction year, amenities, images, energy data and agent contact for every listing. Turn on listing details for the full description, rent breakdown, purchase side costs, energy certificate and 100+ more attributes. Residential and commercial, buy or rent, with recurring change tracking for scheduled runs. Export to JSON, CSV or Excel, or pull results straight into your app through the API.
Why This Scraper?
- Type a place name, nothing else. München, Munich, Köln, Prenzlauer Berg or Titisee-Neustadt: names are looked up on the site's own location search, the state is optional, and towns inside a district work too.
- Every link the site makes. City, district, state-wide and nationwide searches, every residential and commercial category, radius and drawn-area map searches, single listings by link or by number, and start-from-page links.
- Up to 150+ fields per listing. 60+ fields from the search page alone; with listing details on, the description texts, rent and purchase cost breakdown, energy certificate, floor, condition, heating, market price comparison, documents and agent details.
- The site's own filters and sorts. Price, rooms, living space, construction year, floor, amenities, apartment and house types, energy class, heating, pets, publish date, radius, commission free and 9 sort orders.
- Residential and commercial. Apartments, houses, plots, garages, shared rooms, temporary housing, house-building offers, offices, retail, hospitality, industrial halls, commercial plots, investment properties and compulsory auctions.
- Recurring change tracking. Scheduled runs return only new, updated and reappeared listings, with the changed fields and the price change in EUR and percent.
- Ready-made output views. Overview, details, map, changes, costs and agents tabs, plus a run summary.
Use Cases
- Real estate investors and analysts: build a pricing dataset across cities and districts and compare price per square meter, price factors and rental yields.
- Relocation and rental platforms: feed current buy or rent listings for a city into your own site, app or newsletter.
- Proptech and market research teams: track new listings, price cuts and removed listings over time with scheduled incremental runs.
- Commercial property teams: monitor offices, retail units, halls and commercial plots with their areas, rents and conditions.
- Agencies and brokers: collect competing listings with agent and company contacts for market comparison and outreach lists.
Data You Get
Sample shape: values are illustrative placeholders, not from a live record.
| Field | Example |
|---|---|
title | "Lichtdurchflutete 3-Zimmer-Wohnung mit Balkon" |
priceDisplay / priceValue | "450.000 €" / 450000 |
addressFull / postcode / city / quarter | "Musterstraße 12, Mitte, Berlin" / "10115" / "Berlin" / "Mitte" |
latitude / longitude | 52.5320 / 13.3850 |
rooms / livingSpace / plotArea | 3 / 85.5 / null (m²) |
constructionYear / condition / floor | 2024 / "first_time_use" / 2 |
balcony / lift / garden / cellar | amenity flags |
energyEfficiencyClass / energyValue / heatingType | "B" / 62.4 / "central_heating" |
baseRent / serviceCharge / heatingCosts / deposit | rent breakdown in EUR (rentals, with details on) |
commissionAmount / notaryCosts / landTransferTax / totalPurchaseCosts | purchase side costs in EUR (sales, with details on) |
pricePerSqm / priceRating / priceInfo | 5294.12 / "GOOD_OFFER" / the site's market comparison |
description / locationDescription / furnishingDescription | full listing texts (details on) |
images / imageCount / floorplanUrl | photo URLs / 12 / floorplan image |
documents / virtualTourUrl | brochures and floor plans as PDF links / 3D tour link |
contactName / contactPhone / contactCompany | "Meier" / "030 1234567" / "Beispiel Immobilien GmbH" |
agentProfileUrl / agentRating / agentAddress | agent profile, star rating and office address (details on) |
projectName / projectUrl | new development name and link, when the listing belongs to a project |
mainFloorSpace / hallHeight / annualRent / priceFactor | commercial and investment figures, when the listing has them |
datePublished / dateModified | ISO 8601 timestamps |
changeType / changedFields | "UPDATED" / ["priceValue"] (incremental mode) |
previousPrice / priceChange / priceChangePct | 475000 / -25000 / -5.26 (incremental mode, price changes) |
searchUrl / scrapedAt | the search that found the listing / when it was read |
How to Use
- Pick a mode:
location(type place names and set filters) orurl(paste immobilienscout24.de links). - In location mode, type one or more place names; pick the state only to choose between places with the same name. Set any filters and the sort order. In url mode, paste links instead.
- Turn on Include listing details if you need the full description, cost breakdown and energy data, set Max Pages and Max Listings, then click Start.
- Download the dataset as JSON, CSV or Excel, or read it through the API.
Search by place name, filtered:
{"mode": "location","locations": [{ "city": "Munich" }, { "city": "Prenzlauer Berg" }],"listingType": "buy","propertyType": "apartment","priceMax": 600000,"roomsMin": 2,"apartmentTypes": ["penthouse", "maisonette"],"equipment": ["balcony", "lift"],"energyEfficiencyClasses": ["a_plus", "a", "b"],"sortBy": "newest","maxListings": 200}
Rentals with full details and costs:
{"mode": "location","locations": [{ "state": "sachsen", "city": "Leipzig" }],"listingType": "rent","propertyType": "apartment","petsAllowed": ["yes"],"publishedAfter": "2026-10-01","includeDetails": true,"maxListings": 200}
Paste links: a map search, a commercial search and one listing:
{"mode": "url","urls": ["https://www.immobilienscout24.de/Suche/radius/wohnung-mieten?centerofsearchaddress=Berlin;;;;;&geocoordinates=52.52;13.405;2.0","https://www.immobilienscout24.de/Suche/de/sachsen/leipzig/buero-mieten","166798088"],"maxListings": 100}
Daily monitoring of one search (only new and changed listings):
{"mode": "location","locations": [{ "city": "Hamburg" }],"listingType": "rent","propertyType": "house","buildingTypes": ["singlefamilyhouse", "terracehouse"],"incrementalMode": true,"emitExpired": true,"maxListings": 1000}
Run it from your code
Python:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("abotapi/immoscout24-scraper").call(run_input={"mode": "location","locations": [{"city": "Berlin"}],"listingType": "buy","maxListings": 200,})for listing in client.dataset(run["defaultDatasetId"]).iterate_items():print(listing["title"], listing["priceDisplay"])
JavaScript:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('abotapi/immoscout24-scraper').call({mode: 'location',locations: [{ city: 'Berlin' }],listingType: 'buy',maxListings: 200,});const { items } = await client.dataset(run.defaultDatasetId).listItems();
Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.
Output views and run summary
The Output tab has six views of the same dataset: Overview (price, size, address), Details (description, condition, energy, floor), Map (coordinates), Changes (incremental rows with changed fields and price changes), Costs (rent breakdown and purchase side costs) and Agents (agent and company contacts). Each run also stores a summary under the OUTPUT key of its key-value store: listings collected, whether a cap was hit, detail-page counts and incremental change counts.
Splitting a large search across runs
If a URL contains pagenumber=N, scraping starts from page N and walks forward for maxPages pages (or until maxListings is reached, 40 by default). To continue an interrupted full walk in a new run, paste the earlier run ID into Resume from a previous run: listings that run already saved are skipped.
URL mode: every shape supported
Paste any immobilienscout24.de link into urls. Every search family below has a real example in the input's prefilled list (Search mode = URL):
What runs by default: the input form shows a prefilled example list covering these shapes so you can see each format, but if you leave urls untouched in URL mode only the first entry (the Berlin apartments-for-sale search) is the default and is scraped. Edit the list to the links you want; every link you keep is scraped.
| Shape | Example | Notes |
|---|---|---|
| City | /Suche/de/berlin/berlin/wohnung-kaufen | state / city / category |
| District or quarter | /Suche/de/berlin/berlin/charlottenburg-wilmersdorf/wohnung-mieten | adds the district segment |
| State-wide | /Suche/de/bayern/wohnung-kaufen | every city in the state |
| Nationwide | /Suche/de/wohnung-kaufen | no state or city segment |
| Start from a page | /Suche/de/berlin/berlin/haus-mieten?pagenumber=2 | starts at page 2, walks forward for Max Pages |
| Radius map search | /Suche/radius/wohnung-mieten?centerofsearchaddress=...&geocoordinates=lat;lng;km | the circle you set on the site's map |
| Drawn-area map search | /Suche/shape/wohnung-mieten?shape=... | the area you drew on the site's map |
| Residential categories | grundstueck-kaufen, wg-zimmer, wohnen-auf-zeit, garage-mieten, neubauwohnung-kaufen, haus-bauen | rent-only and buy-only categories are labelled correctly |
| Commercial and investment | buero-mieten, einzelhandel-kaufen, gastronomie-mieten, hallenproduktion-mieten, gewerbegrundstuecke-kaufen, anlageimmobilie, zwangsversteigerung | same search format, commercial fields filled in |
| Commission free | /Suche/de/berlin/berlin/provisionsfreie-wohnung-kaufen | same as the noCommission input (sales only) |
| Single listing | /expose/<id>, or just the number, e.g. 166798088 | one row, no pagination |
Bare host / http:// / & | immobilienscout24.de/Suche/... | normalized automatically |
Skipped with a clear warning, never a silent empty result: agent and company profile pages (/anbieter/..., /profil/...), overview and information pages (region overviews, price atlas, new-build portal, guides, the home page) and the Austrian or Swiss sites. A misspelled or outdated search link gets its own warning too.
Send results into your apps (MCP connectors)
Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step after the scrape: the Apify dataset is never changed.
What gets written to the connector: a condensed, human-readable summary of each listing, not the full JSON. Each item becomes one entry with a title and its key fields flattened to plain text. The complete record always stays in the Apify dataset.
- Authorize a connector once under Apify → Settings → Integrations (Notion, Linear, Airtable, or Apify).
- Select it in the "Pipe results into your apps" input field. (If the picker is empty, you haven't authorized a connector yet.)
- For Notion, also set
notionParentPageUrlto the page where items should be created.
The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.
Input Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
mode | string | location | location to search by place name, or url for pasted links. |
locations | array | Berlin (used when empty) | Places to search: city, town, district or quarter names. state is optional and only chooses between places with the same name. A name that cannot be found is reported and skipped. |
listingType | string | buy | buy or rent. Location mode only. |
propertyType | string | apartment | apartment, house, land, garage, flatShareRoom, shortTermAccommodation, houseBuild, office, retail, gastronomy, industry, tradeSite, investment or compulsoryAuction. Buy-only and rent-only types set the listing type automatically. |
priceMin | integer | (none) | Minimum price in EUR. |
priceMax | integer | (none) | Maximum price in EUR. |
roomsMin | integer | (none) | Minimum number of rooms. |
roomsMax | integer | (none) | Maximum number of rooms. |
livingSpaceMin | integer | (none) | Minimum living area in m². |
livingSpaceMax | integer | (none) | Maximum living area in m². |
constructionYearMin | integer | (none) | Earliest construction year. |
constructionYearMax | integer | (none) | Latest construction year. |
equipment | array | (none) | Required amenities, all must be present: balcony, builtinkitchen, garden, lift, cellar, guesttoilet, barrierfree, parking. |
apartmentTypes | array | (none) | Apartments only: apartment, groundfloor, raisedgroundfloor, halfbasement, roofstorey, loft, maisonette, penthouse, terracedflat, other. |
buildingTypes | array | (none) | Houses only: singlefamilyhouse, multifamilyhouse, semidetachedhouse, terracehouse, bungalow, villa, farmhouse, specialrealestate, otherrealestate. |
noCommission | boolean | false | Commission-free listings only. Sales only: the site has no commission-free filter for rentals, so it is ignored there (the log says so). |
energyEfficiencyClasses | array | (none) | Energy certificate classes a_plus to h. |
heatingTypes | array | (none) | central, selfContainedCentral or stove. |
petsAllowed | array | (none) | Rentals only: yes or negotiable. |
floorMin | integer | (none) | Lowest floor (0 = ground floor). |
floorMax | integer | (none) | Highest floor. |
publishedAfter | string | (none) | Only listings first published on or after this date, e.g. 2026-10-01. |
radiusKm | integer | (none) | Radius search in km around radiusCenter. |
radiusCenter | string | (none) | Radius centre as "latitude, longitude", e.g. "52.52, 13.405". |
sortBy | string | default | default, newest, priceAsc, priceDesc, roomsDesc, roomsAsc, livingSpaceDesc, livingSpaceAsc or projectsFirst. |
urls | array | Berlin apartments-for-sale search (one link; the form's prefilled example list shows all shapes) | Links for url mode (see the shapes table above). Location-mode fields are ignored in url mode. |
includeDetails | boolean | false | Also load each listing's details: description texts, rent and purchase cost breakdown, energy certificate, floor, condition, documents, agent details and every other attribute the listing states. One extra request per listing. |
excludeNewBuildProjects | boolean | false | Hide listings that belong to new-build developer projects, in both modes. |
maxPages | integer | (none, up to 500 pages) | Maximum pages per location or URL (about 20 listings per page). Leave empty to read every page; the result count is capped by maxListings. |
maxListings | integer | 40 | Maximum total listings to collect across all searches. 0 = unlimited (every page of every search, up to thousands of listings, billed per listing). |
Behaviour change: maxPages no longer defaults to 2. A run now stops at maxListings = 40 by default (the same size as the old 2-page default, about 20 listings per page). Set maxListings to a higher number, or 0 for unlimited, to collect more.
| proxy | object | German residential (used when empty) | Connection settings. |
| resumeFromRunId | string | (none) | A previous run ID or dataset ID: listings it already saved are skipped. |
| incrementalMode | boolean | false | Recurring change tracking: later runs of the same search return only NEW, UPDATED and REAPPEARED listings. |
| stateKey | string | (none) | Optional name for an incremental campaign; by default the key is derived from the search inputs. |
| emitUnchanged | boolean | false | Incremental mode: also return unchanged listings, marked UNCHANGED. |
| emitExpired | boolean | false | Incremental mode: also return listings that disappeared, marked EXPIRED, after a run that scanned the whole search. Default off (decision, S10c full-scan 2026-10-06): EXPIRED rows are billed dataset items like any other row, so a user who turns on incremental mode without reading every option should not be surprise-billed for rows they did not ask for, the same reasoning emitUnchanged already uses one row above. Turn it on explicitly for monitoring setups that want disappearance tracking (see the "Daily monitoring" example above, which sets it). |
| ignoreFieldsForChanges | array | (none) | Incremental mode: extra field names to ignore when deciding whether a listing changed (scrapedAt, isNew, priceInfo and financeMonthlyRate are always ignored). |
| mcpConnectors | array | (none) | Optional: send a summary of each listing to apps you authorized under Integrations. |
| notionParentPageUrl | string | (none) | Notion connector only: page under which listing pages are created. |
| maxNotifyListings | integer | 50 | Cap on items written to each connector per run. Does not affect the dataset. |
Output Example
Sample shape: values are illustrative placeholders, not from a live record.
{"id": "123456789","url": "https://www.immobilienscout24.de/expose/123456789","listingType": "rent","propertyType": "apartment","title": "Helle 3-Zimmer-Wohnung mit Balkon","addressFull": "Musterstraße 12, 04109 Leipzig, Zentrum","street": "Musterstraße","houseNumber": "12","postcode": "04109","city": "Leipzig","quarter": "Zentrum","state": "Sachsen","latitude": 51.3397,"longitude": 12.3731,"priceValue": 980,"priceCurrency": "EUR","priceDisplay": "980 €","totalRent": 1180,"rooms": 3,"livingSpace": 82.5,"constructionYear": 1910,"balcony": true,"builtInKitchen": true,"lift": false,"energyEfficiencyClass": "C","imageCount": 14,"images": ["https://pictures.immobilienscout24.de/listings/example-800x600.jpg"],"contactName": "Meier","contactCompany": "Beispiel Immobilien GmbH","datePublished": "2026-10-01T10:00:00.000+02:00","detailsFetched": true,"description": "Schöne Altbauwohnung mit hohen Decken ...","floor": 2,"condition": "well_kept","heatingType": "central_heating","baseRent": 980,"serviceCharge": 200,"deposit": 2940,"pricePerSqm": 11.88,"agentProfileUrl": "https://www.immobilienscout24.de/anbieter/example","searchUrl": "https://www.immobilienscout24.de/Suche/de/sachsen/leipzig/wohnung-mieten","changeType": "UPDATED","changedFields": ["priceValue", "totalRent"],"firstSeenAt": "2026-09-20T06:00:00.000Z","lastSeenAt": "2026-10-06T06:00:00.000Z","previousPrice": 1020,"priceChange": -40,"priceChangePct": -3.92,"scrapedAt": "2026-10-06T06:00:00.000Z"}
Plan Requirement
The default connection is a German residential proxy and works without any setup on plans that include residential proxies. On a plan without residential proxy access, the run continues over a backup connection and says so in the log; if no page can be loaded at all, the run fails with a message explaining why. You can also supply your own proxy URLs under the proxy setting.
FAQ
How much does it cost?
You pay per listing returned plus a small start fee per run; the Pricing tab shows the current rates. Listing details are not charged extra, they only make the run slower. Use Max Pages and Max Listings to cap the size, and therefore the cost, of any run; Max Listings defaults to 40, and 0 removes the cap. In incremental mode, unchanged listings are not returned (or billed) unless you turn on Emit unchanged listings.
Is it legal to scrape immobilienscout24.de?
This actor collects only publicly available listing data. You are responsible for how you use it: follow immobilienscout24.de's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Agent and company contact details returned by this actor are business contact information published on the listing, not private personal data.
Can I get only new or changed listings on a schedule?
Yes. Turn on Incremental changes for scheduled runs (in the "🔁 Resume & recurring updates" section) and schedule the actor from the Schedules tab. The first run returns every matching listing as NEW; later runs of the same search return only NEW, UPDATED and REAPPEARED listings. Updated rows name the changed fields, and a price change comes with previousPrice, priceChange and priceChangePct. Turn on Emit expired listings to also get listings that disappeared (only after a run that scanned the whole search). Ignore fields when detecting changes excludes any field you find noisy.
Why did I get fewer listings than my Max Listings setting?
maxPages limits how many pages are read per location or URL, and each page holds about 20 listings, regardless of maxListings. Remember maxListings itself defaults to 40; raise it (or set 0 for unlimited) to collect more. Raise maxPages (or add more locations) to reach a higher maxListings value. Listings already returned for an earlier location in the same run are not repeated.
Why did my run fail instead of returning an empty dataset?
A run fails only when no page could be loaded at all: the proxy refused the connection for your account, your plan has no residential proxy access and the backup connection could not load the pages either, or the requests kept failing. The failure message says which one. A search that loads but matches no listings, or a misspelled place or link, finishes successfully with a warning that names the problem, so "no matching listings" is never confused with "the connection did not work".
Can I use it with AI agents or MCP?
Yes. Call it from any Apify integration or MCP client, and use the connector field to push listing summaries into Notion, Linear or Airtable.
🔗 Want more real estate data?
Pair this actor with these related scrapers from the same team:
| 🏠 Immowelt.de Scraper Scrape detailed property listings from Immowelt.de into clean structured data. Extract... | 🏠 Funda in Business Scraper Scrape Funda in Business commercial listings: offices, retail, industrial, catering and... |
| 🏠 SeLoger Scraper Scrape SeLoger.com properties for sale and rent. Search by location with price, room and... | 🏠 CommercialGuru SG Property Listings & Agent Contacts Scraper Scrape commercialguru.com.sg Singapore listings at scale. Extract prices, PSF, floor... |
| 🏠 Domclick RU Property Scraper Extract property listings from domclick.ru, one of Russia’s largest real estate portals... | 🏠 Otodom.pl Scraper Scrape Otodom.pl properties for sale and rent, including apartments, houses, plots... |
💬 Support
- 🐞 Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
- 🛠️ Need another site, extra fields or a private build? Email contact@abotapi.com.
- ⭐ Enjoying it? A quick review on the actor page helps other users find it.