ImmobilienScout24 Scraper - Germany Real Estate Listings avatar

ImmobilienScout24 Scraper - Germany Real Estate Listings

Pricing

from $0.54 / 1,000 listings

Go to Apify Store
ImmobilienScout24 Scraper - Germany Real Estate Listings

ImmobilienScout24 Scraper - Germany Real Estate Listings

Scrape ImmobilienScout24.de listings for the whole of Germany, rent or sale, 16 property types: price, costs, area, rooms, address, GPS, energy data, photos and the agent's phone and e-mail. Export to JSON, CSV or Excel.

Pricing

from $0.54 / 1,000 listings

Rating

0.0

(0)

Developer

Nice Dev

Nice Dev

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

10 hours ago

Last modified

Share

🏠 What is ImmobilienScout24 Scraper?

ImmobilienScout24 Scraper extracts property listings from ImmobilienScout24.de, Germany's largest real estate portal: price, rent, area, rooms and full address with GPS, plus (tick Extract details, off by default) all costs, the energy certificate, all photos, and the agent's phone number and e-mail — apartments and houses for rent or sale, plots, garages, offices, retail, investment properties and foreclosures, anywhere in Germany. It works as an ImmobilienScout24 API alternative: run it on a schedule, call it from your code, or plug it into Make, Zapier or n8n.

Choose a property type and a city, or paste any ImmobilienScout24 search URL, click Start, and download the listings in JSON, CSV or Excel. No login, nothing to set up, and a whole city or the whole of Germany in one run — there is no page limit.

📋 What data can you extract from ImmobilienScout24?

One item per listing, 120 fields:

CategoryWhat you get
🏷️ Listingtitle, link, Scout-ID, property type, rent or sale, private or agency, new-build project — Helle 3-Zimmer-Wohnung mit Balkon
💶 Price and costsprice, cold rent, total rent, service charge, heating costs, deposit, purchase price, price per m², commission, purchase costs (notary, land transfer tax), price reduction — 1,451.52 € / month
📐 Sizeliving space, plot, floor space, rooms, bedrooms, bathrooms, floor — 66 m², 1 room, 5th floor
🏗️ Building and energyyear built, condition, heating, energy class, energy certificate and consumption — 2026, A, district heating
🛋️ Featuresbalcony, garden, lift, cellar, fitted kitchen, guest toilet, step-free access, pets, parking — balcony: true
📍 Locationaddress, street and number, postal code, city, district, federal state, latitude / longitude — 12559 Berlin, Köpenick
📝 Descriptionsdescription, location, equipment, other notes — the owner's full texts
📷 Photos and documentsevery photo in large size, floor plans and energy certificates as PDF
📞 Contactagent name, company, phone numbers, e-mail, legal notice, rating, profile — +49 30 23632550
🕒 Datespublication date (as precise as the site's "x hours / days ago", exact to the second for the listings in the site's early access), days on the market
🔎 Searchwhich search found it and its rank

Every field, with an example, is listed in the Output section below.

Contact, costs, energy data, descriptions and all photos come from the listing page: they are filled when you tick Extract details (off by default). Left off, you get a quicker search-card scrape (price, area, rooms, address, coordinates, first photos, date).

✅ Why use ImmobilienScout24 Scraper?

  • 🇩🇪 The whole of Germany, no page limit: a search returns every listing the site has — about 83,000 apartments for rent, 230,000 houses for sale.
  • 📞 Phone and e-mail: a phone number on about 9 house sales in 10, 3 offices in 4 and 2 to 4 apartment rentals in 10 (runs of September 2026), charged only for the listings that show one (tick Extract details and Extract phone numbers to get them); the agency's e-mail comes from its legal notice, included in the details.
  • 🏢 16 property types: apartments, houses, plots, garages, flat-share rooms, furnished temporary living, offices, retail, gastronomy, halls, special properties, investment properties, foreclosures, prefab houses, commercial plots, assisted living.
  • 🎯 30+ search filters of the site: price, total rent, rooms, living space, plot, floor space, year built, floor, energy class, equipment, apartment and house types, new builds, commission-free, pets, internet speed, keyword — checked at the start of the run against the property type you chose, and listed in the form for each filter.
  • 🗂️ Several searches in one run: property types × cities × keywords, a radius around a point, or your own search URLs, with a cap per search.
  • 🔔 Monitoring built in: tick Only new listings, schedule the Actor, and each run returns (and charges) only the listings it has never delivered before.
  • 🔌 API, scheduling, integrations (Make, Zapier, n8n, Google Sheets…) and JSON/CSV/Excel export via the Apify platform.

