immokit-ai Bodenwert API

The Bodenwert API from immokit-ai — 1 operation(s) for bodenwert.

GitHub OpenAPI

Operations 1

POST /api/bodenwert Calculate the Bodenwert (density-adjusted land value) for a plot #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/immokit-ai:immokit-ai-bodenwert-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

immokit-ai-bodenwert-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: bodenrichtwert.ai Bodenwert API
  description: 'API for retrieving German land values (Bodenrichtwerte) by address.

    Provide a full German address and receive the land value in EUR per square meter,

    including the land use type, reference date, municipality, and source attribution.

    Covers all German states except Schleswig-Holstein, Sachsen, and Bayern (blocked for legal reasons, HTTP 451).'
  version: 1.2.0
  contact:
    url: https://api.bodenrichtwert.ai
servers:
- url: https://api.immokit.ai
  description: Production REST API
tags:
- name: Bodenwert
paths:
  /api/bodenwert:
    post:
      operationId: calculateBodenwert
      summary: Calculate the Bodenwert (density-adjusted land value) for a plot
      description: 'Calculates the actual land value of a plot at a building density (Geschossflächenzahl, GFZ)

        that differs from the one the official Bodenrichtwert is based on. Pure calculation — no address

        lookup, no external data-source call — and it does NOT count against your monthly request quota.


        Without `flaeche` it returns the actual Bodenrichtwert (density-adjusted, EUR/m²); with `flaeche`

        it additionally returns the Bodenwert (total plot value, EUR).


        Model: the standard German conversion-coefficient formula, used by the Gutachterausschüsse as

        the fallback when no zone-specific table is published (cf. ErbStH on § 179 BewG):

        - K(GFZ) = 0.6·√GFZ + 0.2·GFZ + 0.2 (normalized so K(1.0) = 1.0)

        - bodenrichtwert_tatsaechlich = brw × K(gfz_tatsaechlich) / K(gfz_referenz)


        The reference GFZ (`gfz_referenz`) is the density the Bodenrichtwert is calibrated for — from

        `GET /api/bodenrichtwert` it is the `wertrel_geschossflaechenzahl` field. Not every state

        publishes it (e.g. NRW exposes only the number of full storeys); then supply the reference GFZ

        from the official zone information yourself.


        Optional Vorderland/Hinterland split: pass `hinterland_flaeche_m2` (area of the rear part of the

        plot, in m², must be less than `flaeche`) together with `hinterland_faktor` (its value factor

        relative to the front part, 0 to 1) to split the Bodenwert into a front-plot and a rear-plot share

        and blend them into one total. `bodenwert_euro` stays the ONE canonical total field — it is now

        the blended value. The breakdown (`vorderland_wert_euro`, `hinterland_wert_euro`) is additional

        detail in the response; it is NOT a standard nationwide model — the split line and factor are

        supplied by the caller, not by the Gutachterausschuss (see the mandatory `hinweis` in the

        response). Both fields are required together, and require `flaeche` to be set; `hinterland_faktor`

        outside `[0, 1]` is rejected — a value above 1 would mean the rear part is worth more than the

        front, which is not a depth discount (if the rear part sits in its own Bodenrichtwert zone,

        query it separately via `GET /api/bodenrichtwert` instead).


        The result is an orienting calculation and does NOT replace the zone-specific official conversion

        table of the responsible Gutachterausschuss. It is not a market value.'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
              - brw
              - gfz_referenz
              - gfz_tatsaechlich
              properties:
                brw:
                  type: number
                  minimum: 0
                  description: The official Bodenrichtwert to base the calculation on, in EUR per square meter.
                gfz_referenz:
                  type: number
                  exclusiveMinimum: 0
                  description: Reference GFZ the Bodenrichtwert is based on (wertrelevante GFZ, greater than 0).
                gfz_tatsaechlich:
                  type: number
                  exclusiveMinimum: 0
                  description: Actual or permitted GFZ of the subject plot (greater than 0).
                flaeche:
                  type: number
                  exclusiveMinimum: 0
                  description: Optional plot area in square meters. If given, the total Bodenwert is also returned.
                hinterland_flaeche_m2:
                  type: number
                  exclusiveMinimum: 0
                  description: 'Optional: area of the rear part of the plot (Hinterland) in square meters — must be

                    less than `flaeche`. Only together with `hinterland_faktor`; requires `flaeche`.

                    '
                hinterland_faktor:
                  type: number
                  minimum: 0
                  maximum: 1
                  description: 'Optional: value factor of the rear plot relative to the front plot, 0 to 1 (e.g. 0.2

                    for 20% of the front Bodenrichtwert). Only together with `hinterland_flaeche_m2`. No

                    official model — supplied by the caller. Values below 0.10 or above 0.50 trigger an

                    additional note in the response; values outside [0, 1] are rejected.

                    '
            example:
              brw: 450
              gfz_referenz: 0.8
              gfz_tatsaechlich: 1.2
      security:
      - OAuth2: []
      - BearerAuth: []
      - QueryToken: []
      responses:
        '200':
          description: The density-adjusted land value (and total Bodenwert if flaeche was given)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BodenwertResponse'
              example:
                brw_input_euro_pro_m2: 450
                gfz_referenz: 0.8
                gfz_tatsaechlich: 1.2
                koeffizient_referenz: 0.8967
                koeffizient_tatsaechlich: 1.0973
                faktor: 1.2237
                bodenrichtwert_tatsaechlich_euro_pro_m2: 550.68
                modell: amtliche-standardformel
                formel: K(GFZ) = 0,6·√GFZ + 0,2·GFZ + 0,2  ·  BRW_tatsächlich = BRW × K(GFZ_ist) / K(GFZ_ref)
                disclaimer: Orientierende Umrechnung nach der Standardformel für Umrechnungskoeffizienten (0,6·√GFZ + 0,2·GFZ + 0,2; u. a. ErbStH zu § 179 BewG). Ersetzt NICHT die zonenspezifische amtliche Umrechnungstabelle des zuständigen Gutachterausschusses. Gutachterlicher Orientierungswert — kein Verkehrswert, kein Kaufpreis, keine Rechtsberatung.
        '400':
          description: 'Missing or invalid fields (malformed JSON body, non-numeric value, brw < 0, or a GFZ <= 0).

            Also covers the Vorderland/Hinterland split: `missing_parameter` when only one of

            `hinterland_flaeche_m2`/`hinterland_faktor` is set or `flaeche` is missing;

            `invalid_hinterland_flaeche_m2` when it is not > 0 or not < `flaeche`;

            `invalid_hinterland_faktor` when it is outside `[0, 1]`.

            '
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Missing or invalid Bearer token
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '429':
          description: IP rate limit exceeded (120 requests/minute) — retry after the number of seconds in the Retry-After header
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '500':
          description: Unexpected internal error — retry later; contact support@bodenrichtwert.ai if it persists
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      tags:
      - Bodenwert
