Cadastre, land parcel and BFE number for an address

Find the cadastral number and district for an address, look up the parcel area, and fetch BFE number, valuation and local plans with the property lookup.

3 min Level: Intermediate ✓ Code tested

An address is what people write on a letter. The cadastre (matrikel) is what surveyors, the land registry and municipalities work with. To link an address to a plot, a property valuation or a local plan, you need three keys: ejerlav, cadastral number and BFE number.

KeyWhat it is
EjerlavA cadastral district with a code, e.g. 2000179 Vestervold Kvarter, København
MatrikelnummerThe plot's number within the ejerlav, e.g. 162 or 7a
JordstykkeOne land parcel, identified by ejerlav + cadastral number
BFE numberBestemt Fast Ejendom: the property that is sold, valued and registered

One property (BFE) can consist of several parcels, and one parcel can hold several properties, e.g. owner-occupied flats.

Ejerlav and cadastral number are on the address

The access address already has ejerlav and matrikelnr:

Shell#matrikel-curl
curl -s "https://api.danadresse.dk/adgangsadresser/0a3f507a-ec01-32b8-e044-0003ba298018" \
  -H "X-Api-Key: $DANADRESSE_API_KEY"
JSON#matrikel-svar
{
  "id": "0a3f507a-ec01-32b8-e044-0003ba298018",
  "adressebetegnelse": "Rådhuspladsen 1, 1550 København V",
  "ejerlav": { "kode": 2000179, "navn": "Vestervold Kvarter, København" },
  "matrikelnr": "162",
  "esrejendomsnr": null
}

ejerlav.kode is a number, matrikelnr is text (it can contain letters). esrejendomsnr is always null, because the old ESR property number has been replaced by the BFE number. If you have an address id, the fields are under adgangsadresse in GET /adresser/{id}.

The parcel area

With ejerlav and cadastral number you look up the parcel at GET /jordstykker/{ejerlavkode}/{matrikelnr}:

Python#jordstykke-python
import os
import requests

API = "https://api.danadresse.dk"
s = requests.Session()
s.headers["X-Api-Key"] = os.environ["DANADRESSE_API_KEY"]

a = s.get(f"{API}/adgangsadresser/0a3f507a-ec01-32b8-e044-0003ba298018", timeout=10).json()
if not a.get("ejerlav") or not a.get("matrikelnr"):
    raise SystemExit("The address is not linked to a parcel")

kode, nr = a["ejerlav"]["kode"], a["matrikelnr"]
j = s.get(f"{API}/jordstykker/{kode}/{requests.utils.quote(nr)}", timeout=10).json()
print(a["adressebetegnelse"])
print(f'  {j["ejerlav"]["navn"]}, matr.nr. {j["matrikelnr"]}')
print(f'  registreretareal: {j["registreretareal"]} m² ({j["arealberegningsmetode"]})')

The fields on a parcel include ejerlav (code and name), matrikelnr, registreretareal (m²), arealberegningsmetode, bfenummer (the BFE number of the property the parcel belongs to) and kommune, region, sogn and retskreds.

You can also search:

  • GET /jordstykker?ejerlavkode=2000179 lists the parcels in an ejerlav (page with side and per_side). The list is sorted by ejerlav and cadastral number, so pages do not overlap.
  • GET /ejerlav?navn=Vestervold and GET /ejerlav/autocomplete?q=Vester find ejerlav by name. GET /ejerlav/{kode} looks one up.

Parcels have no geometry and no lookup by coordinate. To go from a point on a map to a parcel, find the address with reverse geocoding and use its ejerlav and matrikelnr.

BFE number and the property

GET /api/v1/enrich/adresser/{id}/ejendom gathers the property at the address from several registers in one call. It accepts both an access-address id and an address id:

Shell#ejendom-curl
curl -s "https://api.danadresse.dk/api/v1/enrich/adresser/0a3f507c-0624-32b8-e044-0003ba298018/ejendom" \
  -H "X-Api-Key: $DANADRESSE_API_KEY"
JSON#ejendom-svar
{
  "adresseid": "0a3f507c-0624-32b8-e044-0003ba298018",
  "adgangsadresseid": "0a3f507c-0624-32b8-e044-0003ba298018",
  "antal_ejendomme": 1,
  "ejendomme": [
    {
      "bfeNummer": "2004739",
      "kommunekode": "0157",
      "matrikel": {
        "bfeNummer": 2004739,
        "erFaelleslod": false,
        "landbrugsnotering": null,
        "udskiltVej": false,
        "opdeltIEjerlejligheder": false
      },
      "vurdering": {
        "vurderingsaar": 2020,
        "ejendomsvaerdi": 49000000,
        "grundvaerdi": 5850000,
        "antal_vurderinger": 24
      }
    }
  ],
  "zoning": {
    "zone": "Byzone",
    "lokalplaner": [
      { "planid": 1037007, "plannr": "209", "navn": "Lokalplan 209 for Hellerup Bydelscenter",
        "anvendelse": "Centerområde", "ikraft": 20030925,
        "dokument": "https://dokument.plandata.dk/20_1037007_1541679182349.pdf" }
    ]
  },
  "terraen": { "terraen_kote_m": 3.35, "datum": "DVR90", "model": "DHM/Terræn" },
  "energimaerke": { "_status": "needs_credential" },
  "antal_bygninger": 7,
  "bygninger": [
    { "id": "70f6f506-2c5b-408f-8e9c-32353f2e0be9", "bygningsnr": "1", "opfoerelsesaar": 1885,
      "samletBygningsareal": 2262, "antalEtager": 4, "anvendelseKode": "321",
      "anvendelseNavn": "Bygning til kontor" }
  ]
}
FieldContent
ejendomme[].bfeNummerThe BFE number (text). Use it for land-registry and valuation lookups
ejendomme[].matrikelThe property's details from the cadastre, including whether it is split into owner-occupied flats
ejendomme[].vurderingThe latest public valuation in DKK and the valuation year, or null
zoning.zoneZoning status, e.g. Byzone (urban), Landzone (rural) or Sommerhusområde (holiday homes)
zoning.lokalplanerAdopted local plans at the point with a link to the PDF. ikraft is a date as the number YYYYMMDD
terraen.terraen_kote_mGround elevation in metres above sea level (DVR90)
bygningerEvery BBR building at the address

Note:

  • An address can belong to several properties. That typically happens in buildings with owner-occupied flats. Always loop through the whole list.
  • A field that cannot be fetched can hold an object with _status instead of data. energimaerke answers like that today in every case. Treat it as missing data.
  • The response is cached for 24 hours, so a new valuation can take up to a day to show up.

Keys and errors

  • /api/v1/enrich/* needs a normal live key. Test keys get 403 with sandbox_scope, browser keys 403 with browser_key_scope.
  • The property lookup fetches data from Datafordeleren. During their service windows it answers 503 with the code upstream_unavailable and a Retry-After header. Retry later and let the rest of your page work without property data.
  • /adgangsadresser, /jordstykker and /ejerlav read from our own copy and work with every key type.

Next steps

Related guides

Markdown source Spotted an error? Tell us API-reference (Swagger)

Try it with a free key

2,000 calls/month on the free plan. No credit card.

Create account →