Webhookide ülevaade
Webhookid võimaldavad ChatLabil teavitada teie süsteeme kohe, kui teie vestlusrobotites midagi juhtub. Selle asemel et teha päringuid Management API liidesesse või eksportida andmeid käsitsi, registreerite HTTPS-lõpp-punkti ja ChatLab saadab sinna reaalajas allkirjastatud HTTP POST-päringu - näiteks siis, kui külastaja jätab müügivihje (lead), esitab kontaktivormi, hindab vestlust, soovib suhelda inimesega või kui käivitub AI toiming.
Tüüpilised kasutusjuhud:
- uute müügivihjete saatmine otse oma CRM-i kohe pärast nende kogumist
- oma meeskonna teavitamine Slackis, kui külastaja soovib Live Chat (reaalajas vestluse) tuge
- vestluste hinnangute ja kokkuvõtete edastamine oma analüütikatööriistadesse
- AI toimingute (AI actions) käivitamise jälgimine ja tõrgete korral hoiatuste saamine
Saadavus: teie konto peab sisaldama funktsiooni Webhooks.
Kus seadistada: avage administraatorirakenduses Account settings -> Webhooks (Konto seaded -> Webhookid, mis asub otse Management API jaotise kõrval). Webhookid toimivad konto tasemel - üks lõpp-punkt võib võtta vastu sündmusi kõigilt teie vestlusrobotitelt või ainult ühelt valitud robotilt.
Lõpp-punkti seadistamine
- Avage Account settings -> Webhooks (Konto seaded -> Webhookid) ja klõpsake nupul Add endpoint (Lisa lõpp-punkt).
- Täitke lõpp-punkti vorm:
- Name (Nimi) - silt teie enda tarbeks, nt "CRM-i sünkroonimine" või "Slack-teavitused".
- URL - HTTPS-aadress, kuhu ChatLab sündmusi POST-päringuga saadab.
- Events (Sündmused) - valige, milliseid sündmustüüpe see lõpp-punkt vastu võtab (vt allpool olevat kataloogi). Valige ainult need, mida vajate; suure mahuga sündmused, nagu
ai_action.executed, võivad tekitada palju võrguliiklust. - Bot filter (Roboti filter) (valikuline) - valige üks vestlusrobot või All bots (Kõik robotid), et kaasata kõik teie konto robotid.
- Custom form filter (Kohandatud vormi filter) (valikuline) - suunab ühe kindla kohandatud vormi esitamised sellesse lõpp-punkti. See piirab ainult sündmust
custom_form.submitted; kõik teised tellitud sündmused (müügivihjed, kontaktipäringud, vestlused, Live Chat, AI toimingud) edastatakse sellest seadistusest sõltumata.
- Kinnitage vorm. Lõpp-punkti salavõtit ehk secret-väärtust kuvatakse õnnestumise dialoogis täpselt üks kord - kopeerige see kohe ja hoidke seda turvaliselt. Vajate seda allkirjade kontrollimiseks (vt jaotist Turvalisus allpool). Lihttekstina ei ole seda hiljem enam võimalik vaadata.
Igal lõpp-punktil on lisaks:
- Lüliti Enable/disable (Luba/keela) - peatab edastused ilma lõpp-punkti kustutamata. Keelatud lõpp-punktid jätavad sündmused vaikimisi vahele (neid ei panda järjekorda hilisemaks saatmiseks).
- Send sample event (Saada näidissündmus) - saadab teie URL-ile allkirjastatud testpäringu, et saaksite oma vastuvõtjat otsast lõpuni kontrollida. Saate enne saatmist valida sündmuse tüübi ja muuta näidisväärtusi, et teie töötleja näeks realistlikke andmeid. Test saabub tavapärase edastusena, kus
eventTypevastab teie valikule (või väärtusegawebhook.testlihtsa ühenduvuskontrolli puhul). - Roll secret (Uuenda salavõtit) - genereerib uue salavõtme ja muudab vana kehtetuks. Kasutage seda juhul, kui salavõti võib olla lekkinud. Uut salavõtit kuvatakse samuti ainult üks kord. Kontrollitud vahetamiseks peatage lõpp-punkt, uuendage ja kopeerige uus salavõti, värskendage vastuvõtjat, lülitage lõpp-punkt uuesti sisse ning saatke näidissündmus. Peatamise ajal toimunud sündmusi järjekorda ei salvestata. Planeerige see katkestus enne võtme vahetamist ette.
- Delivery log (Edastuslogi) - lõpp-punkti hiljutiste edastuste loend koos ajatempli, sündmuse tüübi, teie serveri tagastatud HTTP-olekukoodi ja vastuseajaga. Siin kuvatakse ebaõnnestunud edastused ja kaitselüliti (circuit breaker) automaatsed pausid. Logi säilitatakse 14 päeva.
Sündmuse ümbrik (envelope)
Iga edastus on HTTP POST-päring päisega Content-Type: application/json. Päringu kehal on alati sama ümbrikstruktuur; data objekt sõltub konkreetsest sündmuse tüübist:
{
"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- sündmuse unikaalne identifikaator. Kasutage seda duplikaatide eemaldamiseks, kui teie töötlemine peab olema idempotentne.eventType- üks allpool kirjeldatud tüüpidest; saadetakse ka päisesX-ChatLab-Event.timestamp- ISO 8601 UTC kellaaeg, millal edastusümbrik ette valmistati.botId/botName- vestlusrobot, millele sündmus kuulub.conversationId/sessionId- vestluse kontekst, kui see on kohaldatav.
Sündmuste kataloog
lead.created
Käivitub, kui külastaja esitab oma kontaktandmed - kontaktide kogumise vormi (lead collection form), reaalajas vestluse eelvormi või kohandatud vormi kaudu, mida kasutatakse kontaktide kogumiseks.
{
"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- viis, kuidas kontaktandmed koguti:LEAD_COLLECTION_FORM(kontaktide kogumise vorm),LIVE_CHAT_FORM(reaalajas vestluse eelvorm),CONVERSATION(tehisintellekt kogus andmed vestluse käigus),ADMIN_DATA_UPDATEvõiUPDATE_CLIENT_CONTEXT(muudetud ChatLabi poolel). Klienditoe kontaktivormi esitamised ei käivita seda sündmust kunagi - selle asemel käivitub sündmuscontact_form.submitted.email,name,phone- kontakti kirjele vastendatud kontaktandmed.- Kui kontaktide kogumiseks kasutatakse kohandatud vormi, kaasatakse iga sellel vormil määratletud väli massiivi
fields, vormi järjekorras, ningformCodeName/formNametuvastavad vastava vormi. Klassikalise kontaktide kogumise vormi puhul on mõlemad väärtuseksnulljafieldson tühi massiiv. - Iga kirje massiivis
fieldson kujul{name, value, type}.nameon välja tehniline nimi, mis jääb siltide muutmisel samaks - kasutage seda oma CRM-i vastendamiseks. - Väljade
multichoicepuhul onvaluevalitud valikute massiiv. Märkeruudu väljad on eraldi kirjed väärtustega"true"/"false". - Väljade
filepuhul onvalueüleslaaditud faili allalaadimislink; veebikonks (webhook) ei kanna kunagi faili tegelikku sisu. pageUrl- veebileht, kus külastaja andmete esitamise hetkel viibis.
contact_form.submitted
Käivitub, kui külastaja esitab klienditoe kontaktivormi või kohandatud vormi, mida kasutatakse klienditoega ühenduse võtmiseks.
{
"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- külastaja sisestatud e-posti aadress, millele teie tugimeeskond peaks vastama.source-CUSTOM_FORM, kui kontaktivormina kasutatakse kohandatud vormi, jaCONTACT_FORMsisseehitatud vormi puhul.formCodeName/formName- tuvastavad päringu taga oleva kohandatud vormi; sisseehitatud vormi puhul on mõlema väärtuseksnull.- Kohandatud vormi kasutamisel kaasatakse iga sellel määratletud väli massiivi
fields(sama vorming{name, value, type}nagu sündmuselead.createdpuhul). Sisseehitatud kontaktivormi puhul täidetakse ainult väljademailjamessage,fieldson tühi massiiv ja vormi identifikaatorid on väärtuseganull. message- vastendatud sõnumiväli või kõigi täidetud väärtuste ühendus, kui vormil pole eraldi sõnumivälja määratletud.
custom_form.submitted
Käivitub iga kohandatud vormi esitamisel, olenemata vormi eesmärgist. Pange tähele, et vormid, mille eesmärk on kontaktide kogumine või klienditoega ühenduse võtmine, käivitavad lisaks ka vastava spetsiaalse sündmuse lead.created / contact_form.submitted - tellige neist üks või teine vastavalt sellele, kas soovite üldist või spetsiifilist vaadet, selle asemel et tekitada topelt tegevusi. Nendel kahel sündmuste perekonnal on erinevad sündmuse ID-d; conversationId koos väärtusega timestamp ei ole usaldusväärne esitamise identifikaator.
{
"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- vormi püsiv masinnimi, mis ei muutu vormi ümbernimetamisel; kasutage seda esitatud andmete suunamiseks oma süsteemis.formNameon külastajatele kuvatav nimi.fieldskasutab samu{name, value, type}kirjeid nagulead.created: mitmikvalikute väärtused on massiivid, failiväärtused on allalaadimislingid.purpose-STANDALONE,LEAD_COLLECTIONvõiHUMAN_CONTACT, olenevalt sellest, kuidas vorm on vestlusrobotiga seotud.
conversation.started
Käivitub, kui külastaja saadab uue vestluse esimese sõnumi.
{
"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- külastaja esimese sõnumi täpne tekst.null, kui vestlus avati ilma sõnumi sisuta.chatSource- kanal, mille kaudu vestlus saabus:WIDGET,WHATSAPP,MESSENGER,VOICE,VOICE_PHONE,API,BOOKING,AIRBNBvõiIDOBOOKING.byAdmin-true, kui vestlus pärineb ChatLabi administraatoripaneelis olevast vestlusroboti eelvaatest, mitte päris külastajalt. Kasutage seda oma testvestluste eraldamiseks CRM-ist.countryCode- külastaja IP-aadressi põhjal määratud ISO-riigikood,null, kui seda ei õnnestunud tuvastada.ipAddress- külastaja IP-aadress ChatLabi vaates,null, kui see pole saadaval. Käsitlege seda GDPR-i järgi isikuandmetena ja salvestage seda ainult seadusliku aluse olemasolul.
conversation.rated
Käivitub, kui külastaja esitab positiivse või negatiivse vestluse hinnangu (vt Vestluse hindamine).
{
"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-POSITIVEvõiNEGATIVE. Hinnangu eemaldamine seda sündmust ei käivita, seega ei saa te kunagi neutraalset väärtust.
conversation.summarized
Käivitub, kui ChatLab genereerib lõppenud vestluse kokkuvõtte.
{
"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- genereeritud kokkuvõtte tekst. Kokkuvõtte genereerimine toimub asünkroonselt ning sõltub roboti kokkuvõtete seadistusest ja töötlusgraafikust; ärge eeldage fikseeritud edastusaega.language- roboti sisemine lokaat, mis edastati kokkuvõtte tegemiseks, näiteksen_US; ärge eeldage, et see ühtib külastaja vestluskeelega.
client.summarized
Käivitub, kui ChatLab uuendab kliendi tehisintellekti profiili. Profiil koostatakse uuesti eelmise profiili ja äsja lõppenud vestluse kokkuvõtte põhjal ning see võidakse luua pärast sündmust conversation.summarized. Edastusjärjekord ei ole garanteeritud. Päringu keha sisaldab e-posti aadressi, kui see on teada, kuid ChatLab võib hoida ka kliente ilma e-posti aadressita.
{
"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- identifikaator kliendi vastendamiseks teie enda CRM-is. Anonüümsete külastajate puhul, kes pole kunagi aadressi jätnud, on selle väärtuseksnull, kuid sündmus käivitub ka nende puhul - jätke need edastused vahele, kui teie integratsioon põhineb e-posti aadressil.client- kontaktikirje, mida ChatLab selle isiku kohta hoiab:email,name,phone,countryCodejaipAddress. Iga võti on alati olemas; tundmatud väärtused onnull.clientSummary- täielik profiili tekst tavatekstina, mitte muudatuste loendina (diff). See asendab varasema kokkuvõtte täielikult, seega salvestage see ülekirjutamisena, mitte juurdekirjutamisena.- Profiil luuakse uuesti ainult robotite puhul, millel on sisse lülitatud vestlusmälu (chat memory), ja ainult vestluste puhul, mis olid kokkuvõtte tegemiseks piisavalt kaua passiivsed - oodake seda sündmust mõni minut pärast vestluse lõppu, mitte kohe.
live_chat.requested
Käivitub, kui tehisintellekt annab vestluse üle funktsioonile Live Chat, kas seetõttu, et külastaja küsis klienditeenindajat või robot otsustas, et inimese sekkumine on vajalik.
{
"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- praegu alatiAI, sest üleandmise algatab alati roboti reaalajas vestluse toiming, sealhulgas juhul, kui külastaja seda otsesõnu palub. Käsitlege seda avatud loendina (enum): väärtuseAIeeldamise asemel arvestage ka tundmatute väärtustega.- See sündmus hõlmab üleandmist taotlevat tehisintellekti toimingut, mitte iga viisi, kuidas külastaja saab reaalajas vestluse avada. See ei kinnita operaatori liitumist.
live_chat.started
Käivitub, kui reaalajas vestluse seanss luuakse pärast seda, kui külastaja on üleandmisvormi esitanud. See toimub enne seda, kui operaator tingimata liitub või vastab; ärge käsitlege seda inimese sekkumise kinnitusena.
{
"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": {}
}
dataon teadlikult tühi. Kõik vajalik sisaldub ümbrikus:botIdtuvastab vestlusroboti ningconversationId/sessionIdseovad sündmuse konkreetse vestlusega. Võite selle saada ilma varasema sündmusetalive_chat.requested, näiteks juhul, kui külastaja kasutas vidina reaalajas vestluse juhtelementi.
live_chat.ended
Käivitub, kui reaalajas vestluse seanss lõpeb.
{
"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- reaalajas vestluse seansi kestus sekundites alates seansi loomisest, kaasa arvatud operaatori ootamise aeg. Väli jäetakse välja harvadel juhtudel, kui seanss lõpeb ilma, et seda oleks kunagi alustatud.
ai_action.executed
Käivitub iga kord, kui robot käivitab AI toimingu (AI action) - hallatud integratsioonipäringu või kohandatud API funktsiooni. See on suure mahuga sündmus: aktiivne e-kaubanduse robot võib käivitada sadu toiminguid päevas ning külastaja üksainus repliik võib vallandada mitu toimingut. Tellige see eraldi lõpp-punkti või veenduge, et teie vastuvõtja suudab seda mahtu töödelda.
{
"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- käivitatud toimingu nimi, nagu tehisintellekt seda näeb, näitekssearch_productshallatud integratsiooni puhul või kohandatud API toimingule teie antud nimi.status-SUCCESSvõiERROR.durationMs- toimingu kestus millisekundites. Kasulik aeglase integratsiooni tuvastamiseks enne, kui külastajad selle üle kurtma hakkavad.errorMessage- tõrke põhjus, mis on täidetud ainult siis, kuistatusonERROR; muul juhulnull.
webhook.test
Saadetakse nupuga Send sample event (Saada näidissündmus), kui teete lihtsa ühenduvuskontrolli. Allkirjastatud täpselt nagu päris sündmus.
{
"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- fikseeritud tekst, alati sama. Ümbriku väljad kannavad näidisväärtusi, seega ärge kunagi käsitlege sündmusewebhook.testedastust tegelike andmetena.- See on ainus sündmuse tüüp, mida te ei saa lõpp-punktis tellida: see saadetakse nõudmisel administraatoripaneelist ja see jõuab alati sellele lõpp-punktile, millel klõpsasite, olenemata sellest, milliseid sündmusi see kuulab.
Turvalisus: edastuste kinnitamine
Iga edastus kannab nelja päist:
| Päis | Väärtus |
|---|---|
X-ChatLab-Signature |
sha256=<hex hmac> - päringu keha HMAC-SHA256 allkiri |
X-ChatLab-Timestamp |
Unixi aeg sekundites, millal edastus allkirjastati |
X-ChatLab-Event |
Sündmuse tüüp, nt lead.created |
X-ChatLab-Delivery |
Unikaalne edastuse ID, mis võrdub keha väljaga eventId |
Allkiri arvutatakse HMAC-SHA256 abil sõne {timestamp}.{rawBody} pealt, kasutades teie lõpp-punkti saladust (secret), kus {timestamp} on X-ChatLab-Timestamp väärtus ja {rawBody} on päringu töötlemata, parsimata keha. Kontrollige alati töötlemata baitide (raw bytes) alusel - pargitud JSON-i uuesti jadastamine muudab baitide järjestust ja muudab allkirja kehtetuks.
Kordusrünnakute (replay attacks) eest kaitsmiseks lükake tagasi edastused, mille X-ChatLab-Timestamp on vanem kui 5 minutit.
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);
}
Kui kinnitamine ebaõnnestub, vastake koodiga 401 ja tühistage sisu. Ärge kunagi töödelge kinnitamata edastusi - igaüks, kes saab teada teie URL-i, võib sinna saata suvalist JSON-i.
Edastuskäitumine
Enne webhookide kasutuselevõttu tutvuge järgmiste edastusreeglitega:
- Vastake kiiresti. Teie lõpp-punkt peab vastama 3 sekundi jooksul, vastasel juhul loetakse edastus ebaõnnestunuks. Kinnitage allkiri, lisage sündmus kindlalt järjekorda ja kinnitage kättesaamist staatusega
2xxselle ajavahemiku sees. Teostage aeglasemad CRM-i päringud ja äritoimingud asünkroonselt. - Tee ja unusta (fire-and-forget), ülimalt üks kord. Sobivad lubatud lõpp-punktid saavad kõige rohkem ühe edastuskatse - uuesti proovimisi ei toimu. Peatatud lõpp-punktid ja avatud ahelad (circuit breaker) võivad takistada isegi seda katset. Kui teie lõpp-punkt ei tööta, tekib ajalõpp või tagastatakse staatus, mis ei ole 2xx, läheb see sündmus kaotsi ja seda ei edastata uuesti. Webhookid on teavitused, mitte kopeeritud andmehoidla: kasutage toetatud juhtudel säilitatud andmete vastavusse viimiseks Bot Talk API vestluste lõpp-punkte või müügivihjete eksporti. Management API hõlmab roboti seadeid ja kasutust, mitte täielikku sündmuste arhiivi. Mõnda sündmust ei saa nende liideste kaudu taastada.
- Ahelakatkesti (circuit breaker). Pärast 5 järjestikust ebaõnnestunud edastust lõpp-punkti ja roboti paari kohta peatatakse selle paari edastused 5 minutiks. Peatamise ajal toimuvad sündmused jäetakse vahele ning edastuslogis kuvatakse kirjed
CIRCUIT_OPEN, mis tähistavad ärajäetud katseid. Avatud ahela tõttu vahelejäänud edastusi ei arvestata automaatse väljalülitamise hulka. - Automaatne väljalülitamine. Kontroll toimub edastuse ebaõnnestumise hetkel, mitte kunagi kindla ajavahemiku tagant. Kui edastus ebaõnnestub ja 7 päeva jooksul pole toimunud ühtegi edukat edastust - arvestatuna viimasest õnnestumisest või lõpp-punkti loomise kuupäevast, kui see pole kordagi õnnestunud -, lülitatakse lõpp-punkt välja ja teile saadetakse e-posti teel teavitus. Üksainus
2xxigal ajahetkel lähtestab selle loenduri. Lõpp-punkti, mis ei saa üldse liiklust, ei lülitata kunagi välja, sest midagi ei ebaõnnestu. Kui vastuvõtja on parandatud, lülitage see uuesti sisse menüüst Account settings (konto seaded); tõrgete loendur ja automaatse väljalülitamise märge kustutatakse uuesti sisselülitamisel ning väljalülitatud oleku ajal vahelejäänud sündmusi tagantjärele ei täideta. - 410 Gone. Kui teie lõpp-punkt vastab HTTP-staatusega
410 Gone, lülitab ChatLab selle kohe välja. Kasutage seda lõpp-punkti programmilisest kasutusest eemaldamiseks vastuvõtja poolelt. - Idempotentsus. Tavapärase toimimise korral dubleerivaid edastusi ei eeldata, kuid kui teie töötlus peab olema rangelt idempotentne, eemaldage duplikaadid väärtuse
eventIdjärgi (saadaval ka päisesX-ChatLab-Delivery).
Edastuste järjekord ei ole garanteeritud. Salvestage sündmuse ID ja muutke äritöötlus idempotentseks. Tagage ise webhookide andmesisu (payload) säilitus- ja juurdepääsupoliitikad, kuna need võivad sisaldada isikuandmeid ja failide allalaadimislinke.
Allkirja näidetes kasutatakse teeke Node.js crypto ja PHP funktsiooni hash_equals. Salvestage töötlemata päringu keha (raw request body) enne selle parsimist.
Piirangud
- Kuni 10 webhooki lõpp-punkti konto kohta.
- Edastuslogi säilitusaeg: 14 päeva. Vanemad kirjed eemaldatakse automaatselt.
Seotud artiklid
- Lead collection (müügivihjete kogumine) - vorm sündmuse
lead.createdtaga - Human Support Contact form (klienditoe kontaktivorm) - vorm sündmuse
contact_form.submittedtaga - Live Chat - töövoog sündmuste
live_chat.*taga - Conversation rating (vestluse hindamine) - pöial üles/alla funktsioon sündmuse
conversation.ratedtaga - AI Actions - integratsioonid sündmuse
ai_action.executedtaga - Chat API - veebilehitseja vidina tagasikutsed (veebikonksude kliendipoolne vaste)
- Management API - REST API robotite haldamiseks ja kasutusandmete vaatamiseks