Zum Inhalt springen
WohnData

Schnittstelle für Unternehmen

Standortanalysen direkt in Ihrer Software

Eine Adresse hinein, eine vollständige Auswertung als JSON heraus. Hochwasser, Starkregen, Lärm, Hitze, Erreichbarkeit, Umfeld und Soziodemografie für jede bewohnte Adresse in Deutschland, ohne dass etwas anklicken muss.

Die Schnittstelle ist bald verfügbar. Dokumentation und Preise können Sie schon jetzt lesen. Die Pakete lassen sich kaufen, sobald der Zugang freigeschaltet ist.

Alles aus dem Vollreport

Dieselben Werte wie im bezahlten Bericht auf der Website, nur als JSON und ohne Oberfläche.

Zum Verbinden gebaut

Jede Antwort trägt den amtlichen Gemeindeschlüssel, die Rasterzelle und die Datenversion. Damit fügt sich das Ergebnis in Ihren Bestand ein.

Kostenlos entwickeln

Ein Testschlüssel liefert einen festen Beispielreport, ohne Kontingent zu verbrauchen. Sie zahlen erst im Echtbetrieb.

Pakete und Preise

Abgerechnet wird in Credits. Ein Credit ist ein Report mit allen Werten als JSON. Der KI-Text kostet einen zweiten Credit und ist standardmäßig ausgeschaltet, weil er den Aufruf deutlich verlangsamt. Jedes Paket ist eine Einmalzahlung, kein Abonnement.

Die Schnittstelle liefert Daten, keine fertigen Texte. Das ist der Unterschied zu den Paketen im Browser. Dort ist die Lagebeschreibung das Produkt und immer enthalten. Die Schnittstelle lohnt sich, wenn Sie die Werte in Ihre eigene Oberfläche, Ihr CRM oder Ihre Bewertung übernehmen.

API Start

Einstieg und Anbindung

49 €einmalig

entspricht 0,098 € je Credit

Inklusive
500 Credits
Gültigkeit
mindestens 3 Jahre
Aufgebraucht
einfach nachkaufen
Testzugang
inklusive

API Pro

Laufender Betrieb

299 €einmalig

entspricht 0,060 € je Credit

Inklusive
5.000 Credits
Gültigkeit
mindestens 3 Jahre
Aufgebraucht
einfach nachkaufen
Testzugang
inklusive

API Scale

Hohe Volumina

799 €einmalig

entspricht 0,040 € je Credit

Inklusive
20.000 Credits
Gültigkeit
mindestens 3 Jahre
Aufgebraucht
einfach nachkaufen
Testzugang
inklusive

Enterprise

Ab 50.000 Credits im Monat. Volumen, Konditionen und Verfügbarkeit vereinbaren wir vertraglich.

Kontakt aufnehmen →

Einmalige Massenauswertung

Sie haben eine Liste und brauchen sie einmal ausgewertet, nicht laufend? Wir rechnen den Bestand in einem Durchgang und liefern eine Datei.

  • ab 30.000 Adressen: 0,05 € je Adresse
  • ab 50.000 Adressen: 0,04 € je Adresse
  • ab 100.000 Adressen: 0,03 € je Adresse

Mindestauftrag 1.500 €.

Alle Preise dieser Seite sind Nettopreise und richten sich ausschließlich an Unternehmen. Als Kleinunternehmer nach § 19 UStG erheben wir derzeit keine Umsatzsteuer. Sollten wir künftig umsatzsteuerpflichtig werden, kommt die gesetzliche Umsatzsteuer hinzu. Das Guthaben gilt je Konto, nicht je Schlüssel. Credits gelten bis zum Ende des dritten Kalenderjahres nach dem Kauf. Vier Wochen vor dem Ablauf erinnern wir Sie per E-Mail daran. Ist das Guthaben aufgebraucht, bleiben Konto und Schlüssel bestehen, und Sie können jederzeit ein weiteres Paket kaufen.

In drei Schritten

  1. 1

    Credits kaufen

    Konto anlegen, Paket wählen, Vertrag zur Auftragsverarbeitung bestätigen. Danach legen Sie unter „Konto → API-Zugang“ sofort selbst Schlüssel an. Kein Abo, die Credits gelten bis zum Ende des dritten Kalenderjahres nach dem Kauf.

  2. 2

    Gegen den Testschlüssel entwickeln

    Ein Schlüssel mit dem Präfix wd_test_ liefert immer denselben Beispielreport, kostenlos und ohne Kontingent. Ideal, um Ihre Anbindung zu schreiben.

  3. 3

    Umschalten

    Denselben Aufruf mit dem echten Schlüssel senden. An Ihrem Code ändert sich nichts, die Antwortstruktur ist identisch.

So sieht ein Aufruf aus

curl -X POST https://api.wohn-data.de/api/v1/report \
  -H "Authorization: Bearer wd_..." \
  -H "Content-Type: application/json" \
  -d '{"address": "Musterstraße 1, 66111 Saarbrücken"}'

Antwort: ein JSON-Objekt mit allen Kennzahlen, dem amtlichen Gemeindeschlüssel und der Datenversion. Der KI-Text ist optional und standardmäßig aus, weil er den Aufruf deutlich verlangsamt. Alle Felder und eine Beispielantwort.

Was Sie bekommen

Die Antwort enthält alle verfügbaren Auswertungen zur Rasterzelle, die der Adresse zugeordnet ist. Die folgenden Abschnitte beschreiben die einzelnen Datenblöcke.

