
Sprog 🇩🇰 Dansk
Oversigt
Implementering
Bag kulisserne
Webhooks
Med FastComments er det muligt at kalde et API-endpoint, når en kommentar tilføjes, opdateres eller fjernes fra vores system.
Vi opnår dette med asynkrone webhooks over HTTP/HTTPS.
Hvad er Webhooks 
En Webhook er en mekanisme, eller en integration, mellem to systemer hvor "produceren" (FastComments) udløser en begivenhed som "forbrugeren" (dig) modtager via et API-opkald.
Understøttede begivenheder og ressourcer 
FastComments understøtter kun webhooks for Comment-ressourcen.
Vi understøtter webhooks for oprettelse af kommentarer, fjernelse og opdatering.
Hver af disse betragtes som separate hændelser i vores system og har derfor forskellige semantikker og strukturer for webhook‑hændelserne.
Et vilkårligt antal endpoints kan abonnere på den samme hændelse, fra dashboardet eller via API'en (se Administrere Webhooks via API'en). Hver webhook leveres uafhængigt.
Lokal udviklingsopsætning 
For lokal udvikling kan du bruge et værktøj som ngrok.
For at gøre det lettere at holde systemet sikkert, følger lokal udvikling den samme proces som opsætning og sikring af andre miljøer.
Trin 1: Tilføj "localhost" til domæner i din konto.
Tilføj "localhost" som et domæne her.
Trin 2: Vælg en API-nøgle
Vi skal tilføje webhook-konfiguration for dit domæne, så vi har brug for en API-nøgle. Du kan gøre det her.
Under “Associate with domain” - vælg dit “localhost”-domæne.
BEMÆRK: Alternativt kan du bruge én API-hemmelighed til al testaktivitet og staging-miljøer. Tilføj blot en API-hemmelighed for “All Domains”, og giv den et navn som “test”.
Sørg for, at du har en API-hemmelighed defineret for dine produktionsdomæner. Begivenheder for alle andre domæner vil bruge wildcard‑ (test‑) hemmeligheden.
Trin 3: Tilføj din webhook
Mens du kører ngrok eller et lignende værktøj, indstil værdien for “localhost” her.
Når du klikker på Send Test Payload, vil vi sende to test‑begivenheder for at kontrollere, at du validerer API‑nøglen.
Når den er valideret, tryk på Save.
Trin 4: Tilføj en kommentar
Nu kan du tilføje, redigere eller slette kommentarer og bør se, at vi kalder din lokale udviklingsmaskine med begivenhederne ved hjælp af din test‑API‑nøgle. Der kan gå op til 30 sekunder, før begivenhederne når din maskine.
Opsætning 
Følg de samme trin for localhost, som du ville gøre for produktion. Sørg for, at du har produktionsdomæner og API-hemmeligheder konfigureret.
Først, naviger til Webhooks admin. Dette er tilgængeligt via Manage Data -> Webhooks.
Siden viser alle webhooks på din konto:
Klik på New Webhook for at tilføje en. Hver webhook har en URL, én kommentarhændelse (oprettet, opdateret eller slettet), et domæne og en HTTP-metode:
Hver webhook leveres uafhængigt. Du kan sende den samme hændelse til flere endpoints, og en webhook med omfang All Domains modtager kommentarer fra alle domæner, selv når der findes en domænespecifik webhook for den samme hændelse. Den samme URL, hændelse og domæne kan ikke tilføjes to gange.
Før du gemmer, klik på Send Test Payload for at kontrollere, at endpointet accepterer en signeret anmodning. Se næste afsnit, "Testing", for detaljer.
Fra listen kan du redigere, deaktivere, genaktivere eller slette en webhook. Deaktivering bevarer køede hændelser, indtil webhooken genaktiveres; sletning kasserer dem.
Webhooks kan også oprettes via API'en, for eksempel af Zapier. Disse vises i den samme liste med kilden API. Se Managing Webhooks via the API.
Testning 
De nye og redigerings‑webhook‑sider har en Send Test Payload‑knap, der sender en anmodning til den URL, der i øjeblikket er i formularen, uanset om den er gemt eller ej. Create‑ og Update‑begivenhederne sender et dummy‑WebhookComment‑objekt, mens test af Delete vil sende et dummy‑anmodnings‑body med kun et ID.
Verificering af payloads
Når du tester din webhook‑integration, skal du verificere, at de indgående anmodninger indeholder følgende headers:
X-FastComments-Timestamp- Unix‑tidsstempel (sekunder)X-FastComments-Signature- HMAC‑SHA256‑signatur
Webhooks oprettet før signaturskemaet blev introduceret modtager også en token‑header, der indeholder din API‑hemmelighed. Nye webhooks gør det ikke.
Brug HMAC‑signaturverificering for at sikre, at payloads er ægte.
Testværktøjer
Du kan bruge værktøjer som webhook.site eller ngrok til at inspicere indgående webhook‑payloads under udvikling.
Begivenhedstyper
- Create Event: Udløses, når en ny kommentar oprettes.
- Update Event: Udløses, når en kommentar redigeres.
- Delete Event: Udløses, når en kommentar slettes.
Hver webhook er knyttet til én begivenhed og én HTTP‑metode (POST, PUT eller DELETE). Hver begivenhed inkluderer de fulde kommentardata i anmodnings‑body’en (se Data Structures for payload‑formatet).
Datastrukturer 
The only structure sent via webhooks is the WebhookComment object, outlined in TypeScript below.
WebhookComment-objektets struktur
The "Create" Event Structure
The "create" event request body is a WebhookComment object.
The "Update" Event Structure
The "update" event request body is a WebhookComment object.
The "Delete" Event Structure
The "delete" event request body is a WebhookComment object.
Change as of Nov 14th 2023
Previously the "delete" event request body only contained the comment id. It now contains the full comment at the time of deletion.
Every key is always present in the body. When the comment has no value for a field the body carries null
(or false for booleans and [] for lists), so the shape of a delivery never varies from one comment to the next.
Run 
When users are tagged in a comment, the information is stored in a list called mentions. Each object in that list
has the following structure.
Run 
HTTP-metoder
Du kan konfigurere HTTP-metoden for hver webhook-begivenhedstype i administrationspanelet:
- Create-begivenhed: POST eller PUT (standard: PUT)
- Update-begivenhed: POST eller PUT (standard: PUT)
- Delete-begivenhed: DELETE, POST eller PUT (standard: DELETE)
Da alle anmodninger indeholder et ID, er Create- og Update-operationer idempotente som standard (PUT). Gentagelse af den samme Create- eller Update-anmodning bør ikke oprette duplikerede objekter på din side.
Anmodnings‑headers
Hver webhook-anmodning inkluderer følgende headers:
| Header | Description |
|---|---|
Content-Type | application/json |
token | Din API-hemmelighed |
X-FastComments-Timestamp | Unix-tidsstempel (sekunder) da anmodningen blev signeret |
X-FastComments-Signature | HMAC-SHA256-signatur (sha256=<hex>) |
Se Sikkerhed & API‑tokens for information om verifikation af HMAC-signaturen.
Sikkerhed og API‑tokens 
FastComments webhook-forespørgsler indeholder flere autentificeringsmekanismer for sikkerhed.
Sendte headere
| Header | Beskrivelse |
|---|---|
token | Din API Secret (for bagudkompatibilitet) |
X-FastComments-Timestamp | Unix-tidsstempel (sekunder) da anmodningen blev signeret |
X-FastComments-Signature | HMAC-SHA256-signatur af payloaden |
HMAC-signaturverifikation (Anbefalet)
Vi anbefaler kraftigt at verificere HMAC-signaturen for at sikre, at webhook-payloads er autentiske og ikke er blevet manipuleret med.
Signaturformat: sha256=<hex-encoded-signature>
Hvordan signaturen beregnes:
- Sammenkæd:
timestamp + "." + JSON_payload_body - Beregn HMAC-SHA256 ved at bruge din API Secret som nøgle
- Hex-enkodér resultatet
Eksempel på verifikation (Node.js)
const crypto = require('crypto');
function verifyWebhookSignature(req, apiSecret) {
const timestamp = req.headers['x-fastcomments-timestamp'];
const signature = req.headers['x-fastcomments-signature'];
if (!timestamp || !signature) {
return false;
}
// Bekræft at tidsstemplet er nyligt (inden for 5 minutter)
const now = Math.floor(Date.now() / 1000);
if (Math.abs(now - parseInt(timestamp, 10)) > 300) {
return false; // Forebyggelse af replay-angreb
}
// Bekræft signatur
const payload = JSON.stringify(req.body);
const expectedSignature = crypto
.createHmac('sha256', apiSecret)
.update(`${timestamp}.${payload}`)
.digest('hex');
return signature === `sha256=${expectedSignature}`;
}
Eksempel på verifikation (Python)
import hmac
import hashlib
import time
import json
def verify_webhook_signature(headers, body, api_secret):
timestamp = headers.get('X-FastComments-Timestamp')
signature = headers.get('X-FastComments-Signature')
if not timestamp or not signature:
return False
# Bekræft at tidsstemplet er nyligt
now = int(time.time())
if abs(now - int(timestamp)) > 300:
return False
# Bekræft signatur
payload = json.dumps(body, separators=(',', ':'))
message = f"{timestamp}.{payload}"
expected = hmac.new(
api_secret.encode(),
message.encode(),
hashlib.sha256
).hexdigest()
return signature == f"sha256={expected}"
Eksempel på verifikation (PHP)
function verifyWebhookSignature($headers, $body, $apiSecret) {
$timestamp = $headers['X-FastComments-Timestamp'] ?? null;
$signature = $headers['X-FastComments-Signature'] ?? null;
if (!$timestamp || !$signature) {
return false;
}
// Bekræft at tidsstemplet er nyligt (inden for 5 minutter)
$now = time();
if (abs($now - intval($timestamp)) > 300) {
return false;
}
// Bekræft signatur
$payload = json_encode($body, JSON_UNESCAPED_SLASHES);
$message = $timestamp . '.' . $payload;
$expectedSignature = 'sha256=' . hash_hmac('sha256', $message, $apiSecret);
return hash_equals($expectedSignature, $signature);
}
Ældre autentificering
token-headeren, der indeholder din API Secret, sendes stadig for bagudkompatibilitet. Vi anbefaler dog at migrere til HMAC-verifikation for forbedret sikkerhed, da det beskytter mod replay-angreb.
Håndtering af Webhooks via API'en 
Webhooks kan også administreres via REST API'et. Sådan kan integrationer som Zapier abonnere på kommentarhændelser uden at røre ved dashboardet, og det følger REST Hooks‑mønsteret: abonnere, modtage hændelser, afmelde.
API‑abonnementer lever side om side med de webhooks, der er konfigureret i dashboardet. En kommentarhændelse leveres til hver webhook, der matcher dens domæne, hver for sig, uanset hvordan webhooken blev oprettet.
Godkendelse
Hver anmodning kræver din API‑nøgle i x-api-key‑headeren (eller API_KEY‑forespørgselsparameteren) og dit lejer‑ID i tenantId‑forespørgselsparameteren. Begge vises på siden API Secret i dashboardet.
Abonner
POST https://fastcomments.com/api/v1/webhooks?tenantId=YOUR_TENANT_ID
x-api-key: YOUR_API_KEY
Content-Type: application/json
{
"url": "https://hooks.zapier.com/hooks/catch/123/abc",
"event": "comment-created"
}| Felt | Påkrævet | Beskrivelse |
|---|---|---|
url | Ja | En absolut http‑URL eller https‑URL. |
event | Ja | comment‑created, comment‑updated eller comment‑deleted. |
domain | Nej | Et domæne fra din kontokonfiguration. Standard er *, som modtager hændelser for hvert domæne. |
method | Nej | POST (standard), PUT eller DELETE. |
Hvis du abonnerer på den samme URL til den samme hændelse og domæne igen, returneres det eksisterende abonnement i stedet for at oprette en duplikat, så en klient trygt kan prøve igen. Hver lejer kan have op til 50 API‑abonnementer.
Liste
GET https://fastcomments.com/api/v1/webhooks?tenantId=YOUR_TENANT_ID
Returnerer alle webhooks for lejeren, inklusive dem, der administreres i dashboardet ("source": "dashboard"). Filtrer med event, domain eller source.
Afmeld
DELETE https://fastcomments.com/api/v1/webhooks/SUBSCRIPTION_ID?tenantId=YOUR_TENANT_ID
Sletning af et abonnement kasserer også eventuelle hændelser, der stadig er i kø for det. Kun abonnementer oprettet via API'et kan slettes på denne måde; en dashboard‑webhook eller et id, der ikke findes på din konto, svarer med 404 og koden not-found. Dashboard‑webhooks redigeres på siden Webhooks.
Payloads og signering
Leverancer bruger den samme payload som dashboard‑webhooks (se Data Structures) og er signeret med det samme HMAC‑skema (se Security & API Tokens). API‑abonnementer modtager aldrig den ældre token‑header, så verificer i stedet X-FastComments-Signature‑headeren.
Eksempel‑payloads
GET https://fastcomments.com/api/v1/webhooks/sample-payloads?tenantId=YOUR_TENANT_ID&event=comment-created&limit=3
Returnerer kontoens seneste kommentarer i præcis den form, en levering har, så en integration kan vise reelle eksempeldata, før den første hændelse ankommer. event er valgfri og kun valideret, da hver hændelse leverer det samme kommentarobjekt. limit er standard 3 og accepterer 1 til 10. Koster 2 API‑kreditter.
{
"status": "success",
"payloads": [
{
"id": "66f1c4c1e7a2b3d4f5a6b7c8",
"urlId": "https://example.com/blog/hello-world",
"commenterName": "Jane Reader",
"comment": "Great article!",
"date": "2026-09-08T12:00:00.000Z",
"approved": true
}
]
}
Svar med 410 Gone
Hvis en API‑abonnements endpoint svarer med HTTP 410 Gone, betragter FastComments det som en afmelding: abonnementet slettes sammen med dets køede hændelser, og der foretages ingen yderligere leveringer. Webhooks konfigureret i dashboardet slettes aldrig automatisk; for dem er en 410 en almindelig fejl. Alle andre fejlkoder forsøges igen og deaktiverer til sidst webhooken, som beskrevet i Sådan fungerer det & Håndtering af genforsøg.
Dashboard
API‑abonnementer vises i listen over Webhooks med kilden API, hvor en administrator kan redigere, deaktivere, genaktivere eller slette dem.
Hvordan det fungerer og håndtering af genforsøg 
Alle ændringer af Comment-objektet i systemet udløser en begivenhed, som ender i en kø.
Den indledende webhook-begivenhed sendes normalt inden for seks sekunder efter, at begivenhedskilden indtræffer.
Du kan overvåge denne kø i Webhooks-administrationen i tilfælde af, at din API går ned.
Hvis en anmodning til din API fejler, vil vi sætte den i kø igen efter en tidsplan.
Den tidsplan er 1 Minute * the retry count. Hvis kaldet fejler én gang, forsøger det igen om
et minut. Hvis det fejler to gange, vil det derefter vente to minutter, og så videre. Dette er for at undgå, at vi
overbelaster din API, hvis den går ned på grund af belastning.
Webhooks kan annulleres fra log-siden.
Afslutningsvis
Dette afslutter vores Webhooks-dokumentation.
Vi håber, du synes, at FastComments Webhook-integrationen er nem at forstå og hurtig at sætte op.
Hvis du mener, at du har fundet mangler i vores dokumentation, så lad os det vide nedenfor.