Spring til indhold

På denne side
Dokumentation

Byg på dansk ejendomsdata på minutter

Grundfast er et REST-API. Alle svar er JSON i UTF-8. Base-URL i produktion: https://api.grundfast.dk. Vil du prøve kald direkte i browseren, så åbn den interaktive API-reference (OpenAPI 3.1).

Kom i gang

Hent en nøgle i dashboardet og kald et endpoint. De fleste endpoints kræver en nøgle; demo- og kodeliste-endpoints er åbne.

terminalbash
# gf_test_ = gratis sandbox (intet kort); gf_live_ i produktion
curl https://api.grundfast.dk/v1/bbr/ejendom/5651067 \
  -H "Authorization: Bearer gf_test_…"

Autentificering

Send din nøgle som bearer-token. Nøgler har præfiks gf_live_ eller gf_test_.

Authorization: Bearer gf_live_…

Test-tilstand (sandbox)

gf_test_-nøgler er en sandbox: de rammer de samme rigtige registre, men faktureres aldrig, tæller ikke mod din plans forbrug, og er begrænset til 25.000 kald/måned. Perfekt til CI og staging — læg dem trygt i dit build. Hvert svar markeres med X-Grundfast-Environment: test, og X-Quota-* viser sandbox-loftet. Ved loftet svarer API'et 429 — skift til en gf_live_-nøgle i produktion.

Endpoints

Hvert endpoint svarer med JSON i UTF-8. Nøgle-mærkede endpoints kræver en Bearer-token; åbne endpoints (demo + kodelister) kan kaldes uden.

BBR

nøgle
GET/v1/bbr/ejendom/:bfe

Hele ejendommen for et BFE — grund + alle bygninger (oversat, joinet).

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

WFS-compat FeatureCollection — én Feature pr. bygning, WGS84.

GET/v1/bbr/bygning?bfe=

Samme som ejendom, valideret query-param.

POST/v1/bbr/ejendom:batch

Op til 50 BFE i ét kald — { bfe: number[] }. Property-keyed, én enhed pr. BFE.

Matriklen

nøgle
GET/v1/matrikel/ejendom/:bfe

Matriklen — jordstykker + ejerlav (live; demo: /v1/demo/matrikel).

POST/v1/matrikel/ejendom:batch

Op til 50 BFE i ét kald — { bfe: number[] }. Samme partial-failure-form som BBR-batch.

GeoDanmark

nøgle
GET/v1/geodanmark/bygninger/:bfe

GeoDanmark bygningsfootprints — de rigtige bygningsomrids (WGS84-polygoner) pr. bygning på et BFE, dér hvor BBR kun har et punkt. CC BY 4.0 (@geodanmark). Demo: /v1/demo/geodanmark/bygninger.

DAGI

nøgle
GET/v1/dagi/:tema/:kode

DAGI — administrativ geografi (kommune/region/sogn …): navn + best-effort WGS84-geometri. Liste: /v1/dagi og /v1/dagi/:tema. Demo: /v1/demo/dagi.

POST/v1/dagi:batch

Op til 50 områder i ét tema i ét kald — { tema, kode: string[] }.

Adresser (DAR)

nøgle
GET/v1/adresse/:uuid

