Property data API
The whole Danish property, in one call
Give Grundfast a BFE number and the property comes back as one document: every building and unit from BBR, the parcels underneath, heritage status, the municipality and the latest public valuation — codes resolved to text, current rows only.
The main call
Request
One request, one document
The same call in three 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.anvendelse?.tekst, b.opfoerelsesaar, b.materialer.tag?.tekst); }
The response on the right is abridged. The keyless /v1/demo/ejendom returns the full, unabridged answer for a real property (BFE 5651067, Solbakkevej 70, Silkeborg), so you can build the parser before you have a key.
{ "type": "ejendom", "bfe_nummer": 5651067, "kommunekode": "0740", "dagi": { "kommune": { "kode": "0740", "navn": "Silkeborg" }, "region": { "kode": "1082", "navn": "Region Midtjylland" } }, "jordstykker": [ { "matrikelnummer": "138o", "ejerlav_kode": 2006552, "ejerlav_navn": "Silkeborg Markjorder" } ], "antal_bygninger": 3, "hovedbygning_index": 2, "bygninger": [ { "bygningsnummer": 1, "anvendelse": { "kode": "120", "tekst": "Fritliggende enfamiliehus" }, "opfoerelsesaar": 1958, "om_tilbygningsaar": null, "antal_etager": 1, "areal": { "bebygget_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 }, "enheder": [ { "anvendelse": { "kode": "120", "tekst": "Fritliggende enfamiliehus" }, "areal": { "samlet_m2": 95 }, "antal_vaerelser": 4 } ] } ], "vurdering": { "seneste": { "aar": 2024, "grundvaerdi_kr": 1702000, "ejendomsvaerdi_kr": 2596000, "vurderet_areal_m2": 460 } } }
Response
What the document holds
Every coded field arrives as a { kode, tekst } pair — a stable code for your logic, the register’s own text for people.
bygninger[]Buildings- Use, year built and rebuilt, storeys, built-up and floor areas, wall and roof material, heating installation and fuel.
bygninger[].enheder[]Units- Every flat, shop and office in the building: use, area, rooms, heating and the unit’s own address.
bygninger[].fredningHeritage status- Whether the building is listed, and its SAVE conservation value (1 is highest), from the heritage register.
jordstykker[]Cadastral parcels- Every parcel the property stands on, with parcel number and ejerlav (cadastral district) code and name.
dagiMunicipality and region- The administrative area the property belongs to, with codes and names.
vurderingPublic valuation- The latest property and land value and the yearly series behind it, joined by BFE.
Getting a BFE
From an address or a point
BFE (Bestemt Fast Ejendom) is the national key for a piece of real property. You rarely start with one:
- GET/v1/adresse/search?q=
- From an addressFree-text search over the national address register; every hit carries the BFE of its property.
- GET/v1/jordstykker/reverse?lon=&lat=
- From a coordinateThe cadastral parcel at a WGS84 point, with the BFE of the property it belongs to.
Next calls
Everything else keyed on the same BFE
Same key, same billing. Two variants depend on the plan, and say so.
- GET/v1/matrikel/ejendom/:bfe
- Parcel geometryThe cadastral parcels with their polygons in WGS84 and their areas.
- GET/v1/geodanmark/bygninger/:bfe
- Building footprintsThe measured outline of each building, joined to its BBR record.
- GET/v1/dhm/bygninger/:bfe
- Building heightsHeight of every building on the property, measured inside its footprint from the national elevation model.
- GET/v1/vurdering/:bfe
- Full valuation historyEvery assessment on record, per assessment unit, newest first.
- GET/v1/bbr/ejendom/:bfe/geojson
- The same property as GeoJSONA FeatureCollection you can drop straight onto a map.
- POST/v1/bbr/ejendom:batch
- Many properties per callPro and upUp to 50 BFE numbers in one request, billed once per distinct BFE.
- GET/v1/bbr/ejendom/:bfe?asOf=
- As it stood on a dateScale and upThe property as the register recorded it on any earlier date, or the full change log via /historik.
FAQ
Questions about the property data
BBR (Bygnings- og Boligregistret) is the Danish national register of buildings and dwellings. It records every building and every unit in the country — use, floor area, year built, construction materials and heating — and is maintained by the municipalities.
Resolve the address first: /v1/adresse/search returns DAR addresses with the BFE number of the property each one belongs to. From a coordinate, /v1/jordstykker/reverse returns the parcel at that point and its BFE.
Because they are the register’s own text. Each coded field arrives as { kode, tekst }: the code is stable and language-neutral for your logic, and the Danish text is what matches official documents. The field names follow the register terms too, and every one is described in the English API reference.
Yes, on the Scale plan: add ?asOf=<date> to read the property as the register recorded it then, or call /historik for the sequence of changes. By default only current rows are returned.
Not private owners. Personal ownership data requires a legitimate-interest assessment under Danish data protection rules, and Grundfast does not expose it. Companies are available from the CVR register.
See also
Look up a real property
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