Hjælpecenter
Chat API

Webhooks

Sidst opdateret:

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

  1. Åbn Account settings -> Webhooks (Kontoindstillinger -> Webhooks), og klik på Add endpoint (Tilføj endpoint).
  2. 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.executed kan 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.
  3. 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 eventType svarende til dit valg (eller som webhook.test for 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 headeren X-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_UPDATE eller UPDATE_CLIENT_CONTEXT (redigeret på ChatLabs side). Indsendelser via formularen til menneskelig support udløser aldrig denne hændelse - de udløser i stedet contact_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, og formCodeName / formName identificerer formularen. Med den klassiske lead-formular er begge null, og fields er et tomt array.
  • Hver post i fields er {name, value, type}. name er feltets tekniske navn, som forbliver det samme ved redigering af etiketter - brug det til tilknytning i dit CRM.
  • For multichoice-felter er value et array af de valgte indstillinger. Afkrydsningsfelter er individuelle poster med værdierne "true" / "false".
  • For file-felter er value et 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_FORM for den indbyggede.
  • formCodeName / formName - identificerer den tilpassede formular bag anmodningen; begge er null for 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 i lead.created). Med den indbyggede kontaktformular udfyldes kun email og message, fields er et tomt array, og formularidentifikatorerne er null.
  • 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. formName er den viste etiket, som de besøgende ser.
  • fields bruger de samme {name, value, type}-poster som lead.created: multichoice-værdier er arrays, filværdier er downloadlinks.
  • purpose - STANDALONE, LEAD_COLLECTION eller HUMAN_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. null hvis samtalen blev åbnet uden beskedindhold.
  • chatSource - den kanal, samtalen kom ind igennem: WIDGET, WHATSAPP, MESSENGER, VOICE, VOICE_PHONE, API, BOOKING, AIRBNB eller IDOBOOKING.
  • byAdmin - true nå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, null når den ikke kunne fastslås.
  • ipAddress - den besøgendes IP-adresse set fra ChatLab, null nå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 - POSITIVE eller NEGATIVE. 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 eksempel en_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 er null for 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, countryCode og ipAddress. Alle nøgler er altid til stede; ukendte værdier er null.
  • 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 altid AI, 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 fast AI.
  • 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": {}
}
  • data er bevidst tomt. Alt, hvad du har brug for, findes i konvolutten: botId identificerer chatbottens, og conversationId / sessionId knytter hændelsen til samtalen. Du kan modtage den uden en forudgående live_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 eksempel search_products for en administreret integration eller det navn, du gav en tilpasset API-handling.
  • status - SUCCESS eller ERROR.
  • 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år status er ERROR; ellers null.

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 en webhook.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 2xx inden 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 2xx på 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 headeren X-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