Immowelt Germany Real Estate Scraper avatar

Immowelt Germany Real Estate Scraper

Pricing

from $1.50 / 1,000 result row emitteds

Go to Apify Store
Immowelt Germany Real Estate Scraper

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

DevilScrapes

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

7 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-cffi impersonates 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-After honoured.
  • 🧱 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

  1. Click Try for free at the top of the page.
  2. 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).
  3. Click Start. Output streams into the run's dataset.
  4. Export from Storage → Dataset as JSON, CSV, or Excel — or fetch via the API.

📥 Input

FieldTypeRequiredDefaultNotes
searchUrlsarrayyes—Direct immowelt.de/suche/(kaufen|mieten)/... search URLs copied from the site. A bare city name 410s. Up to 50.
maxResultsintegerno100Cap on rows this run, summed across all Search URLs.
proxyConfigurationobjectnoRESIDENTIAL groupThe 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.

FieldTypeNotes
listing_idstringThe expose/
urlstringCanonical https://www.immowelt.de/expose/
operationstring'sale' (kaufen) or 'rent' (mieten), as requested.
property_type['string', 'null']Raw German noun from the card, e.g. 'Wohnung', 'Haus', 'Penthouse'.
titlestringConstructed from property_type + district, e.g. 'Wohnung in Mitte'.
price['number', 'null']Asking price, parsed to a bare number.
currencystringAlways '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'.
citystringCity slug from the search URL, title-cased, e.g. 'Berlin'.
image_urlsarrayGallery photo URLs (empty OK).
scraped_atstringISO 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:

EventUSDWhat it is
actor-start$0.20One-off warm-up charge per run
result-row$0.0015Per 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.