---
title: "Webhook-slutpunkter"
description: "Administrer flere webhook-URL'er med hemmeligheder pr. slutpunkt og hændelsesfiltre."
---

Det endpointbaserede webhook-system lader dig registrere **flere**
destinationer pr. organisation, hver med sin egen hemmelighed, sin egen
status og sit eget abonnement på et udvalg af hændelsestyper. Dette er
den anbefalede model for alle nye integrationer.

Sammenlign med den [ældre webhook med enkelt-URL](/api-reference/organizations#legacy-single-url-webhook),
som bevares af hensyn til bagudkompatibilitet, men kun understøtter én URL pr.
organisation.

## Endepunkter

| Metode | Sti | Påkrævet rolle | Beskrivelse |
|--------|------|---------------|-------------|
| `GET` | `/v1/developer/webhook-endpoints` | `admin+` | Vis slutpunkter |
| `POST` | `/v1/developer/webhook-endpoints` | `admin+` | Opret et slutpunkt |
| `PATCH` | `/v1/developer/webhook-endpoints/{endpoint_id}` | `admin+` | Opdater etiket / URL / hændelser / status |
| `DELETE` | `/v1/developer/webhook-endpoints/{endpoint_id}` | `admin+` | Slet et slutpunkt |
| `POST` | `/v1/developer/webhook-endpoints/{endpoint_id}/rotate-secret` | `admin+` | Erstat signeringshemmeligheden |
| `POST` | `/v1/developer/webhook-endpoints/{endpoint_id}/test` | `admin+` | Send en signeret testlevering |
| `GET` | `/v1/developer/webhook-deliveries` | `admin+` | Gennemse seneste resultater for slutpunkter og ældre leveringer |

## Endpoint-objekt

```json
{
  "id": "c4d5e6f7-...",
  "label": "Production — Call events",
  "url": "https://example.com/thunderphone/hook",
  "events": ["telephony.incoming", "telephony.complete"],
  "status": "active",
  "agent_id": 42,
  "agent_name": "Support Agent",
  "secret_hint": "a1b2…9f0e",
  "paused_at": null,
  "pause_last_error": "",
  "pause_undelivered_count": null,
  "created_at": "2026-04-20T18:24:10.113Z",
  "updated_at": "2026-04-20T18:24:10.113Z"
}
```

| Felt | Type | Beskrivelse |
|-------|------|-------------|
| `id` | UUID | Endepunkt-id |
| `label` | string | Vist navn, 1–120 tegn |
| `url` | string | HTTPS-URL; `http://localhost` tilladt til udvikling |
| `events` | array af string | Abonnerede hændelsestyper (se [gyldige værdier](#valid-event-types)). Tomt array abonnerer på alle hændelser undtagen de eksplicitte hændelser pr. tur (`telephony.turn` / `web.turn`) |
| `status` | string | `active`, `disabled` (manuelt sat på pause) eller `failing` (indstilles automatisk, når en levering opbruger sin genforsøgsplan på 24 h uden en eneste 2xx) |
| `agent_id` | integer \| null | Agent, som dette endepunkt er afgrænset til; `null` betyder organisationsdækkende |
| `agent_name` | string \| null | Navn på den afgrænsede agent eller `null` for et organisationsdækkende endepunkt |
| `secret_hint` | string | De første 4 og sidste 4 tegn i signeringshemmeligheden med en ellipse (`a1b2…9f0e`) — nok til at krydsreferere hemmeligheden, du har gemt lokalt, uden at eksponere den fulde værdi |
| `paused_at` | timestamp \| null | Tidspunktet, hvor ThunderPhone indstillede endepunktet til `failing`. `null`, mens det er `active` eller `disabled` |
| `pause_last_error` | string | Den sidste leveringsfejl, da endepunktet blev sat på pause, for eksempel `HTTP 503: Service Unavailable`. Tom, medmindre status er `failing` |
| `pause_undelivered_count` | integer \| null | Hændelser, der ikke er leveret siden endepunktets seneste vellykkede levering, talt da det blev sat på pause |
| `created_at`, `updated_at` | timestamp | |

<Note>
  Endpointets fulde `secret` returneres **én gang** ved oprettelse og
  aldrig igen. Opbevar den sikkert — hvis du mister den,
  [rotér den](#rotate-the-signing-secret) for at få en ny.
</Note>

### Gyldige hændelsestyper

`events` valideres mod præcis dette sæt — værdier uden for listen
returnerer `400`. Se [Hændelseskatalog](/da/webhooks/events) for hver types
payloadstruktur.

- `telephony.incoming`, `telephony.complete`, `telephony.tool`, `telephony.turn`
- `web.incoming`, `web.complete`, `web.tool`, `web.turn`
- `sms.sent`, `sms.failed`
- `sms.received` (reserveret; udsendes endnu ikke)
- `call.graded`, `call.data_extracted`, `call.transfer_completed`
- `campaign.completed`
- `issue.reported`, `issue.escalated`
- `test-call.completed`
- `alert.triggered`

`issue.escalated` har ingen agentkontekst og leveres kun til
organisationsdækkende endpoints.

`voice.ready` og `voice.failed` kan ikke vælges eksplicit. For at modtage
dem skal du oprette et organisationsdækkende endpoint med `events: []`. En tom
hændelsesliste modtager alle understøttede hændelser undtagen `telephony.turn` og `web.turn`,
som skal vælges eksplicit.

### Endpoint-statusser

- `active` — leveringer forløber normalt.
- `disabled` — manuelt sat på pause via `PATCH`. Der sendes ingen anmodninger. Vi
  ændrer aldrig status for et `disabled`-endepunkt; det er altid dit valg at ændre det tilbage til
  `active`.
- `failing` — indstilles automatisk, når en levering til endepunktet bruger
  hele sin genforsøgsplan (8 forsøg over 24 timer) uden
  nogensinde at få en 2xx. Et fejlende endepunkt modtager ingen yderligere trafik.
  Vi sender en e-mail til din organisations ejere og administratorer, når dette sker, og
  dashboardet viser det pausede endepunkt med knappen Genaktivér.
  Når endepunktet er rettet, skal du `PATCH`-ændre dets status tilbage til `active`;
  leveringer, hvis genforsøgsplan endnu ikke er udløbet, fortsætter, hvor de
  slap.

---

## Vis endpoints

<CodeGroup>
```bash cURL
curl https://api.thunderphone.com/v1/developer/webhook-endpoints \
  -H "Authorization: Bearer sk_live_YOUR_API_KEY"
```
</CodeGroup>

Returnerer et array af [Endpoint-objekter](#endpoint-object).
Angiv `?agent_id=42` for kun at returnere endpoints, der er afgrænset til den agent.

### Agentafgrænsede endpoints

Organisationsdækkende endpoints modtager alle matchende hændelser. Et endpoint med
`agent_id` modtager kun matchende hændelser for opkald, der håndteres af den agent;
hændelser uden agentkontekst, såsom `alert.triggered`, når det aldrig. Du
kan også oprette og administrere disse endpoints fra afsnittet
**Webhooks** i agentbyggeren.

---

## Opret et endpoint

<CodeGroup>
```bash cURL
curl -X POST https://api.thunderphone.com/v1/developer/webhook-endpoints \
  -H "Authorization: Bearer sk_live_YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "label":  "Production — Call events",
    "url":    "https://example.com/thunderphone/hook",
    "events": ["telephony.incoming", "telephony.complete"]
  }'
```

```python Python
result = requests.post(
    "https://api.thunderphone.com/v1/developer/webhook-endpoints",
    headers={"Authorization": "Bearer sk_live_YOUR_API_KEY"},
    json={
        "label":  "Production — Call events",
        "url":    "https://example.com/thunderphone/hook",
        "events": ["telephony.incoming", "telephony.complete"],
    },
).json()
secret = result["secret"]
endpoint_id = result["id"]
```
</CodeGroup>

### Anmodningsfelter

| Felt | Type | Påkrævet | Beskrivelse |
|-------|------|----------|-------------|
| `label` | streng | ja | 1–120 tegn |
| `url` | streng | ja | HTTPS-URL (`http` er kun tilladt for `localhost` / `127.0.0.1`) |
| `events` | array | nej | Tom/udeladt abonnerer på alle hændelser undtagen `telephony.turn` / `web.turn`, som kræver et eksplicit abonnement. Skal bruge værdierne angivet i [Gyldige hændelsestyper](#valid-event-types); dubletter fjernes |
| `agent_id` | heltal \| null | nej | Begræns levering til en agent i denne organisation; udelad eller brug `null` for et organisationsdækkende endpoint |

Returnerer `201 Created` med det [Endpoint-objekt](#endpoint-object) samt
et ekstra `secret`-felt på øverste niveau, der indeholder den rå signeringsnøgle — en
hex-streng på 48 tegn:

```json
{
  "id": "c4d5e6f7-…",
  "label": "Production — Call events",
  "url": "https://example.com/thunderphone/hook",
  "events": ["telephony.incoming", "telephony.complete"],
  "status": "active",
  "secret_hint": "a1b2…9f0e",
  "created_at": "2026-04-20T18:24:10.113Z",
  "updated_at": "2026-04-20T18:24:10.113Z",
  "secret": "a1b2c37e08d94f5b16a2c8d90e7f3a4b5c6d7e8f90a19f0e"
}
```

<Warning>
  `secret` returneres **kun ved oprettelse**. Efterfølgende `GET`-svar
  indeholder kun `secret_hint`. Kopiér den fulde værdi til din
  hemmelighedshåndtering, før du lukker svaret.
</Warning>

---

## Opdater et endpoint

<CodeGroup>
```bash cURL
curl -X PATCH https://api.thunderphone.com/v1/developer/webhook-endpoints/c4d5e6f7-... \
  -H "Authorization: Bearer sk_live_YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "label":  "Production — Call + Grade events",
    "events": ["telephony.incoming", "telephony.complete", "call.graded"]
  }'
```
</CodeGroup>

| Felt | Type | Beskrivelse |
|-------|------|-------------|
| `label` | streng | |
| `url` | streng | |
| `events` | array | |
| `status` | streng | `active` eller `disabled`. Angiv `active` for at genaktivere et endpoint, som serveren har markeret som `failing` |
| `agent_id` | heltal \| null | Angiv et agent-id for at begrænse endpointet, eller `null` for at gøre det organisationsdækkende |

Returnerer `200 OK` med det opdaterede [Endpoint-objekt](#endpoint-object).

---

## Rotér signeringshemmeligheden

Erstat et endpoints signeringshemmelighed, f.eks. når den er gået tabt eller
muligvis er lækket. For et agentspecifikt endpoint kan du også bruge
dashboardet: Åbn agentens sektion **Webhooks**, og vælg
**Regenerér hemmelighed** på endpointet. Organisationsdækkende endpoints
roteres via API'et.

<CodeGroup>
```bash cURL
curl -X POST https://api.thunderphone.com/v1/developer/webhook-endpoints/c4d5e6f7-.../rotate-secret \
  -H "Authorization: Bearer sk_live_YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```
</CodeGroup>

| Felt | Type | Påkrævet | Beskrivelse |
|-------|------|----------|-------------|
| `include_copies` | boolesk | nej | Standard er `true`. Giver også den nye hemmelighed til din organisations andre endpoints, der har samme URL og samme nuværende hemmelighed, f.eks. kopier af dette endpoint på andre agenter, så én modtager fortsat verificerer med én hemmelighed |

Returnerer `200 OK`:

```json
{
  "endpoint": { "id": "c4d5e6f7-...", "secret_hint": "7f3a…c21d", "...": "..." },
  "secret": "7f3a90b2c4d5e6f708192a3b4c5d6e7f8091a2b3c4d5c21d",
  "rotated_endpoint_ids": ["c4d5e6f7-..."]
}
```

| Felt | Type | Beskrivelse |
|-------|------|-------------|
| `endpoint` | objekt | [Endpoint-objektet](#endpoint-object) med dets nye `secret_hint` |
| `secret` | streng | Den nye signeringshemmelighed. Returneres kun i dette svar |
| `rotated_endpoint_ids` | array af UUID'er | Alle endpoints, der nu bruger den nye hemmelighed |

<Warning>
  Den gamle hemmelighed stopper med at blive brugt med det samme: Næste levering,
  inklusive genforsøg, signeres med den nye. Indtil din modtager har
  den nye hemmelighed, fejler leveringer dens signaturkontrol; hvis den besvarer
  dem med en ikke-2xx-status, genforsøges de efter den normale 24-timers
  plan, så opdater modtageren hurtigt. Hvis din modtager udrulles
  i etaper, skal den acceptere begge hemmeligheder under udrulningen — SDK'ets
  verifikationshjælpere accepterer en liste over hemmeligheder (se
  [Verificér webhook-signaturer](/da/guides/verify-webhook-signatures)).
</Warning>

---

## Send en testlevering

Send en syntetisk `webhook.test`-hændelse til ét endpoint ved hjælp af den normale
leveringspipeline, herunder kanonisk JSON-serialisering, begge
signaturheadere, leveringsregistrering og håndtering af genforsøg.
Testen målretter det valgte endpoint uanset dets `events`-filter.

<CodeGroup>
```bash cURL
curl -X POST https://api.thunderphone.com/v1/developer/webhook-endpoints/c4d5e6f7-.../test \
  -H "Authorization: Bearer sk_live_YOUR_API_KEY"
```
</CodeGroup>

Endepunktet modtager en indpakning som denne:

```json
{
  "data": {
    "message": "ThunderPhone webhook test",
    "sent_at": "2026-07-17T20:12:34.567890+00:00"
  },
  "event_id": "2ad6507c-7d19-4498-9b2d-7e8f944ab5a1",
  "type": "webhook.test"
}
```

API'et returnerer `200 OK` efter det første forsøg, også hvis destinationen
returnerer en fejl. Kontrollér `success`, `status`, `response_code` og `error`
for leveringsresultatet:

```json
{
  "success": true,
  "event_id": "2ad6507c-7d19-4498-9b2d-7e8f944ab5a1",
  "event_type": "webhook.test",
  "status": "delivered",
  "response_code": 204,
  "error": ""
}
```

`webhook.test` er syntetisk og kan ikke føjes til et endepunkts `events`-
abonnement. Hvis det første forsøg mislykkes, prøver ThunderPhone igen én gang
cirka et minut senere og stopper derefter; leveringen vises så med `status: "failed"`
under [Fejlfinding af leveringer](#debug-deliveries). En testlevering markerer aldrig
endepunktet som `failing`.

For at konfigurere en udløser mod en reel hændelsesform skal du angive en valgfri
`event_type`. Leveringen er stadig syntetisk og indeholder `"sample": true`;
opkaldsrelaterede eksempler bruger `call_id: 0` og `agent_id: 0`.

```bash
curl -X POST https://api.thunderphone.com/v1/developer/webhook-endpoints/c4d5e6f7-.../test \
  -H "Authorization: Bearer sk_live_YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"event_type":"call.graded"}'
```

`event_type` accepterer enhver værdi fra [Gyldige hændelsestyper](#valid-event-types).
Hvis den udelades, bevares den generiske `webhook.test`-adfærd.

---

## Slet et endepunkt

<CodeGroup>
```bash cURL
curl -X DELETE https://api.thunderphone.com/v1/developer/webhook-endpoints/c4d5e6f7-... \
  -H "Authorization: Bearer sk_live_YOUR_API_KEY"
```
</CodeGroup>

Returnerer `204 No Content`. Levering til URL'en stopper straks;
igangværende genforsøg opgives.

---

## Fejlfinding af leveringer

Før du konkluderer, at en webhook ikke blev sendt, skal du kontrollere
[`GET /v1/developer/webhook-deliveries`](/api-reference/webhook-deliveries).
Den viser de seneste forsøg fra begge webhook-systemer, herunder opkalds-id,
URL-oprindelse, HTTP-status, antal forsøg, fejlkategori på tilladelseslisten og
tidspunktet for næste genforsøg. Den returnerer aldrig hændelsesdata, transskription,
gemt fejltekst, svarbrødtekst eller URL-sti.

Du kan også se den samme seneste historik i **Agenter → vælg en agent → Webhooks →
Seneste leveringer**. Rækker viser endepunktets etiket og den URL-oprindelse, der blev brugt
ved det seneste forsøg. Dette er driftsstatus frem for en uforanderlig revisionslog: Sletning af et endepunkt
sletter også dets leveringsrækker.

Ved en n8n-`404` skal du først bekræfte, at workflowet er aktivt, accepterer `POST` og bruger
produktions-webhook-URL'en i stedet for test-URL'en. En `401` eller `403` peger på
godkendelse eller validering af signatur; timeouts peger på destinationsforsinkelse
eller tilgængelighed; TLS-fejl peger på certifikatkæden, værtsnavnet eller udløb.

---

## Relateret

<CardGroup cols={2}>
  <Card title="Hændelseskatalog" icon="list" href="/da/webhooks/events">
    Den komplette liste over `events`-værdier, du kan abonnere på.
  </Card>
  <Card title="Oversigt over webhooks" icon="bolt" href="/da/webhooks/overview">
    Signaturverificering og leveringssemantik.
  </Card>
</CardGroup>