meta
Metadaten für die Weiterverarbeitung: Amtlicher Gemeindeschlüssel, Rasterzellen-ID, die tatsächlich aufgelöste Adresse, Daten- und Formelversion, die verbrauchten und verbleibenden Credits und was aus dem KI-Text geworden ist.
headline
Die höchste Einzelbewertung unter den Gefahren und Belastungen der Zelle, mit Kategorie, Stufe und Ampelfarbe. Kein Mittelwert über alle Kategorien.
verdict
Ein Satz, der das Ergebnis zusammenfasst. Regelbasiert, nicht vom Sprachmodell.
tiles
Die sechs bewerteten Kategorien: Überflutungsgefahr, Hitzebelastung, Lärmbelastung, Grünzugang, Nahversorgung und ÖPNV-Anbindung. Jede mit Stufe oder Kennwert, Ampel und einem detail-Objekt mit den Rohwerten dahinter. Die Lärm-Kachel nennt in basis, worauf ihre Stufe beruht: mapped (amtliche Lärmkarte), venues (keine kartierte Quelle, eingeschätzt aus der Zahl der Lokale im Umkreis von 500 m, kein Schallpegel) oder mapped_and_venues (amtliche Lärmkarte, und die Zahl der Lokale hebt die Stufe um eine Stufe an). Die Wasser-Kachel trägt basis neighbour_cell, wenn die Adresse in einer Zelle ohne Bewohner laut Zensus liegt: Die Stufe gehört dann zur nächstgelegenen bewohnten Zelle und gilt nicht für die Adresse selbst. Eine niedrige Stufe ist zusätzlich grau.
info_tiles
Neutrale Zusatzangaben ohne Bewertung, etwa Mietniveau, nächster Supermarkt, nächster Spielplatz und ein Schutzgebiet, falls die Adresse in einem liegt. Fehlt ein Wert, kann nodata_reason den Grund nennen: suppressed steht für eine Angabe, die wir für Zellen mit weniger als 11 Einwohnern aus Datenschutzgründen nicht ausgeben.
eignungsprofile
Familie, Senioren und Pendler als Kennwert von 0 bis 100 mit Einstufung, der Angabe, aus wie vielen Merkmalen er gebildet wurde, und den Namen der Merkmale, die gefehlt haben (components_missing).
baustruktur
Ob die Bebauung im Umfeld kleinteilig, gemischt oder verdichtet ist, mit den Anteilen der Gebäudegrößen.
details
Lärm und Wasser im Detail: Pegel je Quelle und Zeitraum, Hochwasserszenarien mit Tiefe und Flächenanteil, Starkregen. Die Lärmpegel sind Obergrenzen der amtlichen 5-dB-Bänder. Der Flächenanteil eines Hochwasserszenarios (coverage_pct) ist eine vorsichtige Obergrenze: er liegt im Mittel rund 14 Prozentpunkte über dem Anteil, den die amtlichen Flächen tatsächlich bedecken. Für Schwellenwerte bitte die eigene Verteilung des Feldes verwenden, nicht die Annahme eines exakten Flächenanteils. Jeder Block nennt in observed, aus welcher Kartierung er stammt (Lärm 2022, Hochwasserkarten der Länder in der Zusammenstellung 2025, Starkregen-Hinweiskarte 2025).
datenblaetter
Bis zu sechs Tabellen mit den Zahlenwerten: Menschen, Wohnen, Nahversorgung & ÖPNV, Klima, Luft sowie Gelände & Umfeld. Jede Zeile mit Wert und Einordnung. Neben dem formatierten value steht die Zahl maschinenlesbar in raw und ihre Einheit in unit. Beide sind null, wo die Zeile ein Wort statt einer Zahl zeigt. Entfernungen sind in value und raw auf 50 Meter gerundet, weil sie ab der Mitte der Rasterzelle gemessen werden. Jede Zeile nennt in observed, wann der Wert erhoben wurde (zum Beispiel Stichtag 15. Mai 2022 für den Zensus), und in denominator, worauf sich ein Anteil oder eine häufigste Gruppe bezieht. Das Baualter zählt Gebäude, die Heizungsart Wohnungen. Die Liste vintages einer Tabelle fasst die Zeiträume ihrer Zeilen mit Beginn und Ende zusammen.
comparison
Einordnung gegen Deutschland, Gemeinde und Stadtteil, je mit Perzentil und Band. Die gezeigte Zahl steht zusätzlich in raw und unit. Beim Mietniveau bleibt raw immer null, weil wir dort nur eine Einordnung und keinen Eurobetrag ausgeben.
gemeinde, stadtteil
Name und Slug des Gebiets, in dem die Adresse liegt.
cell, gitter_id, lat, lon
Die 100-Meter-Rasterzelle als GeoJSON-Polygon, ihre stabile Kennung und der Mittelpunkt in WGS 84.
address, report_type
Die angefragte Adresse und die Stufe des Berichts. Über die API ist das immer die vollständige Auswertung.
fallback_ring, neighbour_fallback
Ob wir auf eine andere Zelle ausweichen mussten, weil der Zensus 2022 für die Zelle der Adresse keine Bewohner ausweist. Das ist der Fall, wenn dort am Stichtag 15. Mai 2022 niemand oder nur sehr wenige Menschen wohnten, zum Beispiel bei einem später gebauten Haus. Alle Werte beschreiben dann die ausgewertete Nachbarzelle. 1 ist die nächstgelegene bewohnte angrenzende Zelle, 2 eine Zelle im Umkreis von 200 Metern. Für Massenauswertungen der wichtigste Filter.
fallback_distance_m, fallback_direction
Nur bei einer ausgewichenen Zelle: die Entfernung vom Adresspunkt zum Mittelpunkt der ausgewerteten Zelle, auf 10 Meter gerundet, und die Himmelsrichtung dorthin (N, NE, E, SE, S, SW, W, NW). Sonst null.
address_note
Steht hier, wenn die Adresse nicht genau so gefunden wurde, wie sie eingegeben war. Fehlt die Hausnummer in den Kartendaten, haben wir eine nahe Nummer derselben Straße verwendet, die Lage zwischen zwei Nachbarn geschätzt oder die Straße ausgewertet. Außerdem nennt der Hinweis eine erkannte Schreibweise von Straße oder Ort und bei mehreren eingegebenen Hausnummern die ausgewertete. Ohne diesen Eintrag wurde die Adresse direkt gefunden.
match, resolved_at
Was der ausgewertete Punkt ist: house (die angefragte Hausnummer), interpolated (zwischen zwei Nachbarn geschätzt), nearest_number (eine nahe Nummer derselben Straße) oder street (ein Punkt der Straße). Dazu der Zeitpunkt, zu dem die Adresse der Zelle zugeordnet wurde.
near_border
Die Zelle liegt an der Staatsgrenze. Umfeldwerte können dort unvollständig sein, weil jenseits der Grenze keine Daten vorliegen.
starkregen_coverage
Ob für das Bundesland Starkregendaten vorliegen. Fehlen sie, bewertet die Kategorie nur Hochwasser und heißt Hochwassergefahr.
data_version, generated_at, from_cache
Datenstand, Zeitpunkt der Erstellung und ob die Antwort aus dem Zellen-Cache kam.
report_text, llm_blocked
Nur bei include_narration: der ausformulierte Bericht als Markdown, und ob das Modell die Ausgabe verweigert hat.
narration_provenance
Nur mit report_text: kennzeichnet report_text maschinenlesbar als mit KI erstellt (Art. 50 Abs. 2 KI-VO). Die Kennzahlen sind berechnet, nicht erzeugt.
Beispielantwort ansehen

