Oversigt over webhooks
Webhooks giver ChatLab mulighed for at give dine systemer besked i samme øjeblik, der sker noget i dine chatrobotter. I stedet for at polle Management API eller eksportere data manuelt, registrerer du et HTTPS-endpoint, og ChatLab sender en signeret HTTP POST dertil i realtid - når en besøgende efterlader et lead, indsender en kontaktformular, bedømmer en samtale, anmoder om et menneske, eller når en AI-handling kører.
Typiske anvendelser:
- send nye leads direkte ind i dit CRM i samme sekund, de opsamles
- giv dit team besked i Slack, når en besøgende anmoder om Live Chat (livechat)
- før samtalebedømmelser og opsummeringer ind i dine egne analyseværktøjer
- overvåg udførelsen af AI actions (AI-handlinger), og få advarsler ved fejl
Tilgængelighed: din konto skal indeholde funktionen Webhooks.
Hvor det konfigureres: i administrationsappen åbner du Account settings -> Webhooks (Kontoindstillinger -> Webhooks) lige ved siden af sektionen Management API. Webhooks er på kontoniveau - ét endpoint kan modtage hændelser fra alle dine robotter eller fra én udvalgt robot.
Oprettelse af et endpoint
- Åbn Account settings -> Webhooks (Kontoindstillinger -> Webhooks), og klik på Add endpoint (Tilføj endpoint).
- Udfyld endpoint-formularen:
- Name (Navn) - en etiket til din egen reference, f.eks. "CRM-synkronisering" eller "Slack-notifikationer".
- URL - den HTTPS-adresse, som ChatLab skal sende hændelser til via POST.
- Events (Hændelser) - vælg, hvilke hændelsestyper dette endpoint skal modtage (se kataloget nedenfor). Vælg kun det, du har brug for; hændelser med stor mængde som f.eks.
ai_action.executedkan generere meget trafik. - Bot filter (valgfrit) - vælg én robot eller All bots (Alle robotter) for alle robotter på din konto.
- Custom form filter (valgfrit) - sender indsendelser fra én specifik brugerdefineret formular til dette endpoint. Det indsnævrer udelukkende hændelsen
custom_form.submitted; alle andre hændelser, du abonnerer på (leads, kontaktanmodninger, samtaler, Live Chat, AI-handlinger), leveres uanset denne indstilling.
- Indsend. Endpointets secret (hemmelighed) vises præcis én gang i bekræftelsesdialogen - kopiér den nu, og opbevar den sikkert. Du skal bruge den til at verificere signaturer (se Sikkerhed nedenfor). Teksten i klartekst kan ikke hentes igen senere.
Hvert endpoint har også:
- Enable/disable toggle (Slå til/fra-knap) - sæt leveringer på pause uden at slette endpointet. Deaktiverede endpoints kasserer hændelser uden besked (de sættes ikke i kø til senere).
- Send sample event (Send testhændelse) - leverer en signeret testanmodning til din URL, så du kan verificere din modtager fra start til slut. Du kan vælge hændelsestype og redigere testværdierne før afsendelse, så dit modtagersystem ser realistiske data. Testen ankommer som en almindelig levering med
eventTypesvarende til dit valg (eller somwebhook.testfor et simpelt forbindelsestjek). - Roll secret (Roter hemmelighed) - genererer en ny hemmelighed og gør den gamle ugyldig. Brug dette, hvis hemmeligheden kan være blevet lækket. Den nye hemmelighed vises igen kun én gang. For en kontrolleret rotation skal du sætte endpointet på pause, rotere og kopiere den nye hemmelighed, opdatere modtageren, genaktivere endpointet og sende en testhændelse. Hændelser i pauseperioden sættes ikke i kø. Planlæg denne afbrydelse før rotationen.
- Delivery log (Leveringslog) - en liste over nylige leveringer for det enkelte endpoint med tidsstempel, hændelsestype, den HTTP-status, din server returnerede, samt svartid. Mislykkedes leveringer og automatiske afbrydelser (circuit breaker) vises her. Loggen gemmes i 14 dage.
Event envelope
Hver levering er en HTTP POST med Content-Type: application/json. Brødteksten har altid samme overordnede struktur (envelope); data-objektet er specifikt for hændelsestypen:
{
"eventId": "9f1c1c8e-6a2b-4b9e-9d2f-3f8a1e2b4c5d",
"eventType": "lead.created",
"timestamp": "2026-08-13T14:22:31Z",
"botId": 1234,
"botName": "Support Bot",
"conversationId": "conv_a1b2c3",
"sessionId": "sess_x9y8z7",
"data": { }
}
eventId- unikt for hver hændelse. Brug det til deduplikering, hvis din behandling skal være idempotent.eventType- en af de typer, der er beskrevet nedenfor; sendes også i headerenX-ChatLab-Event.timestamp- ISO 8601 UTC-tidspunktet for, hvornår leverings-envelopen blev klargjort.botId/botName- den robot, hændelsen tilhører.conversationId/sessionId- samtalekonteksten, når det er relevant.
Hændelseskatalog
lead.created
Udløses, når en besøgende indsender sine kontaktoplysninger - via formularen til lead-indsamling, live chat-forformularen eller en tilpasset formular, der bruges til lead-indsamling.
{
"eventId": "9f1c1c8e-6a2b-4b9e-9d2f-3f8a1e2b4c5d",
"eventType": "lead.created",
"timestamp": "2026-08-13T14:22:31Z",
"botId": 1234,
"botName": "Support Bot",
"conversationId": "conv_a1b2c3",
"sessionId": "sess_x9y8z7",
"data": {
"email": "jane.doe@example.com",
"name": "Jane Doe",
"phone": "+1 555 0123",
"source": "LEAD_COLLECTION_FORM",
"formCodeName": "lead_form",
"formName": "Lead form",
"fields": [
{"name": "email", "value": "jane.doe@example.com", "type": "email"},
{"name": "company", "value": "Acme Inc.", "type": "text"},
{"name": "topics", "value": ["Billing", "Delivery"], "type": "multichoice"},
{"name": "attachment", "value": "https://api.chatlab.com/aichat/customform/download?key=...&token=...", "type": "file"}
],
"pageUrl": "https://acme.com/pricing"
}
}
source- hvordan kontaktoplysningerne blev indsamlet:LEAD_COLLECTION_FORM(formular til lead-indsamling),LIVE_CHAT_FORM(live chat-forformular),CONVERSATION(AI'en opsnappede oplysningerne under samtalen),ADMIN_DATA_UPDATEellerUPDATE_CLIENT_CONTEXT(redigeret på ChatLabs side). Indsendelser via formularen til menneskelig support udløser aldrig denne hændelse - de udløser i stedetcontact_form.submitted.email,name,phone- kontaktoplysningerne tilknyttet lead-posten.- Når en tilpasset formular bruges til lead-indsamling, medtages alle felter defineret i den formular i
fields, i formularens rækkefølge, ogformCodeName/formNameidentificerer formularen. Med den klassiske lead-formular er beggenull, ogfieldser et tomt array. - Hver post i
fieldser{name, value, type}.nameer feltets tekniske navn, som forbliver det samme ved redigering af etiketter - brug det til tilknytning i dit CRM. - For
multichoice-felter ervalueet array af de valgte indstillinger. Afkrydsningsfelter er individuelle poster med værdierne"true"/"false". - For
file-felter ervalueet downloadlink til den uploadede fil; webhooken indeholder aldrig filindhold. pageUrl- den side, den besøgende var på ved indsendelsen.
contact_form.submitted
Udløses, når en besøgende indsender kontaktformularen til menneskelig support eller en tilpasset formular, der bruges til menneskelig kontakt.
{
"eventId": "3a7b9c2d-1e4f-4a6b-8c0d-5e2f7a9b1c3d",
"eventType": "contact_form.submitted",
"timestamp": "2026-08-13T14:25:02Z",
"botId": 1234,
"botName": "Support Bot",
"conversationId": "conv_a1b2c3",
"sessionId": "sess_x9y8z7",
"data": {
"email": "jane.doe@example.com",
"message": "I need help with my last invoice.",
"source": "CUSTOM_FORM",
"formCodeName": "contact_form",
"formName": "Contact form",
"fields": [
{"name": "email", "value": "jane.doe@example.com", "type": "email"},
{"name": "order_number", "value": "A-10293", "type": "text"},
{"name": "message", "value": "I need help with my last invoice.", "type": "textarea"}
]
}
}
email- den adresse, den besøgende angav, og den adresse, dit supportteam skal svare til.source-CUSTOM_FORM, når kontaktformularen er baseret på en tilpasset formular,CONTACT_FORMfor den indbyggede.formCodeName/formName- identificerer den tilpassede formular bag anmodningen; begge ernullfor den indbyggede formular.- Når der bruges en tilpasset formular, medtages alle felter defineret i den formular i
fields(samme{name, value, type}-format som ilead.created). Med den indbyggede kontaktformular udfyldes kunemailogmessage,fieldser et tomt array, og formularidentifikatorerne ernull. message- det tilknyttede beskedfelt, eller alle udfyldte værdier sat sammen, hvis formularen ikke definerer et beskedfelt.
custom_form.submitted
Udløses ved enhver indsendelse af en tilpasset formular, uanset formularens formål. Bemærk, at formularer med det formål at indsamle leads eller oprette menneskelig kontakt også udløser deres dedikerede lead.created / contact_form.submitted-hændelse - abonner på den ene eller den anden, afhængigt af om du ønsker den generelle eller den specialiserede visning, frem for at oprette duplikerede handlinger. De to hændelsesfamilier har forskellige hændelses-id'er; conversationId plus timestamp er ikke en pålidelig identifikator for en indsendelse.
{
"eventId": "6c1d8e3f-2a5b-4c7d-9e0f-1a4b6c8d0e2f",
"eventType": "custom_form.submitted",
"timestamp": "2026-08-13T14:27:45Z",
"botId": 1234,
"botName": "Support Bot",
"conversationId": "conv_a1b2c3",
"sessionId": "sess_x9y8z7",
"data": {
"formCodeName": "warranty_claim",
"formName": "Warranty claim",
"fields": [
{"name": "order_number", "value": "A-10293", "type": "text"},
{"name": "issue", "value": "Damaged on arrival", "type": "textarea"},
{"name": "photo", "value": "https://api.chatlab.com/aichat/customform/download?key=...&token=...", "type": "file"}
],
"purpose": "STANDALONE"
}
}
formCodeName- formularens faste systemnavn, som forbliver uændret, hvis du omdøber formularen; brug det til at dirigere indsendelser i dit eget system.formNameer den viste etiket, som de besøgende ser.fieldsbruger de samme{name, value, type}-poster somlead.created: multichoice-værdier er arrays, filværdier er downloadlinks.purpose-STANDALONE,LEAD_COLLECTIONellerHUMAN_CONTACT, afhængigt af hvordan formularen er forbundet til chatbottes.
conversation.started
Udløses, når en besøgende sender den første besked i en ny samtale.
{
"eventId": "8e2f0a4b-3c6d-4e8f-a1b2-2c5d7e9f1a3b",
"eventType": "conversation.started",
"timestamp": "2026-08-13T14:20:11Z",
"botId": 1234,
"botName": "Support Bot",
"conversationId": "conv_a1b2c3",
"sessionId": "sess_x9y8z7",
"data": {
"firstMessage": "Do you ship to Canada?",
"chatSource": "WIDGET",
"byAdmin": false,
"countryCode": "PL",
"ipAddress": "83.12.44.7"
}
}
firstMessage- den præcise tekst i den besøgendes indledende besked.nullhvis samtalen blev åbnet uden beskedindhold.chatSource- den kanal, samtalen kom ind igennem:WIDGET,WHATSAPP,MESSENGER,VOICE,VOICE_PHONE,API,BOOKING,AIRBNBellerIDOBOOKING.byAdmin-truenår samtalen kommer fra forhåndsvisningen af chatbottes inde i ChatLab-kontrolpanelet frem for fra en rigtig besøgende. Brug dette felt til at holde dine egne testsamtaler ude af dit CRM.countryCode- ISO-landekode udledt af den besøgendes IP-adresse,nullnår den ikke kunne fastslås.ipAddress- den besøgendes IP-adresse set fra ChatLab,nullnår den ikke er tilgængelig. Behandl den som persondata under GDPR, og gem den kun, hvis du har et lovligt grundlag.
conversation.rated
Udløses, når en besøgende indsender en positiv eller negativ vurdering af samtalen (se Samtalevurdering).
{
"eventId": "1b4c6d8e-5f0a-4b2c-8d3e-4f7a9b1c3d5e",
"eventType": "conversation.rated",
"timestamp": "2026-08-13T14:31:09Z",
"botId": 1234,
"botName": "Support Bot",
"conversationId": "conv_a1b2c3",
"sessionId": "sess_x9y8z7",
"data": {
"rating": "POSITIVE"
}
}
rating-POSITIVEellerNEGATIVE. Hvis en vurdering fjernes, udløses hændelsen ikke, så du modtager aldrig en neutral værdi.
conversation.summarized
Udløses, når ChatLab genererer et resumé af en afsluttet samtale.
{
"eventId": "4d7e9f1a-6b2c-4d4e-9f0a-5b8c0d2e4f6a",
"eventType": "conversation.summarized",
"timestamp": "2026-08-13T14:45:00Z",
"botId": 1234,
"botName": "Support Bot",
"conversationId": "conv_a1b2c3",
"sessionId": "sess_x9y8z7",
"data": {
"summary": "Visitor asked about shipping to Canada and delivery times. The bot confirmed availability and quoted 5-7 business days. Visitor left satisfied.",
"language": "en_US"
}
}
summary- den genererede resumétekst. Generering af resumé sker asynkront og afhænger af bottens resumékonfiguration og behandlingsplan; forvent ikke en fast leveringsforsinkelse.language- bottens interne landestandard sendt til opsummering, for eksempelen_US; gå ikke ud fra, at dette matcher sproget i den besøgendes samtale.
client.summarized
Udløses, når ChatLab opdaterer en klients AI-profil. Profilen genopbygges ud fra den forrige profil plus resuméet af den samtale, der netop er afsluttet, og kan blive genereret efter conversation.summarized. Leveringsrækkefølgen er ikke garanteret. Nyttelasten inkluderer en e-mailadresse, hvis den kendes, men ChatLab kan også indeholde klienter uden en e-mailadresse.
{
"eventId": "b5d8f1a3-7c2e-4d9b-a6f0-1e3c5a7b9d2f",
"eventType": "client.summarized",
"timestamp": "2026-08-18T09:12:04Z",
"botId": 1234,
"botName": "Support Bot",
"conversationId": "conv_a1b2c3",
"sessionId": "sess_x9y8z7",
"data": {
"clientEmail": "jane.doe@example.com",
"client": {
"email": "jane.doe@example.com",
"name": "Jane Doe",
"phone": "+1 555 0123",
"countryCode": "PL",
"ipAddress": "83.12.44.7"
},
"clientSummary": "Returning customer interested in international shipping. Asked about delivery times to Canada twice and about return costs once."
}
}
clientEmail- identifikatoren til at matche klienten mod dit eget CRM. Den ernullfor anonyme besøgende, der aldrig har efterladt en adresse, og hændelsen udløses stadig for dem - spring disse leveringer over, hvis din integration er baseret på e-mail.client- den kontaktpost, ChatLab har for denne person:email,name,phone,countryCodeogipAddress. Alle nøgler er altid til stede; ukendte værdier ernull.clientSummary- den fulde profiltekst som ren tekst, ikke en diff. Den erstatter det forrige resumé fuldstændigt, så gem den ved at overskrive i stedet for at tilføje.- Profilen genopbygges kun for botter med sam选取alehukommelse aktiveret, og kun for samtaler, der har været inaktive længe nok til at blive opsummeret - forvent denne hændelse minutter efter, at samtalen slutter, ikke med det samme.
live_chat.requested
Udløses, når AI'en overdrager samtalen til live chat, enten fordi den besøgende bad om et menneske, eller fordi botten vurderede, at et menneske var nødvendigt.
{
"eventId": "7a0b2c4d-8e3f-4a5b-b0c1-6d9e1f3a5b7c",
"eventType": "live_chat.requested",
"timestamp": "2026-08-13T14:33:20Z",
"botId": 1234,
"botName": "Support Bot",
"conversationId": "conv_a1b2c3",
"sessionId": "sess_x9y8z7",
"data": {
"requestedBy": "AI"
}
}
requestedBy- i øjeblikket altidAI, fordi overdragelsen altid startes af bottens live chat-handling, også når den besøgende beder om det i almindelig tekst. Behandl det som en åben enum: håndter ukendte værdier i stedet for at forvente fastAI.- Denne hændelse dækker AI-handlingen, der anmoder om overdragelse, ikke alle måder en besøgende kan åbne live chat på. Den er ikke et bevis på, at en medarbejder har tilsluttet sig.
live_chat.started
Udløses, når live chat-sessionen oprettes, efter den besøgendes overdragelsesformular er indsendt. Dette sker, før en medarbejder nødvendigvis tilslutter sig eller svarer; betragt det ikke som et bevis på menneskelig involvering.
{
"eventId": "0c3d5e7f-9a4b-4c6d-a1b2-7e0f2a4b6c8d",
"eventType": "live_chat.started",
"timestamp": "2026-08-13T14:33:55Z",
"botId": 1234,
"botName": "Support Bot",
"conversationId": "conv_a1b2c3",
"sessionId": "sess_x9y8z7",
"data": {}
}
dataer bevidst tomt. Alt, hvad du har brug for, findes i konvolutten:botIdidentificerer chatbottens, ogconversationId/sessionIdknytter hændelsen til samtalen. Du kan modtage den uden en forudgåendelive_chat.requested, for eksempel hvis den besøgende brugte widgettens funktion til live chat.
live_chat.ended
Udløses, når live chat-sessionen afsluttes.
{
"eventId": "2e5f7a9b-0c5d-4e7f-b2c3-8f1a3b5c7d9e",
"eventType": "live_chat.ended",
"timestamp": "2026-08-13T14:52:41Z",
"botId": 1234,
"botName": "Support Bot",
"conversationId": "conv_a1b2c3",
"sessionId": "sess_x9y8z7",
"data": {
"durationSeconds": 1126
}
}
durationSeconds- forløbet varighed af live chat-sessionen i sekunder, talt fra sessionens oprettelse, inklusive ventetid på en medarbejder. Feltet udelades i det sjældne tilfælde, hvor en session afsluttes uden nogensinde at være blevet startet.
ai_action.executed
Udløses hver gang botten udfører en AI-handling - et administreret integrationskald eller en tilpasset API-funktion. Dette er en hændelse med høj volumen: en aktiv e-handelsbot kan udføre hundredvis af handlinger om dagen, og en enkelt besked fra en besøgende kan udløse flere. Abonner på den på et dedikeret slutpunkt, eller vær sikker på, at din modtager kan håndtere mængden.
{
"eventId": "5f8a0b2c-1d6e-4f8a-c3d4-9a2b4c6d8e0f",
"eventType": "ai_action.executed",
"timestamp": "2026-08-13T14:21:03Z",
"botId": 1234,
"botName": "Support Bot",
"conversationId": "conv_a1b2c3",
"sessionId": "sess_x9y8z7",
"data": {
"actionName": "search_products",
"status": "SUCCESS",
"durationMs": 842,
"errorMessage": null
}
}
actionName- navnet på den udførte handling, som AI'en ser det, for eksempelsearch_productsfor en administreret integration eller det navn, du gav en tilpasset API-handling.status-SUCCESSellerERROR.durationMs- hvor lang tid handlingen tog i millisekunder. Nyttigt til at opdage en langsom integration, før de besøgende klager over det.errorMessage- årsagen til fejlen, udfyldes kun, nårstatuserERROR; ellersnull.
webhook.test
Sendes af knappen Send sample event (Send testhændelse), når du udfører et almindeligt forbindelsestjek. Signeret præcis som en rigtig hændelse.
{
"eventId": "9b2c4d6e-3f8a-4b0c-d5e6-0b3c5d7e9f1a",
"eventType": "webhook.test",
"timestamp": "2026-08-13T14:10:00Z",
"botId": 1234,
"botName": "Support Bot",
"conversationId": "conv_a1b2c3",
"sessionId": "sess_x9y8z7",
"data": {
"message": "Test delivery from ChatLab"
}
}
message- fast tekst, altid den samme. Konvolutfelterne indeholder testværdier, så behandl aldrig enwebhook.test-levering som rigtige data.- Dette er den eneste hændelsestype, du ikke kan abonnere på på et slutpunkt: den sendes efter anmodning fra kontrolpanelet og når altid det slutpunkt, du har klikket på, uanset hvilke hændelser det lytter til.
Sikkerhed: bekræftelse af leveringer
Hver levering indeholder fire headere:
| Header | Værdi |
|---|---|
X-ChatLab-Signature |
sha256=<hex hmac> - HMAC-SHA256-signatur af nyttelasten |
X-ChatLab-Timestamp |
Unix-tid i sekunder, da leveringen blev signeret |
X-ChatLab-Event |
Hændelsestypen, f.eks. lead.created |
X-ChatLab-Delivery |
Unikt leverings-id, identisk med brødtekstens eventId |
Signaturen beregnes som HMAC-SHA256 over strengen {timestamp}.{rawBody} ved hjælp af din slutpunkthemmelighed, hvor {timestamp} er værdien af X-ChatLab-Timestamp, og {rawBody} er den rå, uparsede anmodningsbrødtekst. Bekræft altid mod de rå bytes - genserialisering af parset JSON ændrer bytesekvensen og ugyldiggør signaturen.
For at beskytte mod gentagelsesangreb skal du afvise leveringer, hvis X-ChatLab-Timestamp er ældre end 5 minutter.
Node.js
const crypto = require('crypto');
function verifyChatLabSignature(req, secret) {
const signature = req.headers['x-chatlab-signature'];
const timestamp = req.headers['x-chatlab-timestamp'];
if (typeof signature !== 'string' || typeof timestamp !== 'string') return false;
if (!/^\d+$/.test(timestamp) || !Number.isSafeInteger(Number(timestamp))) return false;
if (!Buffer.isBuffer(req.rawBody)) return false;
// Reject stale deliveries (older than 5 minutes)
const ageSeconds = Math.abs(Date.now() / 1000 - Number(timestamp));
if (ageSeconds > 300) return false;
// rawBody must be the raw request body bytes, not re-serialized JSON.
// With Express: app.use(express.json({ verify: (req, res, buf) => { req.rawBody = buf; } }))
const expected = 'sha256=' + crypto
.createHmac('sha256', secret)
.update(timestamp + '.')
.update(req.rawBody)
.digest('hex');
const a = Buffer.from(signature);
const b = Buffer.from(expected);
return a.length === b.length && crypto.timingSafeEqual(a, b);
}
PHP
<?php
function verifyChatLabSignature(string $secret): bool
{
$signature = $_SERVER['HTTP_X_CHATLAB_SIGNATURE'] ?? '';
$timestamp = $_SERVER['HTTP_X_CHATLAB_TIMESTAMP'] ?? '';
if ($signature === '' || $timestamp === '' || !ctype_digit($timestamp)) {
return false;
}
// Reject stale deliveries (older than 5 minutes)
if (abs(time() - (int) $timestamp) > 300) {
return false;
}
$rawBody = file_get_contents('php://input');
$expected = 'sha256=' . hash_hmac('sha256', $timestamp . '.' . $rawBody, $secret);
return hash_equals($expected, $signature);
}
Hvis bekræftelsen mislykkes, skal du svare med 401 og kassere nyttelasten. Behandl aldrig ubekræftede leveringer - enhver, der finder frem til din URL, kan sende vilkårlig JSON til den via POST.
Leveringsadfærd
Forstå disse leveringsregler, før du bygger videre på webhooks:
- Svar hurtigt. Dit slutpunkt skal svare inden for 3 sekunder, ellers tæller leveringen som mislykket. Bekræft signaturen, placer hændelsen sikkert i en kø, og bekræft modtagelsen med
2xxinden for dette tidsrum. Udfør langsommere CRM-kald og forretningslogik asynkront. - Fire-and-forget, højst én gang. Matchende, aktiverede slutpunkter får højst ét leveringsforsøg - der er ingen genforsøg. Pausede slutpunkter og afbrudte kredsløb (open circuits) kan endda undertrykke dette forsøg. Hvis dit slutpunkt er nede, udløber i timeout eller returnerer en status, der ikke er 2xx, går hændelsen tabt og bliver ikke leveret igen. Webhooks er notifikationer, ikke et replikeret datalager: Brug samtaleslutpunkter i Bot Talk API eller lead-eksporter til at afstemme gemte data, hvor det understøttes. Management API dækker bot-indstillinger og forbrug, ikke et komplet hændelsesarkiv. Nogle hændelser kan ikke rekonstrueres via disse grænseflader.
- Kredsløbsafbryder (circuit breaker). Efter 5 mislykkede leveringer i træk for et slutpunkts-/bot-par sættes leveringer for dette par på pause i 5 minutter. Hændelser, der opstår under pausen, kasseres, og leveringsloggen viser
CIRCUIT_OPEN-poster for at identificere undertrykte forsøg. Leveringer, der springes over på grund af et åbent kredsløb, tæller ikke med i forhold til automatisk deaktivering. - Automatisk deaktivering. Kontrollen kører i det øjeblik, en levering mislykkes, aldrig på en timer. Hvis en levering mislykkes, og der ikke har været nogen vellykket levering i 7 dage - talt fra den seneste succes eller fra slutpunktets oprettelsesdato, hvis det aldrig har haft succes - deaktiveres slutpunktet, og du modtager en e-mailnotifikation. En enkelt
2xxpå et hvilket som helst tidspunkt nulstiller uret. Et slutpunkt, der ikke modtager nogen trafik, deaktiveres aldrig, fordi intet mislykkes. Genaktiver det fra Account settings (Kontoindstillinger), når din modtager er rettet; fejltælleren og tidsstemplet for automatisk deaktivering nulstilles, når du slår det til igen, og hændelser, der blev overset, mens det var slået fra, eftersendes ikke. - 410 Gone. Hvis dit slutpunkt svarer med HTTP
410 Gone, deaktiverer ChatLab det med det samme. Brug dette til at udfase et slutpunkt programmatisk fra modtagersiden. - Idempotens. Dublerede leveringer forventes ikke under normal drift, men hvis din databehandling skal være strengt idempotent, kan du deduplikere via
eventId(også tilgængelig i headerenX-ChatLab-Delivery).
Leveringsrækkefølgen er ikke garanteret. Gem hændelses-id'et, og gør forretningslogikken idempotent. Oprethold dine egne opbevaringsregler og adgangskontroller for webhook-payloads, som kan indeholde personoplysninger og links til fildownload.
Signatureksemplerne bruger Node.js crypto og PHP's hash_equals. Indfang den rå anmodningstekst (raw request body), før du parser den.
Grænser
- Op til 10 webhook-slutpunkter pr. konto.
- Opbevaring af leveringslog: 14 dage. Ældre poster fjernes automatisk.
Relaterede artikler
- Lead-indsamling - formularen bag
lead.created - Kontaktformular til menneskelig support - formularen bag
contact_form.submitted - Live Chat - flowet bag
live_chat.*-hændelserne - Samtalebedømmelse - tommelfinger op/ned bag
conversation.rated - AI Actions - integrationerne bag
ai_action.executed - Chat API - widget-callbacks i browseren (modstykket på klientsiden til webhooks)
- Management API - REST API til bot-administration og forbrugsdata