ImmobilienScout24 Scraper - German Real Estate, No Login avatar

ImmobilienScout24 Scraper - German Real Estate, No Login

Pricing

from $0.69 / 1,000 listing with full details

Go to Apify Store
ImmobilienScout24 Scraper - German Real Estate, No Login

ImmobilienScout24 Scraper - German Real Estate, No Login

Get ImmobilienScout24 listings for German property research: price, area, rooms, address and realtor company. Search by city or link. No login.

Pricing

from $0.69 / 1,000 listing with full details

Rating

0.0

(0)

Developer

Cliqto Media

Cliqto Media

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Categories

Features

Limited permissions

Share

Export property listings from ImmobilienScout24, also called ImmoScout24, for German market research: give a city, region, postcode or search link, and get price, area, rooms, address and realtor company for each listing. No login or API key is needed, and a run with 10 rows costs about $0.011.

ImmobilienScout24 Scraper: a German city goes in, a table of listings with price, area, rooms and realtor comes out

Table of contents

What it does

This Actor collects public listings from ImmobilienScout24, the German property portal. You search by place, by radius or with links. You get one row per listing, with price, price per square metre, living area, rooms, address, realtor company, energy class and more.

It can also watch a search. With onlyNew it returns only listings it has not seen before, and it can report price changes and removed listings.

It does not collect agent names, phone numbers or email addresses. For private sellers, isPrivate is true and realtor is null.

Good fit

  • You invest in German property and want to compare asking prices and rent per square metre.
  • You track new listings in a city and want only the new ones each day.
  • You need listing data in a spreadsheet, a database or your own tools.

It is not a good fit if you need listings from Austria or Switzerland, seller contact details, or sold prices. This Actor covers public listings in Germany only.

👉 Try it now: open the input form

How it works

  1. You choose a place or paste search links, and you set how many listings you want.
  2. The Actor reads the matching search pages and opens each listing for its full details.
  3. It saves each listing as a row. You read the rows in a table, download them, or get them through the API.

👉 Try it now: open the input form

Quick start

Input form: box 1 marks place and rent or buy, box 2 marks how many rows

  1. Open the Input tab. location is set to Berlin and operation is set to rent (box 1).

  2. Keep maxItems at 10 (box 2).

  3. Click Start.

  4. Open Output and check price, rooms and livingSpace (box 4).

    Output table: box 4 marks price, rooms and area, box 5 marks address and realtor

  5. Check address and realtor (box 5).

Expected result: 10 rental apartments in Berlin in a few seconds, with the newest listings first.

👉 Try it now: open the input form

Use cases

Buyer jobInput pathOutput entityKey fieldsNext integration
Compare rent levels between German citieslocation with operation rentOne row per listingprice, totalRent, pricePerSqm, livingSpace, postcodeSpreadsheet or BI tool
Find investment property for salelocation with operation buy, propertyType apartment, house or investmentOne row per listingprice, pricePerSqm, yearBuilt, energyEfficiencyClass, urlYour deal list or CRM
Watch a search for new listings and price cutslocation or searchUrls, onlyNew, detectPriceChangesNew and changed rowschangeType, previousPrice, price, firstSeenAtSlack, Notion or a webhook
Map which realtor companies work in an arealocation with a high maxItemsOne row per listingrealtor, city, district, operationMarket report
Refresh a list of known listingssearchUrls with listing linksOne row per linkexposeId, price, status, fetchedAtYour database

👉 Try it now: open the input form

Input

Give at least one of these: location, searchUrls, or a radius with coordinates. If all are empty, the run stops at once with a clear message and costs only the start fee. API calls with empty input do not get the Berlin example.

Input fields

