Skip to content

BBR API

Every building on a Danish property, in one call

Look up a BFE number and get each building and unit from BBR, Denmark’s building register: use, year built and rebuilt, storeys, floor areas, materials, heating and heritage status — the numeric codes resolved, the records joined, ready to use.

Læs denne side på dansk

Request

One call on the BFE number

The same request in four languages. The typed @grundfast/sdk retries transient upstream failures for you.

import { GrundfastClient } from '@grundfast/sdk';

const gf = new GrundfastClient({ apiKey: process.env.GRUNDFAST_API_KEY! });
const property = await gf.ejendom(5651067); // Solbakkevej 70, Silkeborg

for (const b of property.bygninger) {
  console.log(b.bygningsnummer, b.anvendelse?.tekst, b.opfoerelsesaar, b.om_tilbygningsaar);
}

The response is abridged to the house. The keyless /v1/demo/ejendom returns the full answer for this property — its three buildings, the parcel and the valuation series — so you can write the parser before you have a key.

GET /v1/bbr/ejendom/5651067json
{
  "type": "ejendom",
  "bfe_nummer": 5651067,
  "kommunekode": "0740",
  "antal_bygninger": 3,
  "bygninger": [
    {
      "bygningsnummer": 1,
      "anvendelse": { "kode": "120", "tekst": "Fritliggende enfamiliehus" },
      "opfoerelsesaar": 1958,
      "om_tilbygningsaar": null,
      "antal_etager": 1,
      "areal": {
        "bebygget_m2": 116,
        "samlet_bygningsareal_m2": 116,
        "samlet_boligareal_m2": 95
      },
      "materialer": {
        "ydervaeg": { "kode": "1", "tekst": "Mursten" },
        "tag": { "kode": "5", "tekst": "Tegl" }
      },
      "varme": {
        "installation": { "kode": "1", "tekst": "Fjernvarme/blokvarme" }
      },
      "fredning": {
        "fredet": false,
        "status_tekst": "ingen_registrering",
        "bevaringsvaerdi": null,
        "kilde": "fbb"
      },
      "geometri": {
        "type": "Point",
        "coordinates": [9.532961, 56.1578452],
        "epsg25832": [533103.83, 6223775.44]
      },
      "enheder": [
        {
          "anvendelse": { "kode": "120", "tekst": "Fritliggende enfamiliehus" },
          "areal": { "samlet_m2": 95 },
          "antal_vaerelser": 4
        }
      ]
    }
  ]
}

What you get

What the register knows, in a shape you can use

Datafordeler serves BBR as separate entities with numeric codes. One lookup here assembles the property and resolves it — and says plainly where the source has no answer.

  • Codes resolved, code kept

    Use, wall, roof and heating arrive as { kode, tekst } from BBR’s code lists: the text for people, the code for your logic.

  • The whole property at once

    Every building on the BFE with its units, joined across BBR’s entities, and an index pointing at the main building.

  • Rebuild year, not just build year

    BBR field 209 — the latest major rebuild or extension. It matters for an asbestos or energy screening, where the build year alone says too little.

  • Heritage status joined

    Listed status and SAVE value from the heritage register, matched on the building’s ID because BBR does not carry them.

Response

Fields in the answer

Field names are BBR’s own Danish terms, glossed here; every one is described in the English API reference.

Fields in the BBR property response
FieldTypeDescription
bygninger[]Bygning[]Every building on the property (bygning = building). hovedbygning_index points at the main one.
bygninger[].anvendelse{ kode, tekst }Use: the BBR use code and the code list’s text, e.g. "120" → "Fritliggende enfamiliehus" (detached house).
bygninger[].opfoerelsesaarnumber | nullYear built, as BBR records it.
bygninger[].om_tilbygningsaarnumber | nullYear of the latest major rebuild or extension (BBR field 209). Served raw, so BBR’s placeholders 0 and 1000 can occur.
bygninger[].materialer{ ydervaeg, tag, … }Outer wall (ydervæg) and roof covering (tag) as { kode, tekst }, plus any supplementary material.
bygninger[].varme{ installation, opvarmningsmiddel, supplerende }Heating installation and fuel as { kode, tekst } — district heating, heat pump, oil boiler and so on.
bygninger[].fredning{ fredet, bevaringsvaerdi, … } | nullListed status and SAVE conservation value (1 is highest) from the national heritage register. null means “could not be answered”, not “not listed”.
bygninger[].geometriPointThe building’s BBR point in WGS84, with EPSG:25832 (UTM 32N) beside it.
bygninger[].enheder[]Enhed[]Units in the building — dwellings, shops, offices — with use, area, rooms and their own address.

Endpoints

BBR, five ways

Same key, same billing. Parameters and every field are in the API reference.

GET/v1/bbr/ejendom/:bfe
The property’s buildingsEvery building and unit, codes resolved, heritage status joined, parcels and valuation alongside.
GET/v1/bbr/ejendom/:bfe/geojson
The same, as GeoJSONA FeatureCollection with one feature per building, ready for a map.
POST/v1/bbr/ejendom:batch
Many properties per callPro and upUp to 50 BFE numbers per request on Pro (100 on Scale, 150 on Enterprise), one call per distinct BFE.
GET/v1/bbr/ejendom/:bfe?asOf=
As it stood on a dateScale and upThe property as the register recorded it on an earlier date; /historik gives the sequence of changes.
GET/v1/kodeliste/:navn
The code listsBBR’s official code lists as code → text, e.g. bygningsanvendelse. No key needed.

Beyond BBR

The same BFE opens the rest of the property

BBR is the buildings. The parcels underneath are in the cadastre API, and the public valuation, terrain, soil classification, protection lines and zoning are all keyed on the same number — see the property data API.

FAQ

Questions about the BBR data

BBR (Bygnings- og Boligregistret) is Denmark’s national register of buildings and dwellings. It records every building and every unit in the country — use, floor areas, year built, materials and heating — and is kept up to date by the municipalities. It is distributed by the Danish state through Datafordeler.

BFE (Bestemt Fast Ejendom) is the national ID of a piece of real property — the key every Danish property register shares. /v1/adresse/search returns the BFE on each address hit, and /v1/jordstykker/reverse returns it for a coordinate, so address → BFE → BBR is two calls.

The text is for people; the code is for your own logic and for matching BBR’s official code lists. The text is the register’s own Danish wording, which is what matches official documents. An unknown code arrives as "Ukendt (code)" rather than disappearing. The lists themselves are at /v1/kodeliste/:navn, without a key.

It is the year of the building’s latest major rebuild or extension (BBR field 209). BBR only records it when the work amounts to at least 15 % of the building’s value before the work — a new kitchen does not count. null means no year is registered.

Not from BBR. Each building is looked up by its ID in the heritage register of the Danish Agency for Culture and Palaces (FBB). fredning is null when that register could not answer for the building — which is not the same as fredet: false.

Grundfast retries against Datafordeler and serves from its cache when the source fails. A cached answer is the same register answer, fetched earlier — you do not see an upstream error for a property already held.

See also

Look up your first building

Create a free key and make your first call in a minute. Build against a gf_test_ key that is never billed, and upgrade when the traffic is real.

Free up to 5,000 calls a month · no card · test keys never billed · data from Klimadatastyrelsen / Datafordeler, CC BY 4.0