# Webhooks

POST innsendingsdata til en hvilken som helst URL i sanntid.

## Webhooks

Send hver innsending som en signert POST-forespørsel til en hvilken som helst URL — ditt backend, automatiseringsplattform eller serverløs funksjon.

<h2 id="how-it-works">Slik fungerer det</h2>

<p>
  Ved hver innsending sender Formstep en JSON-kropp som POST til webhook-URL-en din. Forespørselen signeres med HMAC-SHA256, prøves på nytt
  ved feil og logges i integrasjonens hendelseslogg. Denne siden dekker oppsettet. Den nøyaktige nyttelasten, hodene og signaturalgoritmen
  finner du i <a href="/no/developers/webhooks-reference">webhook-referansen</a>.
</p>

<h2 id="add">Legg til en webhook</h2>

> ℹ️ **Flere webhooks**
> <p>Du kan knytte flere webhooks til ett enkelt skjema. Hver utløses uavhengig for hvert arrangement.</p>

<h2 id="url-rules">Hvilke URL-er Formstep godtar</h2>

<ul>
  <li>
    <code>https://</code> overalt, eller <code>http://</code> for <code>localhost</code> og <code>*.localhost</code> under utvikling.
  </li>
  <li>Ingen påloggingsinformasjon i URL-en, og maks 2 048 tegn.</li>
  <li>
    Ingen private eller interne adresser. Vertsnavnet slås opp og sjekkes på nytt rett før <em>hver</em> levering, så en DNS-post som senere
    peker til en intern adresse, blir fortsatt avvist.
  </li>
</ul>

<p>En avvist URL er et konfigurasjonsproblem, ikke et forbigående: leveringen mislykkes permanent i stedet for å prøves på nytt.</p>

<h2 id="payload">Hva du mottar</h2>

<p>
  Hver forespørsel er den samme hendelseskonvolutten — <code>id</code>, <code>type</code>, <code>createdAt</code>, <code>apiVersion</code>,{' '}
  <code>test</code> og <code>data</code>. Inne i <code>data</code> ligger skjemaet, innsendingen (id, respondentens e-post,
  innsendingstidspunkt, PDF-lenke, språk), et <code>answers</code>-objekt nøkkelsatt med <a href="/no/requests/field-keys">feltnøkkel</a>,
  og et <code>display</code>-objekt med de samme nøklene som lesbar tekst. Hvert svar står én gang, i hvert kart.
</p>

<p>
  Se referansen for hele <a href="/no/developers/webhooks-reference#payload">nyttelastformatet</a>,{' '}
  <a href="/no/developers/webhooks-reference#fields-vs-answers">answers og display</a>, og hvordan en{' '}
  <a href="/no/building-forms/repeating-groups">gjentakende gruppe</a> representeres.
</p>

<p>
  For å forhåndsvise den nøyaktige kroppen for skjemaet ditt, åpne integrasjonen og utvid <strong>Eksempel på nyttelast</strong> under
  signeringshemmeligheten. Den gjengir din nåværende tilordning med eksempelsvar.
</p>

<h2 id="signatures">Verifisering av signaturer</h2>

<p>
  Hver forespørsel inneholder et <code>X-Formstep-Signature</code>-hode: <code>t=TIMESTAMP,sha256=HEX</code>, en HMAC-SHA256 av{' '}
  <code>TIMESTAMP.BODY</code> beregnet med signeringshemmeligheten din. Selve hemmeligheten sendes aldri. Referansen har et{' '}
  <a href="/no/developers/webhooks-reference#signing">kopier-og-lim-inn-verifiseringsutdrag</a>.
</p>

> ⚠️ **Verifiser alltid i produksjon**
> <p>
>     Uten verifisering kan alle som oppdager URL-en din sende falske innsendinger. Avvis forespørsler der signaturen mangler eller er
>     ugyldig.
>   </p>

<h2 id="abandoned-responses">Hendelser for avbrutte svar</h2>

<p>
  Egendefinerte webhooks utløses bare for fullførte innsendinger og redigeringer — aldri for avbrutte utkast. En egendefinert webhook er den
  eneste mottakeren som får begge deler: et Zapier-, Make- eller n8n-abonnement velger første innsendinger eller redigeringer, aldri begge.
  For avbrutte utkast, bruk en leverandør som har et <strong>Forlatte innsendinger</strong>-trinn: Google Sheets, Airtable, Notion, Slack,
  Discord, Linear eller GitHub Issues. Hver har sitt eget inaktivitetsvindu og, der det gjelder, sin egen meldingsmal. Dette trinnet krever
  Pro eller Business.
