ImmoScout24 Property Listings Scraper avatar

ImmoScout24 Property Listings Scraper

Pricing

from $1.00 / 1,000 results

Go to Apify Store
ImmoScout24 Property Listings Scraper

ImmoScout24 Property Listings Scraper

Scrape German property listings from ImmoScout24 by city and type: price, living space, rooms, price per m², address with coordinates, agent, energy class and photos. No login, no browser.

Pricing

from $1.00 / 1,000 results

Rating

0.0

(0)

Developer

Farhan Febrian Nauval

Farhan Febrian Nauval

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

12 days ago

Last modified

Categories

Share

Scrape German property listings from ImmoScout24 by city and property type: price, living space, rooms, price per m², address with coordinates, energy efficiency class, photos and listing flags. Ten property types from apartments to retail space. No login, no browser.

Input

FieldTypeDefaultDescription
placesarray—German place names — Berlin, München, Hamburg-Altona. Resolved to region codes automatically
geocodesarray—Raw ImmoScout24 region codes, if you have them
realEstateTypesarrayapartment-rentapartment-rent, apartment-buy, house-rent, house-buy, flatshare-room, garage-rent, garage-buy, office, store-rent, investment
maxItemsPerSearchinteger200One search = one region × one type. 50 listings per request

Output

{
"_input": "Berlin / apartment-rent",
"_source": "S1-is24-mobile-api",
"_scrapedAt": "2026-09-12T10:22:04Z",
"listingId": "153605035",
"url": "https://www.immobilienscout24.de/expose/153605035",
"title": "Home & Co – Easy Living | Fully Furnished Living",
"realEstateType": "apartment-rent", "listingType": "STANDARD",
"price": 569.0, "currency": "EUR",
"livingSpaceSqm": 16.0,
"rooms": 1.0,
"pricePerSqm": 35.56,
"addressLine": "Clayallee 336, 14169 Berlin, Zehlendorf",
"latitude": 52.43719, "longitude": 13.26222,
"addressIsIncomplete": false,
"realtorLogoUrl": "https://pictures.immobilienscout24.de/usercontent/….PNG/…",
"isPrivate": false, "isNewObject": false, "isProject": false,
"energyEfficiencyClass": "E",
"liveVideoTourAvailable": false, "listedOnlyOnIs24": true,
"publishedLabel": "Published today", "tags": [],
"titlePictureUrl": "…", "pictureCount": 12,
"page": 1
}

Four things worth knowing

Price, size and rooms arrive with no labels. The API returns attributes: [{label: "", value: "€569"}, {label: "", value: "16 m²"}, {label: "", value: "1 rms"}] — every label an empty string. The order was consistent across 97 real listings, but this actor matches on the unit inside the value (€, m², rms) rather than the position, because the one entry that broke the pattern turned out not to be a listing at all.

Not everything in results is a property. Nine entries in 200 were house-construction group cards: no id, an isNewHomeBuilder flag, and a single attribute holding a builder's name. Read positionally, that puts "Build with massa haus – Nancy Ehrhard-Richter" into the price column. They are skipped, and the run log says how many.

A missing coordinate is explained, not mysterious. ImmoScout24 marks addresses the seller left vague with a literal (incomplete address) suffix, and those are precisely the listings with no lat/lon. In one Munich run the correlation was exact: 18 incomplete addresses, 0 with coordinates; 82 complete addresses, 82 with coordinates. addressIsIncomplete carries that so an empty latitude reads as a fact about the listing rather than a bug in the scraper.

There is no agent name in the search response. The realtor object holds a logo URL and a brand colour — on every listing checked — and nothing else. The agency name lives only on the listing's own detail page. Rather than emit a permanently-null realtorName, this actor ships realtorLogoUrl, which is what the API actually returns.

The locale is pinned, deliberately

The same listing renders as €569 / 1 rms under en-US and 569 € / 1 Zi. under de-DE — and German number formatting swaps the meaning of . and ,, so 4.115 € and €4,115 are the same number written two incompatible ways. The requests pin en-US so the parser has one contract instead of two. Prices are always euros regardless.

How it works

Two hosts. www.immobilienscout24.de/geoautocomplete/v3/locations.json turns a place name into the numeric region code the search needs (berlin → 1276003001). api.mobile.immobilienscout24.de/search returns the listings, 50 per page, and answers JSON only for the mobile app's client identifier — without it the same path returns a 200 with a zero-byte body rather than an error.

Errors

_errorMeaning
invalid_inputAn empty place name
place_not_foundThe geocode autocomplete matched no region
no_resultsThe search ran and this region has none of that property type
blockedThe API refused, or returned a 200 that was not usable
network_errorNever reached the server

If every search fails, the run itself fails rather than reporting success over an empty dataset.