Gekürzt: jede Liste zeigt nur ihren ersten Eintrag. Vollständig enthält die Antwort sechs Einträge in tiles, bis zu drei in info_tiles, drei in eignungsprofile und bis zu sechs datenblaetter. Das GeoJSON-Polygon der Zelle ist hier weggelassen. Die Werte stammen aus unserem Testdatensatz, die Struktur ist die der echten Antwort.


{
  "address": "Musterstraße 1, 66111 Musterstadt",
  "address_note": null,
  "baustruktur": {
    "ampel": "info",
    "available": true,
    "detail": {
      "dominant_class": "3bis6_wohnungen",
      "shares": {
        "13undmehr_wohnungen": 0.16,
        "1_wohnung": 0.08,
        "2_wohnungen": 0.06,
        "3bis6_wohnungen": 0.4,
        "7bis12_wohnungen": 0.3
      },
      "tier_shares": {
        "gross": 0.16,
        "klein": 0.14,
        "mittel": 0.7
      }
    },
    "key": "baustruktur",
    "kind": "label",
    "label": "Baustruktur",
    "value": "Mehrfamilienhaus-geprägt"
  },
  "comparison": {
    "gemeinde_available": true,
    "gemeinde_name": "Musterstadt",
    "metrics": [
      {
        "key": "durchschnittsalter",
        "label": "Durchschnittsalter",
        "note": null,
        "raw": 42.5,
        "scopes": {
          "deutschland": {
            "band_key": "durchschnittlich",
            "band_label": "Durchschnittlich",
            "percentile": 66
          },
          "gemeinde": {
            "band_key": "durchschnittlich",
            "band_label": "Durchschnittlich",
            "percentile": 66
          },
          "stadtteil": {
            "band_key": "durchschnittlich",
            "band_label": "Durchschnittlich",
            "percentile": 66
          }
        },
        "unit": "years",
        "value": "42,5 Jahre"
      }
    ],
    "stadtteil_available": true,
    "stadtteil_name": "Musterviertel"
  },
  "data_version": "golden000000",
  "datenblaetter": [
    {
      "rows": [
        {
          "denominator": "Personen",
          "label": "Bevölkerungsdichte",
          "observed": "Stichtag 15. Mai 2022",
          "raw": 240,
          "sub": "Median der Wohnlagen in Deutschland: 30 Personen je Hektar",
          "unit": "persons_per_ha",
          "value": "240 Personen je Hektar",
          "vintage": "zensus2022"
        }
      ],
      "title": "Soziodemografie",
      "vintages": [
        {
          "end": "2022-05-15",
          "id": "zensus2022",
          "period_de": "Stichtag 15. Mai 2022",
          "source": "Zensus 2022",
          "start": "2022-05-15"
        }
      ]
    }
  ],
  "details": {
    "laerm": {
      "any_exposure": true,
      "entries": [
        {
          "hits": 5,
          "period": "lden",
          "source": "road",
          "value": "66 dB Lden"
        }
      ],
      "overall": "66 dB Lden (Straße)",
      "observed": "Kartierung 2022",
      "vintage": "uba_laerm"
    },
    "wasser": {
      "entries": [
        {
          "area_type": "1",
          "coverage_pct": 8.0,
          "depth": "0,8 m",
          "family": "river",
          "scenario": "hq100"
        }
      ],
      "observed": "Zusammenstellung 2025, Stand der Länderkarten unterschiedlich",
      "starkregen": {
        "deep_pct": 3.0,
        "flooded_pct": 12.0,
        "observed": "Ausgabe 2025",
        "vintage": "bkg_starkregen"
      },
      "vintage": "bfg_hochwasser",
      "zuers_class": 3
    }
  },
  "eignungsprofile": [
    {
      "ampel": "green",
      "available": true,
      "detail": {
        "band": "Gut geeignet",
        "components_total": 6,
        "components_used": 6,
        "gruen": 0.52,
        "hitze": 0.25,
        "kita": 1.0,
        "ruhe": 0.6,
        "schule": 1.0,
        "spielplatz": 0.85
      },
      "key": "profil_familie",
      "kind": "score",
      "label": "Familien-Eignung",
      "value": 72
    }
  ],
  "fallback_direction": null,
  "fallback_distance_m": null,
  "fallback_ring": 0,
  "from_cache": false,
  "gemeinde": {
    "land": "SL",
    "name": "Musterstadt",
    "published": true,
    "slug": "musterstadt"
  },
  "generated_at": "2026-07-16T12:00:00+00:00",
  "gitter_id": "crs3035res100mn2691750e4341150",
  "headline": {
    "ampel": "red",
    "category_key": "water_risk_level",
    "category_label": "Überflutungsgefahr",
    "has_unknown_risk": false,
    "level": "Hoch",
    "note": "Höchste Gefahr oder Belastung der Rasterzelle. Kein Mittelwert über alle Kategorien."
  },
  "info_tiles": [
    {
      "ampel": "green",
      "available": true,
      "detail": null,
      "key": "miete_level",
      "kind": "level",
      "label": "Mietniveau",
      "value": "Gering"
    }
  ],
  "lat": 49.234,
  "lon": 6.994,
  "match": "house",
  "near_border": true,
  "neighbour_fallback": false,
  "report_type": "voll",
  "resolved_at": "2026-07-16T12:00:00+00:00",
  "stadtteil": {
    "city_slug": "musterstadt",
    "name": "Musterviertel",
    "published": true,
    "slug": "musterviertel"
  },
  "starkregen_coverage": "verfuegbar",
  "tiles": [
    {
      "ampel": "red",
      "available": true,
      "detail": {
        "flood_layer_assessed": true,
        "flood_risk_label": "HQ100",
        "flood_zuers_class": 3,
        "hochwasser_present": true,
        "hochwasser_severity": 3,
        "starkregen_assessed": true,
        "starkregen_deep_pct": 3.0,
        "starkregen_flooded_pct": 12.0,
        "starkregen_max_class": 3,
        "starkregen_severity": 2
      },
      "key": "water_risk_level",
      "kind": "level",
      "label": "Überflutungsgefahr",
      "value": "Hoch"
    }
  ],
  "verdict": "Diese Lage bringt eine erhöhte Hochwasser- und Starkregengefahr sowie eine hohe sommerliche Hitzebelastung mit sich.",
  "meta": {
    "api_version": "v1",
    "request_id": "b3f1c8e2-4a17-4d90-9f21-7c0a5e6d1234",
    "ags": "10041000",
    "gitter_id": "crs3035res100mn2691750e4341150",
    "resolved_address": "Musterstraße 1, 66111 Musterstadt",
    "match": "house",
    "address_note": null,
    "fallback_ring": 0,
    "data_version": "golden000000",
    "composites_version": "3.2",
    "generated_at": "2026-07-16T12:00:00+00:00",
    "from_cache": false,
    "idempotent_replay": false,
    "sandbox": false,
    "credits_charged": 1,
    "narration_status": "not_requested",
    "credits_remaining": 499
  }
}

