Immowelt Search Results Scraper
Pricing
Pay per event
Immowelt Search Results Scraper
🏠 Extract normalized German sale and rental listing cards from public Immowelt search URLs for property monitoring, market research, price analysis, and lead workflows.
Pricing
Pay per event
Rating
0.0
(0)
Developer
Stas Persiianenko
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
Collect clean German property inventory from public Immowelt search URLs—without opening protected detail pages or maintaining your own scraper.
Paste a sale or rental search URL and get normalized listing cards with prices, rooms, floor area, addresses, contacts, image counts, badges, energy classes, and source metadata. Export the results as JSON, CSV, Excel, XML, RSS, or through the Apify API.
- 🏠 Search URL in, structured listings out
- 🇩🇪 German prices and decimal commas normalized
- 🔁 Duplicate listing IDs removed across searches
- 📊 Ready for property monitoring and market analysis
- 🔌 Works with schedules, webhooks, API clients, and MCP
This version is deliberately search-results-only. It reads public listing cards and does not request Immowelt detail pages.
What does Immowelt Search Results Scraper do?
The Actor downloads the server-rendered results behind public immowelt.de/suche/ URLs and converts each property card into one flat dataset row.
It can extract:
- listing UUID or project ID and canonical listing URL;
- asking price, EUR currency, and visible price per square metre;
- property type and sale, rental, or auction intent;
- room count, floor area, floor, and visible availability;
- address, street, locality, and German postcode;
- contact and agency names shown on the card;
- preview image URL, image count, badges, and energy class;
- summary, original search URL, result position, and scrape timestamp.
The Actor deduplicates listings by ID when the same property appears in more than one supplied search.
Who is it for?
Property investors
Track asking prices, price per m², room counts, and inventory for focused acquisition areas.
Brokers and agencies
Build repeatable market-coverage exports, identify visible contacts, and compare active stock across filtered searches.
Real-estate analysts
Create timestamped snapshots for neighborhood coverage, pricing distributions, and listing-change research.
Proptech teams
Feed normalized German listing cards into internal databases, dashboards, alerts, and enrichment pipelines.
Researchers and journalists
Collect reproducible public search-result evidence without manually copying cards from the website.
Why use this Immowelt scraper?
Building and maintaining a property scraper means handling URL validation, German number formats, selector changes, duplicate records, retries, datasets, and API deployment.
This Actor provides those operational pieces in one run:
- ✅ strict validation for public Immowelt search URLs;
- ✅ HTTP-first extraction with low compute requirements;
- ✅ fail-closed behavior when no listing cards can be extracted;
- ✅ optional Apify Proxy support for challenged traffic;
- ✅ typed, flat fields that work well in CSV and spreadsheets;
- ✅ predictable pay-per-result billing;
- ✅ Apify scheduling, API, webhook, and storage integrations.
What Immowelt data can I extract?
| Field | Description | Example |
|---|---|---|
listingId | Listing UUID or project ID | 1215b46c-9e03-4081-bc72-67209544ff9f |
listingUrl | Canonical public listing URL | https://www.immowelt.de/expose/... |
price | Normalized numeric asking price | 170000 |
priceCurrency | Currency shown on the card | EUR |
pricePerSquareMeter | Visible numeric €/m² | 3778 |
propertyType | Apartment, studio, house, or another visible type | Wohnung |
intent | buy, rent, auction, or unknown | buy |
rooms | Normalized room count | 2 |
floorAreaSquareMeters | Normalized area | 45 |
floor | Visible floor text | EG |
availability | Visible availability text, when present | frei ab sofort |
address | Complete card address | Köpenick, Berlin (12557) |
streetAddress | Street portion, when displayed | Stargarder Straße 74 |
locality | Locality/city portion | Prenzlauer Berg, Berlin |
postcode | German postcode | 10437 |
contactName | Visible contact name | Herr Andreas Kiener |
agencyName | Visible agency name | Immobilien Konzept |
imageCount | Images advertised by the gallery | 14 |
imageUrl | First search-card image | https://mms.immowelt.de/...jpg |
badges | Visible card tags | ["NEU"] |
energyClass | Visible energy class | D |
summary | Search-card description excerpt | Diese charmante ... |
sourceSearchUrl | Search that produced the row | https://www.immowelt.de/suche/... |
position | One-based position on that result page | 1 |
scrapedAt | UTC extraction timestamp | 2026-07-20T03:00:00.000Z |
Optional fields are omitted when Immowelt does not show them on a card.
How much does it cost to scrape Immowelt listings?
The Actor uses pay per event:
- a small $0.005 start fee per run;
- a tiered fee per saved listing, anchored at $0.000077577 per result on BRONZE.
At the BRONZE rate:
- 10 listings cost about $0.00578 including the start fee;
- 100 listings cost about $0.01276 including the start fee;
- 1,000 listings cost about $0.08258 including the start fee.
Apify plan tiers may receive lower result prices. Open the Actor pricing tab for the authoritative live amount. Compute and proxy usage are covered by pay-per-event billing where the platform pricing specifies it.
How to scrape Immowelt search results
- Open Immowelt and configure a public property search.
- Copy the resulting URL under
https://www.immowelt.de/suche/. - Open this Actor and paste the URL into Immowelt search URLs.
- Choose a small Maximum listings value for the first run.
- Click Start.
- Review the dataset table.
- Export JSON, CSV, Excel, XML, or connect the run to your workflow.
For wider coverage, provide several narrower search URLs—for example separate property types, districts, price bands, or sale/rental searches.
Input parameters
startUrls
Required array of one to ten public Immowelt search-result URLs. The Actor accepts only HTTPS URLs on immowelt.de whose path starts with /suche/.
Detail URLs under /expose/, home pages, and third-party URLs are rejected.
maxItems
Maximum unique records saved across all searches. Range: 1–300. Default: 20. The prefilled example uses 10 to keep a first run fast and inexpensive.
proxyConfiguration
Optional Apify Proxy configuration. Leave it empty while anonymous direct access works. If your run is challenged, try a German datacenter or residential proxy according to your Apify plan and compliance needs.
debugMode
When enabled, successful response HTML is saved to the run key-value store. Use it only for troubleshooting because raw HTML consumes storage and can change frequently.
Example input
{"startUrls": [{"url": "https://www.immowelt.de/suche/kaufen/wohnung/berlin/berlin-10115/ad08de8634"}],"maxItems": 10,"debugMode": false}
A multi-market monitoring run can use several URLs:
{"startUrls": [{ "url": "https://www.immowelt.de/suche/kaufen/wohnung/berlin/berlin-10115/ad08de8634" },{ "url": "https://www.immowelt.de/suche/mieten/wohnung/hamburg/hamburg-20095/ad08de1031" }],"maxItems": 50}
Always copy current URLs from Immowelt; locations and path identifiers may change.
Example output
{"listingId": "1215b46c-9e03-4081-bc72-67209544ff9f","listingUrl": "https://www.immowelt.de/expose/1215b46c-9e03-4081-bc72-67209544ff9f","contactName": "Herr Andreas Kiener","agencyName": "Immobilien Konzept","imageCount": 14,"price": 170000,"priceCurrency": "EUR","pricePerSquareMeter": 3778,"propertyType": "Wohnung","intent": "buy","rooms": 2,"floorAreaSquareMeters": 45,"address": "Köpenick, Berlin (12557)","locality": "Köpenick, Berlin","postcode": "12557","badges": [],"energyClass": "D","sourceSearchUrl": "https://www.immowelt.de/suche/kaufen/wohnung/berlin/berlin-10115/ad08de8634","position": 1,"scrapedAt": "2026-07-20T03:00:00.000Z"}
The live values change with Immowelt inventory. The example illustrates types and field names, not a guaranteed active listing.
Data quality and normalization
German values such as 316.000 €, 5.576 €/m², and 56,7 m² become JSON numbers 316000, 5576, and 56.7.
The Actor:
- trims non-breaking spaces and repeated whitespace;
- derives IDs from canonical listing URLs;
- converts relative and protocol-relative links to absolute HTTPS URLs;
- splits visible postcodes and locality components conservatively;
- omits missing optional values instead of inventing data;
- deduplicates by listing ID across all supplied searches;
- records source URL and page position for traceability.
Coverage and pagination
Immowelt currently server-renders the first result page, normally up to 30 cards, for each supplied search URL. This version extracts that public page.
Automated deep pagination is not advertised because the browser pagination backend can challenge automated requests. To collect broader, controlled coverage, supply multiple narrower filtered URLs. Examples include:
- separate Berlin districts;
- separate apartment and house searches;
- separate sale and rental searches;
- non-overlapping price bands;
- separate room-count ranges.
This approach is transparent and avoids silently returning repeated page-one data.
Tips for reliable Immowelt monitoring
- 🎯 Use narrow, stable search URLs rather than one country-wide search.
- 🧪 Start with 5–10 listings before increasing a scheduled workflow.
- 🔑 Use
listingIdas your database primary key. - 🕐 Compare
scrapedAtsnapshots to detect new or removed inventory. - 📍 Group by
postcodeorlocalityfor local market analysis. - 💶 Calculate your own price statistics from numeric
priceandfloorAreaSquareMeters. - 🧹 Expect optional fields: private listings and agencies show different card content.
- 🔄 Schedule at a responsible cadence; avoid unnecessary repeated runs.
Scheduling and change monitoring
Create an Apify schedule to run the same input daily or hourly. Send the completed dataset to a webhook, Make, Zapier, Google Sheets, or your database.
A common monitoring design is:
- run the Actor on a fixed set of search URLs;
- store rows keyed by
listingId; - compare current and previous IDs;
- alert on new IDs, missing IDs, or changed prices;
- retain
sourceSearchUrlandscrapedAtas evidence.
The Actor outputs snapshots; your downstream system decides what counts as a change.
Integrations
Google Sheets market watch
Export CSV or use Make to append listing ID, postcode, rooms, area, and price to a sheet. Add formulas for €/m² or price-band summaries.
Database inventory pipeline
Use a webhook after each run. Upsert records by listingId, retain the latest scrapedAt, and store historical price observations in a separate table.
Slack or email alerts
Filter results downstream for new listings below a target price per m², then send the listing URL and normalized facts to a channel.
BI dashboards
Load the dataset into BigQuery, Snowflake, PostgreSQL, or a data warehouse. Build charts by postcode, property type, intent, and scrape date.
AI research workflows
Use MCP to ask an assistant to run a focused search export, summarize visible inventory, or identify records matching numeric constraints.
API usage with JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('automation-lab/immowelt-search-results-scraper').call({startUrls: [{url: 'https://www.immowelt.de/suche/kaufen/wohnung/berlin/berlin-10115/ad08de8634'}],maxItems: 10});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
API usage with Python
import osfrom apify_client import ApifyClientclient = ApifyClient(os.environ['APIFY_TOKEN'])run = client.actor('automation-lab/immowelt-search-results-scraper').call(run_input={'startUrls': [{'url': 'https://www.immowelt.de/suche/kaufen/wohnung/berlin/berlin-10115/ad08de8634'}],'maxItems': 10,})items = client.dataset(run['defaultDatasetId']).list_items().itemsprint(items)
API usage with cURL
curl -X POST \"https://api.apify.com/v2/acts/automation-lab~immowelt-search-results-scraper/runs?token=$APIFY_TOKEN" \-H 'Content-Type: application/json' \-d '{"startUrls": [{"url": "https://www.immowelt.de/suche/kaufen/wohnung/berlin/berlin-10115/ad08de8634"}],"maxItems": 10}'
Poll the returned run ID or use the synchronous Apify endpoint when your client can wait for completion.
Use Immowelt Search Results Scraper with MCP
Add the Actor to Claude Code:
$claude mcp add --transport http apify "https://mcp.apify.com?tools=automation-lab/immowelt-search-results-scraper"
For Claude Desktop, Cursor, or VS Code, use an HTTP MCP configuration:
{"mcpServers": {"apify": {"url": "https://mcp.apify.com?tools=automation-lab/immowelt-search-results-scraper"}}}
Example prompts:
- “Run the Immowelt scraper for this Berlin sale search and return 10 listings.”
- “Collect these three Immowelt district searches and rank listings by price per m².”
- “Export current rental cards for my supplied Hamburg search URL and summarize room counts.”
- “Compare listing IDs in today’s dataset with the previous snapshot.”
MCP runs the Actor with the same validated input contract as the Console and API.
Legality and responsible use
Immowelt search cards are publicly visible, but public availability does not remove your responsibilities.
You should:
- review Immowelt’s current terms and robots guidance;
- collect only data needed for a legitimate purpose;
- use responsible limits and scheduling frequency;
- avoid republishing personal contact data without a lawful basis;
- follow GDPR and other privacy requirements applicable to your location and use case;
- secure exports and delete records when they are no longer needed;
- respect intellectual-property and database rights.
This tool does not provide legal advice. You are responsible for deciding whether your specific collection and use are lawful.
Limitations
- V1 extracts public search-result cards only.
- It does not request
/expose/detail pages. - Each URL contributes the first server-rendered page, normally up to 30 cards.
- Immowelt can change selectors, card fields, access controls, and URLs.
- Some cards omit streets, contacts, agencies, images, price per m², energy class, floor, or availability.
- Sponsored, project, or suggestion cards may differ from ordinary listings.
- The Actor does not infer hidden fields, coordinates, phone numbers, amenities, deposits, or full image galleries.
- An empty search or challenged response fails closed rather than producing a successful empty dataset.
Troubleshooting
Why did the run reject my URL?
Use the URL shown after configuring a public Immowelt search. It must use HTTPS, the immowelt.de host, and a path beginning with /suche/. Listing detail URLs are intentionally unsupported.
Why did the run say no listing cards were found?
First open the same URL anonymously and confirm it still shows results. If it does, retry with an appropriate German Apify Proxy configuration. If it does not, create a fresh search URL.
Why did I get fewer records than maxItems?
maxItems is a ceiling, not a promise. A single server-rendered result page normally contains up to 30 cards, and duplicates across supplied URLs are saved only once.
Why is a field missing?
Immowelt cards vary. The Actor omits optional fields that are not visible instead of guessing. Use search-card fields only; detail-only values are outside v1.
FAQ
Can it scrape both sale and rental listings?
Yes. Supply the public Immowelt URL for the sale or rental search. The intent field is normalized from visible card text.
Can it scrape houses, apartments, land, and commercial properties?
It processes listing cards returned by valid public search URLs. Field availability depends on the selected property type and card layout.
Does it require an Immowelt account?
No. The product uses anonymous public search-result HTML.
Does it scrape contact phone numbers or full descriptions?
No. It emits only contact names and summary text visible on search cards. It does not open protected detail pages.
How are duplicates handled?
Rows are deduplicated by the UUID or project identifier in the listing URL across the complete run.
Can I schedule the Actor?
Yes. Use Apify schedules and webhooks with a fixed set of current search URLs.
Can I export to Excel?
Yes. Apify datasets support Excel, CSV, JSON, XML, RSS, and API access.
Is it an official Immowelt API?
No. It is an independent scraper for publicly visible search-result cards and is not affiliated with Immowelt.
Related real-estate scrapers
Need another property market? Explore these automation-lab Actors:
- Zillow Scraper for US property listings.
- Realtor.com Scraper for US real-estate search data.
- Rightmove Scraper for UK property listings.
- Redfin Scraper for US housing search workflows.
- PropertyFinder Scraper for Property Finder markets.
- RE/MAX Portugal Scraper for Portuguese property listings.
Choose the Actor for the actual source domain you need; schemas and source coverage differ.
Support
If a valid public Immowelt search URL stops producing cards, include:
- the search URL;
- the Apify run ID;
- whether a proxy was configured;
- the approximate time of the run;
- a short description of the expected visible listings.
Do not post private credentials or unnecessary personal data. The run log and optional debug HTML help diagnose selector or access changes.