REST API

GET /api/bodenrichtwertFür Entwickler

Hauptendpunkt — eine Adresse rein, ein normalisierter Bodenrichtwert raus.

Request

GET https://api.bodenrichtwert.ai/api/bodenrichtwert
Authorization: Bearer brw_pat_...

Query-Parameter

NamePflichtTypBeschreibung
addressjastringVollständige Adresse mit PLZ und Ort
nutzungsartneinW | M | G | S | L | F | SOFilter auf eine oder mehrere Nutzungsarten — Parameter mehrfach anhängen (?nutzungsart=W&nutzungsart=G), nicht kommagetrennt. Ohne Angabe: kein Filter, alle an der Adresse vorhandenen Nutzungsarten werden zurückgegeben

Nutzungsart-Codes:

CodeNutzungsart
WWohnbaufläche
MGemischte Baufläche
GGewerbliche Baufläche
SSonderbaufläche (z. B. Kliniken, Schulen)
LLandwirtschaftliche Fläche
FForstwirtschaftliche Fläche
SOSonstige Fläche

Response (200 OK)

bodenrichtwerte ist ein Array und enthält alle an der Koordinate gefundenen Nutzungsarten, sortiert W, M, G, S, L, F, SO — außer der Request filtert mit nutzungsart auf einen oder mehrere bestimmte Codes, dann enthält es nur die passenden Einträge. Reales Beispiel für „Platz d. Menschenrechte 1, 30159 Hannover" mit explizitem ?nutzungsart=S — die Koordinate liegt in der Sonderbaufläche des Regierungsviertels:

{
  "address_input": "Platz d. Menschenrechte 1, 30159 Hannover",
  "address_resolved": "Platz der Menschenrechte 1, 30159 Hannover - Mitte",
  "coordinates": { "lat": 52.368, "lon": 9.737 },
  "bodenrichtwerte": [
    {
      "nutzungsart": "Sonderbaufläche",
      "code": "S",
      "brw_euro_pro_m2": 800,
      "stichtag": "2025-01-01",
      "gemeinde": "Hannover",
      "gutachterausschuss": "",
      "bodenrichtwertnummer": "04305204",
      "zonenbezeichnung": "Regierungsviertel"
    }
  ],
  "cache_hit": false,
  "attribution": {
    "text": "© Daten der Gutachterausschüsse für Grundstückswerte 2025, dl-de/by-2-0",
    "license_url": "https://www.govdata.de/dl-de/by-2-0",
    "source_url": "https://www.bodenrichtwerte-boris.de",
    "year": 2025
  },
  "disclaimer": "Der Bodenrichtwert ist ein gutachterlicher Orientierungswert — kein Verkehrswert, kein Verkaufspreis, keine Rechtsberatung."
}

Dieselbe Koordinate liegt auch in der flächendeckenden Forst-Zone der Stadt (bodenrichtwertnummer: "04309601"). Mit ?nutzungsart=S&nutzungsart=F (Parameter zweimal anhängen, nicht kommagetrennt) liefert ein einzelner Request beide Einträge zusammen; ganz ohne nutzungsart wären zusätzlich alle anderen an der Koordinate vorhandenen Nutzungsarten enthalten.

Response-Felder pro Bodenrichtwert

FeldTypPflichtBeschreibung
nutzungsartstringjaMenschenlesbare Bezeichnung (z. B. „Wohnbaufläche")
codestringjaKurz-Code, Enum W | M | G | S | L | F | SO
brw_euro_pro_m2numberjaBodenrichtwert in Euro pro Quadratmeter
stichtagstringjaStichtag im ISO-Format YYYY-MM-DD
gemeindestringjaGemeindename
gutachterausschussstringjaName des Gutachterausschusses (in NI/einigen Ländern upstream leer — bleibt als Leerstring erhalten)
bodenrichtwertnummerstringoptionalEindeutige Zonen-ID (BRN) — stabil pro Koordinate, zitierfähig im Gutachten
zonenbezeichnungstringoptionalZonenname (BZN), meist Ortsteil oder Quartier, z. B. „Regierungsviertel" oder „Stederdorf W"
bauweisestringoptionalBauweise (BAW), z. B. „offen" / „geschlossen"
geschossflaechenzahlnumberoptionalGeschossflächenzahl (GFZ)
grundflaechenzahlnumberoptionalGrundflächenzahl (GRZ)
vollgeschosszahlnumberoptionalAnzahl Vollgeschosse (VGZ)
baumassenzahlnumberoptionalBaumassenzahl (BMZ) — meist in dichter Gewerbe-/Hochhausbebauung
wertrel_geschossflaechenzahlnumberoptionalWertrelevante GFZ (WGF) — die vom Gutachterausschuss für den BRW angesetzte Referenz-GFZ. Notwendig, wenn ein Grundstück mit abweichender GFZ umgerechnet werden soll.
Optionale Felder sind nur dann Teil der Response, wenn die Quelle sie für die angefragte Zone veröffentlicht. Leere Upstream-Werte werden nicht als leere Strings durchgereicht — der Key fehlt dann im JSON.

Fehler

Alle Fehler folgen demselben Format: { "error": "<code>", "message": "<Beschreibung>", "status": <HTTP-Status> }.

StatusCodeBedeutung
400missing_addressQuery-Parameter address fehlt
400invalid_nutzungsartUngültiger nutzungsart-Code — gültig sind W, M, G, S, L, F, SO
401missing_tokenAuthorization: Bearer <token>-Header fehlt
401invalid_tokenToken ungültig oder abgelaufen
402limit_reachedMonatslimit erreicht — Plan upgraden
402payment_past_dueLetzte Zahlung fehlgeschlagen — Zahlungsdaten im Dashboard aktualisieren
404address_not_foundAdresse konnte nicht geokodiert werden
404no_dataFür diese Koordinate liegt kein Bodenrichtwert vor
429rate_limit_exceededZu viele Requests pro Minute (120/min IP-Limit) — Retry-After-Header beachten
451restricted_stateSH/SN/BY — aktuell keine Daten verfügbar
503service_errorDatenquelle temporär nicht erreichbar
500processing_errorUnerwarteter Fehler bei der Verarbeitung

Zwischenspeicherung

Antworten werden 7 Tage in Cloudflare KV zwischengespeichert (Schlüssel: brw:v3:SHA-256(lat,lon)), unabhängig vom nutzungsart-Filter — intern wird immer der vollständige Datensatz einer Koordinate zwischengespeichert, gefiltert wird bei jedem Read. Liegt bereits ein Ergebnis vor, ist die Response identisch; das Feld cache_hit: true im Response-Body zeigt das an. Die Key-Version v3 sorgt dafür, dass Einträge aus der Zeit vor dem Default-Wechsel automatisch ignoriert werden.