Ga naar de hoofdinhoud

Webhaken

Webhooks laten externe systemen reageren wanneer werk verandert in Kanera.

Gebruik webhooks wanneer een ander systeem op de hoogte moet zijn van wijzigingen zonder de API voortdurend te ondervragen. Veel voorkomende voorbeelden zijn:

  • Update een extern dashboard.
  • Synchroniseer gewijzigde kaarten met een ander systeem.
  • Implementatie activeren of workflows beoordelen.
  • Registreer Kanera-activiteit in een auditsysteem.

Om kaartactiviteit in een teamchatkanaal te posten, heeft u geen eigen webhook nodig. Kanera heeft ingebouwde Chatbestemmingen voor Slack, Discord, Telegram en Zulip die elk bericht voor het platform opmaken. Gebruik een webhook als u de volledige evenementencatalogus, exacte payloads en handtekeningverificatie nodig heeft.

Werkruimtebeheerders kunnen webhookeindpunten maken van Werkruimte-instellingen -> API, in de Aangepaste webhooks sectie. Op zichzelf staande borden hebben hetzelfde API tabblad in hun eigen bordinstellingen. Integraties kunnen ook eindpunten registreren via de openbare API of TypeScript SDK.

Werkruimte API-instellingen tonen de webhook-configuratie.

Elke webhookbestemming kan alle gebeurtenissen of alleen geselecteerde gebeurtenistypen ontvangen. Vertrekken eventTypes leeg om elke gebeurtenis te ontvangen, of geef een of meer van de onderstaande tekenreeksen voor gebeurtenistypen op.

Plan en machtigingen​

  • Werkruimtebeheerders kunnen elk generiek webhookeindpunt in die werkruimte zien en beheren.
  • Een API-referentie of interactieve OAuth-agent met schrijfmogelijkheid kan een eindpunt registreren zonder beheerdersbevoegdheid wanneer de gebruiker lid is van de werkruimte. Dat eindpunt is gericht op de verbinding die tot stand is gebracht: alleen dezelfde verbindings- en werkruimtebeheerders kunnen het zien of beheren. Met leesreferenties kunnen webhooks niet worden beheerd.
  • Webhooks nodig Pro of de 30-dagen Pro-proefversie. Ze zijn niet beschikbaar op gehost Free.
  • Op gehost Free wordt het aanmaakformulier vervangen door Webhooks zijn niet beschikbaar in uw abonnement.

Als u de referentie- of agentverbinding intrekt, worden ook de eindpunten met een verbindingsbereik verwijderd. Door de beheerder gemaakte werkruimte-eindpunten blijven behouden totdat een beheerder ze verwijdert.

Wat gebeurt er bij een downgrade​

Wanneer een gehoste organisatie overstapt van Pro of een proefversie naar Free, pauzeert Kanera elk ingeschakeld webhook-eindpunt in plaats van iets te verwijderen. Het trekt ook de API-sleutels van de werkruimte in (persoonlijke sleutels blijven werken) en schakelt automatiseringen buiten de Free-limiet uit.

Op gehost GratisGedrag
Bestaande eindpuntenWorden automatisch gepauzeerd en kunnen niet opnieuw worden ingeschakeld zolang de organisatie op Gratis staat.
Nieuwe activiteitBereikt uw eindpunt niet.
Alles wat nog wacht op verzendingGeregistreerd als mislukt webhooks are unavailable on the current plan in plaats van te laat verzonden.
Een mislukte leveringKan niet handmatig opnieuw worden geprobeerd.
Configuratie en geschiedenisGehouden. Eindpunten, gebeurtenisselecties, geheimen en leveringsgeschiedenis zijn allemaal nog aanwezig.

Door terug te upgraden naar Pro worden de eindpunten die door de downgrade zijn gepauzeerd opnieuw ingeschakeld en worden de API-sleutels voor de werkruimte hersteld die zijn ingetrokken, zodat een hervatte integratie niet opnieuw hoeft te worden opgebouwd.

Registreer een eindpunt programmatisch​

De openbare API maakt dezelfde generieke eindpuntlevenscyclus zichtbaar die wordt gebruikt door de Workspace-instellingen. Elk pad hieronder is relatief ten opzichte van:

/api/v1/workspaces/{workspaceId}/webhooks
MethodePadGebruik
GET(basispad)Maak een lijst van eindpunten die zichtbaar zijn voor de beller.
POST(basispad)Maak een eindpunt en retourneer het ondertekeningsgeheim één keer.
PATCH/{endpointId}Wijzig de naam, URL, gebeurtenisfilter of ingeschakelde status.
POST/{endpointId}/secretDraai het ondertekeningsgeheim.
DELETE/{endpointId}Verwijder het eindpunt.
GET/{endpointId}/deliveriesLees recente bezorgpogingen.
POST/{endpointId}/deliveries/{deliveryId}/retryProbeer één mislukte bezorging opnieuw.

