# From Datafordeleren's DAR GraphQL back to REST

> Find the REST endpoint that matches your DAR GraphQL query, and understand which ids line up and which do not.
>
> https://danadresse.dk/en/guides/migrer-fra-datafordeleren · verified 2026-11-02
Some teams moved from DAWA to the Danish Address Register (DAR) on Datafordeleren before DAWA closed. DAR's GraphQL service holds the same data, but in the register's own shape: many small entities that refer to each other by UUID, and queries that need a registration time and a validity time.

Danadresse takes the addresses from DAR and serves them in DAWA's REST shape. This guide shows which endpoint matches the query you have today, and how the ids fit together.

## What you no longer have to do

An address in DAR is spread over several entities. To show "Rådhuspladsen 1, 1550 København V" with a coordinate and a municipality you typically fetch:

- `DAR_Husnummer` (the house number and references to street, postcode and access point),
- `DAR_NavngivenVej` (the street name),
- `DAR_NavngivenVejKommunedel` (municipality and road code),
- `DAR_Postnummer` (postcode and name),
- `DAR_Adressepunkt` (the coordinate).

Every query needs the `registreringstid` and `virkningstid` arguments, and you join the answers yourself. With us it is one call, and the response already embeds street name, postcode, municipality, coordinate and the administrative areas.

This is a house-number lookup in DAR GraphQL. The field names come from DAR's public schema:

```graphql id=dar-query run=no
{
  DAR_Husnummer(
    where: { id_lokalId: { eq: "0a3f507a-ec01-32b8-e044-0003ba298018" } }
    registreringstid: "2026-10-15T00:00:00Z"
    virkningstid: "2026-10-15T00:00:00Z"
    first: 1
  ) {
    nodes { id_lokalId husnummertekst status navngivenVej postnummer adgangspunkt }
  }
}
```

`navngivenVej`, `postnummer` and `adgangspunkt` are UUID references that need three more queries. The same lookup with us:

```bash id=rest-lookup run=live expect="adressebetegnelse"
curl -s "https://api.danadresse.dk/adgangsadresser/0a3f507a-ec01-32b8-e044-0003ba298018" \
  -H "X-Api-Key: $DANADRESSE_API_KEY"
```

Here we read the fields you used to assemble from five entities. `srid=25832` returns the coordinate in ETRS89/UTM32, the same system as DAR's address points:

```python id=rest-fields run=live expect="Rådhuspladsen"
import os

import requests

r = requests.get(
    "https://api.danadresse.dk/adgangsadresser/0a3f507a-ec01-32b8-e044-0003ba298018",
    params={"srid": 25832},
    headers={"X-Api-Key": os.environ["DANADRESSE_API_KEY"]},
    timeout=10,
)
r.raise_for_status()
a = r.json()
print("street:      ", a["vejstykke"]["navn"], a["husnr"])
print("postcode:    ", a["postnummer"]["nr"], a["postnummer"]["navn"])
print("municipality:", a["kommune"]["kode"], a["kommune"]["navn"])
print("road code:   ", a["vejstykke"]["kode"])
print("parish:      ", (a.get("sogn") or {}).get("navn"))
print("east/north:  ", a["adgangspunkt"]["koordinater"])
```

## The ids are the same

The most important point for a migration: the ids you stored from DAR work with us directly.

| DAR entity | Field | At Danadresse |
|---|---|---|
| `DAR_Adresse` | `id_lokalId` | `id` of an adresse – `/adresser/{id}` |
| `DAR_Husnummer` | `id_lokalId` | `id` of an adgangsadresse – `/adgangsadresser/{id}` |
| `DAR_Adresse` | `husnummer` | `adgangsadresseid` on an adresse |
| `DAR_NavngivenVej` | `id_lokalId` | `id` of a named street – `/navngivneveje/{id}` |
| `DAR_Postnummer` | `postnr` | `nr` – `/postnumre/{nr}`. We use the four-digit number, not `id_lokalId` |
| `DAR_NavngivenVejKommunedel` | `kommune`, `vejkode` | `/vejstykker/{kommunekode}/{kode}` |

