Immowelt Germany Real Estate Scraper
Pricing
from $1.50 / 1,000 result row emitteds
Immowelt Germany Real Estate Scraper
Scrape sale and rent listings from Immowelt.de, Germany's #2 property portal. Get clean numeric price, living area, room count, and district data per listing while we handle blocks and fingerprint rotation for you.
Pricing
from $1.50 / 1,000 result row emitteds
Rating
0.0
(0)
Developer
DevilScrapes
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
8 days ago
Last modified
Categories
Share
🎯 What this scrapes
Immowelt.de is Germany's #2 property portal, and its rival cluster is deep: 30 Actors already target it on the Apify Store, 17 with real users, the leader running 714 jobs a month. (Germany's #1 portal, ImmoScout24, is deliberately out of scope here — two incumbents there each out-run our entire top earner combined, an impossible field to enter.) This Actor pulls every listing card off an Immowelt search page — Berlin, Munich, Hamburg, or any city/district you search — and normalizes it into clean numeric fields: a bare EUR price, living area in m², room count, and district, instead of the single German blob string ("Wohnung zum Kauf - Treptow-Köpenick - 170.000 € - 2 Zimmer, 45 m²") the site actually renders. Both kaufen (sale) and mieten (rent) listings work the same way.
🔥 What we handle for you
- 🛡️ Browser fingerprint rotation —
curl-cffiimpersonates real Chrome / Firefox / Safari TLS handshakes, rotated across requests, so the target sees a browser, not Python. - 🌐 Proxy session rotation via Apify Proxy — fresh session and exit IP on every block, always pinned to a German (
DE) exit so you never get a wrong-country page silently. - 🔁 Retries with exponential backoff on
408 / 429 / 5xx— up to 5 attempts per search URL,Retry-Afterhonoured. - 🧱 Search-URL- and listing-level fault isolation — one blocked search URL or one bad card is skipped and logged, never crashes the run.
- 🧊 Clean, typed dataset rows — Pydantic-validated, ISO-8601 timestamps, numeric price/area fields with an explicit currency and unit instead of one unparsed German string.
- 💰 Pay-Per-Event pricing — you only pay for results that hit your dataset. No data, no charge.
💡 Use cases
- Home-buyer market research — pull current kaufen listings for a German city, normalized price-per-m² included, to compare districts fast.
- Rental market benchmarking — track mieten listing prices and living area across Berlin, Munich, and other cities.
- PropTech and real-estate analytics — feed a clean, deduped listings dataset into a pricing or valuation model.
- Relocation services — build client-facing property shortlists with district and room-count data included.
⚙️ How to use it
- Click Try for free at the top of the page.
- Paste one or more real immowelt.de search URLs (copy them straight from your browser — a bare city name alone won't resolve, Immowelt encodes a location-ID hash in every search URL).
- Click Start. Output streams into the run's dataset.
- Export from Storage → Dataset as JSON, CSV, or Excel — or fetch via the API.
📥 Input
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
searchUrls | array | yes | — | Direct immowelt.de/suche/(kaufen|mieten)/... search URLs copied from the site. A bare city name 410s. Up to 50. |
maxResults | integer | no | 100 | Cap on rows this run, summed across all Search URLs. |
proxyConfiguration | object | no | RESIDENTIAL group | The Actor pins country_code='DE' internally whenever a proxy is used (never user-configurable). |
Example input
{"searchUrls": ["https://www.immowelt.de/suche/kaufen/wohnung/berlin/berlin-10115/ad08de8634"],"maxResults": 20,"proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"]}}
📤 Output
Every row is one dataset item.
| Field | Type | Notes |
|---|---|---|
listing_id | string | The expose/ |
url | string | Canonical https://www.immowelt.de/expose/ |
operation | string | 'sale' (kaufen) or 'rent' (mieten), as requested. |
property_type | ['string', 'null'] | Raw German noun from the card, e.g. 'Wohnung', 'Haus', 'Penthouse'. |
title | string | Constructed from property_type + district, e.g. 'Wohnung in Mitte'. |
price | ['number', 'null'] | Asking price, parsed to a bare number. |
currency | string | Always 'EUR'. |
price_per_sqm | ['number', 'null'] | Computed when both price and area_sqm are known. |
area_sqm | ['number', 'null'] | Living area in square metres (Wohnfläche). |
rooms | ['integer', 'null'] | Room count (Zimmer), when the card states one. |
district | ['string', 'null'] | Borough/district name, e.g. 'Treptow-Köpenick'. |
city | string | City slug from the search URL, title-cased, e.g. 'Berlin'. |
image_urls | array | Gallery photo URLs (empty OK). |
scraped_at | string | ISO 8601 UTC row-creation timestamp. |
Example output
{"listing_id": "1215b46c-9e03-4081-bc72-67209544ff9f","url": "https://www.immowelt.de/expose/1215b46c-9e03-4081-bc72-67209544ff9f","operation": "sale","property_type": "Wohnung","title": "Wohnung in Treptow-Köpenick","price": 170000.0,"currency": "EUR","price_per_sqm": 3777.78,"area_sqm": 45.0,"rooms": 2,"district": "Treptow-Köpenick","city": "Berlin","image_urls": ["https://mms.immowelt.de/3/2/9/9/329954f0-f004-47bc-ba98-2b821cb41256.jpg?ci_seal=bb6a7320c68559dbd1bd82a9fa6ed80ede105d28&w=626&h=470"],"scraped_at": "2026-09-15T12:00:00+00:00"}
💰 Pricing
Pay-Per-Event — you pay only when these events fire:
| Event | USD | What it is |
|---|---|---|
actor-start | $0.20 | One-off warm-up charge per run |
result-row | $0.0015 | Per unique dataset item |
Example: 1 000 results at the rates above ≈ $1.70. No subscription, no minimum, no card to start — Apify gives every new account $5 of free credit.
🚧 Limitations
v1 is search-results only — no detail-page enrichment. Immowelt's /expose/<uuid> detail pages sit behind a DataDome challenge that curl-cffi cannot clear, so fields only the detail page carries (bathrooms, year built, energy label, HOA fee, plot area, full address) are out of scope for v1. Numbered pagination is a client-side control that doesn't respond to a URL page parameter, so breadth comes from supplying more search URLs (different cities/districts), not from a page cursor. district is null when a card's title doesn't carry one (e.g. some commercial/land listings).
❓ FAQ
Do I need an Immowelt account or API key?
No. This Actor scrapes Immowelt.de's own publicly listed property data — no login, no API key.
Why can't I just pass a city name?
Immowelt encodes an opaque location-ID hash in every real search URL (.../berlin-10115/ad08de8634). A bare city path 410s. Search on immowelt.de, apply your filters, then paste the resulting URL in.
Why is there no enrich option like some of your other real-estate Actors?
Immowelt's detail pages are protected in a way this Actor's HTTP-level approach can't clear. Rather than ship a broken toggle, v1 sticks to the search-card data, which already carries price, area, rooms, and district.
Can I scrape multiple cities in one run?
Yes — pass multiple search URLs and we fetch and dedupe across all of them.
💬 Your feedback
Spotted a bug, hit a weird edge case, or need a new field? Open an issue on the Actor's Issues tab on Apify Console — we ship fixes weekly and we read every report.