Hjelpesenter
Chat API

Webhooks

Sist oppdatert:

Oversikt over webhooks

Webhooks lar ChatLab varsle systemene dine i samme øyeblikk som noe skjer i chatbotene dine. I stedet for å gjøre spørringer mot Management API eller eksportere data manuelt, registrerer du et HTTPS-endepunkt, og ChatLab sender en signert HTTP POST til det i sanntid - når en besøkende legger igjen et lead, sender inn et kontaktskjema, vurderer en samtale, ber om et menneske, eller når en AI-handling kjører.

Vanlige bruksområder:

  • send nye leads rett inn i CRM-systemet ditt i samme sekund som de fanges opp
  • varsle teamet ditt i Slack når en besøkende ber om live chat (Live Chat)
  • mat samtalevurderinger og sammendrag inn i dine egne analyseverktøy
  • overvåk kjøringer av AI-handlinger og varsle ved feil

Tilgjengelighet: Kontoen din må inkludere funksjonen Webhooks.

Hvor det konfigureres: I administrasjonsappen åpner du Account settings -> Webhooks (Kontoinnstillinger -> Webhooks) (rett ved siden av Management API-seksjonen). Webhooks er på kontonivå - ett endepunkt kan motta hendelser fra alle botene dine eller fra én valgt bot.

Sette opp et endepunkt

  1. Åpne Account settings -> Webhooks og klikk på Add endpoint (Legg til endepunkt).
  2. Fyll ut skjemaet for endepunktet:
    • Name (Navn) - en etikett for din egen referanse, f.eks. "CRM-synkronisering" eller "Slack-varsler".
    • URL - HTTPS-adressen ChatLab skal sende POST-hendelser til.
    • Events (Hendelser) - velg hvilke hendelsestyper dette endepunktet skal motta (se katalogen nedenfor). Velg bare det du trenger; hendelser med høyt volum, som ai_action.executed, kan generere mye trafikk.
    • Bot filter (Bot-filter) (valgfritt) - velg én bot, eller All bots (Alle boter) for alle boter på kontoen din.
    • Custom form filter (Egendefinert skjemafilter) (valgfritt) - ruter innsendinger av ett egendefinert skjema til dette endepunktet. Det begrenser bare hendelsen custom_form.submitted; alle andre hendelser du abonnerer på (leads, kontaktforespørsler, samtaler, live chat, AI-handlinger), leveres uavhengig av denne innstillingen.
  3. Send inn. Endepunktets secret (hemmelighet) vises nøyaktig én gang i bekreftelsesdialogen - kopier den nå og lagre den sikkert. Du trenger den for å verifisere signaturer (se Sikkerhet nedenfor). Klarteksten kan ikke hentes frem senere.

Hvert endepunkt har også:

  • Enable/disable toggle (Aktiver/deaktiver-bryter) - sett leveringer på pause uten å slette endepunktet. Deaktiverte endepunkter forkaster hendelser stille (de settes ikke i kø for senere).
  • Send sample event (Send testhendelse) - leverer en signert testforespørsel til nettadressen din, slik at du kan verifisere mottakeren ende-til-ende. Du kan velge hendelsestype og redigere eksempelverdiene før sending, slik at behandleren din ser realistiske data. Testen ankommer som en vanlig levering med eventType som samsvarer med valget ditt (eller som webhook.test for en ren tilkoblingssjekk).
  • Roll secret (Roter hemmelighet) - genererer en ny hemmelighet og gjør den gamle ugyldig. Bruk dette hvis hemmeligheten kan ha lekket. Den nye hemmeligheten vises igjen bare én gang. For en kontrollert rotasjon setter du endepunktet på pause, roterer og kopierer den nye hemmeligheten, oppdaterer mottakeren, og deretter aktiverer du igjen og sender en testhendelse. Hendelser under pausen settes ikke i kø. Planlegg dette avbruddet før du roterer.
  • Delivery log (Leveringslogg) - en liste over nylige leveringer per endepunkt med tidsstempel, hendelsestype, HTTP-status returnert av serveren din og responstid. Mislykkede leveringer og pauser utløst av kretsbryteren (circuit breaker) er synlige her. Loggen oppbevares i 14 dager.

