Webhookit: tapahtumat, payloadit ja allekirjoitukset

Webhookien avulla omat järjestelmäsi voivat reagoida sillä hetkellä, kun Inwista saa työn valmiiksi: kun transkriptio valmistuu tai videovienti on renderöity, Inwista POSTaa allekirjoitetun JSON-tapahtuman hallitsemaasi HTTPS-päätepisteeseen. Käytä sitä julkaisuputkiin, arkistojärjestelmiin, projektityökaluihin — kaikkeen, minkä pitää tapahtua automaattisesti Inwistan valmistuttua.

Käyttöönotto ja allekirjoitussalaisuus

Kohdassa My workspaceIntegrations, yhdistä Webhooks-kortti ja syötä päätepisteesi URL (HTTPS vaaditaan). Inwista generoi allekirjoitussalaisuuden etuliitteellä whsec_ ja näyttää sen tasan kerran — tallenna se salaisuuksienhallintaasi heti. Voit kierrättää salaisuuden milloin tahansa integraatioasetuksista; vanha lakkaa toimimasta välittömästi.

Käytä asetusten Send test event -painiketta lähettääksesi allekirjoitetun webhook.test-tapahtuman päätepisteeseesi ja varmistaaksesi kytkennän ennen oikeaa liikennettä. Päätepisteen URL:n vaihtaminen myöhemmin säilyttää saman salaisuuden.

Tapahtumat

  • transcript.completed Lähetetään kerran per projekti, kun ensimmäinen transkriptio valmistuu. Sisältää latauslinkit transkriptiotiedostoihin integraatiossa määritetyissä muodoissa.
  • export.completed Lähetetään joka kerta, kun videovienti valmistuu. Sisältää renderöidyn videon sekä tuoreet transkriptiotiedostot, jotka heijastavat transkription jälkeen tehtyjä tekstitysmuokkauksia.
  • webhook.test Lähetetään manuaalisesti integraatioasetuksista vastaanottajasi varmistamiseksi.

Molemmat tapahtumatyypit voi kytkeä päälle ja pois toisistaan riippumatta integraatioasetuksissa. Tapahtumat lähetetään jokaisesta tilatusta esiintymästä riippumatta vientikohtaisista tallennusvalinnoista — webhookit ovat ilmoituksia, eivät toimituskohteita.

Payload

Kaikki tapahtumat jakavat saman kuoren: event-tyyppi, yksilöllinen id deduplikointiin, Unix-timestamp, workspaceId ja project-lohko. Tiedostoja kantavissa tapahtumissa on lisäksi files-taulukko; export.completed sisältää myös video-objektin.

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

url-arvot ovat allekirjoitettuja latauslinkkejä, jotka ovat voimassa 24 tuntia (Unix-aikaleima expiresAt kertoo tarkalleen milloin) — nouda tarvitsemasi heti sen sijaan, että tallentaisit linkit. transcript.completed on samanmuotoinen, vain ilman video-objektia.

Allekirjoitusten varmentaminen

Jokaisessa pyynnössä on kolme headeria: X-Inwista-Event (tapahtumatyyppi), X-Inwista-Delivery (tapahtuman ID) ja X-Inwista-Signature — HMAC-SHA256 raa'asta pyyntörungosta, laskettuna allekirjoitussalaisuudellasi. Laske se uudelleen ja vertaa ennen kuin luotat sisältöön; ilman tätä tarkistusta kuka tahansa päätepisteesi URL:n löytävä voi syöttää sinulle valetapahtumia.

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
// });

Tärkeää: laske HMAC raa'asta pyyntörungosta, ei jäsennetyn JSON:n uudelleensarjoitetusta versiosta — erot avainten järjestyksessä ja välilyönneissä rikkovat vertailun.

Toimitus, uudelleenyritykset ja deduplikointi

  • Kuittaa 2xx:llä Vastaa 10 sekunnin sisällä. Tee raskas käsittely asynkronisesti kuittauksen jälkeen — hidas vastaus lasketaan epäonnistumiseksi.
  • Uudelleenyritykset Epäonnistuneita toimituksia yritetään uudelleen enintään kaksi kertaa lisää (noin 10 ja 30 sekuntia myöhemmin). 4xx-alueen vastaukset käsitellään pysyvinä eikä niitä yritetä uudelleen, poikkeuksina 408 ja 429.
  • Deduplikoi id:llä Jos palvelimesi vastaanottaa pyynnön mutta vastaus katoaa, uudelleenyritys voi toimittaa saman tapahtuman kahdesti. id-kenttä pysyy samana yritysten välillä — käytä sitä kaksoiskappaleiden ohittamiseen.
  • Automaattinen tauko Kymmenen peräkkäisen epäonnistuneen toimituksen jälkeen Inwista keskeyttää päätepisteen ja näyttää syyn integraatioasetuksissa, joista voit jatkaa, kun vastaanottajasi on korjattu. Viimeisimmän toimituksen tila ja HTTP-koodi näkyvät siellä aina.