Översikt över webhooks
Med webhooks kan ChatLab meddela dina system i samma stund som något händer i dina chattbottar. I stället för att regelbundet fråga (polla) Management API eller exportera data manuellt registrerar du en HTTPS-slutpunkt och ChatLab skickar en signerad HTTP POST till den i realtid - när en besökare lämnar ett lead, skickar in ett kontaktformulär, betygsätter ett samtal, ber om att få prata med en människa eller när en AI-åtgärd körs.
Typiska användningsområden:
- skicka nya leads direkt till ditt CRM så fort de samlas in
- meddela teamet i Slack när en besökare ber om Live Chat (livechatt)
- mata in samtalsbetyg och sammanfattningar i din egen analysplattform
- övervaka körningar av AI actions (AI-åtgärder) och larma vid fel
Tillgänglighet: ditt konto måste innehålla funktionen Webhooks.
Var du konfigurerar: i administrationsappen öppnar du Account settings -> Webhooks (Kontoinställningar -> Webhooks, precis bredvid avsnittet för Management API). Webhooks gäller på kontonivå - en slutpunkt kan ta emot händelser från alla dina bottar eller från en utvald bot.
Konfigurera en slutpunkt
- Öppna Account settings -> Webhooks och klicka på Add endpoint (Lägg till slutpunkt).
- Fyll i slutpunktsformuläret:
- Name (Namn) - en etikett för din egen referens, t.ex. "CRM-synkning" eller "Slack-larm".
- URL - HTTPS-adressen dit ChatLab ska skicka (POST) händelser.
- Events (Händelser) - välj vilka händelsetyper som denna slutpunkt ska ta emot (se katalogen nedan). Välj bara det du behöver; händelser med hög volym som
ai_action.executedkan generera mycket trafik. - Bot filter (Bottfilter) (valfritt) - välj en specifik bot, eller All bots (Alla bottar) för alla bottar på ditt konto.
- Custom form filter (Filter för anpassat formulär) (valfritt) - dirigerar inskickade svar från ett anpassat formulär till denna slutpunkt. Det filtrerar enbart händelsen
custom_form.submitted; alla andra händelser du prenumererar på (leads, kontaktförfrågningar, samtal, livechatt, AI-åtgärder) levereras oavsett denna inställning.
- Skicka in. Slutpunktens hemlighet (secret) visas exakt en gång i bekräftelserutan - kopiera den direkt och spara den på ett säkert ställe. Du behöver den för att verifiera signaturer (se Säkerhet nedan). Den kan inte hämtas i klartext senare.
Varje slutpunkt har också:
- Enable/disable toggle (Aktivera/inaktivera-reglage) - pausa leveranser utan att ta bort slutpunkten. Inaktiverade slutpunkter ignorerar händelser tyst (de ställs inte i kö för senare).
- Send sample event (Skicka testhändelse) - levererar en signerad testförfrågan till din URL så att du kan verifiera din mottagare från ände till ände. Du kan välja händelsetyp och redigera exempelvärdena innan du skickar, så att din mottagare ser realistiska data. Testet anländer som en vanlig leverans med
eventTypematchande ditt val (eller somwebhook.testför en enkel anslutningskontroll). - Roll secret (Rotera hemlighet) - genererar en ny hemlighet och ogiltigförklarar den gamla. Använd detta om hemligheten kan ha läckt. Den nya hemligheten visas återigen bara en gång. För en kontrollerad rotation pausar du slutpunkten, roterar och kopierar den nya hemligheten, uppdaterar mottagaren, återaktiverar sedan och skickar en testhändelse. Händelser som inträffar under pausen ställs inte i kö. Planera detta avbrott innan du roterar.
- Delivery log (Leveranslogg) - en lista för varje slutpunkt med de senaste leveranserna inklusive tidsstämpel, händelsetyp, HTTP-status som returnerades från din server och svarstid. Misslyckade leveranser och pauser orsakade av automatsäkringen (circuit breaker) syns här. Loggen sparas i 14 dagar.
Händelsekuvert
Varje leverans är en HTTP POST med Content-Type: application/json. Textkroppen (body) har alltid samma kuvert; objektet data är specifikt för händelsetypen:
{
"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 per händelse. Använd det för deduplicering om din bearbetning måste vara idempotent.eventType- en av typerna som dokumenteras nedan; skickas även i HTTP-headernX-ChatLab-Event.timestamp- ISO 8601 UTC-tidpunkt då leveranskuvertet skapades.botId/botName- botten som händelsen hör till.conversationId/sessionId- samtalskontexten, när det är tillämpligt.
Händelsekatalog
lead.created
Utlöses när en besökare skickar in sina kontaktuppgifter - via formuläret för lead-insamling, förformuläret för livechatt eller ett anpassat formulär som används för lead-insamling.
{
"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- hur kontaktuppgifterna samlades in:LEAD_COLLECTION_FORM(formulär för lead-insamling),LIVE_CHAT_FORM(förformulär för livechatt),CONVERSATION(AI:n fångade uppgifterna under chatten),ADMIN_DATA_UPDATEellerUPDATE_CLIENT_CONTEXT(redigerades på ChatLab-sidan). Insändningar via kontaktformuläret för mänsklig support utlöser aldrig denna händelse - de utlösercontact_form.submittedi stället.email,name,phone- kontaktuppgifterna mappade till lead-posten.- När ett anpassat formulär används för lead-insamling inkluderas alla fält som definierats i det formuläret i
fields, i formulärets ordning, ochformCodeName/formNameidentifierar formuläret. Med det klassiska lead-formuläret är bådanullochfieldsär en tom array. - Varje post i
fieldsär{name, value, type}.nameär fältets tekniska namn, stabilt över ändringar av etiketter - använd det för mappning till ditt CRM. - För
multichoice-fält ärvalueen array med de valda alternativen. Kryssrute-fält är enskilda poster med värdena"true"/"false". - För
file-fält ärvalueen nedladdningslänk till den uppladdade filen; webhooken innehåller aldrig filinnehåll. pageUrl- sidan som besökaren befann sig på vid insändningen.
contact_form.submitted
Utlöses när en besökare skickar in kontaktformuläret för mänsklig support eller ett anpassat formulär som används för mänsklig 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- adressen besökaren lämnade, och den som ditt supportteam bör svara till.source-CUSTOM_FORMnär ett anpassat formulär ligger bakom kontaktformuläret,CONTACT_FORMför det inbyggda.formCodeName/formName- identifierar det anpassade formuläret bakom begäran; båda ärnullför det inbyggda formuläret.- När ett anpassat formulär används inkluderas alla fält som definierats i formuläret i
fields(samma format{name, value, type}som förlead.created). Med det inbyggda kontaktformuläret fylls endastemailochmessagei,fieldsär en tom array och formuläridentifierarna ärnull. message- det mappade meddelandefältet, eller alla ifyllda värden sammanslagna om formuläret inte definierar något meddelandefält.
custom_form.submitted
Utlöses för varje insändning av ett anpassat formulär, oavsett formulärets syfte. Observera att formulär vars syfte är lead-insamling eller mänsklig kontakt också utlöser sin dedikerade lead.created- / contact_form.submitted-händelse - prenumerera på det ena eller det andra beroende på om du vill ha den generiska eller den specialiserade vyn, snarare än att skapa dubblerade affärsåtgärder. De två händelsefamiljerna har olika händelse-ID:n; conversationId plus timestamp är inte en tillförlitlig insändningsidentifierare.
{
"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- formulärets stabila maskinnamn, oförändrat när du byter namn på formuläret; använd det för att dirigera insändningar i ditt eget system.formNameär visningsnamnet som visas för besökare.fieldsanvänder samma poster i form av{name, value, type}somlead.created: flervalsvärden är arrayer, filvärden är nedladdningslänkar.purpose-STANDALONE,LEAD_COLLECTIONellerHUMAN_CONTACT, beroende på hur formuläret är kopplat till chatten.
conversation.started
Utlöses när en besökare skickar det första meddelandet i en ny konversation.
{
"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 exakta texten i besökarens inledande meddelande.nullom konversationen öppnades utan meddelandeinnehåll.chatSource- kanalen som konversationen kom in via:WIDGET,WHATSAPP,MESSENGER,VOICE,VOICE_PHONE,API,BOOKING,AIRBNBellerIDOBOOKING.byAdmin-truenär konversationen kommer från förhandsgranskningen av chatten i ChatLabs administrationspanel snarare än från en riktig besökare. Använd detta för att hålla dina egna testchattar borta från ditt CRM.countryCode- ISO-landskod som hämtats från besökarens IP-adress,nullnär den inte kunde fastställas.ipAddress- besökarens IP-adress som den registreras av ChatLab,nullnär den inte är tillgänglig. Behandla detta som personuppgifter enligt GDPR och lagra det endast om du har en laglig grund.
conversation.rated
Utlöses när en besökare skickar in ett positivt eller negativt betyg för en konversation (se Konversationsbetyg).
{
"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. Att rensa ett betyg utlöser inte händelsen, så du får aldrig ett neutralt värde.
conversation.summarized
Utlöses när ChatLab genererar en sammanfattning av en avslutad konversation.
{
"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 genererade sammanfattningstexten. Sammanfattningsgenereringen är asynkron och beror på chattens konfiguration för sammanfattningar samt schemaläggning för bearbetning; förutsätt inte en fast leveranstid.language- chattens interna språkkod som skickas till sammanfattningen, till exempelen_US; förutsätt inte att detta matchar språket i besökarens konversation.
client.summarized
Utlöses när ChatLab uppdaterar en klients AI-profil. Profilen byggs om utifrån den tidigare profilen samt sammanfattningen av konversationen som just avslutades, och kan genereras efter conversation.summarized. Leveransordningen garanteras inte. Nyttolasten innehåller en e-postadress när en sådan är känd, men ChatLab kan även hantera klienter utan e-postadress.
{
"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- identifieraren för att matcha klienten mot ditt eget CRM. Den ärnullför anonyma besökare som aldrig lämnat en adress, och händelsen utlöses fortfarande för dem - hoppa över dessa leveranser om din integration bygger på e-post.client- kontaktposten som ChatLab sparar för denna person:email,name,phone,countryCodeochipAddress. Varje nyckel finns alltid med; okända värden ärnull.clientSummary- hela profiltexten som ren text, inte en diff. Den ersätter vad den tidigare sammanfattningen än var, så spara den genom att skriva över i stället för att lägga till i slutet.- Profilen byggs endast om för chattar med chattminne aktiverat, och endast för konversationer som varit inaktiva tillräckligt länge för att sammanfattas - förvänta dig denna händelse några minuter efter att konversationen avslutats, inte omedelbart.
live_chat.requested
Utlöses när AI:n lämnar över konversationen till Live Chat (livechatt), antingen för att besökaren bad om en mänsklig agent eller för att chatten bedömde att en mänsklig agent behövdes.
{
"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- för närvarande alltidAI, eftersom överlämningen alltid initieras av chattens livechatt-åtgärd, även när besökaren uttryckligen ber om det i klartext. Behandla det som en öppen enum: hantera okända värden i stället för att förutsättaAI.- Denna händelse täcker AI-åtgärden som begär överlämning, inte alla sätt en besökare kan öppna livechatt på. Den bevisar inte att en operatör har anslutit.
live_chat.started
Utlöses när livechatt-sessionen skapas efter att besökarens överlämningsformulär skickats in. Detta sker innan en operatör nödvändigtvis ansluter eller svarar; behandla det inte som ett bevis på mänsklig interaktion.
{
"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är avsiktligt tomt. Allt du behöver finns i kuvertet:botIdidentifierar chatten ochconversationId/sessionIdkopplar händelsen till konversationen. Du kan få den utan en föregåendelive_chat.requested, till exempel när besökaren använde widgetens livechatt-kontroll.
live_chat.ended
Utlöses när livechatt-sessionen avslutas.
{
"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- förfluten tid för livechatt-sessionen, räknat från att sessionen skapades, inklusive väntetid på en operatör. Fältet utelämnas i det sällsynta fall då en session avslutas utan att någonsin ha startats.
ai_action.executed
Utlöses varje gång chatten kör en AI-åtgärd - ett anrop till en hanterad integration eller en anpassad API-funktion. Detta är en händelse med hög volym: en aktiv e-handelsbot kan köra hundratals åtgärder per dag, och en enstaka replikväxling från en besökare kan utlösa flera. Prenumerera på den via en dedikerad slutpunkt, eller säkerställ att din mottagare klarar volymen.
{
"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- namnet på den utförda åtgärden så som AI:n ser det, till exempelsearch_productsför en hanterad integration eller namnet du gav en anpassad API-åtgärd.status-SUCCESSellerERROR.durationMs- hur lång tid åtgärden tog, i millisekunder. Användbart för att upptäcka en långsam integration innan besökare klagar på den.errorMessage- orsaken till felet, ifyllt endast närstatusärERROR; annarsnull.
webhook.test
Skickas med knappen Send sample event (Skicka testhändelse) när du kör en enkel anslutningskontroll. Signeras på exakt samma sätt som en riktig 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 text, alltid densamma. Kuvertfälten innehåller exempelvärden, så behandla aldrig enwebhook.test-leverans som verkliga data.- Detta är den enda händelsetypen du inte kan prenumerera på via en slutpunkt: den skickas på begäran från administrationspanelen och når alltid den slutpunkt du klickade på, oavsett vilka händelser den lyssnar på.
Säkerhet: verifiera leveranser
Varje leverans innehåller fyra rubriker:
| Rubrik | Värde |
|---|---|
X-ChatLab-Signature |
sha256=<hex hmac> - HMAC-SHA256-signatur för nyttolasten |
X-ChatLab-Timestamp |
Unix-tid i sekunder då leveransen signerades |
X-ChatLab-Event |
Händelsetypen, t.ex. lead.created |
X-ChatLab-Delivery |
Unikt leverans-ID, identiskt med meddelandekroppens eventId |
Signaturen beräknas som HMAC-SHA256 över strängen {timestamp}.{rawBody} med hjälp av din slutpunktshemlighet, där {timestamp} är värdet av X-ChatLab-Timestamp och {rawBody} är den råa, oparsade förfrågningskroppen. Verifiera alltid mot de råa bytena - omserialisering av tolkad JSON ändrar bytesekvensen och gör signaturen ogiltig.
För att skydda mot återspelningsattacker (replay attacks), avvisa leveranser vars X-ChatLab-Timestamp är äldre än 5 minuter.
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);
}
Om verifieringen misslyckas, svara med 401 och ignorera nyttolasten. Behandla aldrig overifierade leveranser - vem som helst som hittar din URL kan skicka godtycklig JSON till den via POST.
Leveransbeteende
Förstå dessa leveransregler innan du bygger vidare på webhooks:
- Svara snabbt. Din endpoint måste svara inom 3 sekunder, annars räknas leveransen som misslyckad. Verifiera signaturen, lägg händelsen i en beständig kö och bekräfta med
2xxinom detta fönster. Utför långsammare CRM-anrop och affärslogik asynkront. - Fire-and-forget, at-most-once. Matchande aktiverade endpoints får högst ett leveransförsök - inga nya försök görs. Pausade endpoints och brutna kretsar kan stoppa även det försöket. Om din endpoint ligger nere, gör en timeout eller returnerar en statuskod som inte är 2xx, förloras den händelsen och levereras inte igen. Webhooks är aviseringar, inte en replikerad datalagring: använd Bot Talk API-konversationsendpoints eller lead-exporter för att stämma av sparad data där det stöds. Management API täcker botinställningar och användning, inte ett fullständigt händelsearkiv. Vissa händelser kan inte återskapas via dessa gränssnitt.
- Kretssäkring (circuit breaker). Efter 5 misslyckade leveranser i rad för ett visst endpoint/bot-par pausas leveranserna för det paret i 5 minuter. Händelser som inträffar under pausen slängs, och i leveransloggen visas
CIRCUIT_OPEN-poster för att identifiera stoppade försök. Leveranser som hoppas över på grund av en öppen krets räknas inte mot automatisk inaktivering. - Automatisk inaktivering. Kontrollen körs i samma ögonblick som en leverans misslyckas, aldrig via en timer. Om en leverans misslyckas och det inte har skett någon lyckad leverans på 7 dagar - räknat från den senaste lyckade leveransen, eller från datumet då endpointen skapades om den aldrig lyckats - inaktiveras endpointen och du får en e-postavisering. En enda
2xxnär som helst återställer den timern. En endpoint som inte tar emot någon trafik inaktiveras aldrig, eftersom ingenting misslyckas. Återaktivera den från Account settings (Kontoinställningar) när mottagaren har åtgärdats; felräknaren och tidsstämpeln för automatisk inaktivering rensas när du slår på den igen, och händelser som missades medan den var avstängd efterlevereras inte. - 410 Gone. Om din endpoint svarar med HTTP
410 Goneinaktiverar ChatLab den omedelbart. Använd detta för att programmatiskt ta en endpoint ur drift från mottagarsidan. - Idempotens. Dubblerade leveranser förväntas inte under normal drift, men om din hantering måste vara strikt idempotent kan du deduplicera med
eventId(finns även i headernX-ChatLab-Delivery).
Leveransordningen garanteras inte. Spara händelse-ID:t och gör affärshanteringen idempotent. Se till att ha egna lagringsregler och åtkomstkontroller för webhook-innehåll, eftersom det kan innehålla personuppgifter och länkar för filnedladdning.
Signaturexemplen använder Node.js crypto och PHP:s hash_equals. Fånga upp den råa anropskroppen innan den tolkas.
Gränser
- Upp till 10 webhook-endpoints per konto.
- Lagringstid för leveransloggen: 14 dagar. Äldre poster tas bort automatiskt.
Relaterade artiklar
- Insamling av leads - formuläret bakom
lead.created - Kontaktformulär för mänsklig support - formuläret bakom
contact_form.submitted - Live Chat - flödet bakom
live_chat.*-händelserna - Betygsättning av konversationer - tumme upp/ned bakom
conversation.rated - AI Actions - integrationerna bakom
ai_action.executed - Chat API - widget-callbacks i webbläsaren (motsvarigheten till webhooks på klientsidan)
- Management API - REST API för hantering av bottar och användningsdata