Centar za pomoć
Chat API

Webhooks

Poslednje ažuriranje:

Pregled vebhukova (Webhooks)

Vebhukovi omogućavaju platformi ChatLab da obavesti vaše sisteme onog trenutka kada se nešto dogodi u vašim četbotovima. Umesto da periodično šaljete upite prema Management API interfejsu ili ručno izvozite podatke, registrujete HTTPS krajnju tačku (endpoint) i ChatLab joj u realnom vremenu šalje potpisani HTTP POST zahtev - kada posetilac ostavi kontakt (lead), pošalje kontakt formu, oceni razgovor, zatraži ljudskog operatera ili kada se izvrši AI akcija.

Uobičajeni primeri korišćenja:

  • prosleđivanje novih lidova direktno u vaš CRM sistem čim se prikupe
  • obaveštavanje vašeg tima na platformi Slack kada posetilac zatraži Live Chat (ćaskanje uživo)
  • slanje ocena razgovora i rezimea u vaš sopstveni analitički sistem
  • praćenje izvršavanja AI akcija (AI actions) i slanje upozorenja u slučaju grešaka

Dostupnost: vebhukovi su dostupni od plana STANDARD i više (funkcija: Webhooks).

Gde se podešava: u administratorskoj aplikaciji otvorite Account settings -> Webhooks (Podešavanja naloga -> Vebhukovi) odmah pored odeljka Management API. Vebhukovi se podešavaju na nivou naloga - jedna krajnja tačka može primati događaje iz svih vaših botova ili samo iz filtriranog podskupa.

Podešavanje krajnje tačke

  1. Otvorite Account settings -> Webhooks i kliknite na Create endpoint (Kreiraj krajnju tačku).
  2. Popunite formu za krajnju tačku:
    • Name (Naziv) - oznaka za vašu internu upotrebu, npr. „CRM sinhronizacija” ili „Slack obaveštenja”.
    • URL - HTTPS adresa na koju će ChatLab slati POST zahteve sa događajima.
    • Events (Događaji) - izaberite koje tipove događaja ova krajnja tačka prima (pogledajte katalog u nastavku). Izaberite samo ono što vam je potrebno; događaji visokog intenziteta poput ai_action.executed mogu generisati veliki obim saobraćaja.
    • Bot filter (opciono) - ograničite krajnju tačku na određene botove. Ostavite prazno da biste primali događaje sa svih botova na vašem nalogu.
    • Custom form filter (opciono) - usmerava unose iz jedne prilagođene forme ka ovoj krajnjoj tački. Ovo sužava samo događaj custom_form.submitted; svi ostali događaji na koje ste pretplaćeni (lidovi, zahtevi za kontakt, razgovori, Live Chat, AI akcije) biće isporučeni bez obzira na ovu postavku.
  3. Potvrdite unos. Secret (tajni ključ) krajnje tačke prikazuje se samo jednom u dijalogu o uspehu - kopirajte ga odmah i sačuvajte na bezbednom mestu. Biće vam potreban za verifikaciju potpisa (pogledajte odeljak Bezbednost u nastavku). Tekstualna vrednost se kasnije ne može ponovo dobiti.

Svaka krajnja tačka takođe ima:

  • Prekidač za omogućavanje/onemogućavanje (Enable/disable toggle) - pauzirajte isporuku bez brisanja krajnje tačke. Onemogućene krajnje tačke tiho odbacuju događaje (ne stavljaju se u red čekanja za kasnije).
  • Send sample event (Pošalji probni događaj) - isporučuje potpisani test zahtev na vaš URL kako biste mogli da proverite rad prijemnika od početka do kraja. Možete odabrati tip događaja i izmeniti probne vrednosti pre slanja, tako da vaš rukovalac vidi realistične podatke. Test stiže kao redovna isporuka gde se eventType poklapa sa vašim izborom (ili kao webhook.test za običnu proveru povezivanja).
  • Roll secret (Zameni tajni ključ) - generiše novi tajni ključ i poništava stari. Koristite ovo ako postoji mogućnost da je tajni ključ kompromitovan. Novi tajni ključ se ponovo prikazuje samo jednom. Ažurirajte svoj prijemnik pre zamene, inače isporuke neće proći verifikaciju potpisa na vašoj strani.
  • Delivery log (Dnevnik isporuke) - lista nedavnih isporuka po krajnjoj tački sa vremenskom oznakom, tipom događaja, HTTP statusom koji je vratio vaš server i vremenom odgovora. Neuspele isporuke i pauze usled mehanizma zaštite od preopterećenja (circuit breaker) vidljive su ovde. Dnevnik se čuva 14 dana.

