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
<PackageReference Include="getAddress.Dk.Sdk" Version="1.2.0" />
<PackageVersion Include="getAddress.Dk.Sdk" Version="1.2.0" />
<PackageReference Include="getAddress.Dk.Sdk" />
paket add getAddress.Dk.Sdk --version 1.2.0
#r "nuget: getAddress.Dk.Sdk, 1.2.0"
#:package getAddress.Dk.Sdk@1.2.0
#addin nuget:?package=getAddress.Dk.Sdk&version=1.2.0
#tool nuget:?package=getAddress.Dk.Sdk&version=1.2.0
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.CodeisQueryParameterFormatError(400),ResourcePathFormatError(404, e.g. an id that is not a UUID) orResourceNotFoundError(404), andFailed.Detailslists 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.Codeis the body'scodewhen 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.
/adresserand/adgangsadresseralways page:per_sideat 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. bebyggelseris always empty;sogn,politikreds,retskreds,opstillingskreds,afstemningsområde,jordstykkeandzonehold 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 | Versions 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. |
-
.NETStandard 2.0
- System.Text.Json (>= 10.0.9)
-
net8.0
- No dependencies.
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
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.