🚀 How to scrape ImmobilienScout24

  1. Create a free Apify account.
  2. Open ImmobilienScout24 Scraper, choose a Property type (apartment, house, office…), Rent or Buy, and type a Location (Berlin, München, Prenzlauer Berg, Bayern).
  3. Or paste your own ImmobilienScout24 URLs into Start URLs: any search results page (every filter set on the site is kept) or single listing pages.
  4. Set Max listings (100 by default, 0 = no limit) — and Max listings per search when you run several searches — then click Start.
  5. Download the dataset in JSON, CSV, Excel or via API.

💰 How much does it cost to scrape ImmobilienScout24?

This Actor uses pay per event pricing, cheaper on higher Apify plans (Free → Bronze → Silver → Gold and above): $0.90 → $0.78 → $0.66 → $0.54 per 1,000 listings, plus $0.39 → $0.36 per 1,000 listings read with their details (only when you tick Extract details, so $1.29 per 1,000 listings with contact, costs and photos on the Free plan, $0.90 on Gold; $0.90 without), plus $4.49 → $4.46 per 1,000 listings delivered with a phone number (contact-phone, only when you tick Extract phone numbers, which needs Extract details: a listing that shows no phone costs nothing more), plus $0.01 per run start (at the default memory; a run given more than 1 GB counts one start per GB). Examples on the Free plan: 10,000 apartments for rent with Extract details ticked ≈ $12.90, plus $4.49 for each 1,000 of them that show a phone with Extract phone numbers ticked too (about 3 in 10: ≈ $13.47); the same without phones ≈ $12.90. Platform usage (compute, proxy) is included in the price. With requirePhone or requireEmail, a listing page read and then dropped because it shows no phone / no e-mail costs $0.19 → $0.16 per 1,000 (filtered-listing): 1,000 apartments for rent with a phone on the Free plan (both options ticked) ≈ $1.29 + $4.49 for the phones + 1.9 pages dropped per listing kept × $0.19 / 1,000 ≈ $6.15. The filters the Actor applies itself on the search card (postedAfter / postedBefore, excludeKeywords, privateSellersOnly, earlyAccessOnly, postalCodes, and excludeNewBuildProjects outside apartments and houses for sale, where the site applies it itself) are checked on every listing they read, kept or not: each listing checked is charged a filter check (filter-check, $0.09 → $0.06 per 1,000). With requireEmail alone, a private landlord dropped on the search card is not charged.

⚙️ Input

{
"propertyType": "apartment",
"offerType": "rent",
"location": "Berlin",
"maxPrice": 1500,
"minRooms": 2,
"maxItems": 200
}

Several property types and cities, a cap per search, only recent listings, only the ones not delivered before:

{
"propertyType": "apartment",
"propertyTypes": ["house"],
"offerType": "buy",
"locations": ["Hamburg", "Köln"],
"equipment": ["cellar"],
"maxItemsPerQuery": 50,
"postedAfter": "7 days",
"onlyNew": true,
"stateKey": "hamburg-koeln-sale"
}

Or with your own URLs, and listings by Scout-ID:

