Immowelt Scraper
Pricing
from $0.72 / 1,000 item extracteds
Immowelt Scraper
Export German sale and rental listings with property details and displayed agent or agency metadata from Immowelt search URLs.
Pricing
from $0.72 / 1,000 item extracteds
Rating
0.0
(0)
Developer
Automation Lab
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
1
Monthly active users
18 days ago
Last modified
Categories
Share
Export current German sale and rental listings from Immowelt with normalized property details and the agent or agency metadata displayed in search results.
Use this Actor for recurring inventory research, price analysis, property sourcing, or public advertiser lead qualification. Supply real Immowelt search URLs, optionally narrow the returned records with keywords and numeric filters, and receive integration-ready JSON, CSV, Excel, XML, or RSS through the Apify dataset.
What does the Immowelt Scraper do?
The Actor reads the current server-rendered result page for each supplied immowelt.de/suche/ URL.
For every accepted listing it can return:
- stable Immowelt and legacy listing IDs;
- canonical listing URLs and publication timestamps;
- listing headline and search-result description;
- sale or rental intent and property type;
- price, price per square meter, rooms, floor area and displayed floor (including
EGground floor); - source-exact commission/media flags:
hasBrokerageFee,isNew,hasFloorPlan,hasVirtualTour,hasVideo; - public location fields and energy class;
- all image URLs exposed in the structured search data;
- displayed contact and agency names;
- advertiser type and private-owner flag;
- public agency profile, website, address, phone numbers, logo, and badge;
- source-search provenance and extraction timestamp.
Agent fields remain empty when Immowelt does not display them for a listing.
Who is this Immowelt data extractor for?
Real-estate analysts
Take repeatable snapshots of filtered German inventory and compare price, supply, location, or property attributes in your own warehouse.
Buyers and acquisition teams
Collect a focused set of properties for review without copying result cards manually.
Agencies and lead researchers
Identify the public advertiser context attached to relevant listings, then qualify agencies using your own compliant workflow.
Data and automation teams
Schedule searches, export records to a spreadsheet or database, and trigger downstream jobs through Apify integrations or webhooks.
Why use this Actor?
The extraction route consumes Immowelt's structured search payload rather than only scraping visible text fragments.
That provides richer, typed records including source IDs, timestamps, multiple images, and displayed provider metadata. The Actor also applies the same keyword, intent, property-type, price, room and living-area filters to every supplied URL. No extra source requests are made for these facts.
It is intentionally bounded and transparent:
- direct anonymous HTTP is the default;
- an Apify Proxy is optional, not an automatic paid fallback;
- duplicates are removed by source identity;
- malformed or unsupported URLs fail early;
- a challenged response is reported as an extraction failure;
- deep pagination and detail-page crawling are not claimed.
What Immowelt data can you extract?
| Group | Fields |
|---|---|
| Identity | listingId, legacyId, listingUrl, status |
| Property | title, description, intent, propertyType |
| Price | price, priceFormatted, pricePerSquareMeter, currency |
| Attributes | rooms, livingAreaSquareMeters, plotAreaSquareMeters, floor, energyClass |
| Location | country, city, district, postcode, street, addressPublished |
| Commission/media flags | hasBrokerageFee, isNew, hasFloorPlan, hasVirtualTour, hasVideo |
| Media | imageUrls |
| Dates | createdAt, updatedAt, scrapedAt |
| Agent | agentName, agencyName, advertiserType, isPrivateOwner |
| Agency | agencyProfileUrl, agencyWebsite, agencyAddress, agencyPhoneNumbers, agencyLogoUrl, agencyBadge |
| Provenance | sourceSearchUrl, sourceSearchLocation, sourceResultCount |
Fields are returned only when they are publicly exposed in the current search payload. Source flags preserve explicit false; absent or null tags mean unknown, not false. isNew is Immowelt's display flag, not cross-run monitoring. Media flags do not download media or verify availability.
How to scrape Immowelt property listings
- Open Immowelt and build a German sale or rental search with the filters you need.
- Copy the resulting URL under
https://www.immowelt.de/suche/. - Add it to Immowelt search URLs.
- Optionally add more URLs for other locations or property segments.
- Set
maxItemsand optional keyword, intent, property-type, price, room or living-area filters. - Run the Actor.
- Open the Results dataset and export or integrate the records.
Start with five to ten items. Increase the limit only after confirming the supplied searches produce the expected segment.
Input parameters
| Input | Type | Default | Description |
|---|---|---|---|
startUrls | array | required | One to ten current public Immowelt search URLs. |
keywords | string array | [] | Keep records containing every keyword in property, location, agent, or agency text. |
intent | string | any | Keep buy, rent, or both listing intents. |
propertyTypes | string array | all | Keep selected normalized property types. |
minPrice | integer | none | Minimum displayed price in euros. |
maxPrice | integer | none | Maximum displayed price in euros. |
minRooms, maxRooms | number | none | Inclusive room bounds, including fractional rooms. |
minLivingAreaSquareMeters, maxLivingAreaSquareMeters | number | none | Inclusive living-area bounds in m², including fractions. |
maxItems | integer | 30 | Global limit of 1–300 saved unique listings after filters/deduplication; budget can stop earlier. |
proxyConfiguration | object | direct | Optional Apify Proxy configuration for challenged traffic. |
All numeric bounds must be finite and nonnegative; each minimum must not exceed its paired maximum. Missing rooms/area are excluded only when their corresponding bound is enabled. Filters intersect across all URLs. Keywords use ALL case-insensitive substring matching over normalized returned text, not whole-word or whole-field matching. Repeated URLs share the same run-level deduplication set.
Example input — qualify Berlin sale inventory by rooms and living area:
{"startUrls": [{"url": "https://www.immowelt.de/suche/kaufen/wohnung/berlin/berlin-10115/ad08de8634"}],"intent": "buy","maxPrice": 500000,"minRooms": 2,"maxRooms": 3.5,"minLivingAreaSquareMeters": 45,"maxLivingAreaSquareMeters": 100,"maxItems": 10}
Output example
Each default-dataset item represents one unique property listing.
{"listingId": "25ABC12DEF34","legacyId": "12345678-abcd-4321-abcd-1234567890ab","listingUrl": "https://www.immowelt.de/expose/12345678-abcd-4321-abcd-1234567890ab","title": "Bright two-room apartment near the city center","intent": "buy","propertyType": "apartment","price": 320000,"priceFormatted": "320.000 €","pricePerSquareMeter": 5333.33,"currency": "EUR","rooms": 2,"livingAreaSquareMeters": 60,"city": "Berlin","district": "Mitte","postcode": "10115","imageUrls": ["https://mms.immowelt.de/a/b/c/d/example-image.jpg"],"agentName": "Example Contact","agencyName": "Example Property Agency","advertiserType": "AGENCY","agencyProfileUrl": "https://www.immowelt.de/profil/example-agency","agencyPhoneNumbers": ["030 1234567"],"sourceSearchLocation": "Berlin","sourceResultCount": 1200,"scrapedAt": "2025-02-01T10:00:00.000Z"}
How much does it cost to extract Immowelt property listings?
This Actor uses pay-per-event pricing:
- Run started: $0.005 once per run.
- Item extracted: a tiered property-listing price that starts at $0.00138 on the FREE tier and decreases on higher Apify tiers.
On the FREE tier, calculate the Actor charge as the $0.005 run-start event plus one $0.00138 item event for each saved listing. For example, a ten-listing run records one start event and ten item events; a 100-listing run records one start event and 100 item events. Higher Apify tiers use lower per-item prices.
Only unique records written to the dataset receive an item charge. Filtered, duplicate, empty, or failed records do not. Optional proxy transfer and platform compute are separate Apify usage costs and can vary by configuration.
Per-search completeness summary
The Search completeness output links to RUN-SUMMARY in the run's key-value store. It records attempted, failed, unvisited, validEmpty, filtered and saved, plus one entry per supplied URL:
sourceIdis a stable hash of the exact normalized URL;indexidentifies its input position. Only the public path is retained, never query strings.resultdistinguishesvalid,valid-empty,http-error,payload-error,transport-errorandunvisited; HTTP status is included when known.sourceCards,filtered,deduplicated,accepted,saved,invalidandunprocesseddistinguish current-page inventory from exported rows.acceptedcounts eligible write candidates, including one refused by budget; it is not a saved-row count.totalResultCountis the source's market total, not the number scraped.pageidentifies the supplied current page when provided. Coverage is alwayscurrent-page-only.reasonexplainsmaxItems,budgetor a fatal stop.completemeans all supplied current pages/cards were processed without failures or omissions; it never means complete-market coverage.
Valid empty and filter-empty pages succeed. Mixed-source failures retain useful rows but mark completeness false; all attempted sources unusable fails. Exhausted transport errors are isolated per source. Dataset/storage or charge errors remain fatal and are not blindly retried. The SDK writes rows then charges the item event; a depleted budget stops writes before an additional item charge. Apify storage and billing are not a cross-service transaction: an ambiguous platform write/charge failure may require checking the run's dataset and charge receipt.
Integrations and private diagnostics
Failed operations send sanitized diagnostic input, exceptions and Actor/build/run IDs to our private GlitchTip service for repair. Secret fields and URL queries are removed and reports are retained for 30 days. Raw provider payloads are not sent. Successful empty searches are not reported as errors.
No AI model processes inputs or listings. Extraction is ephemeral; the Actor keeps no cross-run cache. Listings, displayed advertiser contact data, input URLs and summaries are stored in your Apify run storage under its configured retention and access controls; delete run datasets/KVS when no longer needed. Only sanitized error diagnostics go to our private service. Optional proxy traffic is handled by Apify; no external paid supplier or off-platform fee is required.
Recurring monitoring workflows
A dataset is a snapshot from one run. To monitor changes:
- save the Actor as an Apify Task;
- schedule it daily, weekly, or at another suitable interval;
- keep stable source URLs and filters;
- compare
listingId,price,status,createdAt, andupdatedAtbetween runs; - notify your team or update your warehouse through a webhook.
The Actor does not maintain cross-run history or send alerts itself. Apify schedules, webhooks, and your downstream storage provide that workflow.
Export and integration patterns
From the dataset you can:
- download JSON, CSV, Excel, XML, or RSS;
- connect Google Sheets through an Apify integration;
- send completed-run webhooks to Make, Zapier, or your application;
- pull records into a BI tool or data warehouse;
- trigger another Actor for compliant enrichment or analysis;
- preserve repeated snapshots for inventory and price-change reporting.
Use listingId or legacyId as the primary deduplication key in downstream systems.
Run through the Apify API with cURL
Replace APIFY_TOKEN with a token stored in your environment.
curl -X POST \"https://api.apify.com/v2/acts/automation-lab~immowelt-property-listings-agents-scraper/runs?token=$APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"startUrls": [{"url": "https://www.immowelt.de/suche/mieten/wohnung/berlin/berlin-10115/ad08de8634"}],"intent": "rent","maxItems": 10}'
Use the returned run ID to inspect status and retrieve the default dataset.
Run with JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('automation-lab/immowelt-property-listings-agents-scraper').call({startUrls: [{url: 'https://www.immowelt.de/suche/kaufen/wohnung/berlin/berlin-10115/ad08de8634',}],intent: 'buy',maxItems: 10,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Install the client with npm install apify-client.
Run with Python
import osfrom apify_client import ApifyClientclient = ApifyClient(os.environ['APIFY_TOKEN'])run = client.actor('automation-lab/immowelt-property-listings-agents-scraper').call(run_input={'startUrls': [{'url': 'https://www.immowelt.de/suche/kaufen/haus/berlin/berlin-10115/ad08de8634'}],'intent': 'buy','maxItems': 10,})items = client.dataset(run['defaultDatasetId']).list_items().itemsprint(items)
Install the client with pip install apify-client.
Use the Actor through MCP
Add the Apify MCP server to Claude Code:
claude mcp add --transport http apify \"https://mcp.apify.com?tools=automation-lab/immowelt-property-listings-agents-scraper"
Claude Desktop setup
Add this JSON to the Claude Desktop MCP configuration:
{"mcpServers": {"apify": {"url": "https://mcp.apify.com?tools=automation-lab/immowelt-property-listings-agents-scraper"}}}
Cursor setup
Open Cursor Settings → MCP, add a server named apify, and use the same Actor-specific URL shown above.
VS Code setup
Open the MCP server configuration in VS Code, add an HTTP server named apify, and use the same Actor-specific URL shown above.
Example prompts:
- “Run the Immowelt scraper for this Berlin rental search and return five listings.”
- “Extract sale listings below €500,000 and summarize price per square meter.”
- “Collect displayed agencies from these Immowelt search URLs and group listings by agency.”
Limits and troubleshooting
Current-page coverage
Each supplied search URL contributes the current server-rendered result page, normally up to 30 source cards. The Actor does not claim deep pagination. For broader coverage, create multiple narrower Immowelt searches by location, intent, price, or property type.
Germany-only search URLs
The supported source is immowelt.de. Immowelt Austria, immowelt.at, and unrelated domains are not accepted.
No detail-page enrichment
Direct expose/detail pages are not fetched. Output is limited to data displayed in Immowelt's structured search response, which already includes many property and provider fields.
Challenged traffic
If all supplied URLs fail with a structured-payload error, verify that the URLs still open as public searches. You can then configure an Apify Proxy, preferably with German geography. The Actor does not silently activate residential traffic.
Empty output
A successful run with zero rows means the search page loaded but no current card matched every optional filter. Inspect RUN-SUMMARY, then remove or relax keywords, price, room or living-area bounds, intent, or property-type filters. A valid source can also contain zero current results.
Responsible use and legality
This Actor extracts information publicly displayed by Immowelt. You are responsible for your use of the data and for complying with applicable laws, Immowelt terms, database rights, privacy rules, and marketing regulations.
Do not use public contact metadata for spam, harassment, discrimination, or unlawful profiling. Collect only what you need, protect exported data, respect deletion requests, and apply an appropriate retention policy. Public display does not remove every legal obligation.
This documentation is not legal advice.
Frequently asked questions
Does this provide an unofficial Immowelt API?
It provides structured Actor input and dataset output suitable for API automation. It is not affiliated with Immowelt and does not expose a private or official Immowelt API.
Can it scrape both properties for sale and rent?
Yes. Supply current sale and rental search URLs. Use intent to enforce the same scope across every URL.
Does it return agent phone numbers?
It returns phone numbers only when they are present in the public provider metadata attached to the current search result. Some listings expose no phone number or agency.
Can it scrape every result in a large city?
Not from one URL. The bounded route reads the current server-rendered page. Split a large market into narrower searches when you need broader inventory coverage.
Why did my URL fail validation?
Only HTTPS Immowelt search URLs under /suche/ are accepted. Listing detail URLs, profile URLs, non-Immowelt domains, and other paths fail closed.
Why are some fields missing?
Immowelt controls which fields are displayed per listing. Private or undisclosed addresses, agents, phones, badges, websites, plot areas, and energy classes remain absent rather than being guessed.
Related automation-lab Actors
- Immowelt Search Results Scraper — a lighter listing-card extractor when you do not need the richer structured provider output.
- ImmoScout24 Property Listings Scraper — collect comparable German sale and rental inventory from another public property portal.
- Immoweb Belgium Property Listings Scraper — export Belgian property listing records for cross-market workflows.
Support
If a current public search stops producing records, include the Actor run URL, a sanitized input, the expected search segment, and the observed behavior in your report. Do not paste Apify tokens or other credentials.