components:
  schemas:
    BodenwertResponse:
      type: object
      properties:
        brw_input_euro_pro_m2:
          type: number
          description: The official Bodenrichtwert you provided (EUR/m²).
        gfz_referenz:
          type: number
          description: Reference GFZ the value is based on (wertrelevante GFZ).
        gfz_tatsaechlich:
          type: number
          description: Actual or permitted GFZ of the subject plot.
        koeffizient_referenz:
          type: number
          description: Conversion coefficient K(gfz_referenz) = 0.6·√GFZ + 0.2·GFZ + 0.2.
        koeffizient_tatsaechlich:
          type: number
          description: Conversion coefficient K(gfz_tatsaechlich).
        faktor:
          type: number
          description: Conversion factor K(gfz_tatsaechlich) / K(gfz_referenz).
        bodenrichtwert_tatsaechlich_euro_pro_m2:
          type: number
          description: The actual (density-adjusted) Bodenrichtwert for the plot (EUR/m²).
        grundstuecksflaeche_m2:
          type: number
          description: Plot area — present only when `flaeche` was supplied.
        bodenwert_euro:
          type: number
          description: 'The Bodenwert (total plot value) — ONE canonical total field. Present only when `flaeche` was

            supplied. Without a Vorderland/Hinterland split: bodenrichtwert_tatsaechlich × flaeche. With a

            split: vorderland_wert_euro + hinterland_wert_euro (same field, now blended).

            '
        hinterland_flaeche_m2:
          type: number
          description: Echo of the input (m²). Present only when the Vorderland/Hinterland split was used.
        hinterland_faktor:
          type: number
          description: Echo of the input (0 to 1). Present only when the Vorderland/Hinterland split was used.
        vorderland_flaeche_m2:
          type: number
          description: grundstuecksflaeche_m2 minus hinterland_flaeche_m2. Present only when the Vorderland/Hinterland split was used.
        vorderland_wert_euro:
          type: number
          description: 'Front-plot share of the total value (bodenrichtwert_tatsaechlich × vorderland_flaeche_m2).

            Present only when the Vorderland/Hinterland split was used. This breakdown is additional

            detail — the MCP tool''s text summary deliberately mentions only the ONE total, bodenwert_euro.

            '
        hinterland_wert_euro:
          type: number
          description: 'Rear-plot share of the total value (bodenrichtwert_tatsaechlich × hinterland_faktor ×

            hinterland_flaeche_m2). Present only when the Vorderland/Hinterland split was used.

            '
        modell:
          type: string
          enum:
          - amtliche-standardformel
          description: The calculation model used.
        formel:
          type: string
          description: Human-readable description of the applied formula.
        hinweis:
          type: string
          description: 'Optional note. Can combine (space-joined) an extrapolation warning when a GFZ is outside the

            usual range with the mandatory Vorderland/Hinterland note (always present when that split is

            used — it is not an official model) and, depending on how far `hinterland_faktor` sits outside

            the documented 0.10–0.50 core range, one additional band-specific note.

            '
        disclaimer:
          type: string
          description: 'Mandatory note that this is an orienting conversion using the standard formula — not the

            zone-specific official conversion table, and not a market value.

            '
      required:
      - brw_input_euro_pro_m2
      - gfz_referenz
      - gfz_tatsaechlich
      - koeffizient_referenz
      - koeffizient_tatsaechlich
      - faktor
      - bodenrichtwert_tatsaechlich_euro_pro_m2
      - modell
      - formel
      - disclaimer
    Error:
      type: object
      properties:
        error:
          type: string
          description: Error code
        message:
          type: string
          description: Human-readable error description
        status:
          type: integer
          description: HTTP status code
        reason:
          type: string
          enum:
          - trial_exhausted
          - no_active_plan
          description: Only on 402 limit_reached — why the quota is exhausted
        upgrade_url:
          type: string
          description: Only on 402 limit_reached — deep link to the billing page of the immokit.ai account (`produkt=bodenrichtwert`) to book a plan
  securitySchemes:
    OAuth2:
      type: oauth2
      flows:
        authorizationCode:
          authorizationUrl: https://bodenrichtwert.ai/oauth/authorize
          tokenUrl: https://bodenrichtwert.ai/oauth/token
          scopes: {}
    BearerAuth:
      type: http
      scheme: bearer
      description: 'Static API key issued in the dashboard (Entwickler → API-Keys). Pass as

        `Authorization: Bearer <key>`. Alternative to the OAuth2 flow above —

        recommended for direct server-to-server integrations that skip the

        interactive OAuth consent screen.

        '
    QueryToken:
      type: apiKey
      in: query
      name: token
      description: 'The same API key as `BearerAuth`, passed as `?token=<key>` instead of in a header.


        Intended **only** for clients that cannot set request headers — Google Sheets

        `=IMPORTXML`/`=IMPORTDATA` and comparable spreadsheet importers. Every other client

        should use the `Authorization` header, which takes precedence when both are present.


        A credential in a URL is structurally weaker than one in a header: it is visible to

        anyone who can read the spreadsheet formula or the link. Responses authenticated this

        way are sent with `Cache-Control: no-store`, and our request logs and analytics record

        only the path, never the query string — but the key should still be a dedicated one

        with an expiry date, revocable in the dashboard.

        '