Webhooks: hendelser, payloads og signaturer

Med webhooks kan systemene dine reagere i det øyeblikket Inwista er ferdig med jobben: når en transkripsjon fullføres eller en videoeksport er rendret, POSTer Inwista en signert JSON-hendelse til et HTTPS-endepunkt du kontrollerer. Bruk det til publiseringspipelines, arkivsystemer, prosjektverktøy — alt som skal skje automatisk etter at Inwista er ferdig.

Oppsett og signeringshemmeligheten

Under My workspaceIntegrations, koble til Webhooks-kortet og legg inn endepunkt-URL-en din (HTTPS kreves). Inwista genererer en signeringshemmelighet med prefikset whsec_ og viser den nøyaktig én gang — lagre den i hemmelighetshåndteringen din med det samme. Du kan rotere hemmeligheten når som helst fra integrasjonsinnstillingene; den gamle slutter å virke umiddelbart.

Bruk Send test event i innstillingene for å sende en signert webhook.test-hendelse til endepunktet og bekrefte oppsettet før reell trafikk. Endrer du endepunkt-URL-en senere, beholdes samme hemmelighet.

Hendelser

  • transcript.completed Sendes én gang per prosjekt, når den første transkripsjonen er ferdig. Inneholder nedlastingslenker for transkripsjonsfilene i formatene som er konfigurert på integrasjonen.
  • export.completed Sendes hver gang en videoeksport er ferdig rendret. Inneholder den renderte videoen pluss ferske transkripsjonsfiler som reflekterer eventuelle undertekstredigeringer gjort etter transkripsjonen.
  • webhook.test Sendes manuelt fra integrasjonsinnstillingene, for å verifisere mottakeren din.

Begge hendelsestypene kan slås av og på uavhengig av hverandre i integrasjonsinnstillingene. Hendelser sendes ved hver abonnerte forekomst, uavhengig av lagringsvalg per eksport — webhooks er varsler, ikke leveringsdestinasjoner.

Payload

Alle hendelser deler samme konvolutt: en event-type, en unik id for deduplisering, et Unix-timestamp, workspaceId og en project-blokk. Filbærende hendelser har i tillegg en files-array; export.completed inkluderer også et video-objekt.

{
  "event": "export.completed",
  "id": "evt_9c1b7e2a4f0d4b6e8a12",
  "timestamp": 1784034017,
  "workspaceId": "UK6naH1L1sMtzTVcVZih",
  "project": {
    "id": "abc123def456",
    "name": "Intervju — Episode 12",
    "language": "no",
    "durationSeconds": 1834
  },
  "files": [
    {
      "format": "srt",
      "name": "Intervju — Episode 12.srt",
      "mimeType": "application/x-subrip",
      "url": "https://storage.googleapis.com/...signed...",
      "expiresAt": 1784120417
    }
  ],
  "video": {
    "name": "Intervju — Episode 12.mp4",
    "mimeType": "video/mp4",
    "sizeBytes": 812340221,
    "url": "https://storage.googleapis.com/...signed...",
    "expiresAt": 1784120417
  }
}

url-verdiene er signerte nedlastingslenker gyldige i 24 timer (Unix-tidsstempelet expiresAt sier nøyaktig når) — hent det du trenger med en gang i stedet for å lagre lenkene. transcript.completed har samme form, bare uten video-objektet.

Verifisere signaturer

Hver forespørsel har tre headere: X-Inwista-Event (hendelsestypen), X-Inwista-Delivery (hendelses-ID-en) og X-Inwista-Signature — en HMAC-SHA256 av den rå forespørselskroppen, beregnet med signeringshemmeligheten din. Beregn den på nytt og sammenlign før du stoler på innholdet; uten denne sjekken kan hvem som helst som oppdager endepunkt-URL-en din mate deg med falske hendelser.

const crypto = require("crypto");

function verifyInwistaSignature(rawBody, signatureHeader, secret) {
  const expected =
    "sha256=" +
    crypto.createHmac("sha256", secret).update(rawBody).digest("hex");
  return (
    signatureHeader.length === expected.length &&
    crypto.timingSafeEqual(
      Buffer.from(signatureHeader),
      Buffer.from(expected),
    )
  );
}

// Express example — capture the raw body for verification:
// app.post("/inwista-hook", express.raw({ type: "application/json" }), (req, res) => {
//   if (!verifyInwistaSignature(req.body, req.get("X-Inwista-Signature"), process.env.INWISTA_WEBHOOK_SECRET)) {
//     return res.status(401).end();
//   }
//   const event = JSON.parse(req.body);
//   res.status(200).end(); // acknowledge fast, process async
// });

Viktig: beregn HMAC-en over den rå forespørselskroppen, ikke en reserialisert versjon av den parsede JSON-en — forskjeller i nøkkelrekkefølge og mellomrom vil bryte sammenligningen.

Levering, nye forsøk og deduplisering

  • Kvitter med 2xx Svar innen 10 sekunder. Gjør tung prosessering asynkront etter at du har kvittert — et tregt svar regnes som feil.
  • Nye forsøk Mislykkede leveringer prøves på nytt inntil to ganger til (omtrent 10 og 30 sekunder senere). Svar i 4xx-området regnes som permanente og prøves ikke på nytt, med unntak av 408 og 429.
  • Dedupliser på id Hvis serveren din mottar en forespørsel men svaret går tapt, kan et nytt forsøk levere samme hendelse to ganger. id-feltet er stabilt på tvers av forsøk — bruk det til å ignorere duplikater.
  • Automatisk pause Etter 10 mislykkede leveringer på rad setter Inwista endepunktet på pause og viser hvorfor i integrasjonsinnstillingene, der du kan gjenoppta når mottakeren din er fikset. Siste leverings status og HTTP-kode er alltid synlige der.