Guide Drift

# Hvordan klarer vi os med færre kald?

Hvert opslag tæller mod månedens kvote, så den billigste optimering er det kald, du aldrig laver. De fleste integrationer kan skære en stor del af forbruget væk uden at miste noget — ved at bruge de felter, svarene allerede har, og ved at lade være med at spørge om det samme to gange.

Kaldene i guiden

- [GET /v1/adresse/search](https://grundfast.dk/docs/api/adresse-search)
- [GET /v1/bbr/ejendom/:bfe](https://grundfast.dk/docs/api/bbr-ejendom)

3 min læsning 7 trin Opdateret 1. oktober 2026

## Hvad der tæller

- Et almindeligt opslag tæller ét kald — også når svaret er `400` eller `404`. Validér input, før du sender det.
- Et `:batch`-kald og en eksport tæller ét kald pr. unikt id. Dubletter tælles én gang.
- Svar med `5xx` og `504` lægges tilbage i kvoten, og en burst-`429` trækker intet.
- [`/v1/kodeliste/:navn`](https://grundfast.dk/docs/api/kodeliste) kræver ingen nøgle og tæller ikke mod kvoten.

Den fulde opgørelse står under [Rate limits og kvoter](https://grundfast.dk/docs/rate-limits).

## Søgefelter: debounce og afbryd

Et adressefelt, der kalder ved hvert tastetryk, bruger et kald pr. bogstav. Vent i stedet 150–250 ms efter sidste tastetryk, kald først fra to tegn — kortere giver alligevel `400` og koster et kald — og afbryd det forrige kald, når et nyt starter. SDK’et tager et `signal` på hvert kald, og et afbrudt kald kommer ud som en `AbortError`.

```
import { GrundfastClient } from '@grundfast/sdk';

const gf = new GrundfastClient({ apiKey: process.env.GRUNDFAST_API_KEY });

let timer: ReturnType<typeof setTimeout> | undefined;
let inflight: AbortController | undefined;
const cache = new Map<string, unknown>();

export function onInput(q: string, vis: (hits: unknown) => void) {
  clearTimeout(timer);
  const key = q.trim().toLowerCase();
  if (key.length < 2) return; // under 2 tegn er en 400 — og den tæller
  const kendt = cache.get(key);
  if (kendt) return vis(kendt);

  timer = setTimeout(async () => {
    inflight?.abort();
    inflight = new AbortController();
    try {
      const { results } = await gf.adresseSearch(key, 8, { signal: inflight.signal });
      cache.set(key, results);
      vis(results);
    } catch (err) {
      if ((err as Error).name !== 'AbortError') throw err;
    }
  }, 200);
}
```

Et færdigt eksempel med frontend og backend-proxy står i [Adressefelt i checkout](https://grundfast.dk/adressefelt-i-checkout).

## Brug de felter, du allerede har

Mange integrationer laver kald, de ikke behøver, fordi de ikke ved, hvad der allerede står i det forrige svar:

- Hvert hit fra `/v1/adresse/search` har `bfe_nummer`, `kommunekode` og `koordinat`. Du behøver ikke et reverse-opslag for at finde ejendommen.
- `/v1/bbr/ejendom/:bfe` har kommune og region i `dagi`, matrikelnumre i `jordstykker` og et vurderingsresumé i `vurdering`. Se [Hvad fortæller ét opslag om en ejendom?](https://grundfast.dk/guides/ejendomsberigelse-i-et-kald).
- Enhederne i ejendomssvaret har deres adresser med etage og dør. Du behøver ikke slå hver enkelt op.
- `/v1/postnumre` giver hele listen i ét svar uden sideinddeling.

## Cache på din side

Registerdata ændrer sig langsomt sammenlignet med, hvor ofte en integration typisk spørger. Gem svarene på din side med en nøgle, der ikke ændrer sig: BFE-nummeret for ejendomme, UUID’en for adresser, CVR-nummeret for virksomheder. Hvor længe du kan genbruge et svar, afhænger af din sag — en tilbudsberegning kan leve med et svar fra i går, en sag, der skal vise registret, som det står i dag, kan ikke. Vælg levetiden ud fra det, ikke ud fra en antagelse om, hvornår registrene opdateres.

Hold nøglen på serveren

Et proxy-endpoint i din egen backend er det naturlige sted for cachen: det holder API-nøglen væk fra browseren og samler gentagne opslag fra mange brugere i ét.

## Det, der er gratis

Kodelister skal du ikke hente pr. ejendom: svaret har allerede både kode og tekst, og den fulde liste giver `/v1/kodeliste/:navn` uden nøgle og uden at tælle — se fx [BBR-anvendelseskoder](https://grundfast.dk/bbr-anvendelseskoder). Kommunekoder, ejerlavskoder og postnumre kan du hente som statiske filer uden nøgle: [kommunekoder.csv](https://grundfast.dk/kommunekoder.csv), [ejerlavskoder.csv](https://grundfast.dk/ejerlavskoder.csv) og [postnumre.csv](https://grundfast.dk/postnumre.csv), også som JSON. Byg din udvikling og dine tests på en `gf_test_`-nøgle, som aldrig faktureres.

## Batch: færre forespørgsler, samme forbrug

Et [batch-kald](https://grundfast.dk/docs/batch-og-eksport) slår op til 50 ejendomme, adresser eller områder op i én forespørgsel. Det er hurtigere og giver færre round-trips og færre burst-`429`, men det er ikke billigere: hvert unikt id tæller ét kald. Det, batch sparer, er tid og forespørgsler — og dubletterne, som kun tælles én gang.

## Hold øje med forbruget

Hvert svar har `X-Quota-Remaining`, så din egen overvågning kan se forbruget løbende. Med [webhooks](https://grundfast.dk/docs/webhooks) får du hændelsen `usage.threshold`, når månedens forbrug passerer 80 % og 100 % af kvoten. Et pludseligt hop er næsten altid en løkke eller et felt uden debounce.

Var denne side nyttig?

## Ofte stillede spørgsmål

### Tæller et kald, der giver 404?

Ja. Klientfejl som 400 og 404 tæller mod kvoten. Serverfejl og timeouts lægges tilbage, og en burst-429 trækker intet.

### Er batch billigere end enkeltopslag?

Nej. Hvert unikt id i en batch tæller ét kald. Batch sparer forespørgsler og tid, og dubletter tælles kun én gang.

### Må jeg cache svarene?

Ja, og det anbefales. Gem dem på en stabil nøgle som BFE-nummer, UUID eller CVR-nummer, og vælg levetiden ud fra hvor friske data din sag kræver.

### Hvad er gratis?

Kodelisteopslag tæller ikke og kræver ingen nøgle. Kommunekoder, ejerlavskoder og postnumre kan hentes som statiske CSV- og JSON-filer. Testnøgler faktureres aldrig.

### Hvor tit skal et søgefelt kalde?

Først fra to tegn, og først når brugeren holder en kort pause på 150 til 250 millisekunder. Afbryd det forrige kald, når et nyt starter.

## Prøv det på rigtige data

En gratis nøgle giver adgang til alle registre med samme svarform. Testnøgler faktureres aldrig, så du kan bygge færdigt, før du skifter til produktion.

[Kom i gang gratis](https://grundfast.dk/dashboard?mode=register) [Se alle guides](https://grundfast.dk/guides)

Gratis op til 5.000 kald/md · intet kreditkort · data fra Klimadatastyrelsen/Datafordeler, CC BY 4.0

Relateret

- [Rate limits og kvoter Dokumentation](https://grundfast.dk/docs/rate-limits)
- [Batch og eksport Dokumentation](https://grundfast.dk/docs/batch-og-eksport)
- [Adressefelt med autocomplete i checkout Guide](https://grundfast.dk/adressefelt-i-checkout)
- [Hvad fortæller ét opslag om en ejendom? Guide](https://grundfast.dk/guides/ejendomsberigelse-i-et-kald)
- [Priser Planer, kvoter og overforbrug](https://grundfast.dk/priser)

På denne side

1. Hvad der tæller
2. Søgefelter: debounce og afbryd
3. Brug de felter, du allerede har
4. Cache på din side
5. Det, der er gratis
6. Batch: færre forespørgsler, samme forbrug
7. Hold øje med forbruget
8. Ofte stillede spørgsmål

[API-dokumentation](https://grundfast.dk/docs)[Alle guides](https://grundfast.dk/guides)[Spørg os](https://grundfast.dk/kontakt)
