
Global Sources Supplier Scraper
scrape.ly/store/cornerledger/globalsources-scraperLead generationE-commerce
2 monthly users

Scrape ImmobilienScout24 listings from Germany, Austria and Switzerland: price, rent, living space, rooms, address, coordinates, photos, description, energy data and provider contact. Search URLs, listing URLs or a German location with filters.
Scrape property listings from ImmobilienScout24 in Germany (immobilienscout24.de), Austria (immobilienscout24.at) and Switzerland (immoscout24.ch) in one run. Paste a search URL (or just type a German city), and get price, rent, living space, rooms, full address with coordinates, photos, description, energy data and provider contact for every listing. No login, no browser, about 400 German listings with full details in under a minute.
normalized block (price, area, rooms, address, contact, images).| Field | What it does |
|---|---|
startUrls | Search URLs (/Suche/... on .de, /regional/... on .at, /de/immobilien/mieten/... on .ch) or listing URLs (/expose/<id>, Swiss /mieten/<id>). |
maxItems | Total number of listings to return (0 = no limit). |
searchLocation | German city or district, used instead of a URL. |
searchOperation, searchPropertyType | Rent or buy, apartment or house (with the location). |
radiusKm | Optional Umkreis radius in km (e.g. 1, 2, 5, 10, 15, 20, 50) around the search location. |
searchMinPrice … searchMaxLivingSpace | Price, rooms and living space limits (with the location). |
sortBy | Order of German results (newest, price, living space). |
includeDetails | Full listing records (on) or faster card-only rows (off). |
monitoringMode, detectPriceChanges, detectRemovedListings | Only new listings since the last run, plus price-change and removed rows. |
{
"startUrls": [
{ "url": "https://www.immobilienscout24.de/Suche/de/berlin/berlin/wohnung-mieten" },
{ "url": "https://www.immobilienscout24.at/regional/wien/wien/wohnung-mieten" },
{ "url": "https://www.immoscout24.ch/de/immobilien/mieten/ort-zuerich" }
],
"maxItems": 100
}
Each row is one listing. The top of the row has the most-used fields flat, normalized has the same structure for all three countries, and the rest of the row is the site's own full record (for example sections, contact and adTargetingParameters on German rows).
| Field | Description |
|---|---|
title, url, listingId, countryCode | Listing basics |
priceAmount, priceCurrency, priceKind | Price, currency and type (RENT_NET, RENT_GROSS, RENT_TOTAL, BUY) |
livingSpace, rooms | Living space in m² and number of rooms |
address, city, zip, latitude, longitude | Location (street when the provider shows it) |
searchRadiusKm, distanceKm | Only on radius (Umkreis) searches, from radiusKm or a pasted German radius URL: the radius used and the site's distance from the search center (empty when the address is hidden) |
company, image | Provider and first photo |
normalized | Price (incl. per m²), area, rooms, floor, construction, address, contact, images, media, documents, dates, flags, finance costs, price comparison |
sourceUrl, scrapedAt | Which input found it, and when |
Example (sample data, shortened):
{
"countryCode": "DE",
"listingId": "160000001",
"title": "Helle 2-Zimmer-Wohnung mit Balkon",
"priceAmount": 1150,
"priceCurrency": "EUR",
"priceKind": "RENT_NET",
"livingSpace": 62.5,
"rooms": 2,
"address": "Musterstraße 12, 10115 Berlin",
"city": "Berlin",
"zip": "10115",
"latitude": 52.5321,
"longitude": 13.3849,
"company": "Beispiel Immobilien GmbH",
"image": "https://pictures.immobilienscout24.de/listings/example.jpg",
"url": "https://www.immobilienscout24.de/expose/160000001",
"sourceUrl": "https://www.immobilienscout24.de/Suche/de/berlin/berlin/wohnung-mieten",
"scrapedAt": "2026-10-14T19:06:27.725Z",
"normalized": {
"transferType": "RENT",
"realEstateType": "apartmentrent",
"price": { "amount": 1150, "currency": "EUR", "formatted": "1.150 €", "kind": "RENT_NET", "perSqm": 18.4 },
"area": { "livingSpace": 62.5, "plotArea": null, "usableArea": null, "unit": "m2" },
"rooms": { "total": 2, "bedrooms": 1, "bathrooms": 1 },
"floor": { "current": 3, "total": 5 },
"construction": { "yearBuilt": 1998, "condition": "Gepflegt", "isNew": false, "projectId": null },
"contact": { "name": "Vermietungsteam", "company": "Beispiel Immobilien GmbH", "phone": null },
"priceComparables": {
"minPricePerM2": { "value": 7.9, "text": "7,90 € /m²" },
"maxPricePerM2": { "value": 24.4, "text": "24,40 € /m²" },
"positionInPercent": 0.41
}
}
}
You pay $1.00 per 1,000 listings ($0.001 per result), with no start fee. 1,000 listings ≈ $1.00 plus a few cents of platform usage (compute and proxy traffic, about $0.02 per 1,000 German or Austrian listings and up to about $0.15 per 1,000 Swiss listings, which use residential proxies). Monitoring rows (price changes, removed listings) count as results. When you set a maximum total charge, the run stops cleanly at that budget.
Is it legal to scrape ImmobilienScout24? The scraper reads only public listing pages that anyone can open without an account. You are responsible for how you use the data, especially personal data such as names or phone numbers of private providers (GDPR).
Do I need a login or my own proxy? No. German and Austrian listings work on the included datacenter proxy. Swiss pages always go through residential exits because the site refuses datacenter addresses.
How many results can I get? German searches return the full result list. Austrian search pages stop at 100 pages (about 1,500 listings) and Swiss ones at 50 pages (about 1,000 listings); the run log tells you when a search is bigger, so you can split it by price or district.
Why is a field empty? Providers fill different fields. Many hide the street until you contact them, private listings have no company, and projects have ranges instead of one size. Empty fields are null.
Can I schedule it or call it from code? Yes. Schedule the run and turn on monitoring mode to get only new listings, or start it through the API and read the dataset as JSON or CSV.
Which language are texts in? The listing texts are as the provider wrote them (mostly German, French or Italian in Switzerland).
normalized.listingFlags.paywall and may lack some details.Every field below can be set in the run form, passed through the API, or saved as a task. Unset fields fall back to the defaults shown.
startUrlsarrayOptionalStart URLs
ImmobilienScout24 search or listing URLs from immobilienscout24.de, immobilienscout24.at or immoscout24.ch. Set your filters on the site, then copy the address bar. Search URLs (/Suche/... on .de, /regional/... on .at, /immobilien/mieten/... on .ch) return every listing of the search; /expose/ (or Swiss /mieten/) URLs return one listing.
maxItemsintegerOptionaldefault 20Max results
Stop after this many listings in total. Use 0 for no limit.
maxItemsPerSearchintegerOptionaldefault 0Max results per search
Stop each search (start URL or location) after this many listings, so one big search does not use up the whole limit. 0 = no per-search limit.
searchLocationstringOptionalSearch location (Germany, no URL needed)
A German city, district or quarter such as 'Berlin', 'Hamburg Altona' or 'München Schwabing'. It is matched with the site's own place search. Leave empty to use only the start URLs.
searchOperationenumOptionaldefault "rent"Rent or buy
Used with the search location.
searchPropertyTypeenumOptionaldefault "apartment"Property type
Used with the search location. For other categories (land, offices, garages, ...) paste a search URL instead.
radiusKmintegerOptionalRadius (km)
Search this many km around the middle of the search location (the site's Umkreis search, e.g. 1, 2, 5, 10, 15, 20 or 50). Also changes the radius of pasted German Umkreis URLs. Leave empty to search the place itself.
searchMinPriceintegerOptionalMin price (EUR)
Cold rent per month for rentals, purchase price for sales. Used with the search location.
searchMaxPriceintegerOptionalMax price (EUR)
Used with the search location.
searchMinRoomsintegerOptionalMin rooms
Used with the search location.
searchMaxRoomsintegerOptionalMax rooms
Used with the search location.
searchMinLivingSpaceintegerOptionalMin living space (m²)
Used with the search location.
searchMaxLivingSpaceintegerOptionalMax living space (m²)
Used with the search location.
sortByenumOptionaldefault ""Sort order (Germany)
Order of German search results. Overrides the sorting in a pasted URL.
excludeNewBuildProjectsbooleanOptionaldefault falseSkip new-build project units (Germany)
Leave out units that the site groups under a developer's new-build project card. Skipped units are not charged.
includeDetailsbooleanOptionaldefault trueInclude full listing details
Load each listing's full record (description, all attributes, contact, photos, energy data, price check). Turn off for faster, card-only rows from the search pages.
excludeSectionsbooleanOptionaldefault falseDrop the raw sections block (Germany)
German rows carry the site's full 'sections' array (about 70% of the row size). Everything useful from it is also in 'normalized'.
excludeZipCodeShapesbooleanOptionaldefault falseDrop postcode outline coordinates (Germany)
Remove only the postcode polygon coordinates inside 'sections' (4-5 KB per row).
excludeTrackingbooleanOptionaldefault falseDrop the tracking block
Remove the site's analytics 'tracking' block from each row.
maxConcurrencyintegerOptionaldefault 8Max parallel requests
How many listings load at the same time.
monitoringModebooleanOptionaldefault falseOnly new listings since the last run
Remembers what each search returned before (in a named key-value store) and outputs only listings that are new since then.
detectPriceChangesbooleanOptionaldefault falseReport price changes
With monitoring on: add a row with status 'price_changed' (old and new price, change in EUR and %) for known listings whose price moved.
detectRemovedListingsbooleanOptionaldefault falseReport removed listings
With monitoring on: add a row with status 'removed' for listings that were in the last run but are gone now. Only checked when the whole search was read.
proxyConfigurationobjectOptionaldefault {"useScrapelyProxy":true,"scrapelyProxyGroups":["DATACENTER…Proxy configuration
Germany and Austria work on datacenter proxies. Swiss pages always use residential exits because the site refuses datacenter addresses.
Every run writes its results to a dataset. Preview it in the dashboard, then export it or read it through the API.
| Field | Type | Description |
|---|---|---|
| image | string | null | |
| title | string | null | |
| priceAmount | number | null | |
| priceCurrency | string | null | |
| priceKind | string | null | |
| livingSpace | number | null | |
| rooms | number | null | |
| address | string | null | |
| city | string | null | |
| zip | string | null | |
| company | string | null | |
| countryCode | string | null | |
| latitude | number | null | |
| longitude | number | null | |
| searchRadiusKm | number | null | |
| distanceKm | number | null | |
| listingId | string | null | |
| url | string | null | |
| scrapedAt | string | null | |
| normalized | object | null | The same fields in one shape for all three countries: price, area, rooms, floor, construction, address, contact, images, documents, dates, flags. |
| status | string | null | Monitoring rows only: price_changed or removed. |
You pay for the events the actor reports, such as each result or page it produces. Platform usage is included in the event prices.
| Event | Charged when | Price |
|---|---|---|
| Result | One listing (or one monitoring change row) in the dataset. | $0.001 |
Run this actor from your own code. Swap in your API token and the examples work as-is.
import { ScrapelyClient } from 'scrapely-client'
const client = new ScrapelyClient({ token: process.env.SCRAPELY_TOKEN })
// Start the actor and wait for the run to finish.
const run = await client.actor('roamandroof/immobilienscout24-scraper').call({
"startUrls": [
{
"url": "https://www.immobilienscout24.de/Suche/de/berlin/berlin/wohnung-mieten"
}
],
"maxItems": 20,
"proxyConfiguration": {
"useScrapelyProxy": true,
"scrapelyProxyGroups": [
"DATACENTER"
]
}
})
// Read the dataset the run produced.
const { items } = await client.dataset(run.defaultDatasetId).listItems()
console.log(items)Tokens live in your account settings. Keep them server-side: a token carries the full permissions of your account.
Connect the Scrape.ly MCP server once and your agent can run this actor as a tool. Pick your tool:
Fetch scrape.ly/agents.md and run roamandroof/immobilienscout24-scraperPaste into Claude Code, Codex, Cursor or any AI agent. It signs you in once in the browser.
{
"mcpServers": {
"scrapely": {
"url": "https://api.scrape.ly/mcp?tools=actors,runs,storage,docs&actors=roamandroof/immobilienscout24-scraper"
}
}
}No key in the file: your client opens the browser to sign you in the first time it connects.
Inputs the developer prepared for common jobs. Open one to see its input, then copy it to your account to run it as-is or adjust it.
ImmobilienScout24 houses for sale with details.
Apartments for rent with 2 or more rooms.
Austrian listings from a search link with details.
Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.