# 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.
>
> https://danadresse.dk/en/guides/matrikel-og-jordstykke · verified 2026-11-02
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.

| Key | What it is |
|---|---|
| Ejerlav | A cadastral district with a code, e.g. `2000179` Vestervold Kvarter, København |
| Matrikelnummer | The plot's number within the ejerlav, e.g. `162` or `7a` |
| Jordstykke | One land parcel, identified by ejerlav + cadastral number |
| BFE number | Bestemt 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`:

```bash id=matrikel-curl run=live expect="matrikelnr"
curl -s "https://api.danadresse.dk/adgangsadresser/0a3f507a-ec01-32b8-e044-0003ba298018" \
  -H "X-Api-Key: $DANADRESSE_API_KEY"
```

```json id=matrikel-svar run=no
{
  "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 id=jordstykke-python run=live expect="registreretareal"
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](/en/guides/reverse-geokodning-gps) 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:

```bash id=ejendom-curl run=syntax
curl -s "https://api.danadresse.dk/api/v1/enrich/adresser/0a3f507c-0624-32b8-e044-0003ba298018/ejendom" \
  -H "X-Api-Key: $DANADRESSE_API_KEY"
```

```json id=ejendom-svar run=no
{
  "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" }
  ]
}
```

| Field | Content |
|---|---|
| `ejendomme[].bfeNummer` | The BFE number (text). Use it for land-registry and valuation lookups |
| `ejendomme[].matrikel` | The property's details from the cadastre, including whether it is split into owner-occupied flats |
| `ejendomme[].vurdering` | The latest public valuation in DKK and the valuation year, or `null` |
| `zoning.zone` | Zoning status, e.g. Byzone (urban), Landzone (rural) or Sommerhusområde (holiday homes) |
| `zoning.lokalplaner` | Adopted local plans at the point with a link to the PDF. `ikraft` is a date as the number YYYYMMDD |
| `terraen.terraen_kote_m` | Ground elevation in metres above sea level (DVR90) |
| `bygninger` | Every 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

- [Get BBR data about the building and the dwellings](/en/guides/bbr-bygningsdata)
- Overview: [cadastre](/matrikel) and [property data](/ejendom)