Denselben Aufbau liefert der kostenlose Testschlüssel, bevor Sie ein Paket buchen. Sie sehen also vor dem Kauf genau das, was Sie später bekommen.

Technische Dokumentation

Alles zum Anbinden. Klappen Sie auf, was Sie gerade brauchen. Eine maschinenlesbare Beschreibung liegt unter /api/v1/openapi.json.

Authentifizierung

Jede Anfrage trägt einen API-Schlüssel. Schlüssel legen Sie in Ihrem Konto unter „API-Zugang“ an. Der Schlüssel wird genau einmal angezeigt, danach liegt bei uns nur noch ein Hash. Verlieren Sie ihn, legen Sie einen neuen an.

Ein Schlüssel ist ein Passwort. Legen Sie ihn nicht in ein öffentliches Repository und geben Sie ihn nicht im Browser preis, denn er wirkt ohne weitere Anmeldung.

Authorization: Bearer wd_IHR_SCHLUESSEL
# alternativ
X-API-Key: wd_IHR_SCHLUESSEL
Endpunkte

GET /api/v1/account

Prüft den Schlüssel und nennt den Verbrauch des laufenden Tages. Der Aufruf verbraucht selbst kein Kontingent.

curl -H "Authorization: Bearer wd_..." \
  https://api.wohn-data.de/api/v1/account

POST /api/v1/report

Eine Adresse hinein, ein vollständiger Report heraus. Geliefert wird immer die vollständige Auswertung, nicht die kostenlose Kurzfassung. Felder im Anfragekörper:

  • address (Pflicht): die zu prüfende Adresse in Deutschland.
  • include_narration (optional, Standard false): liefert zusätzlich den KI-Text als report_text. Kostet zwei Credits statt einem und dauert deutlich länger. Berechnet werden die zwei Credits nur, wenn der Text auch geliefert wird. Ob das der Fall ist, steht in meta.narration_status.
  • wide_fallback (optional, Standard false): liegt die Adresse in einer Rasterzelle ohne Zensus-Daten, suchen wir ohne diesen Schalter in den acht angrenzenden Zellen. Mit ihm suchen wir auch in den 16 Zellen dahinter und nehmen die bewohnte Zelle, deren Mittelpunkt der Adresse am nächsten liegt. Das ist eine geänderte Anfrage und keine Wiederholung. Senden Sie sie deshalb mit einem neuen Idempotency-Key.
Metadaten in der Antwort

