# Immolibero > Immolibero ist ein deutschlandweites Immobilienportal für Miet-, Pacht- und > Kaufobjekte (Wohnungen, Häuser, Grundstücke, Garagen, Carports und Stellplätze, > Gewerbe). Jedes Inserat enthält Ort (Stadt/Stadtteil), Preis bzw. Miete und je > nach Objektart Zimmer, Wohn-, Grundstücks- oder Gewerbefläche sowie Ausstattung > (Balkon/Terrasse, Garten, Keller, Aufzug, Einbauküche, Badewanne, Stellplatz u. a.). Alle öffentlichen Seiten werden serverseitig als HTML ausgeliefert. Inserat-Detailseiten (Exposés) sind mit schema.org `RealEstateListing`-JSON-LD ausgezeichnet (inkl. Titelbild, Zimmer, Wohnfläche, Ausstattung, Haustier-Regelung, Preis und bei freigegebener Adresse Geo-Koordinaten). Für strukturierte Abfragen steht eine öffentliche REST-API bereit; für KI-Assistenten gibt es davon eine schlanke Fassung und einen MCP-Server. Die JSON-Adressen unter „API" und der MCP-Server teilen sich eine Abrufgrenze von 120 Anfragen je Minute und Absender-Adresse; wird sie überschritten, nennt die Kopfzeile `Retry-After` die Wartezeit in Sekunden. Ihre Nutzung in diesem Rahmen und zur Beantwortung konkreter Anfragen ist nach Ziffer 16 unserer [AGB](https://www.immolibero.com/agb) ausdrücklich erlaubt; vollständige oder systematische Abzüge des Bestands sind es nicht. Für die HTML-Seiten und die Sitemap gilt stattdessen die robots.txt. ## Suche & Navigation - [Suche](https://www.immolibero.com/suche?via=llms): Einstieg in die Immobiliensuche. - Suchergebnisse: `/inserate?q={ort}&category={kategorie}&via=llms` mit den Filtern, die beide Oberflächen teilen; `per_page` und die Filter nach Vermarktungsart, Objektart, Möblierung, Wohngemeinschaft, Baujahr, Energieeffizienzklasse und Heizungsart gibt es nur in der API. Ohne `category` zeigt die Seite Mietwohnungen; ohne Ort und Filter leitet sie auf die Suche weiter. - Kategorie-Seiten nach Ort: `/{kategorie}/{stadt}?via=llms` zeigt Inserate in einer Stadt und im Umkreis und existiert nur, wenn es dort Inserate gibt; `/{kategorie}/{bundesland}?via=llms` zeigt ein Bundesland, z. B. `/haus-kaufen/bayern?via=llms`. Kategorien in diesen Adressen: wohnung-mieten, haus-mieten, wohnung-kaufen, haus-kaufen, garage-carport-stellplatz-mieten, garage-carport-stellplatz-kaufen, grundstuecke-bau-wald-garten-kaufen, grundstuecke-bau-wald-garten-pachten, gewerbe-mieten, gewerbe-kaufen. Die Sitemap listet die Stadtseiten mit Inseraten. ## API (für strukturierte Abfragen) - [OpenAPI-Beschreibung](https://www.immolibero.com/openapi.json): geprüfte Beschreibung der fünf Endpunkte, mit denen sich Inserate suchen, lesen und Orte nachschlagen lassen - Suche, Detail, die beiden schlanken KI-Adressen und Ortsvorschläge (OpenAPI 3.1). Sie nennt für diese fünf jeden Parameter und die Antwortfelder der obersten Ebene, mit ausgeschriebenen Werten, wo die Antwort nur bestimmte zulässt. Verschachtelte Blöcke der beiden vollen Adressen (`provider`, `details`, `amenities`, `media`) sind dort in Worten beschrieben, nicht Feld für Feld; die schlanken KI-Adressen beschreiben sie Feld für Feld. - [Inserate-Suche für KI (JSON)](https://www.immolibero.com/api/v1/ai/listings?category=mietwohnungen&rooms_from=2): **Für Assistenten, die Antworten für Menschen formulieren, ist das der richtige Einstieg; wer MCP spricht, nimmt den MCP-Server unten.** Ort und Grenzen gehören dabei als Parameter in die Anfrage, nicht als Satz in `q`: Ein ganzer Satz wird an dieser Adresse nicht zerlegt, sondern im Text der Inserate gesucht (Einzelheiten an `q` unten). Dieselbe Suche und dieselben Parameter wie unten, aber eine schlanke Antwort: Felder ohne Wert fehlen ganz statt `null` zu tragen; Objektart, Zustand, Heizung und Haustierregelung stehen als `label` (für den Satz) und als `key` (für die Anschlussfrage); die Kosten neben dem Preis stehen dabei (`costs` mit Nebenkosten, Heizkosten, Kaution, Hausgeld, `parking_rent_cents` und `buyer_commission` - ein Kaufpreis ohne die Provision ist eine unvollständige Auskunft; `parking_rent_cents` steckt dagegen NICHT in `warm_rent` und kommt nur dazu, wenn ein Stellplatz mitgemietet wird). `warm_rent` steht nur, wenn Neben- oder Heizkosten gepflegt sind; sonst wäre die Summe gleich der Kaltmiete und hieße fälschlich "keine Nebenkosten". `amenities` trennt `available` von `not_available` - eine leere `not_available`-Liste heißt NICHT, dass alles andere vorhanden ist. Einzelinserat: `https://www.immolibero.com/api/v1/ai/listings/{slug}` - dazu Beschreibung, Zustand, Heizung, Baujahr, Etage, Schlaf- und Badezimmer, Möblierung, Wohngemeinschaft und die Pflichtangaben nach § 87 GEG als benannte Felder (`energy`). Ausstattung und Haustierregel stehen schon an jedem Treffer der Suche. `meta_extras` trägt hier nur `results_total` (alle Treffer, anders als `meta.total` nicht bei 1000 gekappt), `ignored_filters` und bei null Treffern `empty_state` - die Felder der Weboberfläche (`headline`, `show_results_count`, `active_filter_count`) gibt es an dieser Adresse nicht, und `empty_state` trägt hier kein `saved_search_id` (diese Adresse kennt keine gespeicherten Suchen); `meta.links` mit den Seitenknöpfen ebenfalls nicht, die nächste Seite steht in `links.next`. - [Inserate-Suche (JSON)](https://www.immolibero.com/api/v1/listings): Gefilterte, paginierte Liste veröffentlichter Inserate, sortiert nach interner Rangfolge. Jeder Treffer enthält u. a. Titel, Stadt, Zimmer, Wohnfläche, `expose_url` (die Seite zum Inserat, unverändert weiterzugeben; ohne erkennbare Mobile-App trägt sie den Parameter via=api), `cover_image_absolute_url` (Titelbild mit vollem Gastgeber), `price` mit `amount_cents` in Cent, `unit` (`month`, `sqm` oder `null` beim Kauf) und `label` (Kaufpreis, Kaltmiete, Miete oder Pacht) sowie `warm_rent` (Kaltmiete plus Nebenkosten plus Heizkosten, nur bei Wohnungen und Häusern zur Monatsmiete mit Heizkosten-Angabe). Unbekannte oder unpassende Filter werden übergangen und in `meta_extras.ignored_filters` mit Grund gemeldet. Bei null Treffern steht in `meta_extras.empty_state`, woran es lag und was geht: `supply_in_area` (Angebot im Gebiet ohne die übrigen Filter; 0 heißt, es liegt am Ort), `suggestions` (Lockerungen mit gemessener Trefferzahl und fertigen Parametern; ein größerer Umkreis steht nie darunter), `nearby` (Nachbarorte mit Entfernung und Trefferzahl, nur wenn im Gebiet überhaupt nichts steht), `saved_search_id` (0, wenn zu diesen Filtern kein Suchauftrag läuft) und `next_steps` mit `web_url` (dieselbe Suche auf der Website, dort speicherbar), `dropped_filters` (was der Link nicht tragen kann) und `text` (der fertige Satz zum Weitergeben, in Worten und ohne Parameternamen; brächte ein größerer Umkreis Treffer und steht kein Nachbarort in `nearby`, nennt er Entfernung und Zahl - den `radius` dafür setzt der Klient selbst). Query-Parameter: - `q` - Ort (Stadtname) oder Freitext (Titel, PLZ). Steht neben dem Ort mehr („Gera 3 Zimmer bis 800 €“), wird im Ort gesucht, und Zimmer (ab), Preis (bis), Fläche (ab) und Objektart werden als Filter übernommen, wenn der passende Parameter nicht gesetzt ist (ein gesendetes `price_kind=cold` zählt als gesetzt) und die Angabe zur Kategorie passt; `ignored_filters` meldet das für `q` mit `reason` `adjusted` und `applied_filters` - nur bei den Listen-Endpunkten, `listing-map` filtert ebenso, meldet es aber nicht. **Die Grenze:** Neben dem Ort dürfen nur solche Angaben stehen. Ein ganzer Satz („Ich suche eine Wohnung in Gera mit Balkon bis 500 €“) wird an dieser Adresse nicht zerlegt - gesucht wird dann im Text der Inserate (die ersten sechs Wörter, jedes muss vorkommen), und `ignored_filters` meldet `q` mit `reason` `not_applicable`. Steht daneben `city_id`, `postal`, `district_id` oder ein wirkender Punkt, filtert `q` überhaupt nicht - `city_id` - Stadt, eindeutig über ihre Kennung; sucht NICHT im Text, ein Inserat mit dem Ortsnamen nur im Titel ist kein Treffer. Vorrang vor `postal` und `q` - `postal` - 5-stellige PLZ; hat Vorrang vor `q` - `district_id` - Stadtteil; die Kennung stammt aus den Such-Vorschlägen - `near` - Anzeigename des Suchpunkts. **Filtert nichts**; er steht an `/v1/listings` in `meta_extras.headline` und an beiden Adressen im Satz von `empty_state.next_steps.text`, dort nur bei einer Umkreissuche um den Punkt aus `lat`, `lon` und `radius`. Fehlt er, nennt der Satz den Ort aus `q`, sofern der Punkt bei diesem Ort liegt; sonst nennt er nur den Umkreis. Neben einem wirkenden Punkt filtert `q` nicht. An `/v1/ai/listings` gibt es keine Überschrift - `bbox` - Kartenausschnitt als `minLat,minLng,maxLat,maxLng` - `lat`, `lon` - Mittelpunkt einer Umkreissuche in Dezimalgrad (WGS84), wirkt nur zusammen mit `radius` und hat dann Vorrang vor `q` und `postal`; ohne `radius` bleibt es bei `q`, `postal` bzw. `district_id`. Nur `lat` oder nur `lon`, unmögliche Koordinaten oder ein `radius` außerhalb 1 bis 50 km beantwortet die API mit 422 - `radius` - Umkreis in km: mit `lat` und `lon` 1 bis 50 km um diesen Punkt, sonst nur zusammen mit einem Stadtnamen in `q` - `category` - `mietwohnungen`, `eigentumswohnungen`, `haeuser-mieten`, `haeuser-kaufen`, `garage-carport-stellplatz-mieten`, `garage-carport-stellplatz-kaufen`, `grundstuecke-bau-wald-garten-pachten`, `grundstuecke-bau-wald-garten-kaufen`, `gewerbe-mieten`, `gewerbe-kaufen` (ohne Angabe: alle Kategorien) - `price_max`, `rent_from`, `rent_to`, `price_kind` - Preisgrenzen in Euro; price_kind cold oder warm - `living_area_from`, `living_area_to` - Wohn- bzw. Gewerbefläche in m² - `area_min` - Kurzform von `living_area_from`. Sind beide gesetzt, gilt die strengere der zwei Angaben, und die lockere wird in `ignored_filters` mit `reason` `superseded` gemeldet - `plot_area_from`, `plot_area_to` - Grundstücksfläche in m² - `rooms_from`, `rooms_to` - Zimmeranzahl - `rooms` - Kurzform von `rooms_from`. Neben `rooms_from` ohne Wirkung (`ignored_filters`, `reason` `superseded`); neben `rooms_to` allein fällt die Untergrenze ganz weg (`reason` `not_applicable`) - `floor_from`, `floor_to` - Etage; 0 ist das Erdgeschoss - `house_type` - Haustyp, nur zusammen mit category haeuser-mieten oder haeuser-kaufen, mehrere mit Komma: `einfamilienhaus`, `doppelhaushaelfte`, `reihenhaus`, `mehrfamilienhaus`, `bungalow`, `villa`, `bauernhaus`, `ferienhaus`, `sonstige`. reihenhaus umfasst Mittel- und Eckhaus (listing_type=reihenhaus nur das Mittelhaus), sonstige auch Burg, Schloss und besondere Immobilie. Häuser ohne Angabe zum Haustyp sind immer dabei. Mehrfamilienhäuser tragen Wohnungen statt Zimmern: Der Zimmerfilter einer Haussuche lässt sie durch, und mit mehrfamilienhaus allein wirkt er nicht - Ausstattung (jeweils 1): `balcony_terrace`, `garden_use`, `bathtub`, `parking`, `elevator`, `basement`, `guest_wc` - Wohnungstyp (jeweils 1): `ground_floor`, `top_floor`, `maisonette` - `pet_policy` - `yes` (Haustiere erlaubt), `no` (keine Haustiere), `by_agreement` (nach Vereinbarung) - `marketing_type` - `rent` oder `buy`; wirkt nur ohne `category`, nur API - `listing_type` - Objektart-Gruppe (`apartment`, `house`, `land`, `parking`, `commercial`) oder eine einzelne Objektart; wirkt nur ohne `category`, nur API - `furnished`, `shared_living` - jeweils 1 oder 0; Inserate ohne Angabe fallen in beiden Fällen heraus, nur API - `year_built_from`, `year_built_to` - Baujahr, vierstellig, nur API - `energy_class` - `A+` bis `H`; mindestens diese Klasse, bessere eingeschlossen, nur API - `heating_type` - `zentralheizung`, `fussbodenheizung`, `etagenheizung`, `fernwaerme`, `waermepumpe`, nur API - `sort` - `relevance` (Standard, interne Rangfolge), `price_asc`, `price_desc`, `newest` - `page` - Seite ab 1; jenseits von `meta.last_page` kommt die letzte Seite - `per_page` - Treffer je Seite: ohne Angabe 12, angefordert 1 bis 10, nur API - Inserat-Detail (JSON): `https://www.immolibero.com/api/v1/listings/{slug}` - vollständige Daten eines einzelnen Inserats (per Slug oder ID). Abgeschaltete Inserate: 404 mit `error.code` `listing_not_found`; zeigt die Website einen Hinweis, steht er in `error.message`, und `error.details.reason` enthält `deactivated`. - [Such-Vorschläge (JSON)](https://www.immolibero.com/api/v1/search-suggestions): Autovervollständigung für Städte, Regionen, PLZ, Stadtteile und Straßen. `coordinates` ist bei Straßen der Punkt der Straße, bei Städten und Stadtteilen deren Mitte, bei PLZ die Mitte der zugehörigen Stadt; Regionen haben keine. Bei Straßen enthält `filters` schon `lat`, `lon` und `near`. ## KI-Assistenten (MCP) - [MCP-Server (POST /mcp)](https://www.immolibero.com/mcp): Dieselbe Suche wie die KI-Adresse oben, als MCP-Server (JSON-RPC 2.0 über Streamable HTTP, ohne Anmeldung, nur lesend). Der Aufruf braucht den Kopf `Accept: application/json, text/event-stream`; ein GET auf diese Adresse antwortet mit 405. Werkzeuge: `search_listings` (Suche), `get_listing` (ein Inserat), `search_suggestions` (Ort nachschlagen, bevor ein mehrdeutiger Name zur Suche wird). Parameter und Antwortfelder beschreiben die Werkzeuge selbst - sie stehen hier nicht ein zweites Mal. Abweichend von der REST-Adresse fehlen `near`, `bbox`, `rooms` und `area_min` (Mindestzimmer und Mindestfläche heißen `rooms_from` und `living_area_from`); dafür darf `q` einen ganzen Satz tragen. ## Weiteres - [Sitemap](https://www.immolibero.com/sitemap.xml): Alle öffentlichen Seiten inkl. einzelner Inserate.