# GUTHMANN® Berlin Real Estate

> Berlin real estate for AI agents: granular market data and property search, free, by GUTHMANN®.

- name: estate.guthmann/mcp
- version: 0.3.0
- connection class: R0 (autonomous)
- trust: 93/100
- quality: 85/100 (good)
- owner: not claimed
- descriptor: https://api.protogrid.dev/v1/servers/estate.guthmann%2Fmcp
- tools: https://api.protogrid.dev/v1/servers/estate.guthmann%2Fmcp/tools

**An agent can connect right now, no human step.** Remote endpoint, no authentication, reachable on the last probe.

## Connection (mcpServers)

```json
{
  "mcpServers": {
    "guthmann": {
      "type": "http",
      "url": "https://mcp.guthmann.estate/mcp"
    }
  }
}
```


## Trust

- hygiene: 100
- liveness: 100
- freshness: 85
- provenance: 85
- drivers: +repository +dns-namespace +website +reachable +uptime-100% ~updated-49d-ago
- Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed.

## Quality 85/100 (good)

### protocol: 75 (weight 25)

- warn `protocol.modern`: newest supported version is 2025-11-25; 2026-07-28 not supported, older versions are deprecated until 2027-07-28
- n/a `protocol.stateless`: only applies to 2026-07-28 servers
- pass `protocol.transport`: streamable HTTP
- n/a `protocol.list_ttl`: only applies to 2026-07-28 servers

### authorization: n/a (weight 15)

- n/a `auth.prm`, `auth.as_metadata`, `auth.cimd`: no remote uses OAuth
- n/a `auth.secret_in_url`: no templated URL

### tool hygiene: 86 (weight 30)

- pass `tools.descriptions`: every tool has a description
- warn `tools.description_length`: 4 tools have descriptions over 1,024 characters, which crowds the context
- pass `tools.schemas`: every tool has an object input schema
- pass `tools.annotations`: 37 of 37 tools declare readOnlyHint or destructiveHint
- pass `tools.directory_hints`: every tool declares readOnlyHint, destructiveHint, idempotentHint and openWorldHint
- warn `tools.token_cost`: about 12,360 tokens to load every tool
- pass `tools.api_dump`: tools are not a one-to-one API dump

### stability: 100 (weight 15)

- pass `stability.changes`: 2 tool changes in 30 days
- pass `stability.rug_pull`: no tool changed its meaning under the same name

### dependencies: n/a (weight 15)

- n/a `deps.known_vulns`, `deps.mcp_sdk_version`, `deps.resolvable`: no npm or PyPI package

