# Vask adresser i Make med HTTP-modulet

> Opsæt HTTP-modulet i et Make-scenarie mod datavask, map felterne korrekt, og håndter 429 og fejl med en router eller en error handler.
>
> https://danadresse.dk/guides/make · verified 2026-11-02
Make har ikke brug for en særlig Danadresse-app. Det indbyggede **HTTP**-modul kalder API'et direkte, og med *Parse response* slået til bliver svaret til felter, du kan mappe videre. Den korte opskrift står på [/integrationer/make](/integrationer/make). Denne guide går længere: præcis feltmapping, nøglen i en header, og hvad du gør ved fejl og 429.

## 1. Opsæt HTTP-modulet

Tilføj **HTTP → Make a request** efter det modul, der leverer adressen (Google Sheets, en webhook, dit CRM). Udfyld:

| Felt | Værdi |
|---|---|
| URL | `https://api.danadresse.dk/datavask/adgangsadresser` |
| Method | `GET` |
| Headers | Name `X-Api-Key`, Value din nøgle |
| Query String | Name `betegnelse`, Value adressen fra forrige modul, fx `{{1.Adresse}}` |
| Parse response | Yes |

Send nøglen som header frem for `api_key` i query-strengen. Query-strengen står i scenariets kørselslog sammen med URL'en, så alle med adgang til loggen kan se nøglen. Har dit HTTP-modul et felt til godkendelse med en API-nøgle, kan du gemme nøglen der med header-navnet `X-Api-Key`.

`/datavask/adgangsadresser` matcher opgangen (vej, husnummer, postnummer). Skal du ramme en bestemt lejlighed, så brug `/datavask/adresser`: den læser etage og dør direkte fra `betegnelse` (`Strandvejen 100, 2. tv, 2900 Hellerup`), og `adresse` har så også `etage`, `dør` og `adgangsadresseid`. Har du delene i separate felter, kan du i stedet sende `vejnavn`, `husnr`, `etage`, `dør` og `postnr` som hver sin query-parameter.

## 2. Map felterne

Med *Parse response* ligger svaret under `data`. `resultater` er en liste med det bedste match først, og Make tæller fra 1. Antag, at HTTP-modulet er modul nummer 2:

| Du skal bruge | Mapping |
|---|---|
| Kategori (A, B eller C) | `{{2.data.kategori}}` |
| Adgangsadressens id | `{{2.data.resultater[1].adresse.id}}` |
| Vejnavn | `{{2.data.resultater[1].adresse.vejnavn}}` |
| Husnummer | `{{2.data.resultater[1].adresse.husnr}}` |
| Postnummer | `{{2.data.resultater[1].adresse.postnr}}` |
| By | `{{2.data.resultater[1].adresse.postnrnavn}}` |
| HTTP-status | `{{2.statusCode}}` |

Svaret, mappingen bygger på, ser sådan ud:

```json id=response-shape run=no
{
  "kategori": "A",
  "resultater": [
    {
      "adresse": {
        "id": "0a3f507c-0624-32b8-e044-0003ba298018",
        "vejnavn": "Strandvejen",
        "adresseringsvejnavn": "Strandvejen",
        "husnr": "100",
        "supplerendebynavn": null,
        "postnr": "2900",
        "postnrnavn": "Hellerup",
        "status": 1,
        "href": "…"
      },
      "aktueladresse": { "…": "samme felter, den gældende version" },
      "vaskeresultat": {
        "afstand": 0,
        "forskelle": { "vejnavn": 0, "husnr": 0, "postnr": 0, "postnrnavn": 0 },
        "ukendtetokens": []
      }
    }
  ]
}
```

Er `resultater` tom, er kategorien C, og alle `resultater[1]`-felter er tomme. Tjek det i et filter, før du skriver tilbage.

Vaskesvaret har ikke kommune eller koordinater. Skal du bruge dem, så tilføj et HTTP-modul mere med URL'en `https://api.danadresse.dk/adgangsadresser/{{2.data.resultater[1].adresse.id}}` og samme header. Map `kommune.kode`, `kommune.navn` og `adgangspunkt.koordinater[1]` / `[2]` (længde, bredde) fra dets `data`. Det er ét kald mere pr. række.

## 3. Del flowet med en router

Læg en **Router** efter HTTP-modulet med tre ruter:

1. Filter: `{{2.statusCode}}` = 200 og `{{2.data.kategori}}` er A eller B → skriv adressen tilbage. A er et præcist match. B er ét sikkert match med små stavefejl, så skriv den officielle tekst fra resultatet tilbage, ikke inputtet.
2. Filter: `{{2.statusCode}}` = 200 og `{{2.data.kategori}}` = C → send til manuel kontrol (Slack, mail, en fane i dit regneark). C betyder flere kandidater eller større afvigelser; godkend det aldrig automatisk.
3. Fallback-ruten: alt andet → log status og adresse, så du kan køre dem igen.

Routeren virker kun, hvis HTTP-modulet ikke stopper scenariet ved fejl. Sæt derfor **Evaluate all states as errors** til *No* under modulets avancerede indstillinger. Så kommer 4xx- og 5xx-svar videre som almindelige bundter med `statusCode`.

## 4. 429 og genforsøg

Der er to slags 429, og de skal behandles forskelligt:

| Kode | Header | Hvad du gør |
|---|---|---|
| `rate_limit_per_minute` | `Retry-After` (1-60 sekunder) | For mange kald i minuttet. Vent og prøv igen |
| `quota_exceeded` | ingen `Retry-After` | Gratisplanens månedskvote og dens buffer på 20 % er brugt. Stop indtil den 1. i næste måned, eller opgrader |

Koden står i `{{2.data.code}}`, fordi fejlsvar på DAWA-stierne har formen `{"type", "title", "details", "code"}`. Ved `quota_exceeded` er `{{2.data.title}}` en forklaring i klar tekst, `{{2.data.details.resets_at}}` siger, hvornår kvoten nulstilles, og `{{2.data.details.upgrade_url}}` linker til opgraderingssiden. Afviste kald tæller ikke.

Vil du hellere lade Make prøve igen automatisk, så lad *Evaluate all states as errors* stå på *Yes*, højreklik på HTTP-modulet, og vælg **Add error handler → Break**. Sæt antal forsøg til 3 og intervallet til 1 minut. Det kræver, at *Allow storing of incomplete executions* er slået til i scenariets indstillinger. Break hjælper ved minutgrænsen, ikke ved en brugt månedskvote.

Behandler scenariet mange rækker på én gang, så indsæt **Tools → Sleep** på 1 sekund efter HTTP-modulet. På gratisplanen er grænsen 360 kald i minuttet.

## Test kaldet

Samme kald som HTTP-modulet, fra en terminal:

```bash id=test-call run=live expect="kategori"
curl -s "https://api.danadresse.dk/datavask/adgangsadresser?betegnelse=Strandvejen%20100%2C%202900%20Hellerup" \
  -H "X-Api-Key: $DANADRESSE_API_KEY"
```

## Næste skridt

- [Zapier](/guides/zapier) og [n8n](/guides/n8n) — samme opsætning i andre værktøjer.
- [Grænser, kvoter og 429](/guides/graenser-og-429)
- Kort opskrift: [/integrationer/make](/integrationer/make)