These are the same UUIDs DAWA used, because DAWA was built on DAR too.

Be careful with address references from other registers. CVR on Datafordeleren, for example, refers to addresses with other UUIDs that do not match DAR's `id_lokalId`. To join data from such a register with our addresses, use the structured address: municipality code, road code and house number (plus floor and door for a unit). We expose that combination as `kvh` (12 characters) on adgangsadresser and `kvhx` (19 characters) on adresser, and you can search on them with `/adgangsadresser?kvh=…` and `/adresser?kvhx=…`.

## Task by task

| Task | In DAR GraphQL | At Danadresse |
|---|---|---|
| Search as you type | Not available. You filter yourself | `GET /autocomplete?q=…` |
| Look up an address | `DAR_Adresse` + `DAR_Husnummer` + street, postcode and address point | `GET /adresser/{id}` |
| Look up an access address | `DAR_Husnummer` + the references | `GET /adgangsadresser/{id}` |
| All addresses in a postcode | Filter `DAR_Husnummer` on the postcode reference | `GET /adgangsadresser?postnr=8000` with `side` and `per_side` |
| Street names | `DAR_NavngivenVej` | `/navngivneveje`, `/vejnavne` |
| Postcodes | `DAR_Postnummer` | `/postnumre` |
| Supplementary town name | `DAR_SupplerendeBynavn` | The `supplerendebynavn` field and `/supplerendebynavne2` |
| Municipality, parish, police district etc. | References from `DAR_Husnummer` to DAGI, which you look up in the DAGI register | Embedded in the adgangsadresse: `kommune`, `sogn`, `region`, `retskreds`, `politikreds`, `opstillingskreds`, `afstemningsområde` and more |
| Coordinate to address | Not a DAR function | `/adgangsadresser/reverse?x=…&y=…` |
| Clean a typed address | Not a DAR function | `/datavask/adresser?betegnelse=…` |
| Fetch changes | `DAR_Events` or filtering on `registreringFra` | `/replikering/haendelser?entitet=…&sekvensnummerfra=…` or webhooks |

## Status and time

DAR has its own status codes. We translate them to DAWA's `status`:

| DAR status | Meaning | `status` with us |
|---|---|---|
| 2 | provisional (foreløbig) | 3 |
| 3 | current (gældende) | 1 |
| 4 | retired (nedlagt) | 2 |
| 5 | withdrawn (henlagt) | 4 |

Lists return current and provisional addresses (`status` 1 and 3), as DAWA did, unless you ask for more with `status` or `medtagnedlagte`. Autocomplete only suggests addresses that are not retired. Each address also carries DAR's own code as `darstatus`. See [status, darstatus and retired addresses](/en/guides/status-og-darstatus).

Our API shows the current picture. There are no parameters matching `registreringstid` and `virkningstid`. For the versions of one address over time use `/historik/adresser?id=…` and `/historik/adgangsadresser?id=…`: a list of versions with `virkningstart`, `virkningslut` and `status`, as in DAWA. The versions are built from our change log, which starts in July 2026. If you need DAR's full bitemporal model (what the register knew at a given registration time), use DAR directly.

## Changes and sequence numbers

`DAR_Events` has no sequence number, so you track how far you have got yourself, typically with time windows on `registreringFra`. We give each change a rising `sekvensnummer` in DAWA's replication format. You store the last number you processed and ask for everything after it. See [Fetch changes with events](/en/guides/replikering-haendelser).

The sequence numbers are our own. They continue upwards from where DAWA's numbering stopped, but they do not exist in DAR and cannot be compared with anything there.

## Next steps

- The difference between adresse and adgangsadresse: [Adresse or adgangsadresse](/en/guides/adresse-vs-adgangsadresse).
- The whole dataset locally: [First extract](/en/guides/replikering-foerste-udtraek).
- Known differences from DAWA: [Move from DAWA](/en/guides/migrer-fra-dawa#5-known-gaps).
