Use Immowelt Germany Rent & Buy Listings Scraper with Python
Scrape Immowelt.de - one of Germany's largest real-estate portals. Search rental and for-sale apartments and houses by city, price, rooms, living space, and amenities, or scrape a specific Immowelt search-results URL.
1. Choose the data you need
Review the published README for supported collection modes, examples, and limits. The recipe below uses the current published input definition.
2. Prepare a source-based input
This JSON contains published prefills and required-field defaults. Review every value for your task before running it; it is not a promise of successful collection.
{
"buildState": [],
"city": "Berlin",
"distributionType": "mieten",
"energyClass": [],
"estateSubType": "",
"estateType": "wohnung",
"excludeGroundFloor": false,
"excludeKeywords": [],
"features": [],
"floorLocation": [],
"includeDetails": false,
"includeKeywords": [],
"maxDetails": 0,
"maxItems": 5,
"mode": "search",
"projectTypes": [],
"propertyIds": [],
"sellerType": "any",
"sortBy": "",
"wbsRequired": false
}
Download input.example.json and save your reviewed copy as input.json.
| Field | Type | Required | Description |
|---|---|---|---|
mode | string | required | How to find listings: by German city and filters, by a pasted Immowelt search URL, or by listing IDs / expose URLs. |
city | string | optional | German city or town, for example Berlin, Muenchen, Hamburg, Koeln or Frankfurt am Main. Any place Immowelt indexes can be used. |
distributionType | string | optional | Choose rentals, for-sale listings, or compulsory auctions. |
estateType | string | optional | Broad property category. Temporary living is rent-only and is automatically switched to rentals. All 14 Immowelt categories are supported. |
estateSubType | string | optional | Optional narrower sub-type. Use a value that belongs to the chosen property type; leave empty for any sub-type. |
minPrice | integer | optional | Minimum monthly cold rent or purchase price in EUR. |
maxPrice | integer | optional | Maximum monthly cold rent or purchase price in EUR. |
minRooms | number | optional | Smallest number of rooms to include. |
maxRooms | number | optional | Largest number of rooms to include. |
minArea | integer | optional | Minimum living space in square metres. |
maxArea | integer | optional | Maximum living space in square metres. |
minPlotArea | integer | optional | Minimum plot or land size in square metres. |
maxPlotArea | integer | optional | Maximum plot or land size in square metres. |
minYearBuilt | integer | optional | Earliest year the building was constructed. |
maxYearBuilt | integer | optional | Latest year the building was constructed. |
minBedrooms | integer | optional | Smallest number of bedrooms to include. |
maxBedrooms | integer | optional | Largest number of bedrooms to include. |
features | array | optional | Only include listings that have all selected features. Leave empty for no feature filter. |
energyClass | array | optional | Only include listings with one of the selected German energy certificate classes (A+ is the most efficient). |
buildState | array | optional | Only include listings in one of the selected building conditions. |
projectTypes | array | optional | Only include listings with one of the selected project or tenure types, such as new build, resale, investment or apartment swap. |
sellerType | string | optional | Filter by private owners, professional agents, or any seller. |
wbsRequired | boolean | optional | Only include listings that require a certificate of eligibility (Wohnberechtigungsschein). |
floorLocation | array | optional | Only include listings on one of the selected floor locations. |
excludeGroundFloor | boolean | optional | Skip ground-floor listings. |
includeKeywords | array | optional | Keep only listings whose title or description contains every listed keyword (case-insensitive). |
excludeKeywords | array | optional | Drop listings whose title or description contains any listed keyword (case-insensitive). |
sortBy | string | optional | Order applied by Immowelt across the whole result set, not just one page. |
maxItems | integer | optional | Hard cap on emitted listings. Full result sets are paginated, so values up to 10,000 are supported. |
searchUrl | string | optional | A full Immowelt search-results URL, either a modern /classified-search URL or a /suche/... page. Any filters in the URL are respected. |
propertyIds | array | optional | Immowelt classified IDs or full /expose/... URLs. Both forms can be mixed. |
includeDetails | boolean | optional | Fetch each listing's exposé page to add construction year, heating, energy consumption, coordinates, amenities, price breakdown, documents and the full description. Adds one request per listing. |
maxDetails | integer | optional | How many emitted listings get exposé enrichment. 0 means all emitted listings. |
3. Start an Actor run
Set APIFY_TOKEN in your environment. Python 3.10 or newer is sufficient; this recipe uses no third-party packages.
Execution may incur charges. Review current pricing on Apify. The request asks for a 120-second timeout and a charge limit; these settings are subject to Apify’s pricing and do not guarantee an all-inclusive spending cap.
import json
import os
import urllib.request
# Save the schema-derived example as input.json; review and edit it first.
with open("input.json", encoding="utf-8") as stream:
actor_input = json.load(stream)
token = os.environ["APIFY_TOKEN"]
request = urllib.request.Request(
"https://api.apify.com/v2/acts/CYHgaHuFfQWHxpnpj/runs?timeout=120&maxTotalChargeUsd=0.50",
data=json.dumps(actor_input).encode("utf-8"),
headers={"Authorization": "Bearer " + token, "Content-Type": "application/json"},
method="POST",
)
# This starts a potentially billable run. Do not automatically retry this POST.
with urllib.request.urlopen(request, timeout=40) as response:
run = json.load(response)["data"]
print("Run ID:", run["id"])
print("Status:", run["status"])
# Inspect and download results in Apify Console once the run succeeds.
4. Inspect the actual results
Open the run in Apify Console and wait for a successful completion. Use the published output schema to locate results and the dataset schema to understand declared views. Missing or optional record fields must not be treated as guaranteed values.
German real-estate listings from Immowelt.de with price, rooms, living space, address, images, provider, energy and optional expose detail fields such as coordinates, amenities, documents and the full description.
Questions before you run
Which inputs are required?
The published required fields are mode
What does this guide verify?
The fields, prefills, and schema links are rendered from the published build. This is a usage recipe, not a paid live extraction test. Source availability and collection results can vary.
What if the run request times out?
Check Apify Console before retrying. The first request may already have created a run. Do not automatically repeat a run-creation POST.
Generated from source build 7uMuGZ3LeiapvgTvJ and its README and schemas. Source changes regenerate this guide; no third-party editorial claims are inferred.