getAddress.Dk.Sdk 1.2.0

dotnet add package getAddress.Dk.Sdk --version 1.2.0
                    
NuGet\Install-Package getAddress.Dk.Sdk -Version 1.2.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="getAddress.Dk.Sdk" Version="1.2.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="getAddress.Dk.Sdk" Version="1.2.0" />
                    
Directory.Packages.props
<PackageReference Include="getAddress.Dk.Sdk" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add getAddress.Dk.Sdk --version 1.2.0
                    
#r "nuget: getAddress.Dk.Sdk, 1.2.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package getAddress.Dk.Sdk@1.2.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=getAddress.Dk.Sdk&version=1.2.0
                    
Install as a Cake Addin
#tool nuget:?package=getAddress.Dk.Sdk&version=1.2.0
                    
Install as a Cake Tool

getAddress.Dk.Sdk

.NET client for getaddress.dk, the DAWA-compatible Danish address API — every address in Denmark, from DAR. Same paths, parameters, records, ids and errors as DAWA (Danmarks Adressers Web API), which closes on 1 October 2026.

dotnet add package getAddress.Dk.Sdk

Targets .NET Standard 2.0 and .NET 8. No reflection: works in trimmed, native AOT and file-based apps.

Register

services.AddSingleton(new GetAddressDk.ApiKeys("your-api-key", "your-admin-key"));
services.AddHttpClient<GetAddressDk.Api>();

The API key goes in the api-key query parameter of every request. The admin key is only needed for usage. Keep both on your server: an API key sent from a web page is refused with 401.

Domain tokens (browser code)

Code running in your visitors' browsers (Blazor WebAssembly) uses a domain token instead — made in the console for your site's domain, starting dtoken_. It works on every address endpoint, only from that domain and at the rate you set, and cannot read usage.

var api = new GetAddressDk.Api(httpClient, GetAddressDk.ApiKeys.DomainToken("dtoken_…"));

For DAWA widgets that take only a base URL (such as dawa-autocomplete2), put the token in the path instead: https://api.getaddress.dk/t/{your-domain-token}.

Names

Records keep DAWA's Danish field names. In C# they are PascalCase with æ, ø and å written ae, oe and aa: dør is Doer, højde is Hoejde, ændret is Aendret, wgs84koordinat_bredde is Wgs84koordinatBredde. The JSON names are exactly DAWA's.

Each record comes in DAWA's three shapes, picked by the method name: GetAdresse (nested, struktur=nestet), GetAdresseFlad (struktur=flad) and GetAdresseMini (struktur=mini). Coordinates are WGS84 unless you pass Srid.Etrs89Utm32 (EPSG:25832).

Autocomplete

Suggestions are free; each address picked is one look-up. Ask with kunTekst: true and each suggestion carries only its text and the record's Data.Id and Data.Href (kun_tekst=true, never metered, rate limited); fetch the one the user picks:

var result = await api.Autocomplete("Amagerbrogade 217A", kunTekst: true);   // free

if (result.IsSuccess)
{
    var suggestion = result.Success[0];                   // the one the user picked
    var text = suggestion.Forslagstekst;                  // what to show in the list
    if (suggestion.IsAdresse)
    {
        var adresse = await api.GetAdresseMini(suggestion.Data.Id!);   // one look-up
    }
}

Without it (api.Autocomplete("Amagerbrogade 217A")) the answer is DAWA's own, each address in DAWA's mini structure in Data, and an answer that suggests addresses is one look-up; street names are always free.

DAWA's parameters are on AutocompleteQuery:

await api.Autocomplete(new GetAddressDk.AutocompleteQuery
{
    Q = "Amagerbrogade 217A",
    Type = GetAddressDk.AutocompleteLevel.Adresse,
    Postnr = "2300|2400",                                 // several separated by |, as in DAWA
    Fuzzy = true,
    PerSide = 10,
});

KunTekst = true on AutocompleteQuery asks for the free text-only answer there too.

