---
title: "Building search demo (no key): exact count + first page, or a group_by distribution"
method: GET
path: "/v1/demo/bygninger/soeg"
---

# Building search demo (no key): exact count + first page, or a group_by distribution

`GET /v1/demo/bygninger/soeg`

## Request

- Base URL: `https://api.grundfast.dk`
- URL: `https://api.grundfast.dk/v1/demo/bygninger/soeg`
- Auth: none required

Bygningssøgning: every standing BBR building (status opført) that matches the filter — use, construction year, heating installation and fuel, roof and wall material, registered asbestos, floor areas, storeys, an oil tank, solar cells or ground source heat in use, afløb and spildevandspåbud — plus facts joined on from other registers: the property’s grundareal (Matriklen), kortlagt jordforurening (DKJord V1/V2), fredning and SAVE value (FBB) and the energimærke class (Grundfast’s energimærke corpus — partial coverage, so a class filter only finds labels the corpus holds). Served from a local national building index. The area is ONE of `kommunekode`, `postnr` or `bbox` (a WGS84 window of at most 1° each way); with none the search covers the whole country. Area searches are ordered by address, window and national searches by building id. `antal` is the exact count. Every plan gets the count and the first page (up to 100 buildings, JSON); later pages and the csv/jsonl/geojson formats need the plan named in the 402. Metered as one unit per started 1,000 rows of `per_side`. Filters combine with AND; list filters match ANY of their codes. With `group_by` (aarti, tag, anvendelse, kommune, varme, energimaerke) the same filter is answered as a distribution — one exact count per group from a single GROUP BY, JSON only, every plan, one unit, for any area including the whole country. A 503 with Retry-After means the index is not loaded, a filter needs the extended index that is not loaded yet, or the national search is momentarily busy.

## Query parameters

- `kommunekode` string
- `postnr` string
- `bbox` string
- `anvendelse` string
- `opfoert_fra` integer
- `opfoert_til` integer
- `varme` string
- `opvarmning` string
- `tag` string
- `ydervaeg` string
- `asbest` 'ja' | 'nej'
- `areal_min` integer
- `areal_max` integer
- `boligareal_min` integer
- `boligareal_max` integer
- `olietank` 'ja' | 'nej' | 'true' | 'false'
- `etager_min` integer
- `etager_max` integer
- `grundareal_min` integer
- `grundareal_max` integer
- `energimaerke` string
- `afloeb` string
- `spildevandspaabud` 'ja' | 'nej'
- `solceller` 'ja' | 'nej' | 'true' | 'false'
- `jordvarme` 'ja' | 'nej' | 'true' | 'false'
- `jordforurening` 'v1' | 'v2' | 'kortlagt' | 'nej'
- `fredet` 'ja' | 'nej' | 'true' | 'false'
- `bevaringsvaerdi_max` integer
- `per_side` integer
- `group_by` 'aarti' | 'tag' | 'anvendelse' | 'kommune' | 'varme' | 'energimaerke'

## Response `200`

OK