Met de TypeScript SDK gebruikt u kanera.webhookEndpoints.create(), .list(), .update(), .rotateSecret(), .deliveries(), .retryDelivery(), en .delete(). Het geretourneerde eindpunt heeft scope: "workspace" voor een door de beheerder beheerd eindpunt of scope: "connection" wanneer een niet-beheerdersreferentie deze heeft geregistreerd. Bewaar de secret onmiddellijk geretourneerd door creatie of rotatie; later leest, leg het nooit bloot.

Webhook-gebeurtenistypen​

De openbare API toont de huidige lijst op:

https://api.kanera.app/webhook-event-types
GebiedSoorten evenementen
Lijstenlist:created, list:updated, list:moved, list:rebalanced, list:deleted
Bordscheidersseparator:created, separator:updated, separator:moved, separator:rebalanced, separator:deleted
Aangepaste veldencustomField:created, customField:updated, customField:moved, customField:rebalanced, customField:deleted
Aangepaste veldoptiescustomFieldOption:created, customFieldOption:updated, customFieldOption:moved, customFieldOption:rebalanced, customFieldOption:deleted
Kaartencard:created, card:updated, card:moved, card:rebalanced, card:deleted
Aangepaste velden voor kaartencard:customFieldValue:set, card:customFieldValue:cleared
Kaartlabels en toegewezen personencard:labels:set, card:assignees:set
Kaartbijlagencard:attachment:created, card:attachment:deleted
Controlelijsten voor kaartencard:checklist:created, card:checklist:updated, card:checklist:moved, card:checklist:rebalanced, card:checklist:deleted
Controlelijstitems voor kaartencard:checklistItem:created, card:checklistItem:updated, card:checklistItem:moved, card:checklistItem:rebalanced, card:checklistItem:deleted
Etiketten voor werkruimtekaartencardLabel:created, cardLabel:updated, cardLabel:moved, cardLabel:rebalanced, cardLabel:deleted
Opmerkingencomment:created, comment:updated, comment:deleted
Commentaar reactiescomment:reaction:added, comment:reaction:removed
Kaartfeedcard:feedItem:created, card:feedItem:updated, card:feedItem:deleted
Bordenboard:created, board:updated, board:moved, board:rebalanced, board:deleted
Bestuursledenboard:member:added, board:member:removed
Werkruimtesworkspace:updated, workspace:deleted
Leden van de werkruimteworkspace:member:added, workspace:member:updated, workspace:member:removed
Gebruikersuser:profile:updated
Notitiesnote:created, note:updated, note:moved, note:rebalanced, note:deleted, note:locked, note:unlocked
Agent vluchtagentRun:started, agentRun:updated

Payload-formaat​

Kanera verzendt elke webhook als een JSON-object met een stabiele envelop en gebeurtenisspecifiek data.

VeldBetekenis
idUnieke webhookgebeurtenis-ID. Dit komt overeen X-Kanera-Event-Id.
typeGebeurtenistype, zoals card:created.
workspaceIdWerkruimte waar de gebeurtenis plaatsvond.
boardIdBord waar de gebeurtenis heeft plaatsgevonden, wanneer de gebeurtenis zich op het bord bevindt.
cardIdKaart betrokken bij de gebeurtenis, wanneer de payload van de gebeurtenis een kaart identificeert.
occurredAtISO 8601-tijdstempel voor wanneer de gebeurtenis plaatsvond.
dataVolledige evenementenlading. De vorm hangt ervan af type en komt overeen met de overeenkomstige realtime-gebeurtenispayload.

Door agenten gerunde evenementen zijn geldig { boardId, cardId, run } binnen data, waar run is de volledige agentrun: its agentName, de userId het werkt voor, status, title, summary, externalUrl, en zijn startedAt, heartbeatAt, en endedAt tijdstempels. agentRun:updated vuurt bij elke hartslag en bij een statuswijziging, dus schakel uw handler in run.status in plaats van elke levering als nieuw werk te behandelen. Een run die het kloppen van de hartslag stopt, wordt beschouwd als één finale agentRun:updated met status: "stalled".

Voorbeeld card:created laadvermogen:

{
"id": "7e5c982a-e6c9-4ea7-9647-b14fe73ed50a",
"type": "card:created",
"workspaceId": "a069fd45-3bb3-4928-bac9-cb574a050d20",
"boardId": "48a52a55-763e-4c64-8a76-51ac56247f5c",
"cardId": "70c39cef-1aec-44e6-a8f5-f36f765a818d",
"occurredAt": "2026-05-28T12:34:56.000Z",
"data": {
"boardId": "48a52a55-763e-4c64-8a76-51ac56247f5c",
"card": {
"id": "70c39cef-1aec-44e6-a8f5-f36f765a818d",
"boardId": "48a52a55-763e-4c64-8a76-51ac56247f5c",
"listId": "3bb3c1b3-8fc7-4807-854d-2d5ff62df147",
"title": "Prepare kickoff agenda",
"position": "1000.0000000000"
}
}
}

