# Immonika - Deutsches Immobilienportal > Immobiliensuche mit strukturierten Daten für Kauf, Miete und Pacht ## Über dieses Portal Immonika ist ein deutsches Immobilienportal, technisch ausgelegt für bis zu rund 500.000 Inserate in mehr als 10.000 Orten (Kapazitätsziel der Plattform — nicht der aktuelle Live-Bestand). Der aktuelle Bestand ist maschinenlesbar unter [Städte mit Inseraten](https://immonika.de/api/cities.json) (`totalCount`, `listingCount` pro Ort). Alle Daten werden täglich aktualisiert. Kein Login nötig. Filter erfolgen über URL-Pfade (statische Seiten), nicht über Formulare. ## Empfohlener Einstieg für KI-Agenten - [OpenAPI Spec](https://immonika.de/openapi.json): OpenAPI 3.0 Standardpfad für Scanner - [Swagger-Alias](https://immonika.de/swagger.json): identischer OpenAPI-Inhalt - [OpenAPI unter /api/](https://immonika.de/api/openapi.json): gleiche Spec unter /api/ - [API-Dokumentation](https://immonika.de/api/docs/): menschenlesbare API-Doku (HTML, DE) - [KI-Index](https://immonika.de/ai-index.json): kompakter KI-Einstieg (Endpoints-JSON) - [API-Katalog](https://immonika.de/.well-known/api-catalog): RFC 9727 Linkset (Datei [api-catalog](https://immonika.de/api/api-catalog)); kein ChatGPT-Plugin - [Ablauf](https://immonika.de/api/workflow): Suche → Filtern → Auswahl → Vergleich → Kontakt (`type: agentWorkflow`); kein Chat-Server - [Suchindex](https://immonika.de/api/search): jüngste Inserate (`type: searchIndex`); Filter city/rooms/price_max clientseitig an `items[]` (nicht `?city=` anhängen — Query ändert die Datei nicht) - [Anbieter-Index](https://immonika.de/api/anbieter): alle öffentlichen Firmen und Makler (`type: agentIndex`); Filter name/city/role an `items[]`; Alias [agents](https://immonika.de/api/agents) - [Listings Discovery](https://immonika.de/api/listings.json): Übersicht aller Einstiegspunkte (`type: discovery`) - [Städte mit Inseraten](https://immonika.de/api/cities.json): alle Orte mit mindestens einem Inserat - [Beispiel Berlin Listings](https://immonika.de/Berlin/api/listings.json): Pattern `/{ortSlug}/api/listings.json` - [Beispiel Berlin Stadtteile](https://immonika.de/Berlin/api/stadtteile.json): Pattern `/{ortSlug}/api/stadtteile.json` - [Beispiel Berlin Makler](https://immonika.de/Berlin/api/makler.json): Pattern `/{ortSlug}/api/makler.json` - [Beispiel Anbieterprofil](https://immonika.de/Anbieter/CF242MGQHWBP/api/agent.json): Pattern `/Anbieter/{aeHash}/api/agent.json` - [Beispiel Anbieter-Inserate](https://immonika.de/Anbieter/CF242MGQHWBP/api/listings.json): Pattern `/Anbieter/{aeHash}/api/listings.json` - Pattern `/Anbieter/{aeHash}/{meHash}/api/agent.json`: Makler-Personenprofil (mit parentOrganization) - [Beispiel Kaufen Berlin](https://immonika.de/Berlin/Kaufen/api/listings.json): Pattern `/{ortSlug}/{vermarktungsart}/api/listings.json` - [Beispiel Exposee listing.json](https://immonika.de/Berlin/Kaufen/Eigentumswohnungen/6+-Zimmer/3Seq28e0HXqmwcfl.00011/api/listing.json): Einzelobjekt (RealEstateListing, dateModified, amenities, energy, contactIntent, parentFeed) - Markdown-Fassung je Inserat: Pattern `/{ortSlug}/{vermarktungsart}/{objektart}/{unterkategorie}/{exposeeId}/index.md` (llms.txt-v2-Konvention: gleiche URL wie die Seite, Endung `.md`); im Seitenkopf als `rel="alternate" type="text/markdown"` verlinkt, Feld `markdownUrl` in der listing.json - [Orts-Sitemap HTML](https://immonika.de/sitemap.html): menschenlesbare Alternative - [Sitemap XML](https://immonika.de/sitemap.xml): maschinenlesbare Alternative **Wichtig:** [Listings Discovery](https://immonika.de/api/listings.json) ist **kein** Gesamt-Feed aller Inserate. Es enthält `type: "discovery"` und Verweise - keine `items`-Liste mit Exposees. ## Maschinenlesbare Endpunkte - [API-Dokumentation](https://immonika.de/api/docs/): öffentliche API-Dokumentation (HTML, DE) - [OpenAPI Spec](https://immonika.de/openapi.json): OpenAPI 3.0 (Standardpfad für Scanner) - [Swagger-Alias](https://immonika.de/swagger.json): identischer OpenAPI-Inhalt - [OpenAPI unter /api/](https://immonika.de/api/openapi.json): gleiche Spec unter /api/ - [API-Übersicht](https://immonika.de/api/index.html): HTML-Links zu allen API-Ressourcen - [KI-Index](https://immonika.de/ai-index.json): kompakter KI-Einstieg (llms, Sitemaps, API-Root) - [API-Katalog](https://immonika.de/.well-known/api-catalog): RFC 9727; Datei [api-catalog](https://immonika.de/api/api-catalog) - [Ablauf](https://immonika.de/api/workflow): definierter Flow inkl. `nextActions`; Alias [workflow.json](https://immonika.de/api/workflow.json) - [Suchindex](https://immonika.de/api/search): jüngste Inserate, Kappe 25000; Filter Ort/Zimmer/Preis an `items[]`, nicht als Query-String; Alias [search.json](https://immonika.de/api/search.json) - [Anbieter-Index](https://immonika.de/api/anbieter): alle öffentlichen Firmen und Makler; Alias [anbieter.json](https://immonika.de/api/anbieter.json) und [agents](https://immonika.de/api/agents) - [Listings Discovery](https://immonika.de/api/listings.json): Discovery-Stub; Start hier bei Suche nach "listings" - [Städte mit Inseraten](https://immonika.de/api/cities.json): authoritative Ortliste (`listingCount`, Ziel-URL pro Ort) - Markdown-Mirrors: Pattern `/{ortSlug}/{vermarktungsart}/{objektart}/{unterkategorie}/{exposeeId}/index.md` — Teilmenge der listing.json als Fließtext, `text/markdown`, `X-Robots-Tag: noindex` (die HTML-Seite ist die indexierbare Fassung). Nicht in der Sitemap; Entdeckung über den `rel=alternate`-Link im Seitenkopf - [Beispiel Berlin Listings](https://immonika.de/Berlin/api/listings.json): Pattern `/{ortSlug}/api/listings.json` (RealEstateListing, Feld `items`) - [Beispiel Berlin Stadtteile](https://immonika.de/Berlin/api/stadtteile.json): Pattern `/{ortSlug}/api/stadtteile.json` (Centroid lat/lng) - [Beispiel Kaufen Berlin](https://immonika.de/Berlin/Kaufen/api/listings.json): gefiltert nach Vermarktungsart - [Beispiel Häuser Kaufen Berlin](https://immonika.de/Berlin/Kaufen/H%C3%A4user/api/listings.json): gefiltert nach Objektart - Pattern `/{ortSlug}/.../{unterkategorie}/api/listings.json`: z. B. 3-Zimmer, Baugrund - [Makler Discovery](https://immonika.de/api/makler.json): Wegweiser auf Orts-Empfehlungen; globaler Katalog ist [Anbieter-Index](https://immonika.de/api/anbieter) - [Beispiel Berlin Makler](https://immonika.de/Berlin/api/makler.json): Makler-Empfehlungen (20 km Umkreis); `qualityIndexScore` 0–100 relativ zum höchsten `ranking` in dieser Ortsliste (100 = Bester im Ort) - [Beispiel Berlin Makler HTML](https://immonika.de/Berlin/Makler/): menschenlesbare Makler-Übersicht - [Beispiel Anbieterprofil](https://immonika.de/Anbieter/CF242MGQHWBP/api/agent.json): Schema.org RealEstateAgent; `qualityIndexScore` 0–100 relativ zum höchsten öffentlichen `ranking` im Portal (`qualityIndexScope: portal`) - [Beispiel Anbieter-Inserate](https://immonika.de/Anbieter/CF242MGQHWBP/api/listings.json): Inserate des Anbieters - Pattern `/Anbieter/{aeHash}/{meHash}/api/agent.json`: Makler-Personenprofil - Pattern `/Anbieter/{aeHash}/{meHash}/api/listings.json`: Inserate des Maklers - [Beispiel Exposee listing.json](https://immonika.de/Berlin/Kaufen/Eigentumswohnungen/6+-Zimmer/3Seq28e0HXqmwcfl.00011/api/listing.json): contactIntent v3, fieldDefinitions, agentWorkflow - [Beispiel contact-request.json](https://immonika.de/Berlin/Kaufen/Eigentumswohnungen/6+-Zimmer/3Seq28e0HXqmwcfl.00011/api/contact-request.json): Kontakt-Schema; POST an [kontakt.php](https://service.immonika.de/kontakt.php) - [API-Sitemap](https://immonika.de/api/sitemap-api.xml): alle aktiven Orts-API-URLs (Listings + Makler) - [Sitemap XML](https://immonika.de/sitemap.xml): hierarchische Sitemap aller Index- und Exposee-Seiten - [Sitemap Indexseiten](https://immonika.de/sitemap-indexseiten.xml): alle indexierbaren Ort- und Kategorieseiten - [Sitemap Exposees](https://immonika.de/sitemap-exposees.xml): alle aktiven Exposee-Seiten - [Anbieter-Sitemap](https://immonika.de/anbieter-sitemap.xml): Anbieterseiten mit Objekten und gültigem Impressum - [Orts-Sitemap HTML](https://immonika.de/sitemap.html): menschenlesbare Ortsübersicht - [llms.txt](https://immonika.de/llms.txt): diese Datei **Hinweise:** - `ortSlug` aus [Städte mit Inseraten](https://immonika.de/api/cities.json) verwenden (URL-freundlich, kann von Schreibweise des Ortsnamens abweichen). - Unter **Kaufen** heißt die Objektart **Eigentumswohnungen** (nicht "Wohnungen"); **Wohnungen** gilt bei **Mieten**. - Orte ohne Inserate: `/{ortSlug}/api/listings.json` liefert HTTP 200 mit leerem `items`-Array. ## Nicht für KI-Crawler - /listings.json (ohne `/api/`-Prefix im Root) - existiert nicht; nutze [Listings Discovery](https://immonika.de/api/listings.json) - /{ortSlug}/leanlist.json - nur Browser-JavaScript (Objektlisten-Widgets) - /{ortSlug}/extendedleanlist.json - nur Kartensuche im Browser ## HTML-Seiten Index- und Exposee-Seiten enthalten JSON-LD (WebSite, ItemList, RealEstateListing, RealEstateAgent, BreadcrumbList). KI-Bots dürfen HTML-Seiten crawlen (siehe [robots.txt](https://immonika.de/robots.txt)). Exposee-URLs: `/{ortSlug}/.../{hash}/` (HTML) bzw. `items[].listingApi` → `.../api/listing.json` (JSON). ## Datenstruktur Hierarchie: Ort > Vermarktungsart (Kaufen/Mieten/Pachten) > Objektart > Unterkategorie **Discovery-JSON** ([Listings Discovery](https://immonika.de/api/listings.json)): `schemaVersion`, `type`, `entryPoints`, `perCityListingsPattern`, `perCityStadtteilePattern`, `hint` **Stadtteile-JSON** ([Beispiel Berlin](https://immonika.de/Berlin/api/stadtteile.json)): `ort`, `totalCount`, `items[]` mit `name`, `lat`, `lng` **Daten-JSON** ([Beispiel Berlin Listings](https://immonika.de/Berlin/api/listings.json)): zusätzlich `generatedAt`, `totalCount`, `truncated`, `maxItems` (500 auf Ort- und Vermarktungsart-Ebene). Auf Ortsebene: `stadtteileApi`, `districtFilterHint`. Array `items` mit RealEstateListing-Feldern: name (inkl. Bezirk, z. B. „Häuser in Berlin · Friedrichsfelde"), `district`, `stadtteil`, offers.price, numberOfRooms, floorSize, address.addressSubLocality, yearBuilt, url, listingApi, datePosted **Exposee-Detail** (`…/api/listing.json`): zusätzlich `dateModified` (Inhaltsdatum), `amenities` (physische Ausstattung), `energy` (Energieausweis, falls vorhanden), `contactIntent`. **Makler-JSON** ([Beispiel Berlin Makler](https://immonika.de/Berlin/api/makler.json)): `qualityIndexScore` 0–100 relativ zum höchsten `ranking` dieser Ortsliste (100 = Bester im Ort, nicht CSV-Maximalstufe). Profil-`agent.json`: gleicher Score relativ zum Portal-Maximum. **Ablauf (Suche → Kontakt):** 1. [Ablauf](https://immonika.de/api/workflow) lesen (`steps[]`, `nextActions`) 2. [Suchindex](https://immonika.de/api/search) laden und `items[]` filtern 3. Ein oder zwei `items[].listingApi` laden (vergleichen: Preis, Zimmer, Ort) 4. Kontakt nur über `contactIntent.agentWorkflow` — nicht das HTML-Formular **Suche (Beispiel „3-Zimmer in Celle unter 300000 Euro“):** 1. [Suchindex](https://immonika.de/api/search) laden — ohne Query-String 2. Clientseitig filtern: `city`/`citySlug`, `numberOfRooms`, `offers.price` (nicht `?city=` anhängen) 3. Pagination: `page` ab 1, `pageSize` 50 — `items` selbst schneiden 4. Kein Treffer oder `truncated: true`: [Städte](https://immonika.de/api/cities.json) → `/{ortSlug}/api/listings.json` **Anbieter (Beispiel „Makler in Berlin“):** 1. [Anbieter-Index](https://immonika.de/api/anbieter) laden 2. Clientseitig filtern: `city`, `role` (`organization` oder `person`), `name`/`organization` 3. Profil: `items[].agentApi` — Inserate des Anbieters: `items[].listingsApi` 4. Orts-Empfehlungen (20 km): `/{ortSlug}/api/makler.json` **Stadtteil-Abfrage (Beispiel „EFH in Friedrichsfelde“):** 1. [Städte mit Inseraten](https://immonika.de/api/cities.json) → `ortSlug` (z. B. Berlin) 2. [Beispiel Berlin Stadtteile](https://immonika.de/Berlin/api/stadtteile.json) → gültige Bezirksnamen (`items[].name`) 3. [Beispiel Berlin Listings](https://immonika.de/Berlin/api/listings.json) oder [Häuser Kaufen Berlin](https://immonika.de/Berlin/Kaufen/H%C3%A4user/api/listings.json) 4. Clientseitig filtern: `items.filter(i => i.district === "Friedrichsfelde")` (oder `stadtteil` / `address.addressSubLocality`) ## Kontaktanfragen durch KI-Agenten (Variante B) **WICHTIG — Einstieg für Agenten (nicht das HTML-Formular scrapen):** 1. [Beispiel contact-request.json](https://immonika.de/Berlin/Kaufen/Eigentumswohnungen/6+-Zimmer/3Seq28e0HXqmwcfl.00011/api/contact-request.json) laden (Schema + JSON-Feld-Mapping) — oder [Beispiel listing.json](https://immonika.de/Berlin/Kaufen/Eigentumswohnungen/6+-Zimmer/3Seq28e0HXqmwcfl.00011/api/listing.json) → `contactIntent` v3. 2. `fieldDefinitions` / `jsonFieldMap` lesen (z. B. `firstName` → `Vorname`, Pflichtfelder, `exposeeContext`). 3. `agentWorkflow` befolgen: GET Schema → POST `contactIntent.endpoint` mit **`Content-Type: application/json`** (snake_case/camelCase) **oder** `application/x-www-form-urlencoded`. 4. JSON-Antwort: Header `Accept: application/json` (Feld `mode=agent` bei form-urlencoded). Erfolg/Fehler: `contact-request.json` → `successResponses` / `errorResponses` (Feld `status`). 5. HTML-Exposée: `#immonika-agent-contact-config` und `data-agent-schema` am `