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

- [GET /v1/bbr/ejendom/:bfe](https://grundfast.dk/docs/api/bbr-ejendom)

[Get started free](https://grundfast.dk/dashboard?mode=register) [Read the API reference](https://grundfast.dk/docs/api)

[Læs denne side på dansk](https://grundfast.dk/bbr-api)

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](https://api.grundfast.dk/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/json json

```
{
  "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[].fredning` Heritage 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.

**`dagi` Municipality and region**

The administrative area the property belongs to, with codes and names.

**`vurdering` Public 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 address Free-text search over the national address register; every hit carries the BFE of its property.

**GET/v1/jordstykker/reverse?lon=&lat=**

From a coordinate The 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 geometry The cadastral parcels with their polygons in WGS84 and their areas.

**GET/v1/geodanmark/bygninger/:bfe**

Building footprints The measured outline of each building, joined to its BBR record.

**GET/v1/dhm/bygninger/:bfe**

Building heights Height of every building on the property, measured inside its footprint from the national elevation model.

**GET/v1/vurdering/:bfe**

Full valuation history Every assessment on record, per assessment unit, newest first.

**GET/v1/bbr/ejendom/:bfe/geojson**

The same property as GeoJSON A FeatureCollection you can drop straight onto a map.

**POST/v1/bbr/ejendom:batch**

Many properties per callPro and up Up 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 up The property as the register recorded it on any earlier date, or the full change log via /historik.

FAQ

## Questions about the property data

### What is BBR?

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.

### How do I find a property if I only have an address?

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.

### Why are the values in Danish?

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.

### Can I see what a property looked like in the past?

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.

### Does it include owners?

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

- [Grundfast overview](https://grundfast.dk/en)
- [Danish address API](https://grundfast.dk/en/address-api)
- [MCP server for AI agents](https://grundfast.dk/en/mcp-server)
- [Pricing](https://grundfast.dk/en/pricing)

## 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.

[Get started free](https://grundfast.dk/dashboard?mode=register) [Read the API reference](https://grundfast.dk/docs/api)

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