</p>

<h2 id="retries">Nye forsøk og feil</h2>

<ul>
  <li>
    En levering lykkes ved enhver <code>2xx</code>.
  </li>
  <li>
    Opptil 5 forsøk: det første sendes umiddelbart, nye forsøk venter minst 1, 2, 4 og 8 minutter. Formstep ser etter forfalte nye forsøk
    hvert 30. minutt, så det siste forsøket kommer om lag to timer etter det første. Et <code>Retry-After</code>-hode på en <code>429</code>{' '}
    eller <code>5xx</code> respekteres når det ber om lengre ventetid.
  </li>
  <li>
    <code>429</code>, <code>5xx</code>, tidsavbrudd og tilkoblingsfeil prøves på nytt. Alle andre <code>4xx</code>-feil mislykkes
    umiddelbart.
  </li>
  <li>
    Etter 5 påfølgende feil settes integrasjonen automatisk på pause, og personen som satte den opp får en e-post. Fiks endepunktet, og
    trykk deretter <strong>Gjenoppta</strong>.
  </li>
  <li>
    <code>401</code>, <code>403</code> og <code>404</code> stopper integrasjonen umiddelbart med en feilstatus og samme e-post — det er
    ingen venting på fem feil.
  </li>
  <li>
    Leveringer som har brukt opp alle 5 forsøkene, samles i et banner på integrasjonen. <strong>Prøv alle på nytt</strong> setter dem i kø
    igjen og reaktiverer en pauset integrasjon.
  </li>
</ul>

<h2 id="testing">Testing</h2>

<p>
  <strong>Send en testhendelse</strong> vises på Fullfør-trinnet og igjen på den lagrede integrasjonen. Den POST-er et syntetisert
  eksempelsvar — «John Doe» for tekst, <code>42</code> for tall, <code>john@example.com</code> for e-post — signert og med dine
  egendefinerte hoder, akkurat som en ekte levering. Fra den lagrede integrasjonen skriver den også en tilkoblingstest-oppføring til
  hendelsesloggen.
</p>

<p>For lokal utvikling, eksponér dev-serveren din med en tunnel:</p>

```
# ngrok
ngrok http 3000

# cloudflare tunnel

cloudflared tunnel --url http://localhost:3000
```

<h2 id="faq">FAQ</h2>

  <p>
    Ja. Hver har sin egen URL, signeringshemmelighet og egendefinerte hoder. Alle aktive webhooks utløses uavhengig for hver innsending.
  </p>

  <p>
    Ja. Legg til hoder endepunktet ditt trenger (f.eks. <code>Authorization: Bearer ...</code>) under oppsett. Du kan ikke overstyre{' '}
    <code>Content-Type</code>.
  </p>

  <p>
    Nei. Signeringshemmeligheten genereres én gang når webhook-en opprettes og kan ikke endres. Hvis du trenger en ny hemmelighet, sletter
    du webhook-en og oppretter en ny.
  </p>

  <p>Ja. Åpne integrasjonen, rediger URL-en, og lagre. Signeringshemmeligheten og hendelseshistorikken følger med.</p>

  <p>
    Kun for <code>localhost</code> og <code>*.localhost</code> under utvikling. Alle andre URL-er må bruke HTTPS.
  </p>

  <p>
    Slett den fra Skjemainnstillinger → Integrasjoner. Formstep slutter å sende forespørsler umiddelbart, og integrasjonens
    hendelseshistorikk slettes sammen med den.
  </p>

<h2 id="next-steps">Neste steg</h2>
<div class="not-prose grid gap-3 sm:grid-cols-2">
  - [Webhook-referanse](/no/developers/webhooks-reference) — Nyttelast, hoder og signaturverifisering
  - [Airtable](/no/integrations/airtable) — Send innsendinger til en Airtable-base
  - [Linear](/no/integrations/linear) — Gjør innsendinger til Linear-saker
  - [Gjentakende grupper](/no/building-forms/repeating-groups) — La respondenter legge til så mange oppføringer de trenger
</div>