AdresserAutocomplete, AdgangsadresserAutocomplete, VejnavneAutocomplete and PostnumreAutocomplete call DAWA's per-resource autocompletes. AdresserAutocompleteTextOnly and AdgangsadresserAutocompleteTextOnly are their free text-only forms: each suggestion is Tekst and a RecordReference (Id, Href) to fetch with GetAdresseMini or GetAdgangsadresseMini, one look-up.

Adresser and adgangsadresser

var adresse = await api.GetAdresse("3bba05d4-c8c4-4c90-8a64-a4dff11b9d1b");
var line = adresse.Success!.Adressebetegnelse;        // "Amagerbrogade 217A, kl. 5, 2300 København S"
var floor = adresse.Success.Etage;                    // "kl"
var door = adresse.Success.Doer;                      // "5"
var point = adresse.Success.Adgangsadresse.Adgangspunkt!.Koordinater;   // [lon, lat]

var found = await api.SearchAdresser(new GetAddressDk.AdresseQuery
{
    Postnr = "2300",
    Vejnavn = "Amagerbrogade",
    Husnr = "217A",
    PerSide = 100,                                    // at most 100; Side pages on
});

var adgangsadresse = await api.GetAdgangsadresseMini("099f3e28-4fb8-4c61-86a1-edff5df52409");

A search costs one look-up per record returned. Etage = "" or Doer = "" means "has none", as in DAWA.

Reverse geocoding

var nearest = await api.Reverse(12.6137425, 55.6490036);                                // WGS84
var utm = await api.ReverseMini(724524.37, 6172102.97, GetAddressDk.Srid.Etrs89Utm32);

GeoJSON

var feature = await api.GetAdresseGeoJson("3bba05d4-c8c4-4c90-8a64-a4dff11b9d1b");
var json = feature.Success!.Json;                     // exactly as sent, for a map library

SearchAdresserGeoJson, SearchAdgangsadresserGeoJson, GetAdgangsadresseGeoJson and ReverseGeoJson do the same.

Datavask (address cleaning)

An address written any way — misspelt, abbreviated — matched against DAR. One look-up when an address is returned; free otherwise.

var washed = await api.DatavaskAdresser("Amagerbrogde 217A, kl. 5, 2300 Kbh S");
var svar = washed.Success!;
if (svar.Kategori is "A" or "B")                       // A exact, B safe to use, C uncertain
{
    var adresse = svar.Resultater[0].Adresse!;          // id 3bba05d4-…, Amagerbrogade 217A, kl. 5
}

