API-Dokumentation

immonika.de stellt eine oeffentliche, read-only Listings-API als statische JSON-Dateien bereit. Es gibt keinen API-Key, keine Schreibzugriffe und keinen separaten API-Server — die Dateien werden taeglich mit dem Portal neu generiert.

Katalog

Scanner finden die API unter /.well-known/api-catalog (RFC 9727). Die Datei liegt unter /api/api-catalog — nicht im Let’s-Encrypt-Ordner. Format: Linkset. Kein ChatGPT-Plugin.

Ablauf

/api/workflow (Alias /api/workflow.json) ist der definierte Flow: Suche → Filtern → Auswahl → Vergleich → Kontakt. Kein Chat-Server. Der Agent führt die Schritte an den statischen Dateien aus. Kontakt nur über listing.jsoncontactIntent, nicht über das HTML-Formular. In Suche, Anbieter-Index und (beim nächsten Schreiben) listing.json steht nextActions.

Suche

/api/search (Alias /api/search.json) ist der Suchindex: die jüngsten öffentlichen Inserate (höchstens 25.000), Felder Ort, Zimmer, Preis, URL. Filter und Seiten macht der Agent an items[] — nicht ?city= anhängen, der Query-String ändert die Datei nicht. Beispiel: 3 Zimmer in Celle unter 300.000 Euro. Rest über /api/cities.json und /{ortSlug}/api/listings.json.

Anbieter

/api/anbieter (Alias /api/anbieter.json, englisch /api/agents) ist der Anbieter-Index: alle öffentlichen Firmen und Makler mit gültigem Impressum und mindestens einem Inserat. Filter Name, Ort, Rolle macht der Agent an items[]. Orts-Empfehlungen (20 km) bleiben unter /{ortSlug}/api/makler.json.

Empfohlener Einstieg

  1. /api/api-catalog — RFC-9727-Katalog (Standard-URL /.well-known/api-catalog)
  2. /api/workflow — Ablauf Suche → Kontakt
  3. /api/search — Suchindex (jüngste Inserate, Filter clientseitig)
  4. /api/anbieter — Anbieter-Index (Firmen und Makler)
  5. /api/listings.json — Discovery (Verweise, kein Gesamt-Feed)
  6. /api/cities.json — alle Orte mit mindestens einem Inserat
  7. /{ortSlug}/api/listings.json — Inserate eines Ortes (z. B. /Berlin/api/listings.json)
  8. /{ortSlug}/api/stadtteile.json — Bezirke/Stadtteile mit Centroid (z. B. /Berlin/api/stadtteile.json)

Stadtteil-Abfrage: Bezirksnamen aus stadtteile.json, dann listings.json-Items nach district, stadtteil oder address.addressSubLocality filtern.

Weitere Filterebenen: /{ortSlug}/{Vermarktungsart}/api/listings.json (Kaufen, Mieten, Pachten), danach Objektart und Unterkategorie.

Endpunkte

PfadBeschreibung
/api/api-catalogRFC 9727 Linkset; Alias /.well-known/api-catalog
/api/workflowAblauf (type: agentWorkflow): Suche → Auswahl → Kontakt
/api/searchSuchindex (type: searchIndex), jüngste Inserate, Kappe 25.000
/api/anbieterAnbieter-Index (type: agentIndex), alle öffentlichen Firmen und Makler
/api/listings.jsonDiscovery-Stub (type: discovery)
/api/cities.jsonOrte mit listingCount und Ziel-URL
/openapi.jsonOpenAPI 3.0 (Standardpfad)
/swagger.jsonSwagger-Alias (gleicher Inhalt)
/api/openapi.jsonOpenAPI unter /api/
/api/sitemap-api.xmlSitemap aller Orts-API-URLs
/ai-index.jsonKompakter KI-Einstieg (JSON)
/llms.txtLLM-orientierte Dokumentation (DE/EN)
/{ortSlug}/api/listings.jsonSchema.org RealEstateListing in items (inkl. district/stadtteil, listingApi)
/{ortSlug}/api/makler.jsonEmpfohlene Makler (20 km); qualityIndexScore 0–100 relativ zum höchsten ranking dieser Ortsliste (100 = Bester im Ort)
/{ortSlug}/api/stadtteile.jsonStadtteile/Bezirke mit Centroid (items[].name, lat, lng)

Datenstruktur

Katalog (/api/api-catalog): RFC 9727 Linkset mit service-desc (OpenAPI), service-doc, service-meta, item. Standard-URL /.well-known/api-catalog.

Ablauf (/api/workflow): type: agentWorkflow, steps[] (search, filter, select, compare, contact), nextActions, humanFormForbidden: true.

Suche (/api/search): type: searchIndex, totalCount, truncated, maxItems 25000, serverSideFilter: false, items[] mit city, citySlug, numberOfRooms, offers.price, listingApi, nextActions.

Anbieter (/api/anbieter): type: agentIndex, items[] mit role (organization/person), name, aeHash, listingCount, qualityIndexScore, agentApi, listingsApi.

Discovery (/api/listings.json): schemaVersion, type, entryPoints, perCityListingsPattern, perCityStadtteilePattern, hint

Stadtteile (/{ortSlug}/api/stadtteile.json): ort, totalCount, items[] mit name, lat, lng

Listings (/{ortSlug}/.../api/listings.json): zusätzlich totalCount, truncated, maxItems (2000 pro Index-Ebene). Auf Ortsebene: stadtteileApi, districtFilterHint. Array items mit u. a. name (inkl. Bezirk), district, stadtteil, url, listingApi, offers.price, address.addressSubLocality.

Exposee-Detail (…/api/listing.json): zusätzlich dateModified, amenities (physische Ausstattung), energy (Energieausweis, falls vorhanden), contactIntent.

Makler (/{ortSlug}/api/makler.json): qualityIndexScope: ort, qualityIndexPeerMaximum = höchster ranking in dieser Liste, items[].qualityIndexScore = gerundet 100 × ranking / PeerMaximum (nicht CSV-Maximalstufe). Profil /Anbieter/{hash}/api/agent.json: derselbe Score relativ zum Portal-Maximum (qualityIndexScope: portal).

Unter Kaufen heißt die Objektart Eigentumswohnungen (nicht „Wohnungen“); Wohnungen gilt bei Mieten.

OpenAPI / Maschinenlesbar

Fuer Tools, die Swagger oder OpenAPI erwarten:

Hinweise für KI-Crawler

  • HTML-Seiten enthalten JSON-LD; API-Daten sind unter /api/ partitioniert.
  • /{ortSlug}/leanlist.json ist nur für Browser-Widgets — nicht für KI-APIs.
  • Keine externen Tracker; alle Ressourcen werden lokal gehostet (DSGVO).