Hjälpcenter
Chat API

Webhooks

Senast uppdaterad:

Översikt över webhooks

Webhooks gör att ChatLab kan notifiera dina system i samma ögonblick som något inträffar i dina chattbottar. Istället för att göra förfrågningar mot 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 en konversation, efterfrågar en mänsklig agent eller när en AI-handling körs.

Typiska användningsområden:

  • skicka nya leads direkt till ditt CRM så fort de samlas in
  • notifiera ditt team i Slack när en besökare efterfrågar live chat (livechatt)
  • mata in konversationsbetyg och sammanfattningar i dina egna analysverktyg
  • övervaka körningar av AI actions (AI-handlingar) och larma vid fel

Tillgänglighet: webhooks är tillgängliga från och med Standard plan (funktion: Webhooks).

Var du konfigurerar: i administratörsappen öppnar du Account settings -> Webhooks (Kontoinställningar -> Webhooks, precis bredvid avsnittet för Management API). Webhooks ligger på kontonivå - en slutpunkt kan ta emot händelser från alla dina botar eller från ett filtrerat urval.

Konfigurera en slutpunkt

  1. Öppna Account settings -> Webhooks och klicka på Create endpoint (Skapa slutpunkt).
  2. Fyll i slutpunktsformuläret:
    • Name (Namn) - en etikett för din egen referens, t.ex. "CRM sync" eller "Slack alerts".
    • URL - HTTPS-adressen som ChatLab ska skicka (POST) händelser till.
    • Events (Händelser) - välj vilka händelsetyper 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 (valfritt) - begränsa slutpunkten till specifika botar. Lämna tomt för att ta emot händelser från alla botar på ditt konto.
    • Custom form filter (valfritt) - dirigerar inskickade svar från ett visst anpassat formulär till denna slutpunkt. Den filtrerar enbart händelsen custom_form.submitted; alla andra händelser du prenumererar på (leads, kontaktförfrågningar, konversationer, livechatt, AI-handlingar) levereras oavsett denna inställning.
  3. Skicka in. Slutpunktens secret (hemlighet) visas exakt en gång i bekräftelsedialogen - 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 även:

  • Enable/disable toggle (Aktivera/inaktivera-reglage) - pausa leveranser utan att ta bort slutpunkten. Inaktiverade slutpunkter ignorerar händelser helt (de läggs 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 testvärdena innan du skickar, så att din mottagare hanterar realistisk data. Testet levereras som en vanlig händelse med eventType matchande ditt val (eller som webhook.test för en enkel anslutningskontroll).
  • Roll secret (Rotera hemlighet) - genererar en ny hemlighet och gör den gamla ogiltig. Använd detta om hemligheten kan ha läckt. Den nya hemligheten visas återigen bara en gång. Uppdatera din mottagare innan du roterar den, annars misslyckas signaturverifieringen på din sida.
  • Delivery log (Leveranslogg) - en lista för varje slutpunkt med de senaste leveranserna inklusive tidsstämpel, händelsetyp, HTTP-statuskod från din server samt 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. Innehållet har alltid samma kuvert; data-objektet är specifikt för respektive händelsetyp:

{
  "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 för varje händelse. Använd det för avdubblering om din behandling måste vara idempotent.
  • eventType - en av typerna som beskrivs nedan; skickas även i headern X-ChatLab-Event.
  • timestamp - ISO 8601 UTC-tidpunkt då händelsen inträffade.
  • botId / botName - boten som händelsen tillhör.
  • conversationId / sessionId - konversationskontexten, om tillämpligt.

Händelsekatalog

lead.created

Utlöses när en besökare skickar in sina kontaktuppgifter - via leadinsamlingsformuläret, formuläret före livechatt eller ett anpassat formulär som används för leadinsamling.

{
  "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 (leadinsamlingsformulär), LIVE_CHAT_FORM (formulär före livechatt), CONVERSATION (AI:n fångade upp uppgifterna under chatten), ADMIN_DATA_UPDATE eller UPDATE_CLIENT_CONTEXT (redigerades på ChatLab-sidan). Formulär för mänsklig support utlöser aldrig denna händelse - de utlöser contact_form.submitted istället.
  • email, name, phone - kontaktuppgifterna som mappats till leadposten.
  • När ett anpassat formulär används för leadinsamling inkluderas alla fält som definierats i formuläret i fields, i formulärets ordning, och formCodeName / formName identifierar formuläret. Med det klassiska leadformuläret är båda null och fields är en tom array.
  • Varje post i fields har strukturen {name, value, type}. name är fältets tekniska namn och ändras inte när etiketter redigeras - använd det för mappning till ditt CRM.
  • För multichoice-fält är value en array med de valda alternativen. Kryssrutor visas som 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 själva filinnehållet.
  • pageUrl - sidan som besökaren befann sig på när formuläret skickades.

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 angav 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 formuläret.
  • formCodeName / formName - identifierar det anpassade formuläret bakom förfrågan; 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 saknar ett specifikt meddelandefält.

custom_form.submitted

Utlöses vid varje inskickning av ett anpassat formulär, oavsett formulärets syfte. Observera att formulär vars syfte är leadinsamling eller mänsklig kontakt också utlöser sina dedikerade händelser lead.created / contact_form.submitted - prenumerera på den ena eller den andra beroende på om du vill ha den generiska eller den specialiserade vyn, och gör en avdubblering baserat på conversationId + timestamp om du prenumererar på båda.

{
  "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 systemnamn som inte ändras när du byter namn på formuläret; använd det för att dirigera inskickade uppgifter i ditt eget system. formName är visningsnamnet som visas för besökare.
  • fields använder samma poster med {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 chattbotten.

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 första 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 chattbottens förhandsgranskning i ChatLabs adminpanel istället för 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 hämtad från besökarens IP-adress, null om den inte kunde fastställas.
  • ipAddress - besökarens IP-adress som den registrerades av ChatLab, null om den inte är tillgänglig. Behandla detta som personuppgifter enligt GDPR och lagra det endast om du har en rättslig grund.

conversation.rated

Utlöses när en besökare betygsätter ett botsvar med tumme upp eller tumme ner (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. Om ett betyg tas bort utlöses 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"
  }
}
  • summary - den genererade sammanfattningstexten. Sammanfattningar skapas några minuter efter att konversationen blivit inaktiv, så denna händelse kommer senare än övriga konversationshändelser.
  • language - ISO-kod för språket som sammanfattningen skrevs på, vilket följer konversationens språk.

client.summarized

Utlöses när ChatLab uppdaterar en klients AI-profil. Profilen byggs upp från den tidigare profilen plus sammanfattningen av konversationen som just avslutades, så denna händelse följer efter conversation.summarized för samma konversation. Klienter identifieras med e-postadress, vilket är anledningen till att adressen upprepas på översta nivån i data.

{
  "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 - ignorera dessa leveranser om din integration baseras på e-post.
  • client - kontaktposten som ChatLab har för denna person: email, name, phone, countryCode och ipAddress. Samtliga nycklar finns alltid med; okända värden är null.
  • clientSummary - hela profiltexten som klartext, inte en differens. Den ersätter den tidigare sammanfattningen, så spara den genom att skriva över tidigare innehåll istället för att lägga till text.
  • Profilen återskapas endast för botar 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 boten bedömde att en människa 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 startas av botens livechatt-handling, även när besökaren ber om det i klartext. Behandla fältet som en öppen enum: hantera okända värden istället för att förutsätta enbart AI.
  • Händelsen anger att en överlämning har begärts, inte att en operatör har tagit emot den. Vänta på live_chat.started för det.

live_chat.started

Utlöses när en operatör ansluter och livechattsessionen faktiskt startar.

{
  "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 chattbotten och conversationId / sessionId kopplar händelsen till konversationen som du redan tagit emot live_chat.requested för.

live_chat.ended

Utlöses när livechattsessionen 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 - hur länge operatören var aktiv i konversationen, räknat från tidpunkten då sessionen startade. Fältet utelämnas i sällsynta fall när en session avslutas utan att någonsin ha påbörjats.

ai_action.executed

Utlöses varje gång boten kör en AI action (AI-handling) - ett hanterat integrationsanrop eller en anpassad API-funktion. Detta är en händelse med hög volym: en aktiv e-handelsbot kan utföra hundratals handlingar per dag, och en enda replik från en besökare kan utlösa flera stycken. Prenumerera på denna händelse via en dedikerad slutpunkt, eller se till att din mottagare kan hantera 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 handlingen så som AI:n ser det, till exempel search_products för en hanterad integration eller namnet du gav till en anpassad API-handling.
  • status - SUCCESS eller ERROR.
  • durationMs - hur lång tid handlingen tog i millisekunder. Praktiskt för att upptäcka en långsam integration innan besökare börjar klaga på den.
  • errorMessage - orsaken till felet, finns endast med när status är ERROR; annars null.

webhook.test

Skickas via knappen Send sample event (Skicka testhändelse) när du gö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 leverans av typen webhook.test som riktig data.
  • Detta är den enda händelsetypen du inte kan prenumerera på via en slutpunkt: den skickas på begäran från adminpanelen 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 headers:

Header Värde
X-ChatLab-Signature sha256=<hex hmac> - HMAC-SHA256-signatur av nyttolasten
X-ChatLab-Timestamp Unix-tid i sekunder när leveransen signerades
X-ChatLab-Event Händelsetypen, t.ex. lead.created
X-ChatLab-Delivery Unikt leverans-ID, samma som request-body-innehållets eventId

Signaturen beräknas som HMAC-SHA256 över strängen {timestamp}.{rawBody} med din slutpunktshemlighet, där {timestamp} är värdet för X-ChatLab-Timestamp och {rawBody} är den råa, oparsade request-bodyn. Verifiera alltid mot de råa byten - om du serialiserar om parsad JSON ändras bytesekvensen vilket bryter signaturen.

För att skydda mot replay-attacker bör du 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 (!signature || !timestamp) 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 + '.' + 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 === '') {
        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 släng nyttolasten. Behandla aldrig overifierade leveranser - vem som helst som upptäcker din URL kan göra POST-anrop med godtycklig JSON till den.

Leveransbeteende

Ha dessa förutsättningar i åtanke innan du bygger funktioner baserade på webhooks:

  • Svara snabbt. Din slutpunkt måste svara inom 3 sekunder, annars räknas leveransen som misslyckad. Svara 2xx omedelbart och bearbeta nyttolasten asynkront (lägg den i en kö och bekräfta därefter) - gör inga CRM-anrop eller databasskrivningar innan du svarar.
  • Fire-and-forget, högst en gång. Varje händelse får exakt ett leveransförsök - inga nya försök görs. Om din slutpunkt ligger nere, får en timeout eller returnerar en annan status än 2xx, är händelsen förlorad och levereras inte igen. Webhooks är aviseringar, inte ett replikerat datalager: när du behöver garanterad fullständighet, stäm av mot Management API eller dina lead-exporter.
  • Circuit breaker. Efter 5 misslyckade leveranser i rad för en bot pausas leveranserna för den botten i 5 minuter. Händelser som inträffar under pausen kastas, och leveransloggen visar CIRCUIT_OPEN-poster så att du kan se exakt när och varför trafiken stoppades. Leveranser som hoppas över av en öppen kretsbrytare räknas inte in i den automatiska inaktiveringen.
  • Automatisk inaktivering. Kontrollen körs i samma ögonblick som en leverans misslyckas, aldrig enligt ett schemalagt tidsintervall. 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 slutpunktens skapandedatum om den aldrig har lyckats - stängs slutpunkten av och du får en e-postavisering. Ett enda 2xx-svar när som helst återställer den tidsräkningen. En slutpunkt som inte tar emot någon trafik inaktiveras aldrig, eftersom ingenting misslyckas. Återaktivera den från Account settings (Kontoinställningar) så snart din mottagare är åtgärdad; felräknaren och tidsstämpeln för automatisk inaktivering rensas när du slår på den igen, och händelser som missades under tiden den var avstängd fylls inte i retroaktivt.
  • 410 Gone. Om din slutpunkt svarar med HTTP 410 Gone inaktiverar ChatLab den omedelbart. Använd detta för att programmatiskt avveckla en slutpunkt från mottagarsidan.
  • Idempotens. Duplicerade leveranser förväntas inte under normal drift, men om din bearbetning måste vara strikt idempotent kan du deduplicera med hjälp av eventId (finns även i headern X-ChatLab-Delivery).

Begränsningar

  • Upp till 10 webhook-slutpunkter per konto.
  • Lagringstid för leveranslogg: 14 dagar. Äldre poster tas bort automatiskt.

Relaterade artiklar