Spring til indhold

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.

Live på npm — installér med 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.

app.tstypescript
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.

app.tstypescript
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.

app.tstypescript
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.

app.tstypescript
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.

app.tstypescript
// 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.

app.tstypescript
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).

app.tstypescript
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.

app.tstypescript
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

DHM (#4) & Stednavne (#5)

Terræn/overflade-kote i et punkt, målte bygningshøjder på en ejendom, og navngivne steder nær et punkt.

app.tstypescript
const kote = await gf.dhm(10.32, 56.16);               // DhmPunkt (terraen_m / overflade_m)

// Højden på HVER bygning på ejendommen i ét kald — målt inde i fodaftrykket, ikke
// i et punkt ved siden af huset. Alle koter er DVR90.
const h = await gf.dhmBygninger(5651067);              // DhmBygningshoejder
h.bygninger[0]?.hoejde_m;      // 6.2 | null  — tag_m − terraen_m, aldrig 0 for "ukendt"
h.bygninger[0]?.hoejde_maalt;  // false ⇒ hoejde_m er null, og aarsag siger hvorfor
h.metode;                      // { tag: 'p95', terraen: 'median', hoejde: 'tag_m - terraen_m' }

const steder = await gf.stednavne(10.32, 56.16, 1000); // StednavnePunkt (radius i meter)

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

app.tstypescript
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.

app.tstypescript
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.

app.tstypescript
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.

app.tstypescript
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.

app.tstypescript
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.

app.tstypescript
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.