# Immonika - Deutsches Immobilienportal > Immobiliensuche mit strukturierten Daten fuer Kauf, Miete und Pacht ## Ueber dieses Portal Immonika ist ein deutsches Immobilienportal ausgelegt fuer ca. ~500.000 Inserate in ueber 10.000 Orten. Alle Daten werden taeglich aktualisiert. Kein Login noetig. Filter erfolgen ueber URL-Pfade (statische Seiten), nicht ueber Formulare. ## Empfohlener Einstieg fuer KI-Agenten 1. `/openapi.json` oder `/swagger.json` (OpenAPI 3.0 Standardpfade) - alternativ `/api/openapi.json` 2. `/api/docs/` (menschenlesbare API-Doku) 3. `/ai-index.json` oder `/api/listings.json` (Discovery) - Uebersicht aller Einstiegspunkte 4. `/api/cities.json` - alle Orte mit mindestens einem Inserat (`listingCount`, `url` pro Ort) 5. `/{ortSlug}/api/listings.json` - Inserate eines Ortes (echte Daten, Schema.org; Stadtteil in `district`, `stadtteil`, `name`) 6. `/{ortSlug}/api/stadtteile.json` - Bezirke/Stadtteile des Ortes (Centroid lat/lng; Filterwerte fuer listings.json) 7. `/{ortSlug}/api/makler.json` - empfohlene Makler im Ort/Umkreis (RealEstateAgent; parallel zu listings.json) 8. `/Anbieter/{aeHash}/api/agent.json` - Maklerprofil (RealEstateAgent, ranking, listingCount) 9. `/Anbieter/{aeHash}/api/listings.json` - Inserate dieses Anbieters (inkl. Stadtteil wie Ort-API) 10. `/Anbieter/{aeHash}/{meHash}/api/agent.json` - Makler-Personenprofil (mit parentOrganization) 11. Bei Bedarf tiefer: `/{ortSlug}/{vermarktungsart}/api/listings.json` usw. 12. Exposee-Detail: `/{ortSlug}/{vermarktungsart}/{objektart}/{unterkategorie}/{exposeeId}/api/listing.json` — Einzelobjekt (RealEstateListing, contactIntent, parentFeed) 13. HTML-Alternative: `/sitemap.html` (menschenlesbar) oder `/sitemap.xml` (maschinenlesbar) **Wichtig:** `/api/listings.json` ist **kein** Gesamt-Feed aller Inserate. Es enthaelt `type: "discovery"` und Verweise - keine `items`-Liste mit Exposees. ## Maschinenlesbare Endpunkte - /api/docs/ - oeffentliche API-Dokumentation (HTML, DE) - /openapi.json - OpenAPI 3.0 (Standardpfad fuer Scanner) - /swagger.json - identischer OpenAPI-Inhalt (Swagger-Alias) - /api/openapi.json - gleiche Spec unter /api/ - /api/index.html - API-Uebersicht (Links) - /ai-index.json - kompakter KI-Einstieg (Endpoints-JSON: llms, Sitemaps, API-Root) - /api/listings.json - Discovery-Stub (`type: discovery`; Start hier, wenn "listings" gesucht wird) - /api/cities.json - authoritative Ortliste mit Inseraten (`listingCount`, Ziel-URL pro Ort) - /{ortSlug}/api/listings.json - alle Inserate eines Ortes (Schema.org RealEstateListing, Feld `items`; Stadtteil in `district`, `stadtteil`, `address.addressSubLocality`, `name`) - /{ortSlug}/api/stadtteile.json - Stadtteile/Bezirke mit Centroid (`items[].name`, `lat`, `lng`) - /{ortSlug}/{vermarktungsart}/api/listings.json - gefiltert: Kaufen, Mieten, Pachten - /{ortSlug}/{vermarktungsart}/{objektart}/api/listings.json - z. B. Eigentumswohnungen, Haeuser, Gewerbe - /{ortSlug}/.../{unterkategorie}/api/listings.json - z. B. 3-Zimmer, Baugrund - /api/makler.json - Discovery-Stub fuer Makler-API (Verweis auf Ort-Pattern) - /{ortSlug}/api/makler.json - Makler-Empfehlungen fuer einen Ort (20 km Umkreis, Feld items mit ranking) - /{ortSlug}/Makler/api/makler.json - identischer Inhalt (Kontext Orts-Anbieterseite) - /{ortSlug}/Makler/ - menschenlesbare Makler-Uebersicht (HTML) - /Anbieter/{aeHash}/api/agent.json - Anbieterprofil (Schema.org RealEstateAgent) - /Anbieter/{aeHash}/api/listings.json - Inserate des Anbieters (mit `district`/`stadtteil`/`address`) - /Anbieter/{aeHash}/{meHash}/api/agent.json - Makler-Personenprofil - /Anbieter/{aeHash}/{meHash}/api/listings.json - Inserate des Maklers - /{ortSlug}/{vermarktungsart}/{objektart}/{unterkategorie}/{exposeeId}/api/listing.json - Exposee-Detail (contactIntent v3, fieldDefinitions, agentWorkflow) - /{ortSlug}/.../{exposeeId}/api/contact-request.json - Kontakt-Schema + JSON-POST-Mapping (GET); POST an service.immonika.de/kontakt.php - /api/sitemap-api.xml - Sitemap aller aktiven Orts-API-URLs (Listings + Makler; keine Einzel-Exposees) - /sitemap.xml - hierarchische Sitemap aller Index- und Exposee-Seiten - /sitemap.html - menschenlesbare Ortsuebersicht (Bundesland, Landkreis, Orte) - /llms.txt - diese Datei **Hinweise:** - `ortSlug` aus `/api/cities.json` verwenden (URL-freundlich, kann von Schreibweise des Ortsnamens abweichen). - Unter **Kaufen** heisst die Objektart **Eigentumswohnungen** (nicht "Wohnungen"); **Wohnungen** gilt bei **Mieten**. - Orte ohne Inserate: `/{ortSlug}/api/listings.json` liefert HTTP 200 mit leerem `items`-Array. ## Nicht fuer KI-Crawler - /listings.json (ohne `/api/`-Prefix im Root) - existiert nicht; nutze `/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 duerfen HTML-Seiten crawlen (siehe robots.txt). Exposee-URLs: `/{ortSlug}/.../{hash}/` (HTML) bzw. `.../api/listing.json` (JSON; aus Listings-Feld `url` + `/api/listing.json` oder Sitemap). ## Datenstruktur Hierarchie: Ort > Vermarktungsart (Kaufen/Mieten/Pachten) > Objektart > Unterkategorie **Discovery-JSON** (`/api/listings.json`): `schemaVersion`, `type`, `entryPoints`, `perCityListingsPattern`, `perCityStadtteilePattern`, `hint` **Stadtteile-JSON** (`/{ortSlug}/api/stadtteile.json`): `ort`, `totalCount`, `items[]` mit `name`, `lat`, `lng` **Daten-JSON** (`/{ortSlug}/.../api/listings.json`): zusaetzlich `generatedAt`, `totalCount`, `truncated`, `maxItems` (500 auf Ort- und Vermarktungsart-Ebene). Auf Ortsebene: `stadtteileApi`, `districtFilterHint`. Array `items` mit RealEstateListing-Feldern: name (inkl. Bezirk, z. B. „Haeuser in Berlin · Friedrichsfelde"), `district`, `stadtteil`, offers.price, numberOfRooms, floorSize, address.addressSubLocality, yearBuilt, url, datePosted **Stadtteil-Abfrage (Beispiel „EFH in Friedrichsfelde“):** 1. `/api/cities.json` → `ortSlug` (z. B. Berlin) 2. `/{ortSlug}/api/stadtteile.json` → gueltige Bezirksnamen (`items[].name`) 3. `/{ortSlug}/api/listings.json` oder `/{ortSlug}/Kaufen/Haeuser/api/listings.json` 4. Clientseitig filtern: `items.filter(i => i.district === "Friedrichsfelde")` (oder `stadtteil` / `address.addressSubLocality`) ## Kontaktanfragen durch KI-Agenten (Variante B) **WICHTIG — Einstieg fuer Agenten (nicht das HTML-Formular scrapen):** 1. `.../api/contact-request.json` laden (Schema + JSON-Feld-Mapping) — oder `.../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 `