FieldPlain nameTypeRequiredDefault / prefillAllowed valuesEffectExampleRecommendation
locationLocationstringNoPrefill BerlinCity, region or 5-digit postcode in GermanySearches this placeBayernStart here
operationRent or buystringNorentrent, buyPicks rental or sale listingsbuyOffices, retail, gastronomy and industry ignore it
propertyTypeProperty typestringNoapartmentapartment, house, shared-flat, short-term, plot, garage, office, retail, gastronomy, industry, investment, auctionPicks the kind of propertyhouseauction and investment are for buying only
searchUrlsSearch or listing linksarray of stringsNoEmptyUp to 100 links: /Suche/... or /expose/<id>Reads these links["https://www.immobilienscout24.de/expose/172422033"]Filters below do not change a link
maxItemsMaximum listingsintegerNo100, prefill 101 to 10,000Limit for rows in the whole run500Raise the run timeout above about 2,000
fetchDetailsFull listing detailsbooleanNotruetrue, falseOpens each listing. Off is faster and cheaper, with fewer fields and no realtorfalseTurn off for big price scans
onlyNewOnly new listingsbooleanNofalsetrue, falseSkips listings seen in earlier runstrueUse for daily runs
detectPriceChangesAlso report price changesbooleanNofalsetrue, falseAdds rows with changeType price_changedtrueNeeds onlyNew
detectRemovedListingsAlso report removed listingsbooleanNofalsetrue, falseAdds rows with changeType removed after a full walktrueNeeds onlyNew. Keep maxItems above the search size
stateNameHistory namestringNoOne history per searchLowercase letters, digits, hyphens, up to 31 charactersRuns with the same name share a historyberlin-rentSet it if you change the input between runs
minPrice, maxPricePrice from, price to (EUR)numberNoEmpty0 or morePrice range. For rent this is monthly cold rent1500Works with location or radius, not links
minRooms, maxRoomsRoomsnumberNoEmpty0 or moreRoom range2Same
minLivingSpace, maxLivingSpaceLiving area in m²numberNoEmpty0 or moreArea range60Same
minYearBuilt, maxYearBuiltYear builtintegerNoEmpty1000 to 2100Year range2000Same
minFloor, maxFloorFloorintegerNoEmpty-5 to 200Floor range1Apartments only
equipmentEquipmentarrayNoEmptybalcony, garden, builtinkitchen, lift, cellar, guesttoilet, parking, handicappedaccessibleListing must have all selected options["balcony"]An option the type does not support stops the run with a clear message
apartmentTypesApartment typesarrayNoEmptyloft, maisonette, penthouse, terracedflat, groundfloor, halfbasement, roofstorey, apartment, raisedgroundfloor, otherLimits to these types["loft"]Apartments only
energyEfficiencyClassesEnergy classesarrayNoEmptya_plus, a, b, c, d, e, f, g, hLimits to these classes["a","b"]Some older listings have no class
excludeNewBuildProjectsExclude new-build projectsbooleanNofalsetrue, falseRemoves new-build project listingstrueFor apartments and houses for sale, and apartments for rent
radiusKm, latitude, longitudeRadius searchnumberNoEmpty0.1 to 200 kmSearches a circle5, 52.52, 13.40Give all three. Do not combine with location
sortBySort orderstringNonewestnewest, price-asc, price-desc, space-desc, rooms-desc, relevanceOrder of rowsprice-ascNot every type supports every order. The message lists those that work
skipItemsSkip listingsintegerNo00 or moreSkips rows at the start of each search100Use to continue a big search
languageText languagestringNodede, enLanguage of labels from the sourceenTitles and descriptions stay as the seller wrote them
proxyConfigurationProxyobjectNoEmptyApify proxy settingsSends requests through a proxyNot needed in normal runs
deliveryConnector, deliveryTargetDeliverystringNoEmptyConnector and Notion page link or Slack channel IDPosts a short summary after the runSee Send results to Slack or Notion

The same listing found twice in one run gives one row and one charge.

Interacting settings

WhenInput AInput BEffective behaviorExampleCost/result effect
Links and a place togethersearchUrlslocationBoth run. The links go firstOne link and BerlinmaxItems is shared between them
Links with filterssearchUrlsminPriceThe link keeps its own filters. minPrice does not change itLink and minPrice 1000Put filters in the link itself
Place and radiuslocationradiusKmThe run stops with a clear messageBerlin and 5Start fee only
Monitor options without monitordetectPriceChangesonlyNew falseThe run stops with a clear messageStart fee only
Monitor with a low limitdetectRemovedListingsmaxItemsRemoved listings are reported only after a full walkLimit 100 for a search of 500No removed rows in that run
Commercial type with rent or buypropertyType officeoperationoperation is ignored. Each row says rent or buyOffice and rentRows can mix both
Type and operation that do not fitpropertyType auctionoperation rentThe run stops with a clear messageStart fee only

Input examples

Small example

{ "location": "Berlin", "operation": "rent", "maxItems": 10 }

Expected behavior: reads one search page and opens 10 listings. Expected output: 10 rows in a few seconds. Limit or cost note: about $0.011 on the Free plan.

Investment search with filters

{
"location": "Leipzig",
"operation": "buy",
"propertyType": "apartment",
"maxPrice": 300000,
"minLivingSpace": 50,
"maxItems": 200
}

Expected behavior: searches apartments for sale in Leipzig with these limits. Expected output: up to 200 rows with pricePerSqm and yearBuilt. Limit or cost note: about $0.20 on the Free plan.

Daily watch with price changes

