Hjälpcenter
Chat API

Webhooks

Senast uppdaterad:

Ö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

  1. Öppna Account settings -> Webhooks och klicka på Add endpoint (Lägg till slutpunkt).
  2. 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.executed kan 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.
  3. 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 eventType matchande ditt val (eller som webhook.test fö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-headern X-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_UPDATE eller UPDATE_CLIENT_CONTEXT (redigerades på ChatLab-sidan). Insändningar via kontaktformuläret för mänsklig support utlöser aldrig denna händelse - de utlöser contact_form.submitted i 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, och formCodeName / formName identifierar formuläret. Med det klassiska lead-formuläret är båda null och fields ä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 är value en array med de valda alternativen. Kryssrute-fält är enskilda poster med värdena "true" / "false".
  • För file-fält är value en 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_FORM när ett anpassat formulär ligger bakom kontaktformuläret, CONTACT_FORM för det inbyggda.
  • formCodeName / formName - identifierar det anpassade formuläret bakom begäran; båda är null fö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ör lead.created). Med det inbyggda kontaktformuläret fylls endast email och message i, fields är en tom array och formuläridentifierarna är null.
  • 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.
  • fields använder samma poster i form av {name, value, type} som lead.created: flervalsvärden är arrayer, filvärden är nedladdningslänkar.
  • purpose - STANDALONE, LEAD_COLLECTION eller HUMAN_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. null om konversationen öppnades utan meddelandeinnehåll.
  • chatSource - kanalen som konversationen kom in via: WIDGET, WHATSAPP, MESSENGER, VOICE, VOICE_PHONE, API, BOOKING, AIRBNB eller IDOBOOKING.
  • byAdmin - true nä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, null när den inte kunde fastställas.
  • ipAddress - besökarens IP-adress som den registreras av ChatLab, null nä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 - POSITIVE eller NEGATIVE. 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 exempel en_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 är null fö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, countryCode och ipAddress. Varje nyckel finns alltid med; okända värden är null.
  • 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 alltid AI, 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ätta AI.
  • 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: botId identifierar chatten och conversationId / sessionId kopplar händelsen till konversationen. Du kan få den utan en föregående live_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 exempel search_products för en hanterad integration eller namnet du gav en anpassad API-åtgärd.
  • status - SUCCESS eller ERROR.
  • 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är status är ERROR; annars null.

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 en webhook.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 2xx inom 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 2xx nä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 Gone inaktiverar 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 headern X-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