Gem adresse-id'et og valider igen senere
Hvorfor du skal gemme adresse-id og adgangsadresse-id, hvordan du validerer gemte adresser igen i bunker, og hvad du gør, når en adresse er nedlagt.
Når en kunde har valgt en adresse i autocomplete, eller datavask har accepteret den, har du to UUID'er i hånden: adressens id og adgangsadressens id. Gem dem. Tekst ændrer sig, id'er gør ikke.
Hvorfor id'et og ikke kun teksten?
- Vejnavne ændres. Når en vej får nyt navn eller et område får nyt postnummer, beholder adressen sit id. Med id'et kan du hente den nye stavemåde. Med kun teksten har du en adresse, der ikke længere findes som skrevet.
- Opslag er præcise.
GET /adresser/{id}giver præcis én adresse. En tekstsøgning kan give nul, en eller flere. - Berigelse kræver id. BBR, matrikel, administrative områder og afstand slås op på id (se Hent BBR-data).
- Dubletter. To kunder på samme adresse har samme id, også selv om de har stavet den forskelligt.
De to id'er
| Id | Peger på | Hvor du får det |
|---|---|---|
| Adresse-id | Den konkrete bolig eller enhed, med etage og dør | data.id i autocomplete (type adresse), adresse.id i datavask, id i /adresser |
| Adgangsadresse-id | Bygningens indgang, uden etage og dør | data.adgangsadresseid i autocomplete, adresse.adgangsadresseid i datavask, adgangsadresse.id i /adresser/{id} |
Gem begge. Adresse-id'et er det, du validerer på. Adgangsadresse-id'et er bygningen: koordinater, BBR og matrikel hører til den, og det er stadig gyldigt, hvis kunden flytter fra 2. th til 3. tv i samme opgang. /api/v1/enrich/* tager begge id'er, og /adgangsadresser/{id} med et adresse-id svarer med den adgangsadresse, adressen ligger på. Se Adresse eller adgangsadresse.
Et forslag på bygningsniveau (type adgangsadresse i autocomplete eller et resultat fra /datavask/adgangsadresser) har kun adgangsadresse-id'et, og det står i data.id henholdsvis adresse.id. Lad adresse-id'et være tomt i det tilfælde.
En tabel, der holder
CREATE TABLE kunde_adresse ( kunde_id BIGINT NOT NULL, adresse_id CHAR(36) NULL, -- med etage/dør, kan mangle adgangsadresse_id CHAR(36) NULL, adressetekst VARCHAR(200) NOT NULL, -- som vist for kunden, til fakturaer og breve postnr CHAR(4) NOT NULL, -- tekst, aldrig tal kommunekode CHAR(4) NULL, status TINYINT NULL, -- 1 gældende, 3 foreløbig, 2 nedlagt, 4 henlagt valideret TIMESTAMP NULL, PRIMARY KEY (kunde_id), KEY (adresse_id), KEY (adgangsadresse_id) );
Gem teksten ved siden af id'et. En faktura skal vise adressen, som den så ud, da fakturaen blev lavet, og du skal kunne vise noget, hvis API'et ikke svarer.
Valider gemte adresser igen
Kør et job f.eks. én gang om ugen eller før en udsendelse. GET /adresser tager op til omkring 100 id'er ad gangen adskilt af |. Tilføj medtagnedlagte, ellers bliver nedlagte adresser bare væk fra svaret, og du kan ikke se forskel på "nedlagt" og "ukendt":
import os import requests s = requests.Session() s.headers["X-Api-Key"] = os.environ["DANADRESSE_API_KEY"] gemte = { "fec4202d-1015-425d-a3f5-5d21d03194b6": "Strandvejen 100, 2900 Hellerup", "0a3f50c3-d930-32b8-e044-0003ba298018": "Paludan-Müllers Vej 22, 8000 Aarhus C", "00000000-0000-4000-8000-000000000000": "Tastefejl 1, 9999 Ingensteds", } def bunker(ids, n=100): ids = list(ids) for i in range(0, len(ids), n): yield ids[i:i + n] for bunke in bunker(gemte): r = s.get("https://api.danadresse.dk/adresser", timeout=30, params={ "id": "|".join(bunke), "medtagnedlagte": "", "struktur": "mini", "per_side": len(bunke)}) r.raise_for_status() fundet = {a["id"]: a for a in r.json()} for adresse_id in bunke: a = fundet.get(adresse_id) if a is None: print(f"ukendt {adresse_id} ({gemte[adresse_id]})") elif a["status"] in (2, 4): print(f"nedlagt {adresse_id} {a['betegnelse']}") elif a["betegnelse"] != gemte[adresse_id]: print(f"ændret {adresse_id} {gemte[adresse_id]} -> {a['betegnelse']}") else: print(f"ok {adresse_id} {a['betegnelse']}")
Svaret kommer ikke i samme rækkefølge som id'erne, så slå op på id.
Til enkelte opslag, f.eks. når en kunde logger ind, er GET /adresser/{id} nemmest. Den returnerer adressen uanset status, og et ukendt id giver 404:
async function tjekAdresse(id) { const res = await fetch(`https://api.danadresse.dk/adresser/${id}`, { headers: { "X-Api-Key": process.env.DANADRESSE_API_KEY }, signal: AbortSignal.timeout(5000), }); if (res.status === 404) return { tilstand: "ukendt" }; if (!res.ok) return { tilstand: "kunne ikke tjekke", http: res.status }; const a = await res.json(); const aktiv = a.status === 1 || a.status === 3; return { tilstand: aktiv ? "ok" : "nedlagt", status: a.status, tekst: a.adressebetegnelse }; } console.log(JSON.stringify(await tjekAdresse("fec4202d-1015-425d-a3f5-5d21d03194b6")));
Hvad gør du med resultatet?
| Resultat | Handling |
|---|---|
| ok | Opdater valideret |
| ændret tekst | Opdater adressetekst, postnr og kommunekode til den nye. Id'et er det samme |
| nedlagt (status 2 eller 4) | Send ikke varer dertil. Find afløseren som beskrevet nedenfor, eller bed kunden om en ny adresse |
ukendt (ikke i svaret, eller 404) | Id'et er forkert eller kommer fra en anden kilde. Vask teksten igen med datavask |
429 eller 503 | Prøv igen senere. Rør ikke de gemte data |
En status 3 (foreløbig) er en adresse, der er oprettet, men endnu ikke taget i brug. Den er gyldig at gemme.
Nedlagt: find afløseren
En adresse bliver nedlagt, når den slettes eller erstattes, f.eks. når to lejligheder lægges sammen, eller når et hus får nyt husnummer. Det gamle id kommer ikke tilbage. Vask den gemte tekst med datavask. Vasken matcher kun mod adresser, der er i brug, og aktueladresse i resultatet er den gældende version:
import os import requests def find_afloeser(adressetekst): r = requests.get( "https://api.danadresse.dk/datavask/adresser", params={"betegnelse": adressetekst}, headers={"X-Api-Key": os.environ["DANADRESSE_API_KEY"]}, timeout=10, ) r.raise_for_status() svar = r.json() if svar["kategori"] in ("A", "B") and svar["resultater"]: return svar["kategori"], [svar["resultater"][0]["aktueladresse"]] return svar["kategori"], [x["aktueladresse"] for x in svar["resultater"][:5]] # En adresse, der blev nedlagt i oktober 2026 kategori, kandidater = find_afloeser("Bobakken 27, st., 4652 Hårlev") print(f"kategori={kategori}") for a in kandidater: print(a["id"], a["adgangsadresseid"], a["vejnavn"], a["husnr"], a["etage"], a["dør"], a["status"])
Er kategorien A eller B, opdaterer du adresse_id, adgangsadresse_id og teksten til det nye. Er den C, viser du kandidaterne for kunden ved næste kontakt og lader dem vælge. Her er stuen nedlagt, og vasken foreslår adressen på indgangsniveau.
Se, hvad der er sket
GET /historik/adresser?id=… (og /historik/adgangsadresser?id=…) giver adressens versioner med status, virkningstart og virkningslut, ældste først. Den tager flere id'er adskilt af |:
curl -s "https://api.danadresse.dk/historik/adresser?id=c06a95ac-74d6-4f76-85c6-992d8ad896ed" \ -H "X-Api-Key: $DANADRESSE_API_KEY"
Historikken dækker ændringer fra juli 2026, hvor vores ændringslog startede. En adresse, der ikke er ændret siden, har én version. Se Nedlagte adresser og adressehistorik.
Hold dig opdateret
Vil du have besked, så snart en gemt adresse ændres, i stedet for at tjekke med faste mellemrum, så brug webhooks eller hændelser.
Næste skridt
Relaterede guides
Markdown-kilde Fejl i guiden? Skriv til os API-reference (Swagger)