{
"location": "10115",
"operation": "rent",
"onlyNew": true,
"detectPriceChanges": true,
"maxItems": 1000
}

Expected behavior: the first run saves all current listings. Later runs save only new and changed ones. Expected output: rows with changeType new or price_changed. Limit or cost note: a later run with no change has no listing charges. See Cost examples.

{
"searchUrls": [
"https://www.immobilienscout24.de/expose/172422033",
"https://www.immobilienscout24.de/Suche/de/berlin/berlin/wohnung-mieten"
],
"maxItems": 20
}

Expected behavior: reads the listing and then the search. Expected output: up to 20 rows. A listing that is gone gives a free row with status not_found. Limit or cost note: up to 100 links in one run.

👉 Try it now: open the input form

Output

The Listings view shows the main fields first. Every row also has all the fields below. The run also saves a summary in the RUN_SUMMARY record of the run's key-value store.

Output fields

A null value means the source does not show this field for this listing. It does not mean zero.

FieldMeaningTypeCan be empty?Example / enumSource / notes
exposeIdListing IDstringNo172422033From the source
urlListing pagestringNohttps://www.immobilienscout24.de/expose/172422033From the source
titleListing titlestringYes4-Zimmer-Wohnung in MitteAs the seller wrote it
priceMain price in EUR. For rent this is cold rentnumberYes852See priceUnit
priceTextPrice as the source shows itstringYes852 €From the source
priceUnitWhat price stands forstringYestotal, month, day, year, sqmFrom the source
currencyCurrencystringYesEURFrom the source
pricePerSqmPrice per square metrenumberYes9.88Worked out from price and area. Null for day and year prices
totalRentTotal rent in EURnumberYes1137.67Needs full details
baseRent, serviceCharge, heatingCosts, depositParts of the rentnumberYes852Needs full details
livingSpaceLiving area in m²numberYes86.2From the source
usableArea, plotAreaUsable area and plot area in m²numberYes450Mostly commercial and plots
rooms, bedrooms, bathroomsRoom countsnumberYes4From the source
addressAddress as one linestringYesRosenthaler Straße 11, 10119 Berlin, MitteSellers can hide the street
street, postcode, city, district, stateParts of the addressstringYesBerlinIn big cities the part of town is in district
latitude, longitudeMap positionnumberYes52.52785Missing when the seller hides the address
realtorRealtor companystringYesWBM Wohnungsbaugesellschaft Berlin-Mitte mbHNeeds full details. Null for private sellers. A small business can trade under a person's name
realtorLogoUrlCompany logostringYesLinkNeeds full details
isPrivateA private person placed the listingbooleanYesfalseTheir name is never collected
operationRent or buystringYesrent, buyFrom the input, or from the listing for commercial types
propertyType, realEstateTypeYour type and the source's typestringYesapartment, apartmentrent
isNewBuildProject, isNewObjectNew-build flagsbooleanYesfalseFrom the source
energyEfficiencyClass, energyCertificateType, energyDemand, heatingTypeEnergy datastringYesBSome listings have none
fairPricePrice rating from the sourcestringYesOften empty
yearBuilt, floor, totalFloors, condition, availableFrom, apartmentTypeBuilding and listing factsmixedYes1975Needs full details
hasBalcony, hasGarden, hasKitchen, hasLift, hasCellar, petsAllowedEquipmentbooleanYestrueNull means the listing does not say
attributesOther facts from the listingobjectYesNeeds full details
publishedText, tagsAge text and labels from the sourcemixedYesvor 12 MinutenAs the source shows them
imageUrl, images, descriptionPictures and textmixedYesLinksAs the seller wrote them
changeTypeWhat changedstringYesnew, price_changed, removedOnly with onlyNew
previousPriceEarlier pricenumberYes900For price_changed and removed rows
firstSeenAtWhen the history first saw this listingstringYesISO 8601Only with onlyNew
statusRow statusstringNocomplete, partial, not_foundpartial: search fields only
errorWhy a row is partialstringYes
sourceSource sitestringNoimmobilienscout24.de
sourceSearchSearch or link that gave this rowstringYesBerlin
fetchedAtWhen the row was fetchedstringNo2026-11-06T10:12:00.000Z

For rent, price is cold rent, the first figure the portal shows. Use totalRent for the rent with costs.

Output entities and surfaces

