---
title: "Webhook-endepunkter"
description: "Administrer flere webhook-URL-er med hemmeligheter per endepunkt og hendelsesfiltre."
---

Det endepunktbaserte webhook-systemet lar deg registrere **flere**
destinasjoner per organisasjon, hver med sin egen hemmelighet, sin egen
status og sitt eget abonnement på et utvalg hendelsestyper. Dette er
den anbefalte modellen for alle nye integrasjoner.

Sammenlign med [eldre enkelt-URL-webhook](/api-reference/organizations#legacy-single-url-webhook),
som beholdes for bakoverkompatibilitet, men bare støtter én URL per
organisasjon.

## Endepunkter

| Metode | Sti | Påkrevd rolle | Beskrivelse |
|--------|------|---------------|-------------|
| `GET` | `/v1/developer/webhook-endpoints` | `admin+` | Vis endepunkter |
| `POST` | `/v1/developer/webhook-endpoints` | `admin+` | Opprett et endepunkt |
| `PATCH` | `/v1/developer/webhook-endpoints/{endpoint_id}` | `admin+` | Oppdater etikett / URL / hendelser / status |
| `DELETE` | `/v1/developer/webhook-endpoints/{endpoint_id}` | `admin+` | Slett et endepunkt |
| `POST` | `/v1/developer/webhook-endpoints/{endpoint_id}/rotate-secret` | `admin+` | Bytt ut signeringshemmeligheten |
| `POST` | `/v1/developer/webhook-endpoints/{endpoint_id}/test` | `admin+` | Send en signert testlevering |
| `GET` | `/v1/developer/webhook-deliveries` | `admin+` | Inspiser nylige leveringsresultater for endepunkter og eldre integrasjoner |

## Endepunktobjekt

```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 | Visningsnavn, 1–120 tegn |
| `url` | string | HTTPS-URL; `http://localhost` er tillatt for utvikling |
| `events` | array of string | Abonnerte hendelsestyper (se [gyldige verdier](#valid-event-types)). Et tomt array abonnerer på alle hendelser bortsett fra hendelsene per tur som må angis eksplisitt (`telephony.turn` / `web.turn`) |
| `status` | string | `active`, `disabled` (satt på pause manuelt) eller `failing` (settes automatisk når en levering bruker opp sin 24-timers plan for nye forsøk uten én eneste 2xx) |
| `agent_id` | integer \| null | Stemmeagenten dette endepunktet er avgrenset til; `null` betyr organisasjonsomfattende |
| `agent_name` | string \| null | Navnet på den avgrensede stemmeagenten, eller `null` for et organisasjonsomfattende endepunkt |
| `secret_hint` | string | De første 4 og siste 4 tegnene i signeringshemmeligheten med en ellipse (`a1b2…9f0e`) — nok til å kryssreferere hemmeligheten du lagret lokalt uten å eksponere hele verdien |
| `paused_at` | timestamp \| null | Når ThunderPhone satte endepunktet til `failing`. `null` mens det er `active` eller `disabled` |
| `pause_last_error` | string | Den siste leveringsfeilen da endepunktet ble satt på pause, for eksempel `HTTP 503: Service Unavailable`. Tom med mindre det er `failing` |
| `pause_undelivered_count` | integer \| null | Hendelser som ikke er levert siden endepunktets siste vellykkede levering, telt da det ble satt på pause |
| `created_at`, `updated_at` | timestamp | |

<Note>
  Endepunktets fullstendige `secret` returneres **én gang** ved opprettelse og
  aldri igjen. Oppbevar den sikkert – hvis du mister den,
  [roter den](#rotate-the-signing-secret) for å få en ny.
</Note>

### Gyldige hendelsestyper

`events` valideres mot nøyaktig dette settet — verdier utenfor listen
returnerer `400`. Se [Hendelseskatalog](/nb/webhooks/events) for formen på
nyttelasten til hver type.

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

`issue.escalated` har ingen stemmeagentkontekst og leveres bare til
organisasjonsomfattende endepunkter.

`voice.ready` og `voice.failed` kan ikke velges eksplisitt. For å motta
dem må du opprette et organisasjonsomfattende endepunkt med `events: []`. En tom
hendelsesliste mottar alle støttede hendelser unntatt `telephony.turn` og `web.turn`,
som må velges eksplisitt.

### Endepunktstatuser

- `active` — leveringer flyter normalt.
- `disabled` — satt på pause manuelt via `PATCH`. Ingen forespørsler sendes. Vi
  endrer aldri statusen til et `disabled`-endepunkt; det er alltid du som velger å sette det tilbake til
  `active`.
- `failing` — angis automatisk når en levering til endepunktet bruker opp
  hele forsøksplanen sin på nytt (8 forsøk over 24 timer) uten noen gang å få en 2xx. Et endepunkt med feil mottar ingen ytterligere trafikk.
  Vi sender e-post til organisasjonens eiere og administratorer når dette skjer, og
  dashbordet viser det pausede endepunktet med en **Reaktiver**-knapp.
  Når endepunktet er rettet, bruker du `PATCH` for å sette statusen tilbake til `active`;
  leveringer der forsøksplanen ennå ikke er utløpt, fortsetter der de
  slapp.

---

## List opp endepunkter

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

Returnerer en matrise med [endepunktobjekter](#endpoint-object).
Send `?agent_id=42` for å returnere bare endepunkter som er avgrenset til den stemmeagenten.

### Endepunkter avgrenset til stemmeagent

Organisasjonsomfattende endepunkter mottar alle samsvarende hendelser. Et endepunkt med
`agent_id` mottar bare samsvarende hendelser for samtaler håndtert av den stemmeagenten;
hendelser uten stemmeagentkontekst, som `alert.triggered`, når det aldri. Du
kan også opprette og administrere disse endepunktene fra stemmeagentbyggerens
seksjon **Webhooks**.

---

## Opprett et endepunkt

<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>

### Forespørselsfelt

| Felt | Type | Obligatorisk | Beskrivelse |
|-------|------|----------|-------------|
| `label` | string | ja | 1–120 tegn |
| `url` | string | ja | HTTPS-URL (`http` er bare tillatt for `localhost` / `127.0.0.1`) |
| `events` | array | nei | Tom/utelatt abonnerer på alle hendelser unntatt `telephony.turn` / `web.turn`, som krever et eksplisitt abonnement. Må bruke verdiene oppført i [Gyldige hendelsestyper](#valid-event-types); duplikater fjernes |
| `agent_id` | integer \| null | nei | Begrens leveringen til en stemmeagent i denne organisasjonen; utelat eller bruk `null` for et organisasjonsomfattende endepunkt |

Returnerer `201 Created` med [endepunktobjektet](#endpoint-object) pluss
et ekstra `secret`-felt på øverste nivå som inneholder den rå signeringsnøkkelen — en
48-tegns heksadesimal streng:

```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 **bare ved opprettelse**. Påfølgende `GET`-svar
  inkluderer bare `secret_hint`. Kopier hele verdien til hemmelighetshåndteringssystemet ditt
  før du lukker svaret.
</Warning>

---

## Oppdater et endepunkt

<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` | string | |
| `url` | string | |
| `events` | array | |
| `status` | string | `active` eller `disabled`. Angi `active` for å aktivere på nytt et endepunkt som serveren har merket som `failing` |
| `agent_id` | integer \| null | Angi en stemmeagent-ID for å begrense endepunktet, eller `null` for å gjøre det organisasjonsomfattende |

Returnerer `200 OK` med det oppdaterte [endepunktobjektet](#endpoint-object).

---

## Roter signeringshemmeligheten

Erstatt et endepunkts signeringshemmelighet, for eksempel når den er mistet eller
kan ha blitt lekket. For et agentavgrenset endepunkt kan du også bruke
dashbordet: Åpne agentens **Webhooker**-seksjon og velg
**Regenerer hemmelighet** på endepunktet. Organisasjonsomfattende endepunkter
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åkrevd | Beskrivelse |
|-------|------|----------|-------------|
| `include_copies` | boolsk | nei | Standardverdien er `true`. Gir også den nye hemmeligheten til organisasjonens andre endepunkter som har samme URL og samme gjeldende hemmelighet, for eksempel kopier av dette endepunktet på andre agenter, slik at én mottaker fortsatt verifiserer med én hemmelighet |

Returnerer `200 OK`:

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

| Felt | Type | Beskrivelse |
|-------|------|-------------|
| `endpoint` | objekt | [Endepunktobjektet](#endpoint-object) med den nye `secret_hint` |
| `secret` | streng | Den nye signeringshemmeligheten. Returneres bare i dette svaret |
| `rotated_endpoint_ids` | matrise med UUID-er | Alle endepunkter som nå bruker den nye hemmeligheten |

<Warning>
  Den gamle hemmeligheten slutter å brukes umiddelbart: Neste levering,
  inkludert nye forsøk, signeres med den nye. Inntil mottakeren din har
  den nye hemmeligheten, mislykkes leveringer i signaturkontrollen. Hvis den svarer
  på disse med en ikke-2xx-status, forsøkes de på nytt i henhold til den vanlige
  24-timersplanen, så oppdater mottakeren umiddelbart. Hvis mottakeren din rulles ut
  i trinn, må den godta begge hemmelighetene under utrullingen — SDK-ets
  verifiseringshjelpere tar imot en liste med hemmeligheter (se
  [Verifiser webhook-signaturer](/nb/guides/verify-webhook-signatures)).
</Warning>

---

## Send en testlevering

Send en syntetisk `webhook.test`-hendelse til ett endepunkt ved hjelp av den vanlige
leveringsprosessen, inkludert kanonisk JSON-serialisering, begge
signaturhodene, leveringslogging og registrering av nye forsøk.
Testen retter seg mot det valgte endepunktet uavhengig av `events`-filteret.

<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 mottar en konvolutt 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` etter første forsøk, selv om destinasjonen
returnerer en feil. Kontroller `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 legges til i et endepunkts `events`-
abonnement. Hvis første forsøk mislykkes, prøver ThunderPhone på nytt én gang
omtrent ett minutt senere og stopper deretter. Leveringen viser da `status: "failed"`
under [Feilsøk leveringer](#debug-deliveries). En testlevering markerer aldri
endepunktet som `failing`.

For å konfigurere en utløser mot en ekte hendelsesstruktur, kan du sende et valgfritt
`event_type`. Leveringen er fortsatt syntetisk og inneholder `"sample": true`;
anropsrelaterte eksempler bruker `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` godtar enhver verdi fra [Gyldige hendelsestyper](#valid-event-types).
Hvis du utelater det, beholdes den generiske `webhook.test`-atferden.

---

## Slett 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 umiddelbart;
pågående nye forsøk avbrytes.

---

## Feilsøk leveringer

Før du konkluderer med at en webhook ikke ble sendt, bør du kontrollere
[`GET /v1/developer/webhook-deliveries`](/api-reference/webhook-deliveries).
Den viser nylige forsøk fra begge webhook-systemene, inkludert anrops-ID,
URL-opprinnelse, HTTP-status, antall forsøk, tillatt feilkategori og tidspunkt
for neste forsøk. Den returnerer aldri hendelsesnyttelasten, transkripsjonen, lagret
feiltekst, svartekst eller URL-bane.

Du kan også se den samme nylige historikken i **Agenter → velg en agent → Webhooks →
Nylige leveringer**. Radene viser endepunktetiketten og URL-opprinnelsen som ble brukt i det
siste forsøket. Dette er driftsstatus, ikke en uforanderlig revisjonslogg: Hvis du sletter et endepunkt,
slettes også leveringsradene.

Ved en n8n-`404` må du først bekrefte at arbeidsflyten er aktiv, godtar `POST` og bruker
produksjonswebhook-URL-en i stedet for test-URL-en. En `401` eller `403` peker på
autentisering eller signaturvalidering; tidsavbrudd peker på forsinkelse
eller tilgjengelighet hos destinasjonen; TLS-feil peker på sertifikatkjeden,
vertsnavnet eller utløpsdatoen.

---

## Relatert

<CardGroup cols={2}>
  <Card title="Hendelseskatalog" icon="list" href="/nb/webhooks/events">
    Den komplette listen over `events`-verdier du kan abonnere på.
  </Card>
  <Card title="Oversikt over webhooks" icon="bolt" href="/nb/webhooks/overview">
    Signaturverifisering og leveringssemantikk.
  </Card>
</CardGroup>
