På denne side
TypeScript-SDK-reference
@grundfast/sdk er en fuldt typet klient mod hele API-fladen: svaret er typecheckede objekter, ikke any. Herunder er hver public metode grupperet pr. register med et typet eksempel.
npm i @grundfast/sdk (ESM + CJS, nul runtime-dependencies). Hver metode herunder svarer 1:1 til et REST-endpoint, så foretrækker du et rå HTTP-kald, virker det uændret.Klient & fejl
Uden apiKey virker kun demo-endpoints. Sæt en nøgle for de rigtige registre. Ethvert non-2xx-svar kaster GrundfastError med HTTP-statussen.
import { GrundfastClient, GrundfastError } from '@grundfast/sdk'; // gf_test_… i CI/staging (sandbox, faktureres aldrig), gf_live_… i produktion. const gf = new GrundfastClient({ apiKey: 'gf_live_…' }); // Valgfrit: baseUrl (default https://api.grundfast.dk) og en injiceret fetch. try { const ejendom = await gf.ejendom(999999999); } catch (err) { if (err instanceof GrundfastError) { console.error(err.status, err.message); // fx 404 "property not found" } }
Demo & offentligt (uden nøgle)
Uden nøgle: offline-fixtures med samme datakontrakt som de rigtige endpoints, plus de offentlige discovery- og statistik-aggregater.
const gf = new GrundfastClient(); await gf.demoEjendom(); // EjendomRollup await gf.demoEjendomGeoJson(); // BbrFeatureCollection await gf.demoMatrikel(); // MatrikelEjendom await gf.demoJordstykke(); // JordstykkeResult await gf.demoDagi(); // DagiOmraade await gf.demoDhm(); // DhmPunkt await gf.demoStednavne(); // StednavnePunkt await gf.demoAdresse(); // AdresseResponse await gf.demoAdresseSearch(); // AdresseSearchResponse await gf.demoCvr(); // CvrResponse await gf.demoGeodanmarkBygninger(); // GeodanmarkBygninger await gf.demoJord(); // JordOmraadeklassificering await gf.demoNatur(); // NaturSkovbyggelinje await gf.dagiTemaer(); // DagiIndex (offentligt discovery-index) await gf.statsKommuner(); // KommuneStats (offentligt — per-kommune dækning) await gf.kodeliste('varmeinstallation'); // KodelisteResponse
BBR — Register #1
Hele ejendommen på et BFE (grund + bygninger + enheder), som GeoJSON, og i batch/stream.
const ejendom = await gf.ejendom(5651067); // EjendomRollup const geojson = await gf.ejendomGeoJson(5651067); // BbrFeatureCollection const bygning = await gf.bygning(5651067); // EjendomRollup (samme join) // Op til 50 BFE i ét kald — partial-failure pr. BFE: const { results, errors } = await gf.ejendomBatch([5651067, 12345678]); // Auto-paginér en vilkårligt stor BFE-liste i 50-chunks: for await (const item of gf.ejendomStream(mineBfeer)) { console.log(item.bfe, item.ejendom.antal_bygninger, item.stale); }
Matriklen — Register #2
Jordstykker + ejerlav for et BFE, enkelt og i batch.
const matrikel = await gf.matrikel(5651067); // MatrikelEjendom const batch = await gf.matrikelBatch([5651067, 12345678]); // MatrikelBatchResponse
Historik & point-in-time
De danske registre er bitemporale. Giv ejendom/matrikel/adresse et asOf (ISO-dato eller Date) for posten, som den var registreret dén dag (bypasser cache), eller hent hele versionstidslinjen med *Historik-metoderne — nyeste først, hver version med registrering/virkning-stempler.
// Point-in-time: posten som registreret på en dato. const ejendomDa = await gf.ejendom(5651067, '2020-01-01'); // EjendomRollup const matrikelDa = await gf.matrikel(5651067, new Date('2020-01-01')); // MatrikelEjendom const adresseDa = await gf.adresse('0a3f50a0-…', '2020-01-01'); // AdresseResponse // Versionstidslinjer (nyeste først): const bbrHist = await gf.ejendomHistorik(5651067); // BbrHistorikResponse (pr. bygning) const matHist = await gf.matrikelHistorik(5651067); // MatrikelHistorikResponse (pr. jordstykke) const adrHist = await gf.adresseHistorik('0a3f50a0-…'); // AdresseHistorikResponse
GeoDanmark bygningsfootprints
De rigtige bygningsomrids (WGS84-polygoner) pr. bygning, dér hvor BBR kun har et punkt. CC BY 4.0 — vis attribution, hvor du tegner dem.
const fp = await gf.geodanmarkBygninger(5651067); // GeodanmarkBygninger fp.buildings.forEach((b) => console.log(b.bbr_uuid, b.rings)); console.log(fp.attribution); // "@geodanmark" — CC BY 4.0-kreditering
Adresse→BFE-bro (jordstykker)
Fra et koordinat eller en matrikelbetegnelse til jordstykket + dets BFE i ét kald (DAWA-drop-in).
const parcel = await gf.jordstykkeReverse(10.32, 56.16); // JordstykkeResult (+ bfe_nummer) const byKey = await gf.jordstykke(60851, '4a'); // JordstykkeResult (ejerlavskode + matrikelnr)
DAGI — Register #3
Administrativ geografi: discovery-index, liste pr. tema, opslag og batch.
const temaer = await gf.dagiTemaer(); // DagiIndex (uden nøgle) const liste = await gf.dagiList('kommune'); // DagiList const omraade = await gf.dagi('kommune', 851); // DagiOmraade const batch = await gf.dagiBatch('kommune', [851, 101]); // DagiBatchResponse
Jordforurening (#10) & Naturbeskyttelse (#11)
De to arealudpegninger på et koordinat. Begge svarer et MÅLT ja/nej: et false kommer aldrig af en upstream-fejl — den giver en fejl i stedet — fordi et nej er den påstand, nogen handler på.
const jord = await gf.jordOmraadeklassificering(10.1763672, 56.1327761); jord.omraadeklassificeret; // boolean — § 50 a dækker punktet jord.analysefri; // true | false | null (null = ikke omfattet) const natur = await gf.naturSkovbyggelinje(8.5286062, 55.8988908); natur.skovbyggelinje; // boolean — en GÆLDENDE § 17-linje dækker punktet natur.ophaevet; // et selvstændigt spørgsmål — begge kan være true natur.ophaevede; // de ophævede polygoner: årsag + kommunens afgørelse natur.usikker; // true = intet VEDTAGET grundlag bag det ja — bekræft hos kommunen
Byggelinjer & § 3 (#12)
Ti linjer på ét koordinat i ét kald — strand og klit (§ 15), sø og å (§ 16), skov (§ 17), fortidsminde (§ 18), kirke (§ 19), § 3-natur og -vandløb, og beskyttede sten- og jorddiger. Læs status FØR inden_for: svigter én af de tre kilder, bliver netop den linje utilgaengelig med inden_for: null, mens de øvrige svarer — typen boolean | null er der for at tvinge dig til at tage stilling.
const svar = await gf.naturByggelinjer(15.1450245, 55.1385081); svar.antal_i_kraft; // hvor mange linjer der gælder her svar.utilgaengelige; // [] = alle ti blev faktisk besvaret const strand = svar.linjer.strandbeskyttelse; strand.status; // 'ok' | 'utilgaengelig' — læs ALTID denne først strand.inden_for; // boolean | null (null KUN når status !== 'ok') strand.usikker; // kvalificerer et ja, aldrig et nej strand.afstand_m; // fortegnet: -1.5 = 1,5 m INDE, +11.8 = 11,8 m ude strand.hjemmel; // 'naturbeskyttelsesloven § 15' // Ophævede linjer følger med som dokumentation — en ophævet linje og // ingen linje ser ens ud i en boolean, men ikke ved kommunens skrivebord. svar.linjer.soe.ophaevede;
Adresse / DAR — Register #6
DAWA-erstatningen: UUID-opslag, fritekst-autocomplete, batch, reverse geocoding, adgangsadresser pr. BFE og adressevask.
const adr = await gf.adresse('0a3f50a0-…'); // AdresseResponse (UUID-opslag) const hits = await gf.adresseSearch('rådhusplads', 8); // AdresseSearchResponse const abatch = await gf.adresseBatch(['uuid-1', 'uuid-2']); // AdresseBatchResponse const rev = await gf.adgangsadresseReverse(10.32, 56.16, { radius: 200, perSide: 1 }); // AdgangsadresseReverse const byBfe = await gf.adgangsadresserByBfe(5651067); // AdgangsadresserByBfe const vask = await gf.datavask('rådhuspladsen 1 kbh'); // DatavaskResultat (A/B/C-bånd)
DAWA reference-lister
Ejerlav, postnumre, vejnavne og den samlede autocomplete — drop-in for DAWAs opslagslister.
const ejerlav = await gf.ejerlav(100, 1); // EjerlavList (per_side, side) const etEjerlav = await gf.ejerlavByKode(60851); // EjerlavOpslag const ejerlavAuto = await gf.ejerlavAutocomplete('vejle'); // EjerlavList const post = await gf.postnumre(); // PostnummerList const etPost = await gf.postnummer('8000'); // PostnummerRef & { meta } const postAuto = await gf.postnummerAutocomplete('80'); // PostnummerList const veje = await gf.vejnavne(100, 1); // VejnavnList const vejAuto = await gf.vejnavnAutocomplete('rådhus'); // VejnavnList const auto = await gf.autocomplete('rådhus', 'vejnavn'); // AutocompleteResponse
CVR — Register #8
Virksomhed på CVR-nummer. Kun selve virksomhedsposten — aldrig den adgangsbegrænsede CVRPerson-entitet.
const virksomhed = await gf.cvr('37527968'); // CvrResponse
Bulk-eksport
Async job over en afgrænset id-liste (bbr/matrikel/adresse) → en downloadbar CSV/NDJSON/GeoJSON-fil.
const job = await gf.createExport({ register: 'bbr', format: 'csv', bfe: [5651067, 12345678] }); const status = await gf.getExport(job.id); // ExportJob — poll til status === 'completed' const jobs = await gf.listExports(); // ExportJob[] const file = await gf.downloadExport(job.id); // string (CSV/NDJSON/GeoJSON)
Se alle endpoints i API-dokumentationen, prøv dem i den interaktive reference, eller læs om webhooks.