Jede erfolgreiche Antwort enthält einen Block meta mit den Feldern, die Sie zum Zusammenführen mit eigenen Daten brauchen:

  • ags: der achtstellige Amtliche Gemeindeschlüssel. Der Schlüssel, über den Sie unsere Ergebnisse mit eigenen Beständen oder amtlichen Statistiken verbinden.
  • gitter_id: die 100-Meter-Rasterzelle, auf die sich alle Werte beziehen. Zwei Adressen mit derselben Zelle haben identische Werte.
  • resolved_address: die Adresse, die das Geocoding tatsächlich getroffen hat. Mit Ihrer Eingabe vergleichen, um stille Fehltreffer bei Tippfehlern zu erkennen.
  • fallback_ring: 0 heißt, die Adresse liegt in einer bewohnten Zelle. 1 heißt, dass die nächstgelegene bewohnte angrenzende Zelle verwendet wurde, 2 eine Zelle aus der erweiterten Suche (nur mit wide_fallback). Wie weit ihr Mittelpunkt von der Adresse entfernt ist und in welcher Richtung er liegt, steht in fallback_distance_m und fallback_direction. Für Auswertungen sollten Sie diese Fälle kennzeichnen.
  • data_version und composites_version: Stand der Daten und Version der Berechnungsvorschrift. Beide mitspeichern, sonst lässt sich ein Ergebnis später nicht mehr nachvollziehen.
  • credits_charged: was der Aufruf gekostet hat.
  • credits_remaining: das Guthaben nach dem Aufruf. Bei Enterprise und im Testzugang ist es null, was nicht null Credits bedeutet.
  • narration_status: was aus dem KI-Text geworden ist. not_requested heißt, er war nicht angefragt. delivered heißt, er steht in report_text. blocked heißt, das Modell hat keinen Text geliefert. busy heißt, die Kapazität war erschöpft und ein späterer Versuch kann gelingen. failed heißt, der Aufruf des Modells ist fehlgeschlagen. Nur bei delivered kostet der Aufruf zwei Credits, sonst einen.
  • request_id: identisch mit dem Antwort-Header X-Request-ID.
Was die Werte räumlich bedeuten

Alle Werte gelten für eine 100-Meter-Rasterzelle, aber nicht jeder ist dort gemessen. Manche sind Mittel über ein Quadrat um die Zelle, manche zählen in einem Kreis, manche stammen aus einem 1-km-Rasterfeld, und manche sind Meldungen der Anbieter. Für Auswertungen gilt die Bezugsfläche in der letzten Spalte.