Webhook-levering​

Kanera verzendt webhookleveringen als JSON en bevat headers die u kunt gebruiken om het verzoek te verifiëren:

KoptekstBetekenis
X-Kanera-Event-IdUnieke gebeurtenis-ID.
X-Kanera-TimestampUnix-tijdstempel in seconden.
X-Kanera-Signaturesha256= plus een HMAC-SHA256-handtekening.

De handtekening wordt berekend over:

${timestamp}.${rawBody}

met behulp van het webhookeindpuntgeheim.

Webhookleveringen worden opnieuw geprobeerd wanneer het eindpunt een niet-2xx-status retourneert of niet kan worden bereikt. Kanera legt de leveringsgeschiedenis vast, zodat u fouten kunt bekijken, leveringen opnieuw kunt proberen, bestemmingen kunt pauzeren en geheimen kunt roteren vanuit de API-instellingen van de werkruimte.

Controleer webhookhandtekeningen​

Controleer de handtekening voordat u de payload vertrouwt.

De Typescript SDK doet dit voor je, en gooit in plaats van een booleaanse waarde terug te geven, zodat een handler niet kan vergeten te controleren:

import { parseWebhook } from "@kanera/sdk";

app.post("/kanera/webhook", express.raw({ type: "application/json" }), async (req, res) => {
const event = await parseWebhook({
secret: process.env.KANERA_WEBHOOK_SECRET!,
payload: req.body, // the raw bytes
headers: req.headers,
});
// Handle event.type, event.workspaceId, event.boardId, event.cardId, and event.data.
res.sendStatus(204);
});

Om het zelf te verifiëren, vergelijkt u de HMAC {timestamp}.{body} in constante tijd. Let op de lengtecontrole: crypto.timingSafeEqual gooit wanneer de twee buffers in lengte verschillen, die een aanvaller controleert.

import crypto from "node:crypto";
import express from "express";

const app = express();

app.post("/kanera/webhook", express.raw({ type: "application/json" }), (req, res) => {
const timestamp = req.header("X-Kanera-Timestamp") ?? "";
const signature = req.header("X-Kanera-Signature") ?? "";
const expected = "sha256=" + crypto
.createHmac("sha256", process.env.KANERA_WEBHOOK_SECRET!)
.update(`${timestamp}.${req.body.toString("utf8")}`)
.digest("hex");

const received = Buffer.from(signature);
const digest = Buffer.from(expected);
if (received.length !== digest.length || !crypto.timingSafeEqual(received, digest)) {
return res.status(401).send("invalid signature");
}

const event = JSON.parse(req.body.toString("utf8"));
// Handle event.type, event.workspaceId, event.boardId, event.cardId, and event.data.
res.sendStatus(204);
});

Verifieer altijd aan de hand van de onbewerkte aanvraagtekst. Als uw raamwerk JSON parseert vóór verificatie, kan de handtekeningcontrole mislukken of onbetrouwbaar worden.

Kanera stuurt ook X-Kanera-Timestamp en X-Kanera-Event-Id. Weiger leveringen waarvan de tijdstempel buiten een paar minuten van nu ligt om de herhaling te beperken, en gebruik de gebeurtenis-ID om uw handler idempotent te maken, aangezien leveringen mogelijk opnieuw worden geprobeerd.

Webhooks zijn het pad voor algemene doeleinden. Er bestaan twee beperktere opties voor specifieke doelgroepen:

PadPubliekLaadvermogenWaar op te zettenAbonnement
WebhakenEen ander systeemJSON ondertekend voor de hele evenementencatalogusWerkruimte-instellingen -> APIPro of proef
ChatbestemmingenEen teamkanaalOpgemaakte berichten voor Slack, Discord, Telegram of ZulipWerkruimte-instellingen -> IntegratiesPro of proef
Persoonlijke bezorgkanalenEén persoonntfy, Gotify of ondertekende JSON voor uw eigen meldingenProfielinstellingen -> MeldingenPro of proef
MCP-evenementabonnementenDe gastheer van een AI-agentOndertekende kaart- en commentaargebeurtenissen voor een terugbelactie die door de agent is geverifieerdDe agent abonneert zich via MCP; niets om op te zetten in KaneraElk plan

Chatbestemmingen worden afzonderlijk van webhookeindpunten beheerd en verschijnen niet in de webhooklijst, dus het roteren van een webhookgeheim heeft nooit invloed op een chatbestemming.

Een automatisering Roep een webhook op actie is gericht in plaats van op abonnementsbasis. Het verzendt automation:webhook:called alleen naar het eindpunt dat op de regel is geselecteerd, ongeacht het gewone eindpunt eventTypes filteren, terwijl hetzelfde gedrag voor handtekeningen, nieuwe pogingen en leveringsgeschiedenis behouden blijft. Zie Automatiseringen.