Skip to content

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.

Læs denne side på dansk

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.

200 OK · application/jsonjson
{
  "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

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