{
"startUrls": [
{ "url": "https://www.immobilienscout24.de/Suche/de/berlin/berlin/wohnung-mieten?price=-1500.0&numberofrooms=2.0-" },
{ "url": "https://www.immobilienscout24.de/expose/171143307" }
],
"listingIds": ["171123122"],
"maxItems": 500
}
FieldNotes
propertyType, propertyTypesapartment, house, plot, garage, flatshare, temporaryLiving, office, retail, gastronomy, industry, specialPurpose, investment, foreclosure, prefabHouse, commercialPlot, assistedLiving; propertyTypes adds more types (one search each).
offerTyperent, buy or any (both). Ignored by the types that exist one way only.
location, locationsGerman city, district, town quarter or federal state as typed in the site's search box, or a region path (/de/berlin/berlin); empty = the whole of Germany. Every type and keyword is searched in every location (max 500 searches per run).
latitude, longitude, radiusKmA radius search around a point (km), instead of a location.
query, searchQueriesKeyword searched in the listings (Kamin, Altbau); searchQueries adds more keywords.
startUrlsImmobilienScout24 search results pages (region, radius or map-area searches — filters kept, pagination automatic) or listing pages. When set, the search fields above are ignored.
listingIdsScout-IDs or listing URLs, always read on their own page.
maxItemsStop after this many listings for the whole run (0 = unlimited).
maxItemsPerQueryCap for EACH search (type × location × keyword, or search URL). 0 = no per-search cap.
extractDetailsRead each listing page: contact with e-mail, all costs, energy data, texts and all photos (default off).
extractPhoneAdd the contact's phone numbers (phone, phones), read on the listing page (needs extractDetails: ticked alone, no phone comes out and the run log says so; default off). Charged only for a listing that shows one. Off: no phone in the output, and the numbers of the agent's legal notice (imprint) read [phone hidden]. Always on with requirePhone.
sortBynewest (default), oldest, priceAsc, priceDesc, areaAsc, areaDesc, standard (the site's own order). Not every type has every order (no area order for plots or garages for sale, no price order for foreclosures): such a search stops at once, naming the sort.
minPrice, maxPrice, minRooms, maxRooms, minLivingSpace, maxLivingSpace, minPlotArea, maxPlotArea, minFloorArea, maxFloorArea, minYearBuilt, maxYearBuilt, minFloor, maxFloorRanges sent to the site. A filter the site does not offer for the chosen property type stops the run at its start, before any page is read, and the message lists the types it works for (the form lists them for each filter).
priceTypecoldRent or totalRent: the rent the price range reads, for apartments to rent.
equipmentThe site's equipment: balcony, garden, builtinkitchen, lift, cellar, guesttoilet, parking, handicappedaccessible (all must be present).
energyEfficiencyClassesa_plus, a, b … h.
apartmentTypesapartment, loft, maisonette, penthouse, terracedflat, groundfloor, raisedgroundfloor, roofstorey, halfbasement, other.
buildingTypesHouse types: singlefamilyhouse, semidetachedhouse, midterracehouse, endterracehouse, multifamilyhouse, bungalow, villa, farmhouse, castlemanorhouse, specialrealestate.
newBuildingOnly, excludeNewBuildProjects, noCommissionOnly, petsAllowed, excludeRented, minInternetSpeedNew builds only, no developer projects, commission-free only, pets allowed, not currently let, lowest internet speed (Mbit/s).
postedAfter, postedBeforePublication date range: 2026-09-01, or a period before now (7 days, 2 weeks, 1 month, 24 hours).
postalCodes, excludeKeywords, privateSellersOnly, earlyAccessOnly, requirePhone, requireEmailKeep these postal codes (5 digits or a prefix such as 101), drop titles with these words, private landlords only, the site's newest early-access listings only, only with a phone number / an e-mail.
onlyNew, stateKey, resetStateMonitoring: only the listings never delivered under this memory key; resetState forgets the memory.
includeRawAdd the site's own data of each listing, as received — for JSON or the API only: with extractDetails it adds hundreds of columns per listing, and a CSV or Excel export keeps only the first 2,000 columns (other columns would be missing from 3 listings on).
AdvancedproxyConfiguration (Apify proxy by default, included in the price; the residential proxy is not available), maxConcurrency, maxRequestsPerMinute, maxRequestRetries, debugLog.

📦 Output

One real item of a run (shortened: some columns and the long texts are cut here):

{
"id": "171123122",
"url": "https://www.immobilienscout24.de/expose/171123122",
"title": "SCHLOSSBERG TWO - Premium-WG-Zimmer im Neubau",
"propertyType": "apartmentrent",
"offerType": "rent",
"isPrivate": false,
"isPlusExclusive": false,
"publishedAt": "2026-09-23T13:36:19.977Z",
"publishedAtPrecision": "hour",
"publishedAgo": "vor 11 Stunden",
"price": 1451.52,
"priceText": "1.452 €",
"priceInterval": "month",
"currency": "EUR",
"pricePerSqm": 21.99,
"baseRent": 1451.52,
"totalRent": 1681.52,
"serviceCharge": 113.2,
"heatingCosts": 116.8,
"livingSpace": 66,
"rooms": 1,
"floor": 5,
"yearBuilt": 2026,
"energyEfficiencyClass": "A",
"balcony": true,
"features": ["Balkon/Terrasse", "Keller", "Personenaufzug", "Einbauküche", "Stufenloser Zugang", "WG-geeignet"],
"address": "Am Schloßberg 1A, 12559 Berlin, Köpenick",
"street": "Am Schloßberg",
"houseNumber": "1A",
"postalCode": "12559",
"city": "Berlin",
"district": "Köpenick",
"latitude": 52.44326,
"longitude": 13.58496,
"hasFullAddress": true,
"description": "Schlossberg Two – zwei Bewohner. Ein außergewöhnliches Zuhause. …",
"images": ["https://pictures.immobilienscout24.de/listings/a2d442f1-e720-4598-af1b-501fd5bd5f5c-2098436291.jpg/ORIG/resize/1500x1000/format/webp/quality/80"],
"documents": [],
"tags": [],
"contactName": "TEAM - Vermietung | Verkauf",
"companyName": "IMMS Immobilien Management & Services GmbH",
"phone": "+49 30 23632550",
"phones": [{ "type": "landline", "number": "+49 30 23632550" }],
"email": "info@imms-immobilien.de",
"searchRank": 44,
"detailsExtracted": true,
"scrapedAt": "2026-09-24T00:36:19.977Z"
}

You can download the dataset in various formats such as JSON, HTML, CSV or Excel.

All 120 fields

FieldsWhat you get
id, url, title, propertyType, offerTypeListing: 171123122, the listing page, the title, apartmentrent, rent / buy
isPrivate, builderName, isProject, isNewBuilding, isNewListing, listingTier, tagsprivate landlord or agency, the house builder of a builder's offer, new-build project, new build, the site's "new" badge, paid tier S–XL, badges
isPlusExclusive, earlyAccessEndsAt, publishedAt, publishedAtPrecision, publishedAgo, daysOnMarketDates: in the site's early access for its members, its end, publication date and its precision, as shown (vor 2 Stunden), days online
price, priceText, priceInterval, currency, pricePerSqm, previousPrice, priceReductionPercentPrice: 1451.52, 1.452 €, month, EUR, per m², the price before a reduction and the %
baseRent, totalRent, serviceCharge, heatingCosts, heatingCostsIncluded, depositcold rent, total rent, service charge, heating, whether heating is in the service charge, deposit as written
purchasePrice, maintenanceFee, rentalIncomePerYear, commission, hasCommission, purchaseCostspurchase price, Hausgeld, rental income, commission as written and whether one is due, purchase costs (notary, land transfer tax, land registry, total)
fairPriceRating, priceRangethe site's price rating and the price range of the area per m²
marketValue, minimumBid, auctionDateforeclosures: market value, minimum bid, auction date
livingSpace, usableArea, floorSpace, plotArea, rooms, bedrooms, bathrooms, floor, numberOfFloorsSize, in m² and counts
yearBuilt, lastRefurbishment, condition, interiorQuality, apartmentType, heatingType, energySourcesBuilding: 2026, last modernisation, Erstbezug, Gehoben, Etagenwohnung, Fernwärme, Gas
energyCertificate, energyCertificateType, energyConsumption, energyEfficiencyClassEnergy: certificate available, its type, kWh/m²·a, A+ … H
balcony, garden, lift, cellar, builtInKitchen, guestToilet, barrierFree, petsAllowed, parkingSpaces, parkingType, isRented, availableFrom, internetSpeed, featuresFeatures: true / false / unknown, pets yes / no / negotiable, parking, currently let, available from, internet speed, every ticked feature
address, street, houseNumber, postalCode, city, district, region, latitude, longitude, hasFullAddressLocation: street and number only when the owner shows them (hasFullAddress), coordinates when the site gives them
description, locationDescription, equipmentDescription, otherDescriptionDescriptions: the owner's texts, line breaks kept
imageUrl, images, imageCount, hasVideoTour, documents, floorplanUrl, virtualTourUrl, videoUrlPhotos and documents: large photos, PDF documents ({name, url}), the floor plan, the 360° tour and the video when there is one
contactName, companyName, phone, phones, email, imprintContact: TEAM - Vermietung, the agency, +49 30 23632550, every number with its type, the agency e-mail, its legal notice
agentProfileUrl, agentLogoUrl, agencyId, agentRating, agentReviewCount, isVerifiedAgent, externalIdthe agency's page, logo, id, rating out of 5 and number of reviews, verified badge, the agent's own reference number
attributes, rawAttributesevery label → value of the listing page (German, as shown) and the site's raw values
searchUrl, searchQuery, searchLocation, searchRankSearch: the search that found it, its keyword, region, and the rank of the listing
detailsExtracted, raw, scrapedAtwhether the listing page was read, the site's data as received (includeRaw), ISO timestamp

💡 Tips

How to get more results

Leave Location empty for the whole of Germany and set maxItems to 0: there is no page limit, a search returns every listing the site has. Split a very large market by city, price range or property type to run searches side by side.

How to reduce costs

The price is per listing, so the levers are maxItems, maxItemsPerQuery, the site filters (a listing the site filters out is never downloaded), the post-filters (each listing a card filter checks is charged filter-check, kept or not; one that requirePhone / requireEmail drops after its page was read costs $0.19 → $0.16 / 1,000) and onlyNew for recurring runs (you never pay twice for the same listing). Leaving extractDetails off (default) saves the details price when the search card is enough; leaving extractPhone off (default) saves the phone price when you only need the listings.

Several searches in one run

Fill propertyTypes, locations and / or searchQueries: the Actor runs one search per property type × location × keyword, up to 500 per run; offerType: "any" searches both rent and sale. A listing found by several searches is saved — and charged — once. Set maxItemsPerQuery to give every search its own cap: without it the first searches can use up the whole maxItems budget. You can also paste several search URLs into startUrls: each one is a search of its own, with the same cap.

Monitoring: only the new listings

Tick Only new listings (onlyNew) and schedule the Actor. The first run returns everything; each later run skips the listings already delivered: they are not saved, not charged, and their page is not even opened. The memory lives in a named key-value store of your account (immobilienscout24-listings-scraper-seen, up to 150,000 listings per key) and is only updated with listings that really reached the dataset, so a failed run never hides anything. Give each schedule its own stateKey (two schedules sharing a key would hide each other's listings), and tick resetState once to start over. With the default sort (newest first), a search stops once it meets a run of listings you already have — as many in a row as your cap per search or per run, 100 at most.

Filter by publication date

postedAfter and postedBefore take a date (2026-09-01, the whole day is included, German time) or a period before now (7 days, 2 weeks, 1 month; via the API also 24 hours or a full ISO date-time). The filter reads publishedAt, which is as precise as the site's "x hours / days / months ago" (publishedAtPrecision), exact to the second for the listings in the site's early access (about 1 in 15 of the listings under 3 days old). The site rounds that text to the nearest unit ("3 days ago" = 2.5 to 3.5 days ago, "a month ago" = 26 to 45 days ago): a listing that may be inside the range is kept, so listings up to one unit outside it can come back (a day for "3 days ago", a month for "2 months ago": check publishedAgo) — none inside is dropped. A listing without a publication date is dropped as soon as a date bound is set. A filtered-out listing is not saved and does not count in maxItems; each listing the date filter checks is charged filter-check, kept or not. With the default sort, a search stops at the first page that is entirely too old.

🔌 Integrations and API

Call the Actor via the Apify API, the JavaScript or Python clients, or connect it with integrations and webhooks (Make, Zapier, n8n, Google Sheets, Slack, Airtable…). The dataset can be fetched as JSON or CSV from any tool.

🤖 Use with AI agents (MCP)

AI agents (Claude, ChatGPT, Cursor…) can find and run this Actor through the Apify MCP server, billed to their Apify account like any run. It returns one item per ImmobilienScout24 listing. Actor id: nice_dev/immobilienscout24-listings-scraper; MCP server with this Actor only: https://mcp.apify.com/?tools=fetch-actor-details,nice_dev/immobilienscout24-listings-scraper.

Smallest input, for a cheap first call:

{
"propertyType": "apartment",
"offerType": "rent",
"location": "Berlin",
"maxItems": 10
}

Key output fields: url, title, price, livingSpace, rooms, address, phone, publishedAt.

Cost on the Free plan (lower on paid plans): $0.90 per 1,000 listings (search-card fields), $1.29 per 1,000 listings with their details (extractDetails: true), plus $4.49 per 1,000 listings delivered with a phone number (extractPhone: true, with extractDetails), plus $0.01 per run start at the default memory; requirePhone, requireEmail and the filters cost extra, see the pricing section above. Cap each call with maxItems and, through the API, with the run option maxTotalChargeUsd.

❓ FAQ

The Actor only reads what ImmobilienScout24 shows publicly to any anonymous visitor. It logs in to nothing and solves no captcha. Results can contain personal data (the names, phone numbers and e-mails of agents, the names of private landlords), which is protected by GDPR: do not store it without a legitimate reason. You are responsible for using the data in compliance with ImmobilienScout24's Terms of Use and applicable law. This Actor is not affiliated with ImmobilienScout24 or Scout24 SE.

Does it need a login or a proxy?

No login. The proxy is included in the price: leave the default setting (the residential proxy is not available). A request the site turns away is retried at once on a new proxy session (without a proxy, after a pause of 5 seconds, doubled at each retry up to 150 seconds).

Is the data safe to open in Excel or to show on a web page?

Titles and descriptions are the owners' own words, copied as they are, line breaks kept. A text can begin with -, +, = or @, and every phone number starts with +: Excel and Google Sheets may read such a cell of a CSV file as a formula or as a number. The Actor leaves the text as it is, so that the JSON and the API give the real value: when you open a CSV, import these columns as text. Every URL field holds an http(s) URL or nothing. On a web page, escape every field like any text written by a stranger.

Known limitations

  • The site shows a listing's publication only as "x hours / days / months ago": publishedAt is as precise as that text (publishedAtPrecision: the minute or the hour for a listing of the last 21 hours, then the day, the month…), exact to the second only for the listings in the site's early access (about 1 in 15 of the listings under 3 days old).
  • Most private rentals show no phone number (about 1 in 5 does); a phone number the advertiser writes inside the description stays in the description, whatever extractPhone says; street and number are empty when the owner hides the address (hasFullAddress: false).
  • The site does not filter every property type the same way: a filter it does not offer for your type stops the run at its start, and the message lists the types it works for. For gastronomy, commercial plots and assisted living, the site cannot search the rentals alone: a rent search returns the sales too, told apart by offerType (a sale search returns sales only).
  • onlyNew remembers listing ids, not their content: a listing whose price changed is not returned again.
  • Two runs sharing the same stateKey at the same time may both return the same new listing.

A run the platform stops without warning (out of memory, run timeout)

  • Resurrect it: it goes on from where it stood at most a minute before the stop. What it had read since is read again, and the listings already saved are skipped: none is delivered or charged twice, and maxItems still counts them.
  • With onlyNew, the memory is saved once a minute: resurrect the stopped run and the listings it had saved meanwhile join the memory; leave it stopped for good, and the next run may return up to a minute of them once more.

Something doesn't work?

The last line of the log counts the listings saved, filtered out and no longer on ImmobilienScout24 (removed while the run was reading them), and the requests that failed after every retry. Those requests and the removed listings are listed, with the reason, in the FAILED_REQUESTS record of the run's key-value store. A run that saved nothing and had failed requests fails, and its last message gives the cause (an unknown location or a filter the site refuses says so, instead of "run it again"). A run that saved some listings fails too when at least as many requests failed for good as were read — the first results page read, the rest blocked: a green run with a short dataset would hide the outage. One failed request among many is only a warning.

If ImmobilienScout24 changes its data, you are told instead of paying for blank rows. A results page that counts listings but gives none the Actor can read is an error (listed in FAILED_REQUESTS), never a quiet "No listings found". If the first 20 listings read all lack their title, publication date or postal code — or, with extractDetails, the raw values of their listing page — the run saves nothing more, stops and fails, and its last message names the missing field: at most those first listings are charged. A listing that postedAfter / postedBefore drops because it has no date at all counts among those 20.

🛟 Support

Open an issue in the Issues tab with a link to your run: the run log and the FAILED_REQUESTS record of the key-value store show exactly which URLs failed and why.