# Webhooks

> Giv jeres egen tjeneste besked, når der sker noget i Adea. Hver besked er signeret, indeholder id'er, titler og links, og sendes igen, hvis den ikke kommer frem.

Source: https://adea.app/da/docs/webhooks

En webhook er en adresse hos jer selv, som Adea kalder, når der sker noget. Brug den til at sætte arbejde i gang i jeres egne værktøjer: opret en sag, når der kommer en indsigt, opdater et regneark, når en liste ændrer sig, eller giv et chatrum besked, når nogen får en række.

Kun administratorer kan tilføje og ændre webhooks. De ligger på siden **Udvikler** i **Indstillinger**, under API-nøglerne.

## Tilføj en webhook

1. Åbn **Indstillinger**, derefter **Udvikler**, og find **Webhooks**.
2. Skriv adressen på jeres tjeneste. Den skal starte med `https://` og kunne nås fra internettet. Adresser på et privat netværk bliver afvist.
3. Vælg, hvad den skal høre om, og vælg **Tilføj webhook**.
4. Kopier signeringsnøglen, og gem den et sikkert sted. Den vises kun én gang.

Hver webhook har sin egen signeringsnøgle. En virksomhed kan have op til 10 webhooks. At tilføje en bliver skrevet i sikkerhedsloggen.

## Hvad I kan lytte efter

| Begivenhed | Sendes, når |
|---|---|
| `insight.created` | Adea opretter en indsigt. |
| `list.changed` | En liste får nye rækker, eller rækker forlader den. |
| `list.row_assigned` | En række på en liste er givet til nogen. |
| `answer.saved` | Nogen gemmer et svar. |

## Hvad en besked indeholder

En besked er JSON og sendes med `POST`. Den indeholder id'er, titler og et link, aldrig værdierne i jeres rækker og aldrig personoplysninger. Den siger heller ikke, hvem en række er givet til. Vil I se mere, så følg linket, hvor Adeas sædvanlige adgangsregler gælder.

```json
{
  "id": "0198f1c2-7d1e-7c3a-9b5e-2f6a8d4c1e90",
  "type": "insight.created",
  "createdAt": "2026-10-07T08:30:12.000Z",
  "data": {
    "insightId": "0198f1c2-5a0b-7e11-8c44-91d2b7e3a6f5",
    "title": "Ordrer fra Aarhus faldt 18 %",
    "url": "https://jeres-virksomhed.adea.app/insights/0198f1c2-5a0b-7e11-8c44-91d2b7e3a6f5"
  }
}
```

Felterne i `data` afhænger af begivenheden. Alle begivenheder har en `title` og en `url`.

## Tjek, at den kommer fra Adea

Hver besked har disse headers:

- `Adea-Signature`: `t=<sekunder>,v1=<signatur>`
- `Adea-Event`: begivenheden, fx `insight.created`
- `Adea-Delivery`: beskedens id, det samme som `id` i beskeden

Signaturen er en HMAC med SHA-256 over tidspunktet, et punktum og selve beskeden præcis som den kom, med webhookens signeringsnøgle. Regn den ud selv, og sammenlign. Afvis en besked, hvor tidspunktet er mere end fem minutter gammelt.

```js
import { createHmac, timingSafeEqual } from "node:crypto";

export function fromAdea(secret, header, rawBody) {
  const t = /t=(\d+)/.exec(header)?.[1];
  const v1 = /v1=([0-9a-f]+)/.exec(header)?.[1];
  if (!t || !v1 || Math.abs(Date.now() / 1000 - Number(t)) > 300) return false;
  const expected = createHmac("sha256", secret).update(`${t}.${rawBody}`).digest();
  const given = Buffer.from(v1, "hex");
  return expected.length === given.length && timingSafeEqual(expected, given);
}
```

Brug beskeden præcis som den kom, før den læses som JSON.

## Svar hurtigt

Svar med en `2xx`-status inden for 10 sekunder. Gør det langsomme arbejde, når I har svaret. Adea følger ikke omdirigeringer.

## Hvis den ikke kommer frem

En besked, der ikke får et `2xx`-svar, sendes igen efter 1 minut, 5 minutter, 30 minutter, 2 timer, 6 timer, 12 timer og et døgn. Efter det ottende forsøg opgiver Adea den. En besked kan komme frem mere end én gang, så brug `Adea-Delivery` til at springe en over, I allerede har håndteret.

Hvis 20 beskeder i træk fejler, sætter Adea webhooken på pause, og siden siger det. Ret fejlen i jeres tjeneste, og slå webhooken til igen.

## Test og se tilbage

- **Send en test** sender en besked af typen `test` til adressen, signeret som de rigtige. Den indeholder ingen af jeres data.
- **Seneste beskeder** viser de seneste 50, der er sendt til en webhook: hvilken begivenhed, om den kom frem, hvilken status jeres tjeneste svarede med, og hvornår næste forsøg er. En besked, der ikke kom frem, kan sendes igen derfra.

## Slå fra eller slet

Slå en webhook fra for at stoppe beskederne uden at miste dens indstillinger. Slet den for at fjerne den og dens log. At slette en bliver skrevet i sikkerhedsloggen.

## Med API'et

Alt på siden er en handling, så I kan også styre webhooks fra et script: `webhooks.list`, `webhooks.create`, `webhooks.change`, `webhooks.test`, `webhooks.log`, `webhooks.retry` og `webhooks.delete`. Se [API'et](/da/docs/api).