WertQuelleArtBezugsfläche
Baumkronen im UmfeldCopernicus Tree Cover Density 2023Auflösung: 100 mZeitbezug: Referenzjahr 2023Messung aus SatellitendatenMittel über ein Quadrat von 1,1 × 1,1 km um die Zelle.Bezugsgröße: Fläche
Baumkronen im 500-m-QuadratCopernicus Tree Cover Density 2023Auflösung: 100 mZeitbezug: Referenzjahr 2023Messung aus SatellitendatenMittel über ein Quadrat von 500 × 500 m um die Zelle.Bezugsgröße: Fläche
Grünflächen im UmfeldOpenStreetMap (Parks, Wald, Wiesen) ergänzt um die amtliche Flächennutzung des IÖR-Monitors (Wald, Grünland)Auflösung: Flächen, auf 100 m gerastert, je Zelle der größere Wert beider QuellenZeitbezug: Stand 24. August 2026Kartierung (was erfasst ist, nicht zwingend alles)Anteil in einem Quadrat von 1,1 × 1,1 km um die Zelle.Bezugsgröße: Fläche
Oberflächentemperatur (Sommer)Landsat 8/9, Sommermediane 2018 bis 2025Auflösung: 30 m, auf das 100-m-Raster übertragenZeitbezug: Sommer 2018 bis 2025Messung aus SatellitendatenDie Zelle. Gemessen wird die Temperatur der Oberflächen, nicht der Luft.
VersiegelungsgradCopernicus Imperviousness Density 2024Auflösung: 100 mZeitbezug: Referenzjahr 2024Messung aus SatellitendatenDie Zelle.Bezugsgröße: Fläche
Heiße Tage (ab 30 °C)DWD, Normalperiode 1991 bis 2020Auflösung: 1 kmZeitbezug: Mittel der Jahre 1991 bis 2020Stationswerte auf ein Raster übertragenDas 1-km-Rasterfeld des DWD, in dem die Zelle liegt. Lufttemperatur.
WärmeinselintensitätDWD UHI-MAP, Modell über 1995 bis 2024Auflösung: 1 kmZeitbezug: Modellzeitraum 1995 bis 2024ModellrechnungDas 1-km-Rasterfeld des DWD-Modells, in dem die Zelle liegt. Unterschied der Lufttemperatur zum ländlichen Umland im Mittel der Tagesmaxima, keine absolute Temperatur.
Stickstoffdioxid (NO2)Europäische Umweltagentur, Jahreskarte 2024Auflösung: 1 kmZeitbezug: Jahr 2024ModellrechnungDas 1-km-Rasterfeld der EEA-Karte. Hintergrundbelastung, direkt an einer stark befahrenen Straße liegt der Wert höher.
Feinstaub (PM2,5)Europäische Umweltagentur, Jahreskarte 2024Auflösung: 1 kmZeitbezug: Jahr 2024ModellrechnungDas 1-km-Rasterfeld der EEA-Karte. Hintergrundbelastung.
Ozon (Sommerspitze)Europäische Umweltagentur, Jahreskarte 2024Auflösung: 1 kmZeitbezug: Jahr 2024ModellrechnungDas 1-km-Rasterfeld der EEA-Karte. Hintergrundbelastung.
Internet (verfügbare Geschwindigkeit)Bundesnetzagentur, Gigabit-Grundbuch (Breitbandatlas)Auflösung: 100-m-Raster des BKGZeitbezug: Stand 31. Dezember 2025Meldung der Anbieter, nicht gemessenDie Zelle, flächengewichtet aus dem 100-m-Raster des BKG übertragen. Gemeldete Verfügbarkeit der Anbieter, keine gemessene Leistung.Bezugsgröße: Haushalte
Mobilfunk (5G)Bundesnetzagentur, Gigabit-GrundbuchAuflösung: 100-m-Raster des BKGZeitbezug: Stand Januar 2026Meldung der Anbieter, nicht gemessenDie Zelle, aus dem 100-m-Raster des BKG übertragen. Gemeldete Versorgung der Netzbetreiber, keine gemessene Leistung.Bezugsgröße: Netzbetreiber
Ziele im Umkreis von 500 mOpenStreetMapAuflösung: Punkte und FlächenZeitbezug: Stand 24. August 2026Kartierung (was erfasst ist, nicht zwingend alles)Ein Kreis mit 500 m Radius um den Mittelpunkt der Zelle, in Luftlinie.Bezugsgröße: Einrichtungen
Haltestellen und Abfahrten im Umkreis von 500 mDELFI-Sollfahrplan (GTFS)Auflösung: Haltestellen als PunkteZeitbezug: Mittel der Werktage vom 1. August bis 12. Dezember 2026Meldung der Anbieter, nicht gemessenEin Kreis mit 500 m Radius um den Mittelpunkt der Zelle, in Luftlinie. Fahrplan, nicht tatsächlich gefahrene Fahrten.Bezugsgröße: Haltestellen und Abfahrten
BevölkerungsdichteZensus 2022Auflösung: 100 mZeitbezug: Stichtag 15. Mai 2022Amtliche ZählungDie Zelle.Bezugsgröße: Personen
DurchschnittsalterZensus 2022Auflösung: 100 mZeitbezug: Stichtag 15. Mai 2022Amtliche ZählungDie Zelle.Bezugsgröße: Personen
Haushaltsgröße (häufigste)Zensus 2022Auflösung: 100 mZeitbezug: Stichtag 15. Mai 2022Amtliche ZählungDie Zelle.Bezugsgröße: Haushalte
Anteil ausländische BevölkerungZensus 2022Auflösung: 100 mZeitbezug: Stichtag 15. Mai 2022Amtliche ZählungDie Zelle.Bezugsgröße: Personen
Größte ReligionsgruppeZensus 2022Auflösung: 100 mZeitbezug: Stichtag 15. Mai 2022Amtliche ZählungDie Zelle.Bezugsgröße: Personen
Gebäudealter (häufigste Klasse)Zensus 2022Auflösung: 100 mZeitbezug: Stichtag 15. Mai 2022Amtliche ZählungDie Zelle.Bezugsgröße: Gebäude mit Wohnraum
Heizung der Wohnungen (häufigste Art)Zensus 2022Auflösung: 100 mZeitbezug: Stichtag 15. Mai 2022Amtliche ZählungDie Zelle.Bezugsgröße: Wohnungen
Wohnfläche je WohnungZensus 2022Auflösung: 100 mZeitbezug: Stichtag 15. Mai 2022Amtliche ZählungDie Zelle.Bezugsgröße: Wohnungen
EigentümerquoteZensus 2022Auflösung: 100 mZeitbezug: Stichtag 15. Mai 2022Amtliche ZählungDie Zelle.Bezugsgröße: bewohnte Wohnungen
LeerstandsquoteZensus 2022Auflösung: 100 mZeitbezug: Stichtag 15. Mai 2022Amtliche ZählungDie Zelle.Bezugsgröße: Wohnungen
Marktaktive LeerstandsquoteZensus 2022Auflösung: 100 mZeitbezug: Stichtag 15. Mai 2022Amtliche ZählungDie Zelle.Bezugsgröße: Wohnungen in Wohngebäuden mit mehr als zwei Wohnungen
Fehler und Statuscodes

Fehler tragen den passenden HTTP-Status und in error ein Objekt mit code, message, request_id und retry. Werten Sie immer den code aus, nicht den Text. Der Text kann sich ändern, der Code nicht.

{
  "error": {
    "code": "ADDRESS_NOT_FOUND",
    "message": "The address could not be geocoded. ...",
    "request_id": "9f2c1ab73d4e5f60",
    "retry": "fix_request"
  }
}

Das gilt für alle Fehler, auch für ungültige Eingaben. Bei einer fehlerhaften Anfrage kommt INVALID_REQUEST zurück, zusätzlich mit details und der Angabe, welches Feld beanstandet wurde.

