Les webhooks vous permettent de recevoir des notifications en temps reel lorsque des evenements se produisent dans votre widget de chat. Lorsqu'un visiteur demarre un chat, soumet un formulaire ou envoie un message, Chatim envoie une requete HTTP POST a votre URL avec les donnees de l'evenement.
Avec les webhooks vous pouvez :
Apres la creation, vous verrez un Secret du Webhook — copiez-le et sauvegardez-le immediatement. Ce secret est utilise pour verifier que les requetes entrantes proviennent de Chatim. Il n'est affiche qu'une seule fois.
| Evenement | Declenche quand |
|---|---|
chat.started | Un visiteur ouvre le widget de chat et commence une nouvelle session |
chat.message.received | Un visiteur envoie un message texte |
chat.form.submitted | Un visiteur soumet un formulaire dans le flux du chatbot |
chat.closed | Une session de chat est fermee |
chat.assigned | Un agent de support rejoint la conversation |
chat.handoff | Le chatbot passe du mode bot au chat en direct |
Chaque livraison de webhook est une requete HTTP POST avec un corps 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": { }
}Inclut les informations du visiteur, l'URL de la page, la localisation et l'agent utilisateur.
{
"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" }
}
}Inclut qui a ferme le chat (agent, visitor, system ou timeout), la duree en secondes, le nombre de messages et la transcription.
{
"event": "chat.closed",
"data": {
"closedBy": "agent",
"status": "closed",
"duration": 345,
"messageCount": 12,
"visitor": { "uuid": "visitor-uuid", "name": "John Doe" }
}
}Envoye lorsqu'un agent de support rejoint la conversation.
{
"event": "chat.assigned",
"data": {
"assignedTo": { "uuid": "agent-uuid", "name": "Jane Smith" },
"visitor": { "uuid": "visitor-uuid", "name": "John Doe" }
}
}Envoye lorsque le chatbot passe en mode chat en direct.
{
"event": "chat.handoff",
"data": {
"reason": "Visitor requested human support",
"fromNode": "node-id",
"visitor": { "uuid": "visitor-uuid", "name": "John Doe" }
}
}Chaque requete webhook inclut une signature pour que vous puissiez verifier qu'elle provient de Chatim. La signature est calculee comme HMAC-SHA256(secret, timestamp + "." + payload) et envoyee dans l'en-tete X-Chatim-Signature.
| En-tete | Description |
|---|---|
X-Chatim-Signature | Signature HMAC-SHA256 de la charge utile |
X-Chatim-Timestamp | Horodatage Unix du moment ou la requete a ete envoyee |
X-Chatim-Event | Le type d'evenement |
X-Chatim-Delivery-Id | Identifiant unique de livraison |
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)Si votre endpoint est indisponible ou renvoie une erreur, Chatim reessaie automatiquement.
| Tentative | Delai |
|---|---|
| 1er reessai | 1 minute |
| 2e reessai | 5 minutes |
| 3e reessai | 30 minutes |
| 4e reessai | 2 heures |
| 5e reessai | 24 heures |
Apres 5 tentatives echouees, la livraison est marquee comme echouee. Les reponses 2xx sont traitees comme un succes, 4xx comme des echecs permanents (pas de reessai), 5xx et les depassements de delai (30s) declenchent des reessais.
Si un webhook accumule 10 echecs consecutifs, il est automatiquement desactive. Vous pouvez le reactiver depuis le tableau de bord apres avoir corrige le probleme.
Cliquez sur Tester sur n'importe quel webhook pour envoyer un evenement exemple chat.started a votre URL. Cela vous permet de verifier votre endpoint avant la mise en production.
Cliquez sur un webhook pour voir les livraisons recentes avec le type d'evenement, l'horodatage, le code de statut HTTP et les messages d'erreur. L'historique est conserve pendant 30 jours.
Si votre secret de webhook est compromis, cliquez sur Regenerer le secret, sauvegardez le nouveau secret et mettez a jour votre endpoint. L'ancien secret est immediatement invalide.
Abonnez-vous a chat.form.submitted et chat.started pour creer automatiquement des contacts et des leads dans votre CRM.
Abonnez-vous a chat.assigned et chat.handoff pour alerter votre equipe quand un visiteur a besoin de support en direct.
Abonnez-vous a tous les evenements pour construire une image complete de l'engagement chat, des taux de conversion de formulaires et des temps de reponse du support.
Abonnez-vous a chat.form.submitted pour declencher des emails de bienvenue, des sequences de suivi ou des messages de confirmation.
eventId pour gerer les livraisons en doubletimestamp + "." + raw_body (pas du JSON parse)Commencer