DatavaskAdgangsadresser does the same for access addresses (each result's Adgangsadresse). Up to 10 results, best first; Vaskeresultat.Afstand and Forskelle count the edits.

Vejnavne and postnumre

Free, and rate limited.

var streets = await api.Vejnavne(new GetAddressDk.VejnavnQuery { Postnr = "2300" });   // every street in 2300
var street = await api.GetVejnavn("Amagerbrogade");
var postcodes = await api.Postnumre();                                                  // all of them
var postcode = await api.GetPostnummer("2300");

Companies (CVR)

Active Danish companies from CVR (Det Centrale Virksomhedsregister), by name or CVR number. Suggestions are free and rate limited; a company's record is one look-up (a bad check digit or an unknown company costs nothing).

var found = await api.Companies("eksempel bag");                     // legal names first, then binavne
var company = await api.Company(found.Success!.Suggestions[0]);      // or api.Company("12345674")
var c = company.Success!;                                            // Name, OtherNames, CompanyForm, Industry, Address
if (c.Address?.Source == "dar")
{
    var dar = await api.GetAdresse(c.Address.Id!);                   // the full DAR address
}

A company with Reklamebeskyttet true has asked not to be contacted for direct marketing: you must not use it for that. Data: Det Centrale Virksomhedsregister (CVR), CC BY 4.0.

Errors

Errors are results, not exceptions. Failed.Status is the HTTP status (0 when no response arrived) and Failed.Message says what went wrong. There are two kinds:

  • DAWA's errors, with DAWA's status and body. Failed.Code is QueryParameterFormatError (400), ResourcePathFormatError (404, e.g. an id that is not a UUID) or ResourceNotFoundError (404), and Failed.Details lists each parameter and what was wrong with it.
  • Our refusals — the key, the plan's limits, the subscription — as problem details: 401 (no key, an unknown key, or an API key from a web page), 403 (the key may not do this, or the subscription has ended) and 429 with Failed.RetryAfterSeconds. Failed.Code is the body's code when it has one.
var result = await api.GetAdresse(id);

if (!result.IsSuccess)
{
    if (result.Failed.IsNotFound) { /* no such address; costs nothing */ }
    else if (result.Failed.IsQueryParameterFormatError) { var what = result.Failed.Details[0].Name; }
    else if (result.Failed.IsRateLimited) { await Task.Delay(TimeSpan.FromSeconds(result.Failed.RetryAfterSeconds ?? 60)); }
}

Usage

var today = await api.Usage();                        // needs the admin key
var oneDay = await api.Usage(29, 9, 2026);
var range = await api.Usage(new DateTime(2026, 9, 1), new DateTime(2026, 9, 29));

Coming from DAWA

DAWA getAddress.Dk.Sdk
https://api.dataforsyningen.dk/autocomplete?q=… api.Autocomplete(q)
/adresser/{id} (?struktur=flad, mini) GetAdresse(id), GetAdresseFlad(id), GetAdresseMini(id)
/adresser?postnr=…&vejnavn=… SearchAdresser(new AdresseQuery { … })
/adgangsadresser/{id}, /adgangsadresser?… GetAdgangsadresse(id), SearchAdgangsadresser(…)
/adgangsadresser/reverse?x=…&y=… Reverse(x, y)
/vejnavne, /vejnavne/{navn} Vejnavne(…), GetVejnavn(navn)
/postnumre, /postnumre/{nr} Postnumre(…), GetPostnummer(nr)
/datavask/adresser, /datavask/adgangsadresser DatavaskAdresser(betegnelse), DatavaskAdgangsadresser(betegnelse)
format=geojson the …GeoJson methods
  • Every request needs a key. DAWA needed none.
  • Ids are DAR's UUIDs, the same ids DAWA used, so stored ids still resolve.
  • /adresser and /adgangsadresser always page: per_side at most 100, and 100 when not given.
  • Records fetched, searched for or found by position count against your plan; street names and postcodes are free. Requests are rate limited.
  • Only the endpoints above are provided. Links in records to others (/kommuner, /sogne, …) answer 404.
  • bebyggelser is always empty; sogn, politikreds, retskreds, opstillingskreds, afstemningsområde, jordstykke and zone hold DAWA's values of 23 September 2026.

The full list: Differences from DAWA.

Local development

Set the HttpClient's BaseAddress to a locally running API (end it with a slash):

services.AddHttpClient<GetAddressDk.Api>(client => client.BaseAddress = new Uri("https://localhost:7166/"));

Licence

MIT © getAddress()

The MIT licence covers the code only. Address data is the Danish Address Register (DAR), © Klimadatastyrelsen, licensed CC BY 4.0: credit it wherever you show or pass it on, e.g. "Contains data from the Danish Address Register (DAR), © Klimadatastyrelsen, CC BY 4.0." See the data sources page.

Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 was computed.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 was computed.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
.NET Core netcoreapp2.0 was computed.  netcoreapp2.1 was computed.  netcoreapp2.2 was computed.  netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.0 is compatible.  netstandard2.1 was computed. 
.NET Framework net461 was computed.  net462 was computed.  net463 was computed.  net47 was computed.  net471 was computed.  net472 was computed.  net48 was computed.  net481 was computed. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen40 was computed.  tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
1.2.0 88 10/11/2026
1.1.0 88 10/6/2026
1.0.0 104 9/29/2026

1.2.0: free text-only autocomplete (AutocompleteQuery.KunTekst, Autocomplete(q, kunTekst: true), AdresserAutocompleteTextOnly, AdgangsadresserAutocompleteTextOnly); the address picked is one look-up with GetAdresseMini. Nothing else changes.