{
  "error": {
    "code": "INVALID_REQUEST",
    "message": "The request body is not valid. Check: address.",
    "request_id": "9f2c1ab73d4e5f60",
    "retry": "fix_request",
    "details": [
      { "field": "address", "reason": "String should have at least 3 characters",
        "type": "string_too_short" }
    ]
  }
}
StatuscodeBedeutungretry
400BAD_REQUESTAnfrage nicht verarbeitbar.fix_request
401MISSING_API_KEYKein Schlüssel gesendet.fix_account
401INVALID_API_KEYSchlüssel unbekannt, gelöscht oder Paket beendet.fix_account
402INSUFFICIENT_CREDITSGuthaben aufgebraucht. Neues Paket kaufen, der Schlüssel bleibt gültig.fix_account
403FORBIDDENDer Schlüssel darf diesen Aufruf nicht ausführen.fix_account
404ADDRESS_NOT_FOUNDGeocoding hat keinen Treffer. Schreibweise prüfen.fix_request
404ADDRESS_AMBIGUOUSStraße und Hausnummer gibt es in mehreren Orten. Die Orte stehen in candidates. Postleitzahl und Ort ergänzen oder ein label aus candidates senden.fix_request
404PLACE_NOT_ADDRESSEin Ort statt einer Adresse. Straße und Hausnummer ergänzen.fix_request
404HOUSENUMBER_NOT_FOUNDHausnummer nicht verzeichnet, und die geschätzte Lage hat keine Zensus-Zelle.fix_request
404OUTSIDE_GERMANYTreffer liegt außerhalb Deutschlands.fix_request
404NO_CENSUS_DATAKeine bewohnte Zelle in der Nähe. Mit wide_fallback und einem neuen Idempotency-Key erneut senden.fix_request
404ADDRESS_RESOLUTION_FAILEDDie Adresse ließ sich keiner Rasterzelle zuordnen.fix_request
404NOT_FOUNDUnbekannter Pfad.fix_request
405METHOD_NOT_ALLOWEDFalsche HTTP-Methode für diesen Pfad.fix_request
409REQUEST_IN_PROGRESSEin Aufruf mit diesem Idempotency-Key läuft noch.retry_later
411LENGTH_REQUIREDDer Content-Length-Header fehlt.fix_request
413REQUEST_TOO_LARGEDer Anfragekörper ist zu groß.fix_request
422INVALID_REQUESTAnfrage formal fehlerhaft. Welches Feld, steht in details.fix_request
422IDEMPOTENCY_KEY_REUSEDDerselbe Schlüssel mit anderem Anfragekörper.fix_request
422IDEMPOTENCY_KEY_TOO_LONGDer Idempotency-Key ist zu lang.fix_request
429DAILY_QUOTA_EXCEEDEDTageskontingent erreicht. Retry-After beachten.retry_later
429TOO_MANY_CONCURRENT_REQUESTSMehr als drei Anfragen gleichzeitig.retry_later
429RATE_LIMITEDZu viele Anfragen in kurzer Zeit. Retry-After beachten.retry_later
500INTERNAL_ERRORFehler auf unserer Seite.retry_later
503SERVICE_BUSYKurzzeitig überlastet.retry_later
503GEOCODER_UNAVAILABLEGeocoding nicht erreichbar.retry_later
503SANDBOX_UNAVAILABLEDie Beispielantwort des Testzugangs ist gerade nicht verfügbar.retry_later
503API_NOT_AVAILABLEDie Schnittstelle ist noch nicht freigeschaltet.retry_later
andereREQUEST_FAILEDSonstiger Fehler ohne eigenen Code.retry_later

Ein 404 ist ein endgültiges Ergebnis für diese Adresse und sollte nicht wiederholt werden. Was nach einem Fehler zu tun ist, steht in retry. fix_request heißt, dieselbe Anfrage bekommt dieselbe Antwort, sie muss geändert werden. fix_account heißt, erst Schlüssel oder Guthaben in Ordnung bringen. Danach darf derselbe Idempotency-Key wiederholt werden. retry_later heißt, dieselbe Anfrage später erneut senden und dabei Retry-After beachten.

Wiederholte Aufrufe absichern (Idempotency-Key)

Bricht eine Verbindung ab, wissen Sie nicht, ob der Aufruf angekommen ist. Schicken Sie deshalb bei Massenläufen einen Idempotency-Key mit, zum Beispiel Ihre Datensatznummer. Ein Aufruf mit demselben Schlüssel wird dann höchstens einmal berechnet, auch wenn die Verbindung abbricht oder unser Server währenddessen neu startet. Bei einer Wiederholung steht in der Antwort meta.idempotent_replay: true und meta.credits_charged: 0.

curl -X POST https://api.wohn-data.de/api/v1/report \
  -H "Authorization: Bearer wd_..." \
  -H "Idempotency-Key: batch-2026-08-04-row-00042" \
  -H "Content-Type: application/json" \
  -d '{"address": "Musterstraße 1, 66111 Saarbrücken"}'
  • Derselbe Schlüssel mit einem anderen Anfragekörper ergibt 422 IDEMPOTENCY_KEY_REUSED. Das ist Absicht, denn es ist fast immer ein Fehler im aufrufenden Programm.
  • War der erste Versuch erfolglos, liefert die Wiederholung denselben Fehler zurück, ohne erneut zu rechnen.
  • Vorübergehende Fehler wie 429 oder 503 geben den Schlüssel wieder frei, ebenso 402, damit derselbe Aufruf nach dem Kauf eines Pakets durchgeht.
  • Bricht ein Aufruf auf unserer Seite ab, ist der Schlüssel nach spätestens zehn Minuten wieder frei. War der abgebrochene Aufruf schon berechnet, liefert die Wiederholung den Report ohne erneute Berechnung.
  • Schlüssel gelten mindestens 24 Stunden. Ein Aufruf mit einem abgelaufenen Schlüssel ist ein neuer Aufruf und wird berechnet.

Wir speichern dabei nicht die Antwort, sondern nur, wie der Aufruf ausgegangen ist. So bleibt es dabei, dass wir Ihre Adressen nicht vorhalten. Die Antwort wird bei einer Wiederholung deshalb neu erzeugt. Die Werte sind dieselben, solange sich Datenstand und Berechnungsvorschrift nicht geändert haben, was meta.data_version und meta.composites_version zeigen. request_id und generated_at sind bei jeder Antwort neu.

Testzugang (Sandbox)

Für die Entwicklung legen Sie im Konto einen Testschlüssel an. Er beginnt mit wd_test_ und liefert für jede Anfrage einen festen Beispielreport in genau der Struktur, die auch die echten Antworten haben.

  • verbraucht kein Kontingent,
  • unterliegt keiner Gleichzeitigkeitsgrenze,
  • antwortet immer mit meta.sandbox: true. Prüfen Sie dieses Feld, damit Testdaten nie in Ihre Auswertung geraten.