DAR-adresse (register #6) — én adresse-UUID slået op til ren adresse. DAWA-erstatningen. Demo: /v1/demo/adresse.

GET/v1/adresse/search?q=

DAR-native autocomplete — rangerede hits på fritekst over det lokale søgeindeks (demo: /v1/demo/adresse-search).

POST/v1/adresse:batch

Op til 50 DAR-adresse-UUID i ét kald — { uuid: string[] }. Partial-failure pr. UUID.

DHM

nøgle
GET/v1/dhm/punkt?lon=&lat=

DHM — terrænkote i et WGS84-punkt (demo: /v1/demo/dhm).

Ortofoto

nøgle
GET/v1/orto/tile/:z/:x/:y

Ortofoto — 256×256 web-mercator JPEG-tile (XYZ). Orienterings-backdrop, ikke målfast. Keyless demo: /v1/demo/orto/tile/:z/:x/:y.

Stednavne

nøgle
GET/v1/stednavne/punkt?lon=&lat=&radius=

Stednavne nær et WGS84-punkt (nearest-first; demo: /v1/demo/stednavne).

CVR

nøgle
GET/v1/cvr/:cvr

Virksomhed på CVR-nummer (register #8) — navn, adresse, status, branche. Demo: /v1/demo/cvr.

DAWA drop-in

nøgle
GET/v1/autocomplete?q=

DAWA-kompatibel samlet autocomplete — adgangsadresser, vejnavne og postnumre i ét.

GET/v1/adgangsadresser/reverse?lon=&lat=

Reverse geocoding — nærmeste adgangsadresse til et WGS84-punkt (DAWA-erstatning).

GET/v1/adgangsadresser/bfe/:bfe

Alle adgangsadresser på et BFE — det omvendte af reverse (DAWA adgangsadresser?bfenummer=). Tom liste (ikke 404), hvis BFE endnu ikke er indekseret.

GET/v1/datavask/adgangsadresser?betegnelse=

Adressevask — match en fritekst-adresse mod DAR med A/B/C-sikkerhedsbånd.

GET/v1/jordstykker?ejerlavkode=&matrikelnr=

Adresse→BFE-bro: jordstykket for en matrikelbetegnelse (ejerlavskode + matrikelnr) → dets BFE; reverse fra en koordinat via /v1/jordstykker/reverse?lon=&lat=.

GET/v1/postnumre/autocomplete?q=

Postnumre-autocomplete på fritekst. Hele listen på /v1/postnumre (usideinddelt — hele korpuset i ét svar; ?stormodtagere=true tilføjer de historiske stormodtager-koder), opslag på /v1/postnumre/:nr.

GET/v1/vejnavne/autocomplete?q=

Vejnavne-autocomplete på tværs af landet (DAWA-kompatibel; ?kommunekode= afgrænser til én kommune). Hele listen på /v1/vejnavne (per_side/side).

GET/v1/ejerlav/autocomplete?q=

Ejerlav-autocomplete på fritekst. Hele listen på /v1/ejerlav (per_side/side), opslag på /v1/ejerlav/:kode.

Eksport

nøgle
POST/v1/export

Async bulk-eksport (CSV/NDJSON/GeoJSON) over en afgrænset id-liste (bbr/matrikel/adresse). Poll status på /v1/export/:id og hent filen på /v1/export/:id/download. Virker med nøgle eller session.

Åbne (uden nøgle)

åben
GET/v1/kodeliste/:navn

En oversat kodeliste (kode → tekst), fx varmeinstallation.

GET/v1/demo/ejendom

Offline-eksempel — mærk outputtet uden nøgle.

GET/v1/demo/ejendom.geojson

Offline WFS-compat GeoJSON-eksempel.

TypeScript-SDK

Fuldt typet klient mod hele API-fladen — svaret er typecheckede objekter. Live på npm: npm i @grundfast/sdk (ESM + CJS, nul runtime-dependencies). Foretrækker du REST, kalder du direkte — se cURL ovenfor. Sådan bliver kaldet med SDK’et:

app.tstypescript
import { GrundfastClient } from '@grundfast/sdk';

const gf = new GrundfastClient({ apiKey: 'gf_test_…' }); // gf_live_ i produktion

const ejendom = await gf.ejendom(5651067);
console.log(ejendom.jordstykke.ejerlav_navn);
console.log(ejendom.bygninger.length, 'bygninger');
batch.tstypescript
// Op til 50 BFE i ét kald — partial-failure pr. BFE.
const { results, errors } = await gf.ejendomBatch([5651067, 5651068]);

// …eller auto-paginér en stor BFE-liste i 50-chunks:
for await (const { bfe, ejendom } of gf.ejendomStream(mineBfeer)) {
  console.log(bfe, ejendom.antal_bygninger);
}

Se den fulde SDK-reference — hver metode pr. register med et typet eksempel.

Webhooks

Abonnér på hændelser (key.created, key.revoked, subscription.updated, usage.threshold) og få et HMAC-SHA256-signeret POST til dit endpoint, når de sker. Registrering sker i dashboardet (eller på /v1/me/webhooks med din session), og hver leverance genforsøges med backoff. Læs webhooks-dokumentationen — event-katalog, payload-skema, signaturverificering og retry.

Svar-format

Et BFE giver én ejendom med alle bygninger. Hver bygning har oversatte koder, arealer, materialer, varme, geometri (WGS84) og enheder.

GET /v1/bbr/ejendom/5651067json
{
  "type": "ejendom",
  "bfe_nummer": 5651067,
  "grund_id": "000000b1-…",
  "kommunekode": "0740",
  "jordstykke": {
    "matrikelnummer": null,
    "ejerlav_kode": null,
    "ejerlav_navn": null
  },
  "antal_bygninger": 3,
  "bygninger": [
    {
      "type": "bygning",
      "anvendelse": { "kode": "120", "tekst": "Fritliggende enfamiliehus" },
      "opfoerelsesaar": 1958,
      "areal": { "bebygget_m2": 116, "samlet_boligareal_m2": 95 },
      "materialer": { "ydervaeg": { "tekst": "Mursten" }, "tag": { "tekst": "Tegl" } },
      "varme": { "installation": { "tekst": "Fjernvarme/blokvarme" } },
      "geometri": { "type": "Point", "coordinates": [10.32, 56.16] },
      "enheder": [ { "anvendelse": { "tekst": "…" }, "antal_vaerelser": 4 } ]
    }
  ]
}

Rate limits

Hver nøgle har en burst-grænse pr. minut (afhænger af din plan) oven på den månedlige kvote. Free: 5.000 kald/md og 1.200 kald/min. Overskrider du en grænse, får du 429. Hvert svar bærer rate-limit-headers, så du kan styre din throughput uden at gætte:

response headershttp
X-RateLimit-Limit       # burst-loft (kald/min for din plan)
X-RateLimit-Remaining   # tilbage i det aktuelle minut-vindue
X-RateLimit-Reset       # unix-sekunder til vinduet nulstilles
X-Quota-Limit           # månedlig kvote (inkluderede kald)
X-Quota-Remaining       # tilbage af månedens kvote
X-Quota-Reset           # unix-sekunder til kvoten nulstilles
Retry-After             # sekunder at vente (kun ved 429)

Cache-headers & paginering

Udover rate-limit- og kvote-headerne ovenfor bærer hvert svar et friskheds-signal, så du altid ved, om du ser live eller cachede data:

response headershttp
X-Grundfast-Stale        # "true" når svaret kom fra SLA-mirroren under et upstream-udfald
X-Grundfast-Cache-Age    # cachens alder i sekunder (kun sat ved et stale svar)
X-Grundfast-Environment  # "test" for gf_test_-nøgler (sandbox — faktureres aldrig)

Under et upstream-udfald serverer SLA-mirroren den sidst kendte kopi med X-Grundfast-Stale: true og X-Grundfast-Cache-Age, så du selv kan afgøre, om alderen er acceptabel. Deployment kan sætte et loft (MAX_STALE_SECONDS): en kopi ældre end loftet afvises med 502/503 i stedet for at blive serveret som et forældet 200.

Register-lister som /v1/ejerlav og /v1/vejnavne sideinddeles med query-parametrene per_side og side (1-indekseret); svaret bærer antal (denne side) og total (hele registret), så du kan paginere uden at gætte. Autocomplete-endpoints klipper i stedet til de bedste hits.

Fejl

Fejl returneres som { "error": "…" } med en passende HTTP-status.

statuskoderhttp
400  ugyldig forespørgsel (fx forkert BFE-format eller manglende påkrævet query-param)
401  manglende / ugyldig API-nøgle
403  kontoen er suspenderet — kontakt support
404  ukendt BFE
429  rate limit eller månedlig kvote opbrugt
502  upstream Datafordeler-fejl (efter retry)
503  kilden er ikke konfigureret i dette deployment