Hendelseskonvolutt

Hver levering er en HTTP POST med Content-Type: application/json. Brødteksten har alltid den samme konvolutten; data-objektet er spesifikt for hendelsestypen:

{
  "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 - unik per hendelse. Bruk den til deduplisering dersom behandlingen din må være idempotent.
  • eventType - en av typene som er dokumentert nedenfor; sendes også i X-ChatLab-Event-headeren.
  • timestamp - ISO 8601 UTC-tidspunkt for når leveringskonvolutten ble klargjort.
  • botId / botName - boten som hendelsen tilhører.
  • conversationId / sessionId - samtale-konteksten, der det er aktuelt.

Hendelseskatalog

lead.created

Utløses når en besøkende sender inn kontaktopplysningene sine - gjennom skjemaet for innsamling av leads, forhåndsskjemaet for live chat eller et egendefinert skjema som brukes til leadinnsamling.

{
  "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 kontaktopplysningene ble samlet inn: LEAD_COLLECTION_FORM (skjema for innsamling av leads), LIVE_CHAT_FORM (forhåndsskjema for live chat), CONVERSATION (AI-en fanget opp detaljene under chatten), ADMIN_DATA_UPDATE eller UPDATE_CLIENT_CONTEXT (redigert på ChatLab-siden). Innsendinger av kontaktskjemaet for manuell kundestøtte utløser aldri denne hendelsen - de utløser contact_form.submitted i stedet.
  • email, name, phone - kontaktopplysningene koblet til leadoppføringen.
  • Når et egendefinert skjema brukes til innsamling av leads, inkluderes alle feltene definert i det skjemaet i fields, i skjemaets rekkefølge, og formCodeName / formName identifiserer skjemaet. Med det klassiske leadskjemaet er begge null og fields er en tom matrise.
  • Hver oppføring i fields er {name, value, type}. name er feltets tekniske navn, uendret selv om etiketten redigeres - bruk dette til tilordning i CRM-systemet ditt.
  • For multichoice-felter er value en matrise med de valgte alternativene. Avmerkingsbokser er individuelle oppføringer med "true"- / "false"-verdier.
  • For file-felter er value en nedlastingslenke til den opplastede filen; webhooken inneholder aldri selve filinnholdet.
  • pageUrl - siden den besøkende var på da skjemaet ble sendt inn.

contact_form.submitted

Utløses når en besøkende sender inn kontaktskjemaet for manuell kundestøtte eller et egendefinert skjema som brukes til manuell 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 den besøkende oppga, og den som supportteamet ditt bør svare til.
  • source - CUSTOM_FORM når et egendefinert skjema ligger bak kontaktskjemaet, CONTACT_FORM for det innebygde.
  • formCodeName / formName - identifiserer det egendefinerte skjemaet bak forespørselen; begge er null for det innebygde skjemaet.
  • Når et egendefinert skjema brukes, inkluderes alle feltene definert i det skjemaet i fields (samme {name, value, type}-format som for lead.created). Med det innebygde kontaktskjemaet fylles bare email og message ut, fields er en tom matrise og skjemaindikatørene er null.
  • message - det tilordnede meldingsfeltet, eller alle utfylte verdier slått sammen når skjemaet ikke definerer et eget meldingsfelt.

custom_form.submitted

Utløses for hver innsending av et egendefinert skjema, uavhengig av skjemaets formål. Vær oppmerksom på at skjemaer som har som formål å samle inn leads eller formidle manuell kontakt, også utløser sine dedikerte hendelser lead.created / contact_form.submitted - abonner på den ene eller den andre avhengig av om du ønsker den generelle eller den spesialiserte visningen, i stedet for å opprette dupliserte handlinger. De to hendelsesfamiliene har ulike hendelses-ID-er; conversationId pluss timestamp er ikke en pålitelig identifikator for en innsending.

{
  "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 - det faste tekniske navnet på skjemaet, som forblir uendret når du endrer visningsnavnet; bruk det til å rute innsendinger i ditt eget system. formName er etiketten som vises til besøkende.
  • fields bruker de samme {name, value, type}-oppføringene som lead.created: flervalgsverdier er matriser, og filverdier er nedlastingslenker.
  • purpose - STANDALONE, LEAD_COLLECTION eller HUMAN_CONTACT, avhengig av hvordan skjemaet er koblet til chatboten.

conversation.started

Utløses når en besøkende sender den første meldingen 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 nøyaktige teksten i den besøkendes åpningsmelding. null hvis samtalen ble åpnet uten meldingsinnhold.
  • chatSource - kanalen samtalen kom inn via: WIDGET, WHATSAPP, MESSENGER, VOICE, VOICE_PHONE, API, BOOKING, AIRBNB eller IDOBOOKING.
  • byAdmin - true når samtalen kommer fra forhåndsvisningen av chatboten i ChatLab-administrasjonspanelet i stedet for fra en reell besøkende. Bruk dette til å holde dine egne testsamtaler utenfor CRM-systemet ditt.
  • countryCode - ISO-landskode fastsatt ut fra den besøkendes IP-adresse, null hvis den ikke kunne bestemmes.
  • ipAddress - den besøkendes IP-adresse slik ChatLab ser den, null hvis den ikke er tilgjengelig. Behandle den som personopplysning under GDPR og lagre den bare dersom du har et lovlig behandlingsgrunnlag.

conversation.rated

Utløses når en besøkende sender inn en positiv eller negativ vurdering av 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. Å fjerne en vurdering utløser ikke hendelsen, så du vil aldri motta en nøytral verdi.

conversation.summarized

Utløses når ChatLab genererer et sammendrag av en avsluttet 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 genererte sammendragsteksten. Generering av sammendrag foregår asynkront og avhenger av botens innstillinger for sammendrag og behandlingskøen; ikke anta en fast leveringstid.
  • language - botens interne språkinnstilling som sendes til sammendragsfunksjonen, for eksempel en_US; ikke anta at dette samsvarer med språket den besøkende brukte i samtalen.

client.summarized

Utløses når ChatLab oppdaterer AI-profilen til en kunde. Profilen bygges opp på nytt basert på den forrige profilen pluss sammendraget av samtalen som nettopp ble avsluttet, og kan genereres etter conversation.summarized. Leveringsrekkefølgen er ikke garantert. Nyttelasten inneholder en e-postadresse hvis den er kjent, men ChatLab kan også lagre kunder uten e-postadresse.

{
  "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 som brukes til å koble kunden mot ditt eget CRM. Den er null for anonyme besøkende som aldri har oppgitt en adresse, og hendelsen utløses likevel for disse - hopp over slike leveringer dersom integrasjonen din er basert på e-post.
  • client - kontaktoppføringen ChatLab har registrert for denne personen: email, name, phone, countryCode og ipAddress. Hver nøkkel er alltid til stede; ukjente verdier er null.
  • clientSummary - hele profilteksten som ren tekst, ikke en differanse. Den erstatter det forrige sammendraget i sin helhet, så du bør overskrive den eksisterende verdien i stedet for å legge til teksten på slutten.
  • Profilen bygges bare opp på nytt for boter som har samtaleminne aktivert, og bare for samtaler som har vært inaktive lenge nok til å bli oppsummert - forvent at denne hendelsen kommer noen minutter etter at samtalen er avsluttet, ikke umiddelbart.

live_chat.requested

Utløses når AI-en overlater samtalen til live chat, enten fordi den besøkende ba om å få snakke med et menneske, eller fordi boten avgjorde at manuell hjelp var nødvendig.

{
  "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 - for øyeblikket alltid AI, fordi overleveringen alltid settes i gang av botens live chat-handling, også når den besøkende ber om det i klartekst. Behandle dette som en åpen liste (enum): håndter ukjente verdier i stedet for å forutsette at verdien alltid er AI.
  • Denne hendelsen dekker AI-handlingen som ber om overlevering, ikke alle mulige måter en besøkende kan starte live chat på. Den er ikke et bevis på at en kundebehandler faktisk har koblet seg til samtalen.

live_chat.started

Utløses når live chat-økten opprettes etter at den besøkendes overleveringsskjema er sendt inn. Dette skjer før en kundebehandler nødvendigvis har koblet seg til eller svart; ikke regn dette som et bevis på menneskelig deltakelse.

{
  "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 bevisst tom. Alt du trenger finnes i konvolutten: botId identifiserer chatboten, og conversationId / sessionId knytter hendelsen til samtalen. Du kan motta denne hendelsen uten en forutgående live_chat.requested, for eksempel hvis den besøkende brukte live chat-knappen i widgeten.

live_chat.ended

Utløses når live chat-økten avsluttes.

{
  "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 - medgått tid for live chat-økten regnet fra øktopprettelse, inkludert ventetid på en kundebehandler. Feltet utelates i de sjeldne tilfellene der en økt avsluttes uten noen gang å ha blitt startet.

ai_action.executed

Utløses hver gang boten utfører en AI-handling - et administrert integrasjonskall eller en egendefinert API-funksjon. Dette er en hendelse med høyt volum: en aktiv e-handelsbot kan utføre hundrevis av handlinger per dag, og én enkelt henvendelse fra en besøkende kan utløse flere handlinger. Abonner på denne hendelsen på et eget endepunkt, eller sørg for at mottakeren din kan håndtere datamengden.

{
  "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 utførte handlingen slik AI-en ser den, for eksempel search_products for en administrert integrasjon eller navnet du ga en egendefinert API-handling.
  • status - SUCCESS eller ERROR.
  • durationMs - hvor lang tid handlingen tok, i millisekunder. Nyttig for å oppdage en treg integrasjon før besøkende klager på det.
  • errorMessage - årsaken til feilen, fylles bare ut når status er ERROR; ellers null.

webhook.test

Sendes med Send sample event (Send testhendelse)-knappen når du kjører en enkel tilkoblingssjekk. Signert på nøyaktig samme måte som en ekte hendelse.

{
  "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, alltid den samme. Konvoluttfeltene inneholder eksempelverdier, så du må aldri behandle en webhook.test-levering som ekte data.
  • Dette er den eneste hendelsestypen du ikke kan abonnere på for et endepunkt: den sendes på forespørsel fra administrasjonspanelet og når alltid det endepunktet du klikket på, uansett hvilke hendelser det lytter til.

Sikkerhet: verifisering av leveringer

Hver levering inneholder fire headere:

Header Verdi
X-ChatLab-Signature sha256=<hex hmac> - HMAC-SHA256-signatur av nyttelasten
X-ChatLab-Timestamp Unix-tid i sekunder da leveringen ble signert
X-ChatLab-Event Hendelsestypen, f.eks. lead.created
X-ChatLab-Delivery Unik leverings-ID, lik meldingstekstens eventId

Signaturen beregnes som HMAC-SHA256 over strengen {timestamp}.{rawBody} ved hjelp av endepunktshemmeligheten din, der {timestamp} er verdien av X-ChatLab-Timestamp og {rawBody} er den ubehandlede, uparsede forespørselskroppen. Verifiser alltid mot de ubehandlede bytene - å serialisere analysert JSON på nytt vil endre bytesekvensen og gjøre signaturen ugyldig.

For å beskytte mot replay-angrep bør du avvise leveringer der X-ChatLab-Timestamp er eldre enn 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 verifiseringen mislykkes, svarer du med 401 og forkaster nyttelasten. Behandle aldri uverifiserte leveringer - hvem som helst som finner URL-en din, kan sende vilkårlig JSON til den via POST.

Leveringsatferd

Forstå disse leveringsreglene før du bygger på webhooks:

  • Svar raskt. Endepunktet ditt må svare innen 3 sekunder, ellers regnes leveringen som mislykket. Verifiser signaturen, legg hendelsen trygt i kø, og bekreft med 2xx innenfor dette tidsvinduet. Utfør tregere CRM-kall og forretningslogikk asynkront.
  • Fire-and-forget, høyst én gang. Endepunkter som samsvarer og er aktivert, får høyst ett leveringsforsøk - det gjøres ingen nye forsøk. Settes endepunkter på pause eller utløses en kretsbryter (circuit breaker), kan selv dette forsøket bli blokkert. Hvis endepunktet ditt er nede, opplever tidsavbrudd eller returnerer en statuskode som ikke er 2xx, går hendelsen tapt og vil ikke bli levert på nytt. Webhooks er varsler, ikke et replikert datalager: bruk samtaleendepunkter i Bot Talk API eller lead-eksporter for å avstemme lagrede data der dette støttes. Management API dekker bot-innstillinger og bruksdata, ikke et fullstendig hendelsesarkiv. Noen hendelser kan ikke rekonstrueres via disse grensesnittene.
  • Kretsbryter (circuit breaker). Etter 5 mislykkede leveringer på rad for et bestemt par av endepunkt/bot, settes leveringer for dette paret på pause i 5 minutter. Hendelser som oppstår under denne pausen forkastes, og leveringsloggen viser CIRCUIT_OPEN-oppføringer for å identifisere blokkerte forsøk. Leveringer som hoppes over på grunn av en åpen kretsbryter, teller ikke mot automatisk deaktivering.
  • Automatisk deaktivering. Sjekken kjøres i det øyeblikket en levering mislykkes, aldri på en timer. Hvis en levering mislykkes og det ikke har vært noen vellykket levering på 7 dager - regnet fra forrige vellykkede levering, eller fra datoen endepunktet ble opprettet hvis det aldri har lyktes - blir endepunktet deaktivert og du mottar et e-postvarsel. En enkelt 2xx når som helst tilbakestiller denne telleren. Et endepunkt som ikke mottar trafikk, blir aldri deaktivert, fordi ingenting mislykkes. Aktiver det igjen fra Account settings (Kontoinnstillinger) når mottakeren din er rettet opp; feiltelleren og tidsstempelet for automatisk deaktivering nullstilles når du slår det på igjen, og hendelser som gikk tapt mens det var avslått, ettersendes ikke.
  • 410 Gone. Hvis endepunktet ditt svarer med HTTP 410 Gone, deaktiverer ChatLab det umiddelbart. Bruk dette til å avvikle et endepunkt programmatisk fra mottakersiden.
  • Idempotens. Duplikate leveringer forventes ikke under normal drift, men hvis behandlingen din må være strengt idempotent, kan du deduplisere basert på eventId (også tilgjengelig i X-ChatLab-Delivery-headeren).

Leveringsrekkefølge er ikke garantert. Lagre hendelses-ID-en og gjør forretningslogikken idempotent. Sørg for egne retningslinjer for oppbevaring og tilgangskontroll for webhook-nyttelaster, som kan inneholde personopplysninger og lenker til filnedlastinger.

Signaturoksemplene bruker Node.js crypto og PHPs hash_equals. Fang opp den rå forespørselskroppen før du parser den.

Begrensninger

  • Opptil 10 webhook-endepunkter per konto.
  • Oppbevaringstid for leveringslogg: 14 dager. Eldre oppføringer fjernes automatisk.

Relaterte artikler