Webhook-urile va permit sa primiti notificari in timp real cand se intampla evenimente in widget-ul dvs. de chat. Cand un vizitator incepe un chat, trimite un formular sau trimite un mesaj, Chatim trimite o cerere HTTP POST la URL-ul dvs. cu datele evenimentului.
Cu webhook-urile puteti:
Dupa creare, veti vedea un Secret Webhook — copiati-l si salvati-l imediat. Acest secret este folosit pentru a verifica ca cererile primite provin de la Chatim. Este afisat doar o singura data.
| Eveniment | Declansat cand |
|---|---|
chat.started | Un vizitator deschide widget-ul de chat si incepe o sesiune noua |
chat.message.received | Un vizitator trimite un mesaj text |
chat.form.submitted | Un vizitator trimite un formular in fluxul chatbotului |
chat.closed | O sesiune de chat este inchisa |
chat.assigned | Un agent de suport se alatura conversatiei |
chat.handoff | Chatbotul face tranzitia de la modul bot la chat live |
Fiecare livrare de webhook este o cerere HTTP POST cu un corp JSON.
{
"event": "chat.started",
"eventId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"timestamp": "2025-01-15T10:30:00.000Z",
"projectUuid": "your-project-uuid",
"chatUuid": "visitor-chat-uuid",
"data": { }
}Include informatii despre vizitator, URL-ul paginii, locatia si agentul utilizator.
{
"event": "chat.started",
"data": {
"visitor": {
"uuid": "visitor-uuid",
"name": "John Doe",
"email": "[email protected]",
"phone": "+1234567890"
},
"page": {
"url": "https://example.com/pricing",
"title": "Pricing - Example"
},
"location": { "country": "US", "city": "Los Angeles" },
"userAgent": { "browser": "Chrome", "os": "Windows", "device": "Desktop" }
}
}{
"event": "chat.message.received",
"data": {
"messageUuid": "message-uuid",
"message": "Hi, I have a question about your pricing.",
"visitor": { "uuid": "visitor-uuid", "name": "John Doe" }
}
}{
"event": "chat.form.submitted",
"data": {
"formNodeId": "node-id",
"formName": "Contact Form",
"fields": {
"name": "John Doe",
"email": "[email protected]",
"phone": "+1234567890",
"message": "I'd like a product demo."
},
"visitor": { "uuid": "visitor-uuid", "name": "John Doe" }
}
}Include cine a inchis chatul (agent, visitor, system sau timeout), durata in secunde, numarul de mesaje si transcriptia.
{
"event": "chat.closed",
"data": {
"closedBy": "agent",
"status": "closed",
"duration": 345,
"messageCount": 12,
"visitor": { "uuid": "visitor-uuid", "name": "John Doe" }
}
}Trimis cand un agent de suport se alatura conversatiei.
{
"event": "chat.assigned",
"data": {
"assignedTo": { "uuid": "agent-uuid", "name": "Jane Smith" },
"visitor": { "uuid": "visitor-uuid", "name": "John Doe" }
}
}Trimis cand chatbotul face tranzitia la modul de chat live.
{
"event": "chat.handoff",
"data": {
"reason": "Visitor requested human support",
"fromNode": "node-id",
"visitor": { "uuid": "visitor-uuid", "name": "John Doe" }
}
}Fiecare cerere webhook include o semnatura pentru a putea verifica ca provine de la Chatim. Semnatura este calculata ca HMAC-SHA256(secret, timestamp + "." + payload) si trimisa in headerul X-Chatim-Signature.
| Header | Descriere |
|---|---|
X-Chatim-Signature | Semnatura HMAC-SHA256 a sarcinii utile |
X-Chatim-Timestamp | Marca de timp Unix a momentului trimiterii cererii |
X-Chatim-Event | Tipul evenimentului |
X-Chatim-Delivery-Id | Identificator unic de livrare |
const crypto = require('crypto');
function verifyWebhook(req, secret) {
const signature = req.headers['x-chatim-signature'];
const timestamp = req.headers['x-chatim-timestamp'];
const body = JSON.stringify(req.body);
// Reject requests older than 5 minutes
const age = Math.floor(Date.now() / 1000) - parseInt(timestamp);
if (age > 300) return false;
const expected = 'sha256=' + crypto
.createHmac('sha256', secret)
.update(timestamp + '.' + body)
.digest('hex');
return crypto.timingSafeEqual(
Buffer.from(signature),
Buffer.from(expected)
);
}import hmac, hashlib, time
def verify_webhook(headers, body, secret):
signature = headers.get('X-Chatim-Signature', '')
timestamp = headers.get('X-Chatim-Timestamp', '')
if abs(time.time() - int(timestamp)) > 300:
return False
expected = 'sha256=' + hmac.new(
secret.encode(),
f'{timestamp}.{body}'.encode(),
hashlib.sha256
).hexdigest()
return hmac.compare_digest(signature, expected)Daca endpoint-ul dvs. nu este disponibil sau returneaza o eroare, Chatim reincearca automat.
| Incercare | Intarziere |
|---|---|
| Prima reincercare | 1 minut |
| A 2-a reincercare | 5 minute |
| A 3-a reincercare | 30 minute |
| A 4-a reincercare | 2 ore |
| A 5-a reincercare | 24 ore |
Dupa 5 reincercari esuate, livrarea este marcata ca esuata. Raspunsurile 2xx sunt tratate ca succes, 4xx ca esecuri permanente (fara reincercare), 5xx si timeout-urile (30s) declanseaza reincercari.
Daca un webhook acumuleaza 10 esecuri consecutive, este dezactivat automat. Il puteti reactiva din panoul de control dupa rezolvarea problemei.
Faceti clic pe Testare pe orice webhook pentru a trimite un eveniment exemplu chat.started la URL-ul dvs. Aceasta va permite sa verificati endpoint-ul inainte de a merge in productie.
Faceti clic pe un webhook pentru a vedea livrarile recente cu tipul evenimentului, marca de timp, codul de stare HTTP si mesajele de eroare. Istoricul este pastrat timp de 30 de zile.
Daca secretul webhook-ului este compromis, faceti clic pe Regenerare secret, salvati noul secret si actualizati endpoint-ul. Secretul vechi este invalidat imediat.
Abonati-va la chat.form.submitted si chat.started pentru a crea automat contacte si leaduri in CRM-ul dvs.
Abonati-va la chat.assigned si chat.handoff pentru a alerta echipa cand un vizitator are nevoie de suport live.
Abonati-va la toate evenimentele pentru a construi o imagine completa a angajamentului in chat, ratelor de conversie a formularelor si timpilor de raspuns al suportului.
Abonati-va la chat.form.submitted pentru a declansa emailuri de bun venit, secvente de urmarire sau mesaje de confirmare.
eventId pentru a gestiona livrarile duplicatetimestamp + "." + raw_body (nu JSON parsat)Începe