- tools: 37, about 12,360 tokens to load them all
- tool set hash: 0e84cf62fb6e6b08cccc7d73a06763ae
- tools last changed: 2026-10-01T17:26:44.741Z
- badge: [![protogrid quality](https://protogrid.dev/badge/estate.guthmann/mcp.svg)](https://protogrid.dev/servers/estate.guthmann/mcp)
- Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed.

### Tool changes

- 2026-10-01 `market_germany_residential` changed (description, inputSchema)
  - before: National market data for the German residential real estate market. Sources: DESTATIS, vdp, HYPOPORT. Includes price AND transaction indices for various market segments. Time filters: - start/end: flexible date values (YYYY, YYYY-MM, YYYY-MM-DD) - recent: number of most recent periods Response controls: - limit, fields, include: "metadata" Key response fields: PRICE INDICES: - preisindex_gesamt_destatis, preisindex_gesamt_vdp, preisindex_gesamt_hypoport (overall price index per source) - preisindex_grossstaedte_top_7 (top-7 major cities), preisindex_staedte_top_127 (top-127 cities) TRANSACTION INDICES: - transaktionsindex_grossstaedte_top_7, transaktionsindex_staedte_top_127
  - after: National market data for the German residential real estate market. Sources: DESTATIS, vdp, HYPOPORT. Includes price AND transaction indices for various market segments. Parameters: - zeitraum: "jahr" (default) | "quartal" - jahr: all price and transaction indices, regional and per source - quartal: only the Germany-wide price indices of DESTATIS, vdp and HYPOPORT, current up to the second-to-last quarter; periode like "2026-Q2"; DESTATIS arrives one quarter after the other two Time filters: - start/end: flexible date values (YYYY, YYYY-MM, YYYY-MM-DD) - recent: number of most recent periods (years or quarters) Response controls: - limit, fields, include: "metadata" Key response fields: PRICE INDICES: - preisindex_gesamt_destatis, preisindex_gesamt_vdp, preisindex_gesamt_hypoport (overall price index per source) - preisindex_landkreise_kreisfreie_staedte (all districts), preisindex_grossstaedte_top_7 (top-7 major cities), preisindex_staedte_top_127 (top-127 cities) (zeitraum=jahr only) - *_delta_1j / *_delta_proz_1j: change vs. previous year (quarterly: vs. same quarter a year earlier) - *_delta_1q / *_delta_proz_1q: change vs. previous quarter (zeitraum=quartal only) TRANSACTION INDICES (zeitraum=jahr only): - transaktionsindex_landkreise_kreisfreie_staedte, transaktionsindex_grossstaedte_top_7, transaktionsindex_staedte_top_127
- 2026-09-29 `berlin_districts` changed (description)
  - before: Returns all 96 Berlin districts (Ortsteile), optionally filtered by borough. Parameters: - bezirk_id (optional): filter to the districts of one borough - bezirke: "true" to include borough references Key response fields: array of { ortsteil_id, ortsteil_name, bezirk_id?, bezirk_name? } - ortsteil_id: 4 digits (e.g. "0301" for Prenzlauer Berg) Examples of well-known districts: - Prenzlauer Berg (0301), Kreuzberg (0201), Mitte (0101) - Charlottenburg (0401), Neukölln (0801), Friedrichshain (0202)
  - after: Returns all 97 Berlin districts (Ortsteile), optionally filtered by borough. Parameters: - bezirk_id (optional): filter to the districts of one borough - bezirke: "true" to include borough references Key response fields: array of { ortsteil_id, ortsteil_name, bezirk_id?, bezirk_name? } - ortsteil_id: 4 digits (e.g. "0301" for Prenzlauer Berg) Examples of well-known districts: - Prenzlauer Berg (0301), Kreuzberg (0201), Mitte (0101) - Charlottenburg (0401), Neukölln (0801), Friedrichshain (0202)

Full history: https://api.protogrid.dev/v1/servers/estate.guthmann%2Fmcp/changes

## Remotes

- https://mcp.guthmann.estate/mcp (streamable-http, auth none, reachable true, uptime30d 1)

## Packages

_none_

## Tools (37)

- `berlin_borough_details`: Returns details for one Berlin borough (Bezirk) by ID, optionally with all its districts.

Parameters:
- bezirk_id (required): 2-digit ID ("01" to "12")
- ortsteile: "true" to include all districts of the borough

Key response fields: { bezirk_id, bezirk_name, ortsteile?: [...] } (ortsteile = districts)

Example: bezirk_id="03" → Pankow with 13 districts (Prenzlauer Berg, Weißensee, etc.)
- `berlin_boroughs`: Returns all 12 Berlin boroughs (Bezirke) with IDs and names.

Key response fields: array of { bezirk_id, bezirk_name }
- bezirk_id: 2 digits ("01" to "12")
- bezirk_name: e.g. "Mitte", "Friedrichshain-Kreuzberg", "Pankow"

Use when:
- You need an overview of Berlin's administrative structure
- You need a bezirk_id for market data queries

Do NOT use when:
- You already know the bezirk_id → use berlin_borough_details directly
- `berlin_conservation_area_details`: Returns a single Berlin social conservation area (Milieuschutzgebiet) by ID. For main areas, associated extensions are embedded automatically.

Parameters:
- id (required): 12-character hex string (deterministic area ID)
- include: comma-separated geo attributes; available: "centroid". Polygons are provided as GeoJSON URLs in geometry_urls

Key response fields: { id, name, kategorie_id, kategorie_name, parent_id, beschreibung (description), datum (date), flaeche_km2 (area in km²), geometry_urls, centroid?, erweiterungen? (extensions) }
- `berlin_conservation_areas`: Berlin social conservation areas (Milieuschutzgebiete, §172 BauGB). 124 areas in 6 categories with polygon geometry.

Parameters:
- kategorie_id: filter by category ("erhaltungsgebiet" | "erweiterung" | "aufstellungsbeschluss" | "untersuchungsgebiet" | "beobachtungsgebiet" | "aufgehoben")
- erweiterungen: "true" to embed extensions as a nested array inside their main area
- include: comma-separated geo attributes; available: "centroid". Polygons are provided as GeoJSON URLs in geometry_urls
- lat/lon: WGS84 point lookup. Returns only areas containing the point (typically 0 or 1 match). lat and lon must be provided together.

Key response fields: array of { id, name, kategorie_id, kategorie_name, parent_id, beschreibung (description), datum (date), flaeche_km2 (area in km²), geometry_urls, centroid?, erweiterungen? (extensions) }

Use for: "Is this address in a social conservation area?" (with lat/lon), overview of all Milieuschutz areas.
- `berlin_district_details`: Returns details for one Berlin district (Ortsteil) by ID, optionally with its neighborhoods.

Parameters:
- ortsteil_id (required): 4-digit ID (e.g. "0301")
- planungsraeume: "true" to include all neighborhoods of the district

Key response fields: { ortsteil_id, ortsteil_name, bezirk_id, bezirk_name, planungsraeume?: [...] } (planungsraeume = neighborhoods)
- `berlin_districts`: Returns all 97 Berlin districts (Ortsteile), optionally filtered by borough.

Parameters:
- bezirk_id (optional): filter to the districts of one borough
- bezirke: "true" to include borough references

Key response fields: array of { ortsteil_id, ortsteil_name, bezirk_id?, bezirk_name? }
- ortsteil_id: 4 digits (e.g. "0301" for Prenzlauer Berg)

Examples of well-known districts:
- Prenzlauer Berg (0301), Kreuzberg (0201), Mitte (0101)
- Charlottenburg (0401), Neukölln (0801), Friedrichshain (0202)
- `berlin_neighborhood_details`: Returns details for one Berlin neighborhood (LOR Planungsraum) by ID, optionally with its blocks.

Parameters:
- planungsraum_id (required): 8-digit ID
- bloecke: "true" to include all blocks of the neighborhood

Key response fields: { planungsraum_id, planungsraum_name, bezirk_id, bezirk_name, ortsteil_id, ortsteil_name, bloecke?: [...] } (bloecke = blocks)
- `berlin_neighborhoods`: Returns all 542 Berlin neighborhoods (LOR Planungsräume), optionally filtered by borough or district.

Parameters:
- bezirk_id (optional): filter by borough
- ortsteil_id (optional): filter by district
- bezirke/ortsteile: "true" to include parent references

Key response fields: array of { planungsraum_id, planungsraum_name, ... }
- planungsraum_id: 8 digits (e.g. "03010101")

Neighborhoods are the finest statistical level in Berlin.
Ideal for granular market analyses.
- `berlin_neighborhood_search`: Searches Berlin neighborhoods (LOR Planungsräume) by name.

Parameters:
- q (required): search term (min. 3 characters)
- limit: max. results (default: 25)
- bezirk_id/ortsteil_id: optional filters to narrow the search

Example: q="Kollwitz" finds the "Kollwitzplatz" neighborhood
- `field_metadata`: Returns field definitions for interpreting API responses.

Use this to understand fields, units, data types, and sources.

Parameters:
- domain (optional): specific domain for detailed field information
- locale: "de" (default) | "en"

Available domains:
- berlin: geographic reference data — Boroughs (Bezirke), Districts (Ortsteile), Neighborhoods (LOR Planungsräume)
- immobilienmarkt.berlin.wohnungen: Berlin apartment market
- immobilienmarkt.berlin.mehrfamilienhaeuser: Berlin apartment buildings
- makrooekonomie.kapitalmarkt: mortgage lending rates, Bund yields
- makrooekonomie.geldpolitik: ECB policy rates
- makrooekonomie.arbeitsmarkt: unemployment, employment

Without a domain parameter: returns an overview of all available domains.
- `listing_details`: One GUTHMANN listing in detail: prices and running costs, areas, amenities, energy certificate, exposé texts, images, contact and the exposé URL on guthmann.estate. When the address is not released, street/house number are null and the coordinate is deterministically offset by 150-300 m (koordinaten_versetzt = true).

Parameters:
- public_id: public listing id (hex, from listings or the exposé URL)
- locale: "de" | "en" (default: en)
- `listings`: The GUTHMANN listings: the broker's active inventory in Berlin (for sale: owner-occupier apartments, investment apartments, apartment buildings, commercial). Every card carries its exposé URL on guthmann.estate. Addresses only for released listings, otherwise ZIP/District (Ortsteil)/Borough (Bezirk).

Parameters:
- segment: "APARTMENT_LIVING" | "APARTMENT_INVEST" | "APARTMENT_BUILDING" | "COMMERCIAL"
- bezirk / ortsteil: name filter, e.g. "Pankow" / "Prenzlauer Berg"
- preis_min / preis_max: purchase price in EUR
- zimmer_min, flaeche_min: lower bounds for rooms / living area (m²)
- locale: "de" | "en" for title, texts and exposé URL (default: en)
- limit: 1-100 (default: 50)

Key response fields:
- public_id (key for listing_details), titel (title), teaser, expose_url
- kaufpreis (purchase price), kaufpreis_pro_qm (price per m²), kaltmiete (net rent), bruttorendite (gross yield), mietfaktor (price-to-rent multiple)
- wohnflaeche (living area), anzahl_zimmer (rooms), baujahr (construction year), energie_wertklasse (energy class)
- bezirk (Borough), ortsteil (District), plz (ZIP), adresse (null when adresse_verborgen), bild (small first-party preview image, suitable for inline display)
- `macro_bund_yields`: Yields on German government bonds (Bunds). Source: Bundesbank.

Parameters:
- start/end: YYYY-MM-DD
- recent: number of most recent periods
- limit, fields, include: "metadata"

Key response fields (German names):
- rendite_10j: 10-year Bund yield
- rendite_15j: 15-year Bund yield
- rendite_30j: 30-year Bund yield
- `macro_construction_prices`: Construction price index for residential buildings. Source: Bundesbank.

Quarterly data (2015=100).

Parameters:
- start/end: YYYY-MM-DD
- recent: number of most recent periods

Key response fields (German names):
- preisindex: construction price index
- preisindex_delta_1q: change vs. previous quarter
- preisindex_delta_1j: change vs. previous year
- `macro_ecb_policy_rates`: ECB key interest rates. Source: Bundesbank.

Parameters:
- start/end: YYYY-MM-DD
- recent: number of most recent periods
- limit, fields, include: "metadata"

Key response fields (German names):
- zinssatz_hauptrefinanzierungssatz: main refinancing rate (the ECB's key rate)
- zinssatz_einlagefazilitaet: deposit facility rate
- zinssatz_spitzenrefinanzierungsfazilitaet: marginal lending facility rate
- `macro_gdp`: GDP data (gross domestic product). Source: Bundesbank.

Quarterly data, price-adjusted, seasonally and calendar-adjusted (2015=100).

Parameters:
- start/end: YYYY-MM-DD
- recent: number of most recent periods

Key response fields (German names):
- kettenindex: GDP chain-linked index
- kettenindex_delta_1q: change vs. previous quarter
- kettenindex_delta_1j: change vs. previous year
- `macro_inflation_hicp`: Inflation data (HICP - harmonized index of consumer prices). Source: Bundesbank.

Parameters:
- start/end: YYYY-MM-DD
- recent: number of most recent periods

Key response fields (German names):
- hvpi_gesamt: overall HICP
- hvpi_gesamt_ohne_energie_nahrungsmittel: core inflation (HICP excluding energy and food)
- hvpi_energie, hvpi_nahrungsmittel, hvpi_dienstleistungen, hvpi_mieten: energy, food, services, rents
- `macro_labor_employment`: Employment statistics. Source: Bundesbank.

Parameters:
- start/end: YYYY-MM-DD
- recent: number of most recent periods

Key response fields (German names):
- erwerbstaetige: persons in employment (seasonally adjusted)
- sv_beschaeftigte: employees subject to social insurance contributions
- geringfuegig_beschaeftigte: marginally employed (mini-jobs)
- `macro_labor_short_time_work`: Short-time work (Kurzarbeit) statistics. Source: Bundesbank.

Parameters:
- start/end: YYYY-MM-DD
- recent: number of most recent periods

Key response fields (German names):
- kurzarbeiter: short-time workers (seasonally adjusted)
- `macro_labor_unemployment`: Unemployment statistics. Source: Bundesbank.

Parameters:
- start/end: YYYY-MM-DD
- recent: number of most recent periods

Key response fields (German names):
- arbeitslose: registered unemployed (seasonally adjusted)
- arbeitslosenquote: unemployment rate (%)
- `macro_mortgage_lending`: Mortgage rates for residential housing loans. Source: Bundesbank.

Parameters:
- start/end: YYYY-MM-DD
- recent: number of most recent periods
- limit, fields, include: "metadata"

Key response fields (German names):
- zinssatz_gesamt: average rate across all fixed-interest periods
- zinssatz_5_bis_10j: rate for 5-10 year fixed-interest periods
- zinssatz_ueber_10j: rate for fixed-interest periods over 10 years
- volumen_gesamt: new lending volume
- `market_berlin_apartment_buildings`: Berlin apartment building market (rental buildings, "Zinshäuser") - transaction data. Source: transaction data from the Berlin committee of valuation experts (GAA, Gutachterausschuss).

Parameters:
- rbs: "stadt" | "bezirk" | "stadtteil" | "ortsteil" — bezirk = Borough, ortsteil = District

Time filters:
- start/end: flexible date values (YYYY, YYYY-MM, YYYY-MM-DD)
- recent: number of most recent periods (alternative to start/end)

Additional filters:
- bezirk_id, stadtteil_id, ortsteil_id
- limit, fields, include: "metadata"

Key response fields:
- transaktionspreis: average total purchase price (€)
- transaktionen: number of transactions
- vielfaches: purchase price multiplier (purchase price / annual net cold rent)
- vielfaches_delta_*j: absolute change of the multiplier (1y, 5y, 10y, 15y)
- transaktionspreis_m2: price per m² of living space

Ideal for: investment market analysis, yield comparisons across locations
- `market_berlin_apartments`: Berlin apartment market data (listings + transactions). Sources: listing/offer data (IMV) + transaction data from the Berlin committee of valuation experts (GAA, Gutachterausschuss).

Parameters:
- zeitraum: "jahr" (default) | "monat" | "quartal" (abgeschlossene Quartale)
  - jahr: transaction data (GAA) + listing data (IMV), finest level: block
  - monat: listing data (IMV) only, finest level: District (Ortsteil)
  - quartal: listing data (IMV) only, closed quarters, finest level: District (Ortsteil)

- rbs: spatial aggregation level — bezirk = Borough, ortsteil = District, planungsraum = Neighborhood (LOR Planungsraum)
  - For zeitraum=jahr: "stadt" | "bezirk" | "stadtteil" | "ortsteil" | "planungsraum" | "block"
  - For zeitraum=monat or quartal: "stadt" | "bezirk" | "stadtteil" | "ortsteil"

Time filters:
- start/end: flexible date values (YYYY, YYYY-MM, YYYY-MM-DD)
- recent: number of most recent periods (alternative to start/end)

Additional filters:
- bezirk_id, stadtteil_id, ortsteil_id, planungsraum_id, block_id
- baualtertyp: "neubau" (new construction) | "bestand" (existing stock)
- limit, fields, include: "metadata"

Key response fields (depending on zeitraum):
- zeitraum=jahr: transaktionspreis_m2 (transaction price per m²), anzahl_transaktionen (number of transactions), kaufangebotspreis_m2 (asking sale price per m²), mietangebotspreis_m2 (asking rent per m²)
- zeitraum=monat: kaufangebotspreis_m2, anzahl_kaufangebote (number of sale listings), kaufangebot_vermarktungszeit (time on market)
- `market_germany_apartment_buildings`: National price index data for the German apartment building market. Source: vdp.

Quarterly data for apartment buildings (rental buildings, "Mehrfamilienhäuser") across Germany.

Time filters:
- start/end: flexible date values (YYYY, YYYY-MM, YYYY-MM-DD)
- recent: number of most recent periods (quarters)

Response controls:
- limit, fields, include: "metadata"

Key response fields:
- preisindex: price index for apartment buildings
- preisindex_delta_1q: quarter-over-quarter change
- preisindex_delta_1j: year-over-year change
- `market_germany_residential`: National market data for the German residential real estate market. Sources: DESTATIS, vdp, HYPOPORT.

Includes price AND transaction indices for various market segments.

Parameters:
- zeitraum: "jahr" (default) | "quartal"
  - jahr: all price and transaction indices, regional and per source
  - quartal: only the Germany-wide price indices of DESTATIS, vdp and HYPOPORT, current up to the second-to-last quarter; periode like "2026-Q2"; DESTATIS arrives one quarter after the other two

Time filters:
- start/end: flexible date values (YYYY, YYYY-MM, YYYY-MM-DD)
- recent: number of most recent periods (years or quarters)

Response controls:
- limit, fields, include: "metadata"

Key response fields:
PRICE INDICES:
- preisindex_gesamt_destatis, preisindex_gesamt_vdp, preisindex_gesamt_hypoport (overall price index per source)
- preisindex_landkreise_kreisfreie_staedte (all districts), preisindex_grossstaedte_top_7 (top-7 major cities), preisindex_staedte_top_127 (top-127 cities) (zeitraum=jahr only)

- *_delta_1j / *_delta_proz_1j: change vs. previous year (quarterly: vs. same quarter a year earlier)
- *_delta_1q / *_delta_proz_1q: change vs. previous quarter (zeitraum=quartal only)

TRANSACTION INDICES (zeitraum=jahr only):
- transaktionsindex_landkreise_kreisfreie_staedte, transaktionsindex_grossstaedte_top_7, transaktionsindex_staedte_top_127
- `search`: Semantic search over guthmann.estate — market insights, reports, neighborhood portraits, listing exposés, project pages and the company's own pages. Hybrid retrieval (vector + keyword, no reranking); one result per page with title, description, image, best-matching snippet and score. Use it for questions that need prose (analysis, context, advice); use the data tools for exact numbers and `listings` for what is currently for sale — the search index follows the website with up to six hours of delay.

Parameters:
- q: natural-language query, in the language of the pages you want (min 2 characters)
- locale: "de" | "en" — language of the indexed pages (default: en)
- section: comma-separated filter — "listings" (exposés), "projects" (new-build projects), "market-intelligence" (insights, reports, portraits), "pages" (company, services, guides); omit for all
- limit: 1-20 pages (default: 10)

Key response fields:
- url, title, description, image, section, language
- snippet (best-matching text passage), score (0-1)
- `socio_berlin_age_groups`: Berlin population by 8 age groups, additionally by population group. Source: Amt für Statistik Berlin-Brandenburg.

Parameters:
- rbs: "stadt" (city) | "bezirk" (Borough) | "stadtteil" | "ortsteil" (District) | "planungsraum" (Neighborhood, LOR Planungsraum)
- bevoelkerungsgruppe: "alle" (all) | "mit_migrationshintergrund" (with migration background) (optional)
- altersgruppe: age group, e.g. "alter_unter_6", "alter_65_und_mehr" (optional)
- bezirk_id, stadtteil_id, ortsteil_id, planungsraum_id: geographic filters
- start/end, recent, limit, fields, include: "metadata"

Key response fields:
- bevoelkerungsgruppe_id/_name (population group), altersgruppe_id/_name (age group), anzahl_einwohner (number of residents)
- `socio_berlin_census_buildings`: Zensus 2022 building data for Berlin. Source: Statistisches Bundesamt, Zensus 2022.

Without a category: total number of buildings.
With a category:
- bauweise: construction type (detached, row house, semi-detached)
- eigentumsform: ownership type (private individual, cooperative, municipality)
- heizungsart: heating type (central heating, per-floor heating, individual stoves)
- energietraeger: energy source (gas, oil, district heating, electricity)

Parameters:
- rbs: "stadt" (city) | "bezirk" (Borough) | "stadtteil" | "ortsteil" (District) | "planungsraum" (Neighborhood, LOR Planungsraum)
- kategorie: "bauweise" | "eigentumsform" | "heizungsart" | "energietraeger" (optional)
- bezirk_id, stadtteil_id, ortsteil_id, planungsraum_id: geographic filters
- start/end, recent, limit, fields, include: "metadata"
- `socio_berlin_census_dwellings`: Zensus 2022 dwelling stock data for Berlin. Source: Statistisches Bundesamt, Zensus 2022.

Without a category: total number of dwellings.
With a category:
- raeume: breakdown by number of rooms
- flaeche: breakdown by floor-area cluster (under 40 m², 40-59 m², etc.)
- nutzung: breakdown by type of use (owner-occupied, rented, vacant)

Parameters:
- rbs: "stadt" (city) | "bezirk" (Borough) | "stadtteil" | "ortsteil" (District) | "planungsraum" (Neighborhood, LOR Planungsraum)
- kategorie: "raeume" | "flaeche" | "nutzung" (optional)
- bezirk_id, stadtteil_id, ortsteil_id, planungsraum_id: geographic filters
- start/end, recent, limit, fields, include: "metadata"
- `socio_berlin_census_households`: Zensus 2022 household data for Berlin. Source: Statistisches Bundesamt, Zensus 2022.

Without a category: total number of households.
With a category:
- groesse: household size (1 person, 2 persons, etc.)
- wohndauer: length of residence (under 1 year, 1-5 years, etc.)

Parameters:
- rbs: "stadt" (city) | "bezirk" (Borough) | "stadtteil" | "ortsteil" (District) | "planungsraum" (Neighborhood, LOR Planungsraum)
- kategorie: "groesse" | "wohndauer" (optional)
- bezirk_id, stadtteil_id, ortsteil_id, planungsraum_id: geographic filters
- start/end, recent, limit, fields, include: "metadata"
- `socio_berlin_census_rents`: Zensus 2022 rent data for Berlin. Source: Statistisches Bundesamt, Zensus 2022.

Without a category: weighted average across all dwellings (net cold rent, net cold rent per m², count).
With category "flaeche": rent per m² by floor-area cluster.

Parameters:
- rbs: "stadt" (city) | "bezirk" (Borough) | "stadtteil" | "ortsteil" (District) | "planungsraum" (Neighborhood, LOR Planungsraum)
- kategorie: "flaeche" (optional)
- bezirk_id, stadtteil_id, ortsteil_id, planungsraum_id: geographic filters
- start/end, recent, limit, fields, include: "metadata"

Key response fields:
- nettokaltmiete: average net cold rent (EUR)
- nettokaltmiete_m2: net cold rent per m² (EUR)
- anzahl_wohnungen: number of dwellings
- `socio_berlin_census_vacancy`: Zensus 2022 dwelling vacancy data for Berlin. Source: Statistisches Bundesamt, Zensus 2022.

Breakdown by vacancy category (duration or reason).

Parameters:
- rbs: "stadt" (city) | "bezirk" (Borough) | "stadtteil" | "ortsteil" (District) | "planungsraum" (Neighborhood, LOR Planungsraum)
- kategorie: "dauer" (duration) | "grund" (reason) (optional)
- bezirk_id, stadtteil_id, ortsteil_id, planungsraum_id: geographic filters
- start/end, recent, limit, fields, include: "metadata"

Key response fields:
- kategorie_id, kategorie_label: vacancy category
- anzahl: number of vacant dwellings
- `socio_berlin_construction_activity`: Construction activity data for Berlin. Source: Amt für Statistik Berlin-Brandenburg.

Shows net changes: building balance, dwelling balance, living-space balance.

Parameters:
- rbs: "stadt" (city) | "bezirk" (Borough) | "stadtteil" | "ortsteil" (District) | "planungsraum" (Neighborhood, LOR Planungsraum)
- bezirk_id, stadtteil_id, ortsteil_id, planungsraum_id: geographic filters
- start/end: period (YYYY, YYYY-MM, YYYY-MM-DD)
- recent: number of most recent periods
- limit, fields, include: "metadata"

Key response fields:
- gebaeude_saldo: net change in number of buildings
- wohnungen_saldo: net change in number of dwellings
- wohnflaeche_m2_saldo: net change in living space (m²)
- `socio_berlin_migration_external`: External migration for Berlin: migration across the city boundary, annual, by nationality. Source: Amt für Statistik Berlin-Brandenburg.

Parameters:
- rbs: "stadt" (city) | "bezirk" (Borough) | "stadtteil" | "ortsteil" (District) | "planungsraum" (Neighborhood, LOR Planungsraum)
- bezirk_id, stadtteil_id, ortsteil_id, planungsraum_id: geographic filters
- staat_code: filter by country code (e.g. "000" for Germany)
- alpha2: filter by ISO 3166-1 alpha-2 code (e.g. "TR")
- start/end, recent, limit, fields, include: "metadata"

Key response fields:
- zuzuege: move-ins to Berlin
- fortzuege: move-outs from Berlin
- saldo: net migration (move-ins minus move-outs)
- `socio_berlin_migration_matrix`: Migration matrix for Berlin: migration flows between areas (moves within Berlin, annual). The RBS level applies to both origin and destination. Source: Amt für Statistik Berlin-Brandenburg.

Parameters:
- rbs: "stadt" (city) | "bezirk" (Borough) | "stadtteil" | "ortsteil" (District) | "planungsraum" (Neighborhood, LOR Planungsraum) (default: bezirk)
- von_rbs_id: filter by origin-area ID
- nach_rbs_id: filter by destination-area ID
- min_personen: lower bound on number of persons (default 1)
- start/end, recent, limit, fields, include: "metadata"

Key response fields:
- von_rbs_id/von_rbs_name: origin area
- nach_rbs_id/nach_rbs_name: destination area
- anzahl_personen: number of moves
- `socio_berlin_origin`: Berlin population with a migration background, by area of origin. Source: Amt für Statistik Berlin-Brandenburg.

⚠️ herkunft_ebene: "eu_gesamt" is the aggregate over the individual "eu_land" entries. The default (drittland,eu_gesamt,nicht_zuordenbar) prevents double-counting EU countries.

Parameters:
- rbs: "stadt" (city) | "bezirk" (Borough) | "stadtteil" | "ortsteil" (District) | "planungsraum" (Neighborhood, LOR Planungsraum)
- herkunft_ebene: origin level, comma-separated, e.g. "drittland,eu_gesamt" (optional; default prevents double counting)
- herkunftsgebiet: area of origin, e.g. "tuerkei", "ukraine", "eu" (optional)
- top: top N areas of origin by count (optional)
- bezirk_id, stadtteil_id, ortsteil_id, planungsraum_id: geographic filters
- start/end, recent, limit, fields, include: "metadata"

Key response fields:
- herkunftsgebiet_id/_name (area of origin), herkunft_ebene (origin level), anzahl_einwohner_mit_migrationshintergrund (residents with a migration background)
- `socio_berlin_population`: Population stock for Berlin (headline figures) at the Neighborhood level (LOR Planungsraum), semi-annual. Source: Amt für Statistik Berlin-Brandenburg.

Parameters:
- rbs: "stadt" (city) | "bezirk" (Borough) | "stadtteil" | "ortsteil" (District) | "planungsraum" (Neighborhood)
- bezirk_id, stadtteil_id, ortsteil_id, planungsraum_id: geographic filters
- start/end, recent, limit, fields, include: "metadata"

Key response fields:
- einwohner_gesamt (total population), einwohner_maennlich/_weiblich (male/female)
- einwohner_deutsch/_auslaendisch (German/foreign nationals), einwohner_ohne/_mit_migrationshintergrund (without/with migration background)
- frauen_anteil, auslaender_anteil, migrationshintergrund_anteil: shares of women, foreign nationals, migration background (0–1)
