Immowelt Scraper – German Real Estate Listings (Buy & Rent)
Pricing
from $2.00 / 1,000 results
Immowelt Scraper – German Real Estate Listings (Buy & Rent)
Scrape Immowelt.de apartments, houses & plots for sale or rent in any German city. Price, Kaltmiete/Warmmiete, rooms, m², €/m², address, agent, energy class, photos. Newest first.
Pricing
from $2.00 / 1,000 results
Rating
0.0
(0)
Developer
ninhothedev
Maintained by CommunityActor stats
1
Bookmarked
13
Total users
2
Monthly active users
a day ago
Last modified
Categories
Share
Immowelt Scraper – German Real Estate Listings (Buy & Rent)
Scrape Immowelt.de property listings for any German city, district or postcode: apartments, houses and plots, for sale or for rent. Get clean, flat rows with price, Kaltmiete & Warmmiete, rooms, living area, €/m², address, district, agent, energy class, photos and publish date – newest first by default. Fields depend on what each listing publishes. Export to JSON, CSV, Excel or straight into your CRM, Google Sheets or database.
Built for real-estate investors, agents, proptech startups, relocation services and market analysts who need repeatable snapshots of publicly visible property listings.
- ✅ Works with the 2026 Immowelt platform (AVIV) – reads the site's embedded search data; source changes and access restrictions can still interrupt runs
- ✅ City search or an Immowelt search URL (
/suche/…,/liste/…,/classified-search?…) – uses the search model returned by Immowelt - ✅ Filters: buy/rent, apartment/house/plot, price, rooms, living area, year built
- ✅ Newest first by default – explicit URL sorting takes precedence
- ✅ Optional detail enrichment: full description, all photos, year built, heating, energy kWh, Nebenkosten, Heizkosten, Kaution, commission, balcony/garden/elevator/cellar/garage
- ✅ Per-result pricing plus a start fee; no Immowelt account or API key needed
What data can you extract from Immowelt?
| Field | Example |
|---|---|
title | Hochwertiges 4-Zimmer-Apartment im neuen Hochpunkt von München |
price | 2175 (Kaufpreis or Kaltmiete in €) |
total_rent | 2465 (Warmmiete, rentals) |
additional_costs | 290 (Nebenkosten / Hausgeld) |
price_type / property_type | miete / wohnung |
rooms / area_sqm / plot_sqm | 4 / 95.43 / null |
price_per_sqm | 22.79 |
address, street, district, city, zip_code, state | Forst-Kasten-Allee, … , München, 81475, Bayern |
floor | 4 |
energy_rating, energy_kwh, heating_type, year_built, condition | A, 45, Fernwärme, 2025, Erstbezug |
provider_name, provider_type | Müller Merkle Immobilien GmbH, agency |
published_at, updated_at | 2026-03-19T16:37:53Z |
images, thumbnail_url | All photo URLs |
url, external_id, online_id | Stable Immowelt IDs for deduplication |
How to scrape Immowelt
- Enter a city (e.g.
München,Hamburg,Köln) or paste an Immowelt search URL from your browser. - Choose buy/rent, property type and optional filters. Set Maximum unique listings (e.g. 100).
- Click Start and download the results as JSON, CSV or Excel – or fetch them via API.
{"city": "München","propertyType": "wohnung","priceType": "miete","priceMax": 2500,"roomsMin": 2,"maxItems": 20,"maxPages": 1,"enrichDetails": false,"proxyConfiguration": {"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"]}}
Use your own filtered search instead:
{ "searchUrl": "https://www.immowelt.de/suche/hamburg/haeuser/kaufen", "maxPages": 10 }
Output example
{"external_id": "27a87713-9fad-4075-8457-7c055024bda7","url": "https://www.immowelt.de/expose/27a87713-9fad-4075-8457-7c055024bda7","title": "Hochwertiges 4-Zimmer-Apartment im neuen Hochpunkt von München","price": 2175,"total_rent": 2465,"additional_costs": 290,"price_type": "miete","property_type": "wohnung","rooms": 4,"area_sqm": 95.43,"price_per_sqm": 22.79,"street": "Forst-Kasten-Allee","zip_code": "81475","city": "München","state": "Bayern","floor": 4,"energy_rating": "A","condition": "Erstbezug","provider_name": "Müller Merkle Immobilien GmbH","provider_type": "agency","published_at": "2026-03-19T16:37:53.567Z","thumbnail_url": "https://mms.immowelt.de/5/4/1/d/541d6f68-2114-488b-ae6d-78d27c70e29a.jpg"}
Check export coverage before using the data
Open Run coverage report in the Output tab, or read RUN_SUMMARY from the run's key-value store. Apify's SUCCEEDED status means the run completed its execution; it can still contain a partial export.
RUN_SUMMARY.status | Meaning |
|---|---|
complete | Finished within the configured item, page or budget limit, or reached the source's end of results. This does not mean all listings in a market were collected. |
partial | Stored rows remain available, but a later page failed, pagination repeated, or some requested detail pages failed. |
incomplete | Execution failed. Inspect the report and log; any rows already stored remain available. |
Check stopReason, pagesAttempted, failedPages, timedOutPages, detailFailures and deliveredItems. A failed detail page retains its search row with detail_status: "failed". A source error with no usable output fails the run. Unavailable fields are empty or null, not evidence that a property lacks that feature.
With enrichDetails: true, cost fields use the source's legacy and component price layouts. deposit, heating_costs, additional_costs and total_rent contain explicit amounts where available. A deposit such as “3 Kaltmieten” remains null rather than becoming €3; percentages, annual amounts and purchase-cost estimates are not substituted for monthly euro costs. A loaded detail page can still have null fields when the listing supplies no supported amount.
Detail enrichment first tries to read the listing's embedded data from its HTML document in the existing browser session, avoiding other page resources. If that fails, it uses full browser navigation for the remaining details. RUN_SUMMARY.detailRequests records document attempts, loaded documents, browser loads and fallbacks for troubleshooting. Field availability, result charges and the enrichDetails setting stay the same; source access and runtime can vary.
Search pages also use document-only requests after the initial browser visit resolves the location. The Actor checks the response URL, page number, filters and result structure before accepting them; if these checks fail, it falls back to browser navigation for the remaining search pages. RUN_SUMMARY.searchRequests records document attempts, loaded documents, browser loads and fallbacks for result pages (the initial location visit is excluded). This reduces unnecessary page resources when the source supports it; it does not guarantee access or a fixed runtime.
Daily rental monitoring: Munich example
Start with the 20-listing input above: Munich apartments for rent, up to €2,500 and at least two rooms. Save your own task and choose a schedule that fits your needs. Each run is a fresh, bounded snapshot; the Actor does not retain a cross-run price history or emit only new listings.
- Read
RUN_SUMMARYand flag partial runs before comparison. - Store each row in your database or spreadsheet using
external_idandscraped_at. - Compare against your previous snapshot to identify first-seen listings and changed asking prices. Preserve both observations for auditability.
- Send alerts through your own integration after deduplication. A listing missing from a bounded or partial snapshot is not proof it was rented or sold.
Deduplication applies within a run, including resumed runs. A listing returned on a later scheduled run is another billable result. Increase both maxItems and maxPages if you need a broader sample.
Pricing
Pay per result: $2 per 1,000 listings (plus a tiny start fee). For example, 500 returned listings cost $1 in result charges, plus the displayed start fee, before any plan discounts. This is an arithmetic example, not an availability guarantee. Detail enrichment does not add extra result charges – it only takes longer.
Use cases
- Investors & agents: daily alerts for new listings below a target €/m² in your cities
- Market analysis: rent and price levels by district, postcode, size and energy class
- Lead generation: list of active agencies and private sellers per region
- Proptech & valuation models: fresh training data with prices, areas, year built and location
- Relocation & HR: current rental supply for employees moving to a city
Integrations & API
Schedule your saved task (e.g. every morning), compare snapshots in your workflow, and connect the output to Google Sheets, Slack, Make, Zapier, n8n, Airtable or a webhook. Python example for apify-client==3.2.0 (set APIFY_TOKEN in your environment). Each call starts a billable run; the small limits below are intentional. See the official client quick start.
import osfrom datetime import timedeltafrom decimal import Decimalfrom apify_client import ApifyClientclient = ApifyClient(os.environ["APIFY_TOKEN"])run = client.actor("ninhothedev/immowelt-scraper").call(run_input={"city": "München", "priceType": "miete", "propertyType": "wohnung","priceMax": 2500, "roomsMin": 2, "maxItems": 3, "maxPages": 1,"enrichDetails": True,"proxyConfiguration": {"useApifyProxy": True, "apifyProxyGroups": ["RESIDENTIAL"]},},run_timeout=timedelta(seconds=240), max_total_charge_usd=Decimal("0.10"),)if run is None or run.status != "SUCCEEDED":raise RuntimeError("Run failed; inspect its log and any partial output.")record = client.key_value_store(run.default_key_value_store_id).get_record("RUN_SUMMARY")summary = record["value"] if record else {}if summary.get("status") != "complete":raise RuntimeError(f"Partial or missing coverage report: {summary}")for item in client.dataset(run.default_dataset_id).iterate_items():print(item["price"], item["total_rent"], item["deposit"], item["url"])
FAQ
How many listings can I get? maxItems accepts up to 10,000 and maxPages up to 300. Actual output depends on available results, page size, duplicates, budget and source access; setting a limit does not guarantee that many rows. The Console starts with a 20-item prefill. API calls that omit maxItems use the page limit alone.
Do I need a proxy? Apify Residential proxy is prefilled in the Console. API calls should include proxyConfiguration explicitly if desired; omitting it uses a direct connection. Proxies cannot guarantee access.
Rent: is price Kaltmiete or Warmmiete? price is the price Immowelt shows on the card (Kaufpreis or Kaltmiete). total_rent and additional_costs are populated where supplied or derivable from the source. Missing values do not mean zero costs.
Is scraping Immowelt legal? The actor only collects publicly visible listing data. Make sure your use complies with GDPR and Immowelt's terms – don't store personal data you don't need.
Something broke? Open an issue on the Actor page with your run URL, sanitized input and the expected versus observed result. Share a failing run for debugging when possible; do not post API tokens or private data.
Related actors
- ImmoScout24 Scraper – Germany's largest property portal
- Kleinanzeigen Scraper – private property and classifieds listings
- AutoScout24 Scraper – European car listings