- union
  - Bygningssoegning: Standing BBR buildings in Denmark, a kommune, a postnummer or a map window that match the filter.
    - `type` 'bygningssoegning', required
    - `omfang` 'kommune' | 'postnummer' | 'kortudsnit' | 'hele_landet', required: The area the search covered.
    - `antal` number, required: Exact number of buildings matching the filter.
    - `side` number, required
    - `per_side` number, required
    - `sider` number, required
    - `begraenset` boolean, required: True when the plan limited this answer to the first page (antal stays exact).
    - `bygninger` object[], required
      - `id` string, required: BBR Bygning id
      - `bfe_nummer` number, nullable, required
      - `adgangsadresse_id` string, nullable, required
      - `adresse` string, nullable, required
      - `kommunekode` string, required
      - `postnr` string, nullable, required
      - `koordinat` object, nullable, required
        - `lon` number, required
        - `lat` number, required
      - `anvendelse` object, nullable, required: A translated code field: raw code + human-readable Danish label.
        - `kode` string, required
        - `tekst` string, required
      - `opfoerelsesaar` number, nullable, required
      - `om_tilbygningsaar` number, nullable, required
      - `samlet_areal` number, nullable, required
      - `boligareal` number, nullable, required
      - `erhvervsareal` number, nullable, required
      - `antal_etager` number, nullable, required
      - `varmeinstallation` object, nullable, required: A translated code field: raw code + human-readable Danish label.
        - `kode` string, required
        - `tekst` string, required
      - `opvarmningsmiddel` object, nullable, required: A translated code field: raw code + human-readable Danish label.
        - `kode` string, required
        - `tekst` string, required
      - `supplerende_varme` object, nullable, required: A translated code field: raw code + human-readable Danish label.
        - `kode` string, required
        - `tekst` string, required
      - `tagdaekning` object, nullable, required: A translated code field: raw code + human-readable Danish label.
        - `kode` string, required
        - `tekst` string, required
      - `ydervaeg` object, nullable, required: A translated code field: raw code + human-readable Danish label.
        - `kode` string, required
        - `tekst` string, required
      - `asbest` object, nullable, required: A translated code field: raw code + human-readable Danish label.
        - `kode` string, required
        - `tekst` string, required
      - `olietank` boolean, required: An oil tank in use (not sløjfet) is registered on the plot.
      - `grundareal` number, nullable, required: Matriklen's registreret areal of the property (all its jordstykker), m².
      - `jordforurening` 'V1' | 'V2' | 'V1 og V2', nullable, required: Kortlagt jordforurening on the property’s parcels (DKJord), null = not kortlagt.
      - `fredet` boolean, required: FBB: the building is fredet.
      - `bevaringsvaerdi` number, nullable, required: FBB SAVE bevaringsværdi 1 (highest) – 9; null = not assessed.
      - `afloebsforhold` object, nullable, required: A translated code field: raw code + human-readable Danish label.
        - `kode` string, required
        - `tekst` string, required
      - `spildevandspaabud` object, nullable, required: A translated code field: raw code + human-readable Danish label.
        - `kode` string, required
        - `tekst` string, required
      - `solceller` boolean, required: Solcelleanlæg in use (BBR teknisk anlæg 1230).
      - `jordvarme` boolean, required: Jordvarmeslanger in use (BBR teknisk anlæg 1220).
      - `energimaerke` 'A' | 'B' | 'C' | 'D' | 'E' | 'F' | 'G', nullable, required: Energimærke class letter when the property’s label is in Grundfast’s corpus (partial coverage).
    - `meta` object, required
      - `kilde` string, required
      - `grundfast_version` string, required
  - Bygningsgruppering: The building search filter as a distribution: aarti in decade order (unknown last), the others by antal descending.
    - `type` 'bygningsgruppering', required
    - `group_by` 'aarti' | 'tag' | 'anvendelse' | 'kommune' | 'varme' | 'energimaerke', required
    - `antal` number, required: Exact number of buildings matching the filter (the sum of the groups' antal).
    - `grupper` object[], required
      - `noegle` string, nullable, required: Decade start ("1960"), BBR code ("3"), kommunekode ("0751") or energimærke letter ("C"); null = not registered (aarti: unknown year; energimaerke: no label in the corpus).
      - `tekst` string, nullable, required: "1960–1969", the kodeliste text, or the kommune name.
      - `antal` number, required
      - `andel` number, required: Share of the total antal, 0–1 (4 decimals).
    - `meta` object, required
      - `kilde` string, required
      - `grundfast_version` string, required

## Other responses

- `400`: Error
- `429`: Per-IP demo rate limit (60/min) exceeded.
- `503`: Error

---

[API](https://skmtc.dev/grundfast/apis/grundfast-api.md) · [All operations](https://skmtc.dev/grundfast/apis/grundfast-api/llms.txt) · [OpenAPI document](https://skmtc.dev/grundfast/apis/grundfast-api/revisions/ccef6e299bb5?raw)