SituationDataset/API/KVS/live viewResult shapeUser action
Normal itemDataset, API, Listings viewRow with status completeUse the row
Domain-empty resultEmpty Dataset or free row with status not_found. RUN_SUMMARY says whyThe run succeeds. reason is NO_RESULTS or NO_CHANGESChange the search, or wait for new listings
Partial resultRows you have so far. RUN_SUMMARY has status partial with reasonOne listing failed: row with status partial and error. Run stopped early: rows are keptRaise maxItems, the timeout or the charge limit
Technical failure or retryThe run retries up to 4 times, then fails. RUN_SUMMARY has reason SOURCE_ERRORSaved rows stay in the DatasetRun again later. An empty failed run does not mean there are no listings

Output example

{
"exposeId": "172422033",
"url": "https://www.immobilienscout24.de/expose/172422033",
"title": "4-Zimmer-Wohnung in Mitte",
"price": 852,
"priceUnit": "month",
"currency": "EUR",
"pricePerSqm": 9.88,
"totalRent": 1137.67,
"livingSpace": 86.2,
"rooms": 4,
"address": "Rosenthaler Straße 11, 10119 Berlin, Mitte",
"realtor": "WBM Wohnungsbaugesellschaft Berlin-Mitte mbH",
"isPrivate": false,
"operation": "rent",
"propertyType": "apartment",
"energyEfficiencyClass": "B",
"status": "complete",
"source": "immobilienscout24.de",
"fetchedAt": "2026-11-06T10:12:00.000Z"
}

This row is trimmed. A full row has all the fields above, and a field with no value is null rather than missing.

Send results to Slack or Notion

Pick your connector in the optional deliveryConnector field. After the run saves its data, the Actor posts a short summary (up to 25 rows and a link to the full dataset) there. Put a Notion page link or a Slack channel ID in deliveryTarget: in Notion every run is added on top of that one page, so your workspace does not fill up with new pages. A delivery error never fails the run and costs nothing extra. Connect a service once in Apify Console → MCP connectors.

Use case → fields

Buyer jobInput pathOutput entityKey fieldsNext integration
Compare rent levelslocation with rentListing rowsprice, totalRent, pricePerSqm, postcodeSpreadsheet or BI tool
Find property for salelocation with buyListing rowsprice, pricePerSqm, yearBuilt, urlDeal list or CRM
Watch a searchonlyNewNew and changed rowschangeType, previousPrice, firstSeenAtSlack, Notion or a webhook
Map realtor companieslocationListing rowsrealtor, city, districtMarket report

👉 Try it now: open the input form

Pricing

Pricing unit

You pay per event. Platform usage is included in these prices.

EventWhat it isFreeBronzeSilverGold and above
Listing with full detailsOne saved row with details$0.00099$0.00089$0.00079$0.00069
ListingOne saved row without details (fetchDetails off, or the listing page failed)$0.0005$0.00045$0.0004$0.00035
Check without a paid rowOne read that gave no paid row: an empty search, a listing that is gone, or a search page with nothing new. The first read in a run is free$0.00005$0.00005$0.00005$0.00005
Actor startOnce per run$0.001$0.001$0.001$0.001
  • The start fee grows with run memory: one start event per GB, with a minimum of one. At the default 256 MB you pay one.
  • A search with no results costs the start fee. A monitor run with no change costs the start fee and small check fees. It is not free.
  • A row that lost its details costs the lower Listing price, never more than a full row.
  • If a run stops or fails, you pay for what it saved and read before that. Saved rows stay in the Dataset.
  • A run stops at your maximum charge and keeps its rows.

Cost examples

Examples use Free plan prices.

ScenarioInput scopeExpected item/event countBase chargeOptional chargeStop/cap behavior
Small testBerlin, maxItems 1010 rows with details$0.001 start$0.0099Stops at 10 rows
MediummaxItems 100100 rows with details$0.001 start$0.099Stops at 100 rows
LargemaxItems 1,0001,000 rows with details$0.001 start$0.99Stops at 1,000 rows
Without detailsmaxItems 1,000, fetchDetails off1,000 rows$0.001 start$0.50Stops at 1,000 rows
No resultsA search with no listings0 rows, first read free$0.001 start$0Run succeeds with an empty Dataset
100 gone links100 listing links that no longer exist100 free rows, 99 checks$0.001 start$0.00495Run succeeds
Monitor with no changeWalks about 100 search pages0 rows, about 100 checks$0.001 startAbout $0.005Run succeeds with reason NO_CHANGES

👉 Try it now: open the input form