Omotnica događaja (Event envelope)

Svaka isporuka je HTTP POST zahtev sa zaglavljem Content-Type: application/json. Telo zahteva uvek ima istu omotnicu; objekat data je specifičan za svaki tip događaja:

{
  "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 - jedinstven za svaki događaj. Koristite ga za deduplikaciju ako vaša obrada mora biti idempotentna.
  • eventType - jedan od tipova dokumentovanih u nastavku; takođe se šalje u zaglavlju X-ChatLab-Event.
  • timestamp - ISO 8601 UTC vreme kada se događaj desio.
  • botId / botName - bot kome događaj pripada.
  • conversationId / sessionId - kontekst razgovora, kada je primenljivo.

Katalog događaja

lead.created

Aktivira se kada posetilac pošalje svoje kontakt podatke - putem forme za prikupljanje lidova, uvodne forme za Live Chat ili prilagođene forme koja se koristi za prikupljanje lidova.

{
  "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 - način na koji su kontakt podaci prikupljeni: LEAD_COLLECTION_FORM (forma za prikupljanje lidova), LIVE_CHAT_FORM (uvodna forma za Live Chat), CONVERSATION (AI je preuzeo podatke tokom razgovora), ADMIN_DATA_UPDATE ili UPDATE_CLIENT_CONTEXT (izmenjeno na strani ChatLab-a). Slanje forme za kontakt sa ljudskom podrškom nikada ne pokreće ovaj događaj - umesto toga pokreće contact_form.submitted.
  • email, name, phone - kontakt podaci mapirani u zapis o lidu.
  • Kada se za prikupljanje lidova koristi prilagođena forma, svako polje definisano u toj formi biće uključeno u fields, po redosledu iz forme, a formCodeName / formName identifikuju formu. Kod klasične forme za lidove oba polja su null, a fields je prazan niz.
  • Svaki unos u fields ima format {name, value, type}. name je tehnički naziv polja, nepromenjen prilikom izmena teksta labele - koristite ga za mapiranje u vaš CRM.
  • Za polja tipa multichoice vrednost value je niz izabranih opcija. Polja sa poljima za potvrdu (checkbox) su zasebni unosi sa vrednostima "true" / "false".
  • Za polja tipa file vrednost value je veza za preuzimanje otpremljene datoteke; vebhuk nikada ne prenosi sam sadržaj datoteke.
  • pageUrl - stranica na kojoj se posetilac nalazio u trenutku slanja.

contact_form.submitted

Aktivira se kada posetilac pošalje kontakt formu za podršku ljudi ili prilagođenu formu koja se koristi za kontakt sa ljudima.

{
  "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 - adresa koju je posetilac ostavio i na koju vaš tim za podršku treba da odgovori.
  • source - CUSTOM_FORM kada se iza kontakt forme nalazi prilagođena forma, a CONTACT_FORM za ugrađenu formu.
  • formCodeName / formName - identifikuju prilagođenu formu u pozadini zahteva; oba su null za ugrađenu formu.
  • Kada se koristi prilagođena forma, svako polje definisano u njoj biće uključeno u fields (isti {name, value, type} format kao u lead.created). Kod ugrađene kontakt forme popunjavaju se samo email i message, fields je prazan niz, a identifikatori forme su null.
  • message - mapirano polje za poruku, ili sve unete vrednosti spojene zajedno ako u formi nije definisano posebno polje za poruku.

custom_form.submitted

Aktivira se prilikom svakog slanja prilagođene forme, bez obzira na njenu namenu. Imajte na umu da forme čija je svrha prikupljanje lidova ili kontakt sa ljudima takođe aktiviraju svoje namenske događaje lead.created / contact_form.submitted - pretplatite se na jedne ili druge u zavisnosti od toga da li želite opšti ili specijalizovani prikaz, i primenite deduplikaciju prema conversationId + timestamp ako se pretplatite na oba.

{
  "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 - stabilan mašinski naziv forme, koji se ne menja kada preimenujete formu; koristite ga za usmeravanje unosa u vašem sistemu. formName je naziv koji se prikazuje posetiocima.
  • fields koristi iste unose u formatu {name, value, type} kao lead.created: višestruki izbori su nizovi, a datoteke su veze za preuzimanje.
  • purpose - STANDALONE, LEAD_COLLECTION ili HUMAN_CONTACT, u zavisnosti od toga kako je forma povezana sa četbotom.

conversation.started

Aktivira se kada posetilac pošalje prvu poruku u novom razgovoru.

{
  "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 - tačan tekst uvodne poruke posetioca. Vrednost je null ako je razgovor otvoren bez tekstualnog sadržaja.
  • chatSource - kanal preko kog je razgovor stigao: WIDGET, WHATSAPP, MESSENGER, VOICE, VOICE_PHONE, API, BOOKING, AIRBNB ili IDOBOOKING.
  • byAdmin - ima vrednost true kada razgovor potiče iz pregleda četbota unutar ChatLab kontrolne table, a ne od stvarnog posetioca. Koristite ovo kako biste sprečili da vaši testni razgovori dospeju u CRM.
  • countryCode - ISO kod zemlje određen na osnovu IP adrese posetioca, null ako se ne može utvrditi.
  • ipAddress - IP adresa posetioca koju vidi ChatLab, null kada je nedostupna. Tretirajte je kao lični podatak u skladu sa GDPR regulativom i čuvajte je samo ako imate pravni osnov.

conversation.rated

Aktivira se kada posetilac oceni odgovor bota palcem nagore ili nadole (pogledajte Ocenjivanje razgovora).

{
  "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 ili NEGATIVE. Poništavanje date ocene ne pokreće događaj, tako da nikada ne dobijate neutralnu vrednost.

conversation.summarized

Aktivira se kada ChatLab generiše rezime završenog razgovora.

{
  "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 - tekst generisanog rezimea. Rezimei se kreiraju nekoliko minuta nakon što razgovor postane neaktivan, pa ovaj događaj stiže kasnije u odnosu na ostale događaje iz razgovora.
  • language - ISO kod jezika na kom je rezime napisan, što odgovara jeziku razgovora.

client.summarized

Aktivira se kada ChatLab osveži AI profil klijenta. Profil se ponovo gradi na osnovu prethodnog profila i rezimea razgovora koji se upravo završio, tako da ovaj događaj sledi nakon conversation.summarized za isti razgovor. Klijenti se identifikuju putem imejl adrese, zbog čega se adresa ponavlja na najvišem nivou objekta 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 - identifikator za uparivanje klijenta sa vašim CRM sistemom. Ima vrednost null za anonimne posetioce koji nikada nisu ostavili adresu, a događaj se i za njih aktivira - preskočite ove isporuke ako se vaša integracija oslanja na imejl.
  • client - kontakt zapis koji ChatLab ima o toj osobi: email, name, phone, countryCode i ipAddress. Svaki ključ je uvek prisutan; nepoznate vrednosti su null.
  • clientSummary - ceo tekst profila kao običan tekst, a ne razlika (diff). On zamenjuje celokupan prethodni rezime, pa ga treba sačuvati prepisivanjem postojećeg sadržaja umesto dopisivanjem.
  • Profil se ponovo gradi samo za botove koji imaju omogućenu funkciju memorije razgovora (chat memory) i samo za razgovore koji su bili neaktivni dovoljno dugo da bi dobili rezime - očekujte ovaj događaj nekoliko minuta nakon završetka razgovora, a ne trenutno.

live_chat.requested

Aktivira se kada AI preda razgovor funkciji Live Chat, bilo zato što je posetilac zatražio operatera ili zato što je bot procenio da je čovek neophodan.

{
  "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 - trenutno uvek AI, jer preusmeravanje uvek pokreće akcija za Live Chat samog bota, uključujući i situacije kada posetilac to zatraži sopstvenim rečima. Tretirajte ovo polje kao otvorenu enumeraciju: obradite nepoznate vrednosti umesto da se oslanjate isključivo na AI.
  • Ovaj događaj samo označava da je prenos zatražen, ali ne i da je operater preuzeo razgovor. Za to sačekajte događaj live_chat.started.

live_chat.started

Aktivira se kada se operater pridruži i sesija ćaskanja uživo zaista započne.

{
  "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": {}
}
  • Objekat data je namerno prazan. Sve što vam je potrebno nalazi se u omotnici: botId identifikuje četbota, a conversationId / sessionId povezuju događaj sa razgovorom za koji ste već primili live_chat.requested.

live_chat.ended

Aktivira se kada se sesija ćaskanja uživo završi.

{
  "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 - vreme koje je operater proveo u razgovoru, računajući od trenutka početka sesije. Polje je izostavljeno u retkim situacijama kada se sesija završi a da nikada nije formalno započeta.

ai_action.executed

Aktivira se svaki put kada bot izvrši AI akciju - poziv integracije kojom upravlja platforma ili prilagođenu API funkciju. Ovo je događaj visokog intenziteta: aktivan e-commerce bot može izvršiti stotine akcija dnevno, a samo jedna poruka posetioca može pokrenuti nekoliko njih. Pretplatite se na njega na namenskoj krajnjoj tački ili se uverite da vaš prijemnik može da podnese toliki obim.

{
  "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 - naziv izvršene akcije onako kako je AI vidi, na primer search_products za integraciju kojom upravlja sistem ili naziv koji ste dodelili prilagođenoj API akciji.
  • status - SUCCESS ili ERROR.
  • durationMs - vreme trajanja akcije u milisekundama. Korisno za uočavanje spore integracije pre nego što se posetioci požale.
  • errorMessage - razlog neuspeha, popunjava se samo kada je status jednak ERROR; u suprotnom je null.

webhook.test

Šalje se klikom na dugme Send sample event (Pošalji probni događaj) kada pokrenete običnu proveru povezivanja. Potpisuje se potpuno isto kao stvarni događaj.

{
  "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 - fiksni tekst, uvek isti. Polja omotnice sadrže probne vrednosti, tako da isporuku webhook.test nikada ne treba tretirati kao stvarne podatke.
  • Ovo je jedini tip događaja na koji se ne možete pretplatiti u podešavanjima krajnje tačke: šalje se na zahtev iz kontrolne table i uvek stiže na krajnju tačku na koju ste kliknuli, bez obzira na to koje događaje ona sluša.

Bezbednost: verifikacija isporuka

Svaka isporuka sadrži četiri zaglavlja:

Zaglavlje Vrednost
X-ChatLab-Signature sha256=<hex hmac> - HMAC-SHA256 potpis tela zahteva
X-ChatLab-Timestamp Unix vreme u sekundama kada je isporuka potpisana
X-ChatLab-Event Tip događaja, npr. lead.created
X-ChatLab-Delivery Jedinstveni ID isporuke, jednak vrednosti eventId u telu zahteva

Potpis se računa kao HMAC-SHA256 nad stringom {timestamp}.{rawBody} koristeći tajni ključ vaše krajnje tačke (endpoint secret), gde je {timestamp} vrednost zaglavlja X-ChatLab-Timestamp, a {rawBody} sirovo, neobrađeno telo zahteva. Uvek vršite verifikaciju u odnosu na sirove bajtove - ponovna serijalizacija raščlanjenog JSON-a promeniće redosled bajtova i poništiti ispravnost potpisa.

Da biste se zaštitili od napada ponavljanjem (replay attacks), odbijte isporuke čiji je X-ChatLab-Timestamp stariji od 5 minuta.

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);
}

Ako verifikacija ne uspe, odgovorite sa 401 i odbacite podatke. Nikada nemojte obrađivati neverifikovane isporuke - svako ko sazna vaš URL može na njega poslati proizvoljan JSON putem POST zahteva.

Ponašanje prilikom isporuke

Razumite ove garancije pre nego što počnete sa integracijom webhook-ova:

  • Odgovorite brzo. Vaša krajnja tačka mora odgovoriti u roku od 3 sekunde ili se isporuka smatra neuspešnom. Odmah pošaljite odgovor sa statusom 2xx i obradite podatke asinhrono (stavite ih u red čekanja, a zatim potvrdite prijem) - nemojte izvršavati CRM pozive ili upise u bazu podataka pre slanja odgovora.
  • Pošalji i zaboravi, najviše jednom (fire-and-forget, at-most-once). Svaki događaj dobija tačno jedan pokušaj isporuke - ponovnih pokušaja nema. Ako vaša krajnja tačka nije dostupna, istekne joj vreme za odgovor ili vrati status koji nije 2xx, taj događaj je izgubljen i neće biti ponovo poslat. Webhook-ovi su obaveštenja, a ne replicirano skladište podataka: kada vam je potrebna garantovana potpunost, uskladite podatke pomoću Management API interfejsa ili izvoza vaših lead-ova.
  • Sigurnosni prekidač (circuit breaker). Nakon 5 uzastopnih neuspelih isporuka za bota, isporuke za tog bota se pauziraju na 5 minuta. Događaji koji se dese tokom ove pauze se odbacuju, a evidencija isporuka prikazuje unose CIRCUIT_OPEN kako biste mogli tačno da vidite kada je i zašto saobraćaj bio zaustavljen. Isporuke preskočene zbog aktiviranog prekidača ne računaju se u automatsko onemogućavanje.
  • Automatsko onemogućavanje. Ova provera se pokreće u trenutku kada isporuka ne uspe, nikada po tajmeru. Ako isporuka ne uspe i nije bilo nijedne uspešne isporuke tokom 7 dana - računajući od poslednjeg uspeha ili od datuma kreiranja krajnje tačke ako nikada nije uspela - krajnja tačka se isključuje i dobijate obaveštenje putem e-pošte. Jedan jedini status 2xx u bilo kom trenutku resetuje to vreme. Krajnja tačka koja ne prima saobraćaj se nikada ne onemogućava jer nema neuspelih zahteva. Ponovo je omogućite u podešavanjima naloga (Account settings) čim popravite prijemnik; brojač neuspeha i oznaka za automatsko onemogućavanje se brišu kada je ponovo uključite, a događaji propušteni dok je bila isključena se ne nadoknađuju naknadno.
  • 410 Gone. Ako vaša krajnja tačka odgovori statusom HTTP 410 Gone, ChatLab je odmah onemogućava. Iskoristite ovo da programski ugasite krajnju tačku sa prijemne strane.
  • Idempotentnost. Duple isporuke se ne očekuju u normalnom radu, ali ako vaša obrada mora biti striktno idempotentna, uklonite duplikate pomoću polja eventId (takođe dostupnog u zaglavlju X-ChatLab-Delivery).

Ograničenja

  • Do 10 webhook krajnjih tačaka po nalogu.
  • Zadržavanje evidencije isporuka: 14 dana. Stariji unosi se automatski uklanjaju.

Povezani članci