Immowelt.de API scraper - German real estate data: apartments and houses for sale
Immowelt.de API scraper - German real estate data: apartments and houses for sale
/immowelt/v1/search1 creditSearch Immowelt.de property listings in any German city, district, postcode area or federal state - for sale, to rent or foreclosure auction - with structured filters: price (EUR), number of rooms, living space (m2), plot size (m2), property type and subtype (penthouse, loft, detached house, villa...), new-build only, and features such as garden, cellar or lift. Results are 30 per page and can be sorted by price, date or size. Each row carries the numeric price, rooms, living space, plot, address (city/district/postcode), energy class, publication date, photos and the listing agency. `location` takes plain German free text ('Berlin', 'Muenchen', 'Koeln') and is resolved to Immowelt's own geo-id, or you can pass a geo-id ('AD08DE8634') straight through.
| Parameter | Allowed / range | Description | |
|---|---|---|---|
| location | required | — | Where to search - a German city, town, district or federal state as plain text ('Berlin', 'Muenchen', 'Koeln', 'Frankfurt am Main', 'Hamburg'), or an Immowelt geo-id ('AD08DE8634') taken from a previous response's location.geo_id / results[].geo_ids. Free text is slugified and resolved against Immowelt's own place index; umlauts may be written either way (Muenchen or München). |
| contract = sale | optional | sale · rent · auction · buy_auction | Which market to search. Rent prices are monthly cold rent in EUR; sale prices are the asking price. |
| property_type = apartment | optional | apartment · house · land · any | Kind of property. |
| property_subtype | optional | — | Narrow to one or several comma-separated subtypes: penthouse, loft, maisonette, terrace_flat, ground_floor, attic, souterrain (flats); detached, semi_detached, terraced, villa, bungalow, farmhouse (houses). e.g. 'penthouse,loft'. |
| page = 1 | optional | 1– | Result page. 30 listings per page; paginate with page += 1 until page > max_pages. |
| sort = relevance | optional | relevance · newest · price_low · price_high · largest | Result ordering. |
| price_min | optional | 0– | Minimum price in EUR - asking price when contract=sale, monthly cold rent when contract=rent. |
| price_max | optional | 0– | Maximum price in EUR. |
| rooms_min | optional | 1–20 | Minimum number of rooms (Zimmer). |
| rooms_max | optional | 1–20 | Maximum number of rooms. |
| living_space_min | optional | 0– | Minimum living space in square metres (Wohnflaeche). |
| living_space_max | optional | 0– | Maximum living space in square metres. |
| plot_min | optional | 0– | Minimum plot size in square metres (Grundstuecksflaeche) - relevant for houses and land. |
| plot_max | optional | 0– | Maximum plot size in square metres. |
| features | optional | garden · cellar · lift | Only return listings that have these features. One or several comma-separated: garden, cellar, lift. e.g. 'garden,lift'. |
| new_build = false | optional | — | true = only new-build properties (Neubau). |
/immowelt/v1/detail1 creditFull record for one Immowelt listing, by its expose URL or its listing id. Returns the asking price or monthly rent with running costs and commission, rooms, living space, plot, year built, condition, heating and energy source, the complete feature and energy-certificate table, the full German description and neighbourhood text, every photo at full resolution, the market price-per-m2 comparison Immowelt itself publishes for the area, and the listing agency. Both Immowelt id spaces are accepted - the short online id from a search row ('256Q14GY2JL7') and the legacy UUID in an older expose link - and both are returned so a row can be joined either way.
| Parameter | Allowed / range | Description | |
|---|---|---|---|
| listing | required | — | An Immowelt expose URL (https://www.immowelt.de/expose/<id>) or just the id. Both the short online id ('256Q14GY2JL7', what a search row's `id` gives you) and the legacy UUID ('1215b46c-9e03-4081-bc72-67209544ff9f') work. |
/immowelt/v1/locationfreeResolve a free-text German place - city, town, district or federal state - to Immowelt's own geo-id and canonical search URL, and report how many listings are live there right now. Use it to power a search box, to confirm which area a search will actually cover, or to obtain a geo-id you can then reuse in `search` without paying for resolution again.
| Parameter | Allowed / range | Description | |
|---|---|---|---|
| query | required | — | Free-text German place to resolve: 'Berlin', 'Muenchen', 'Koeln', 'Frankfurt am Main', 'Nuernberg'. Umlauts may be written either way. |
| contract = sale | optional | sale · rent | Which market the reported total counts. |
| property_type = apartment | optional | apartment · house · land · any | Which property kind the reported total counts. |
curl -X POST https://api.reefapi.com/immowelt/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"location":"Berlin"}'{
"ok": true,
"data": { /* the result */ },
"meta": {
"latency_ms": 240,
"record_count": 12,
"completeness_pct": 100
},
"error": null
}Measured at 60 requests a second across the fleet, with no central bottleneck. Volume pricing is on request, and per-key limits are raised for high-volume accounts.
Tell us a site we do not cover yet and it becomes an engine. A customer asked for bestprice.gr on a Sunday and it was in the catalog the next day.
Median time from a question in the live chat to the first answer, measured across every answered conversation. Setup help included, no support tier to buy.
No per-site plans and no separate subscriptions. One key and one credit pool across the whole catalog, so adding a source costs nothing up front.
Planning something large? Tell us the volume and the sources and we will come back with what it costs and what we would have to build.