Limits

  • Germany only. The source's other country sites are not covered.
  • Up to 10,000 rows per run. We tested this limit. A bigger area can have more listings, for example about 89,000 rental apartments in Germany. Split it by region or use skipItems.
  • Up to 100 links in searchUrls per run.
  • The default run timeout of 300 seconds is enough for about 2,000 rows with details. A run of 10,000 rows took about 14 minutes, so set a timeout of 1,200 seconds for it. When time runs out, the run keeps its rows and ends with reason DEADLINE.
  • Filter fields work with location and radius, not with links. Put filters in the link itself.
  • Search links with map-drawn areas are not supported. Use a place or a radius.
  • Offices, retail, gastronomy and industry cannot be filtered by rent or buy, because the source mixes them.
  • realtor needs full details. With fetchDetails off it is null.
  • Agent names, phone numbers and email addresses are not collected.
  • Listings change all the time, so two runs can differ. Rows show the data at fetchedAt.
  • Removed listings are reported only after a full walk of the search.

👉 Try it now: open the input form

API, export and integrations

  • API: Start a run with the same JSON as the input form, for example location and maxItems. Read rows from the run's dataset. Most systems use exposeId as the key.
  • Export: Download the Listings view as CSV, Excel, JSON or XML from the Output tab. Spreadsheets mostly use price, pricePerSqm, address and url.
  • Scheduling: Create an Apify schedule with onlyNew on. Each run saves only new rows to its own dataset. The next step reads changeType.
  • Webhooks / no-code: Start a Zapier, Make or n8n flow when a run succeeds. It reads the run's dataset. Check reason in RUN_SUMMARY and then use changeType and url.
  • SDK / MCP / agent: Call the Actor with the Apify SDK or MCP, using the same input. Rows appear in the dataset, and the run's status appears in RUN_SUMMARY.

Use with AI agents (MCP)

Server link: https://mcp.apify.com?tools=cliqtomedia/immobilienscout24-scraper

Smallest input:

{ "location": "Berlin", "operation": "rent", "maxItems": 10 }

Key fields: exposeId, price, pricePerSqm, livingSpace, address.

This input takes a few seconds and costs about $0.011 on the Free plan. The limits are 10,000 rows and 100 links per run, and Germany only.

👉 Try it now: open the input form

Troubleshooting

The run saved fewer rows than I asked for

Symptom: the Dataset has fewer rows than maxItems. Likely reason: the search has fewer listings, or the run ran out of time. Check: reason and totalAvailable in RUN_SUMMARY. Action: for DEADLINE, give the run a longer timeout. For ALL_SAVED, widen the search.

The Dataset is empty and the run succeeded

Symptom: the run is green with 0 rows. Likely reason: the search has no listings, or onlyNew found nothing new. Check: reason in RUN_SUMMARY: NO_RESULTS or NO_CHANGES. Action: remove some filters. With onlyNew, wait for new listings.

The run failed with a message about input

Symptom: the run fails at once with INVALID_INPUT. Likely reason: a value is wrong, or two settings do not fit. For example, the type does not support that filter or sort order. Check: the status message. It names the field and what works instead. Action: fix the field and start again.

The source does not know my location

Symptom: the message says that ImmobilienScout24 does not know the location. Likely reason: a typo, or a place outside Germany. Check: search for the same name on the site. Action: use the German name or a 5-digit postcode.

Some rows have status partial

Symptom: realtor and other detail fields are null, and error has text. Likely reason: the source did not return that listing's page in time. Check: the url of the row. Action: run the listing link again. You paid the lower price for this row.

The run failed with SOURCE_ERROR

Symptom: the run fails after retries, and rows may be missing. Likely reason: the source was not available at that moment. Check: RUN_SUMMARY and any saved rows. Action: run it again later. This failure does not mean that there are no listings.

👉 Try it now: open the input form

FAQ

Do I need an ImmobilienScout24 account or a key?

No. The Actor reads public listings and does not log in.

Do I need a proxy?

No. Normal runs do not use one, and the proxy field is there only if you want it.

Does the data include phone numbers or emails?

No. You get the realtor company name. Private sellers are marked with isPrivate, and their names are not collected.

Why is price lower than the rent I see elsewhere?

For rent, price is cold rent. totalRent includes costs when the listing gives them.

Do I get all listings in Germany?

You get up to 10,000 rows per run, and only those that the source shows. Split big areas by region, or use skipItems.

How fresh is the data?

Each row is read during the run, and fetchedAt gives the time. Sort newest shows the latest listings first.

Does a run with no results cost money?

It costs the start fee. See Pricing.

How does onlyNew remember listings?

It keeps a history in a named store in your Apify account. Without stateName, each search has its own history. The first run counts all rows as new, and you pay for them.

👉 Try it now: open the input form

👉 Try it now: open the input form

Support

Open the Issues tab of this Actor. Include the run ID, your input mode (place, radius or links) and the error message. Do not send tokens, cookies, private source data or billing data.

👉 Try it now: open the input form