Immowelt APIimmowelt.de ↗
Access German property listings from Immowelt.de. Search rentals and sales by location, price, rooms, and area. Retrieve full details, features, and images via 3 endpoints.
What is the Immowelt API?
The Immowelt.de API provides access to German real estate listings across 3 endpoints, covering both rental and purchase markets. The search_listings endpoint returns paginated listing cards with price, rooms, area, and address, while get_listing_details exposes full property data including description, features, key facts, and image URLs — all keyed by the listing UUID returned from search.
curl -X GET 'https://api.parse.bot/scraper/e8fdb8a3-31d8-4834-a13d-ac909ddc6d4d/search_listings?page=1&order=Default&location=berlin%2Fberlin-10115%2Fad08de8634&price_max=2000&price_min=500&rooms_min=2&space_min=50&transaction=mieten&property_type=wohnung' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace immowelt-de-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
from parse_apis.immowelt_de_real_estate_api import Immowelt, Transaction, PropertyType, Sort, ListingNotFound
client = Immowelt()
# Search for apartments for rent in Berlin, sorted by price
for listing in client.listingsummaries.search(
location="berlin/berlin-10115/ad08de8634",
transaction=Transaction.MIETEN,
property_type=PropertyType.WOHNUNG,
order=Sort.PRICE_ASC,
rooms_min=2,
limit=5,
):
print(listing.uuid, listing.price_raw, listing.rooms, listing.address)
# Navigate from summary to full detail
detail = listing.details()
print(detail.title, detail.price, detail.key_facts)
# Access images sub-resource on the detail
for img in detail.images.list():
print(img.url)
Search for real estate listings (rent or buy) with optional filters. Returns paginated listing cards with basic info including price, rooms, area, and address. The location parameter must be a full path as used in Immowelt URLs, including city name, district/ZIP, and geoid. Each page returns up to ~20 listings.
| Param | Type | Description |
|---|---|---|
| page | integer | Page number for pagination. |
| order | string | Sort order for results. |
| locationrequired | string | Location path including city, district/ZIP, and geoid (e.g. 'berlin/berlin-10115/ad08de8634'). Forms part of the URL path and must match Immowelt's internal location format. |
| price_max | integer | Maximum price filter. |
| price_min | integer | Minimum price filter. |
| rooms_min | integer | Minimum number of rooms. |
| space_min | integer | Minimum living area in square meters. |
| transaction | string | Transaction type. |
| property_type | string | Property type to search for. |
{
"type": "object",
"fields": {
"url": "string the constructed search URL",
"page": "integer current page number",
"listings": "array of listing summary objects with id, url, uuid, price_raw, rooms, area, address, agency, main_image",
"total_count_text": "string showing total number of results (e.g. '4.366 Wohnungen mieten in Berlin')"
},
"sample": {
"data": {
"url": "https://www.immowelt.de/suche/mieten/wohnung/berlin/berlin-10115/ad08de8634",
"page": 1,
"listings": [
{
"id": "26UBAUCV6EY5",
"url": "https://www.immowelt.de/expose/7847437c-82b4-4347-a6b6-452ecc09f62d",
"area": "29,5 m²",
"uuid": "7847437c-82b4-4347-a6b6-452ecc09f62d",
"rooms": "1 Zimmer",
"address": "Friedenauer Höhe 6, Friedenau, Berlin (12159)",
"price_raw": "929 €Kaltmiete",
"main_image": "https://mms.immowelt.de/b/f/2/1/bf213538-3e94-4549-9aef-a9063d983f6f.jpg?ci_seal=3b1d4022350df6c3ca4b9f8fb7eec7acb30acdfe&h=50",
"keyfacts_raw": "1 Zimmer|·|29,5 m²|·|5. Geschoss"
}
],
"total_count_text": "4.366 Wohnungen mieten in Berlin"
},
"status": "success"
}
}About the Immowelt API
Search and Filter Listings
The search_listings endpoint accepts a required location parameter formatted as a URL path including city, district or ZIP, and a geoid (e.g. berlin/berlin-10115/ad08de8634). Optional filters include price_min, price_max, rooms_min, space_min, and transaction type. Results are paginated via the page parameter and sortable via order. Each result in the listings array carries an id, uuid, url, price_raw, rooms, area, address, agency, and main_image. The total_count_text field shows the raw count string from the site (e.g. 4.366 Wohnungen mieten in Berlin).
Property Details and Images
Passing a listing UUID to get_listing_details returns the full expose: title, address, price, key_facts (rooms, area, floor), a description text block, a features array, and an images array of full-resolution URLs. The get_listing_images endpoint is a focused alternative that returns only the UUID and its associated image URLs from the mms.immowelt.de CDN — useful when you only need to display or store photos without fetching the entire listing payload.
Coverage and Scope
All three endpoints cover listings across Germany. The transaction parameter on search_listings determines whether results are rentals or sales. Location paths follow Immowelt's URL structure, so you can derive the correct location value directly from any Immowelt search URL. UUIDs from search_listings are stable identifiers that feed directly into get_listing_details and get_listing_images.
The Immowelt API is a managed, monitored endpoint for immowelt.de — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when immowelt.de changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official immowelt.de API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Aggregate rental listings across multiple German cities using
search_listingswith differentlocationpaths - Monitor asking prices over time by storing
price_rawandaddressfrom paginated search results - Build a property comparison tool using
key_facts,features, anddescriptionfromget_listing_details - Populate a real estate portfolio site with listing photos by calling
get_listing_imagesfor each UUID - Filter listings by minimum rooms and area using
rooms_minandspace_minto qualify leads for relocation services - Extract agency names from
search_listingsresults to identify the most active brokers in a given district - Feed property data into a GIS tool by pairing
addressfields with a geocoding service
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does Immowelt have an official developer API?+
What format does the `location` parameter require for `search_listings`?+
location value must be a full path matching Immowelt's URL structure, combining a city slug, a district or ZIP segment, and a geoid — for example, berlin/berlin-10115/ad08de8634. You can derive the correct path from any Immowelt search result URL for the area you want to query.Does `search_listings` return contact details for the listing agent or landlord?+
agency field with the listing agency name, but individual agent contact details such as phone numbers or email addresses are not returned. The get_listing_details endpoint also does not expose contact information. You can fork this API on Parse and revise it to add a contact-details endpoint if that data is accessible on the listing page.Can I retrieve sold or expired listings through the API?+
How does pagination work for `search_listings`?+
page integer parameter. The response includes a total_count_text string (e.g. 4.366 Wohnungen mieten in Berlin) that indicates the total result count, which you can use to calculate how many pages are available. There is no explicit total_pages field returned — you need to derive page count from the total count text.