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.
The main call
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.
{ "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.
| Field | Type | Description |
|---|---|---|
| bygninger[ | Bygning[ | Every building on the property (bygning = building). hovedbygning_index points at the main one. |
| bygninger[ | { kode, tekst } | Use: the BBR use code and the code list’s text, e.g. "120" → "Fritliggende enfamiliehus" (detached house). |
| bygninger[ | number | null | Year built, as BBR records it. |
| bygninger[ | number | null | Year of the latest major rebuild or extension (BBR field 209). Served raw, so BBR’s placeholders 0 and 1000 can occur. |
| bygninger[ | { ydervaeg, tag, … } | Outer wall (ydervæg) and roof covering (tag) as { kode, tekst }, plus any supplementary material. |
| bygninger[ | { installation, opvarmningsmiddel, supplerende } | Heating installation and fuel as { kode, tekst } — district heating, heat pump, oil boiler and so on. |
| bygninger[ | { fredet, bevaringsvaerdi, … } | null | Listed status and SAVE conservation value (1 is highest) from the national heritage register. null means “could not be answered”, not “not listed”. |
| bygninger[ | Point | The building’s BBR point in WGS84, with EPSG:25832 (UTM 32N) beside it. |
| bygninger[ | 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
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