Die Werte beziehen sich immer auf dieselbe Adresse und ändern sich nicht, egal was Sie anfragen. Der Testzugang dient dazu, Ihre Anbindung zu schreiben, nicht dazu, Ergebnisse zu prüfen.

Damit Sie auch die Fehlerfälle Ihrer Anbindung schreiben können, antwortet der Testzugang auf die folgenden Adressen mit dem jeweiligen Fehler oder Teilergebnis statt mit dem Beispielreport, in genau der Form einer echten Antwort. Die Adresse wird genau so als address gesendet.

addressAntwort
sandbox-not-found404 ADDRESS_NOT_FOUND
sandbox-ambiguous404 ADDRESS_AMBIGUOUS mit zwei Einträgen in candidates
sandbox-outside-germany404 OUTSIDE_GERMANY
sandbox-no-census-data404 NO_CENSUS_DATA
sandbox-insufficient-credits402 INSUFFICIENT_CREDITS
sandbox-quota-exceeded429 DAILY_QUOTA_EXCEEDED mit Retry-After
sandbox-service-busy503 SERVICE_BUSY mit Retry-After
sandbox-narration-failed200 mit Report, aber ohne KI-Text: report_text ist null und meta.narration_status ist failed
Grenzen und Lastverhalten

Das Kontingent gilt je Konto, nicht je Schlüssel. Zusätzliche Schlüssel erhöhen es also nicht, sie dienen der Trennung Ihrer Systeme. Die genaue Zahl steht in Ihrem Konto unter „API-Zugang“.

Pro Konto dürfen höchstens drei Anfragen gleichzeitig laufen. Darüber antworten wir sofort mit 429 TOO_MANY_CONCURRENT_REQUESTS, damit Ihr Programm reagieren kann, statt in einen Timeout zu laufen. Ist der Dienst insgesamt ausgelastet, kommt stattdessen 503.

Für größere Bestände empfehlen wir wenige parallele Verbindungen statt vieler, und include_narration im Massenbetrieb ausgeschaltet zu lassen: der KI-Text ist der langsamste und teuerste Teil, und ohne ihn verlassen Ihre Daten unseren Verarbeitungskreis nicht in Richtung eines KI-Anbieters.

Nachvollziehbarkeit und Protokoll

Jede Antwort trägt den Header X-Request-ID. Wenn Sie eine Anfrage reklamieren, nennen Sie diesen Wert, dann finden wir den Vorgang. Sie können auch selbst einen Wert mitschicken, dann verwenden wir Ihren. Er muss zwischen 8 und 64 Zeichen lang sein und darf nur Buchstaben, Ziffern, Punkt, Bindestrich und Unterstrich enthalten. Andernfalls vergeben wir einen eigenen Wert, statt Ihren stillschweigend zu verändern.

In Ihrem Konto finden Sie unter „API-Verlauf“ die Aufrufe der letzten 30 Tage mit Zeitpunkt, Status, Fehlercode, Dauer und verwendetem Schlüssel. Die abgefragte Adresse steht dort nicht, weil wir sie nicht speichern. Genau dafür ist die selbst gesetzte Kennung gedacht: Schicken Sie Ihre Datensatznummer als X-Request-ID mit, dann verbinden Sie den Verlauf mit Ihren eigenen Daten, ohne dass uns die Adresse bekannt wird.

Bitte übermitteln Sie in diesem Feld keine personenbezogenen Daten, also keine Namen und keine Kundendaten. Eine interne Nummer erfüllt denselben Zweck.

Stabilität und Versionierung

Der Pfad enthält die Version. Innerhalb von v1 nehmen wir nur ergänzende Änderungen vor, etwa zusätzliche Felder. Ihre Auswertung sollte unbekannte Felder daher ignorieren statt an ihnen zu scheitern. Eine Änderung, die bestehende Felder entfernt oder umdeutet, erscheint als v2.

Nutzungsrechte, Datenschutz und Grenzen der Aussage

Der Schlüssel erlaubt genau das, was die AGB sonst untersagen, nämlich die systematische Abfrage. Erlaubt ist die Nutzung der Ergebnisse in Ihren eigenen Prozessen und gegenüber Ihrer eigenen Kundschaft. Untersagt bleiben der Aufbau eines eigenen oder konkurrierenden Datenbestands aus den Antworten, die Weitergabe als eigenes Produkt und der Weiterverkauf einzelner Auskünfte an Verbraucher. Die Quellenangaben der Datenlieferanten sind mitzuführen, siehe Datenquellen.

Wenn Sie Adressen Ihrer eigenen Kundschaft an die Schnittstelle senden, verarbeiten wir diese in Ihrem Auftrag. Dafür schließen wir vor der Freischaltung einen Vertrag zur Auftragsverarbeitung nach Art. 28 DSGVO. Sprechen Sie uns darauf an, wir halten ihn bereit.

Die Ergebnisse sind eine Information und kein Gutachten. Das gilt über die Schnittstelle genauso wie auf der Website, siehe Methodik & Grenzen der Daten.

Passt das zu Ihrem Bestand?

Schreiben Sie uns kurz, worum es geht. Wir schalten den Zugang frei, schicken den Vertrag zur Auftragsverarbeitung, und Sie können am selben Tag gegen den Testschlüssel entwickeln.

Zugang anfragen

Sie suchen keine Schnittstelle, sondern einen Zugang für Ihr Team? Im Office-Paket arbeitet Ihr Team mit einem gemeinsamen Konto, siehe Preise & Pakete.