API WebSocket Chatbot (Chat en direct)
API WebSocket
Utilisez l'API WebSocket pour le Chat en direct en temps réel : distribution instantanée des messages, indicateurs de saisie, présence, Traduction automatique et cycle de vie des sessions. Le même socket alimente les widgets pour les visiteurs et le Tableau de bord de l'agent, ce qui vous permet de créer une console d'agent personnalisée ou de piloter le Chat en direct depuis votre propre backend.
Endpoint
wss://webchatagent.com/api/livechat
L'ensemble du trafic est en JSON. Vous envoyez des événements client:*, le Serveur renvoie des événements livechat:*. Chaque message comprend un champ type.
Rôles de Connexion
Lorsque vous rejoignez la session, vous déclarez un Rôle avec le champ as :
| Rôle | Description |
|---|---|
user | Un Visiteur du Site web dans un chat. |
admin | Un agent humain gérant les sessions de Chat en direct. |
widget | Le Widget de chat intégré en mode surveillance (avant une prise en main). |
Le Rôle détermine ce que vous recevez : les clients admin obtiennent l'historique complet des messages et les événements réservés aux administrateurs, tandis que les clients user ne reçoivent que les nouveaux événements en direct (les visiteurs chargent leur propre historique via l'endpoint REST d'historique, et non via le socket).
Déroulement rapide
- Ouvrez le socket et envoyez
client:joinavec votrechatbotId,sessionIdetas. - Le Serveur répond avec
{ "type": "livechat:status", "ok": true }pour Confirmer la jonction. Les administrateurs reçoivent ensuite l'historique des messages ainsi qu'un instantané dulivechat:statusActuel. - Envoyez
client:messagepour publier un message, et recevezlivechat:messagepour chaque Nouveau message. - Envoyez
client:typinget recevezlivechat:typingpour les indicateurs de saisie. - Terminez avec
client:end, ou recevezlivechat:endedlorsque l'autre partie ferme la session.
Événements client (envoyés par vous)
client:join
Le premier événement après la Connexion. Rejoint la salle de session (et, pour les administrateurs, la salle du Chatbot).
{
"type": "client:join",
"chatbotId": "YOUR_CHATBOT_ID",
"sessionId": "SESSION_ID",
"as": "user",
"lang": "en",
"translateEnabled": true,
"retranslateBacklog": false
}
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
chatbotId | string | Oui | L'UUID de votre Chatbot. Pour un administrateur surveillant Tous les bots, la Valeur spéciale "all" permet de rejoindre sans salle spécifique. |
sessionId | string | Oui | L'ID de session du chat. |
as | string | Oui | user, admin ou widget. |
lang | string | Non | Code de Langue préféré (par exemple en, de, fr). Définit la cible de Traduction. |
translateEnabled | boolean | Non | Active la Traduction automatique pour cette session (Par défaut : activée). |
retranslateBacklog | boolean | Non | Retraduit les messages existants de l'historique dans la lang lors de la jonction (admin). |
client:message
Publie un message dans la session. Le Serveur le persiste, le traduit si l'option est activée et diffuse livechat:message.
{
"type": "client:message",
"chatbotId": "YOUR_CHATBOT_ID",
"sessionId": "SESSION_ID",
"sender": "user",
"content": "I need help with my order",
"lang": "en"
}
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
chatbotId | string | Oui | L'UUID de votre Chatbot. |
sessionId | string | Oui | L'ID de session du chat. |
sender | string | Oui | user ou admin. |
content | string | Oui | Le texte du message. Un content Vide ou manquant est ignoré. |
lang | string | Non | Indication sur la Langue du message pour la Traduction. |
Le premier message admin dans une session waiting l'ouvre (Statut → open) et insère automatiquement une notification Système "agent joined".
client:typing
Diffuse un indicateur de saisie à tous les participants de la session.
{
"type": "client:typing",
"chatbotId": "YOUR_CHATBOT_ID",
"sessionId": "SESSION_ID",
"sender": "user",
"isTyping": true
}
client:meta
Met à jour les métadonnées de session (Page actuelle) pour que les agents voient où se trouve le Visiteur.
{
"type": "client:meta",
"chatbotId": "YOUR_CHATBOT_ID",
"sessionId": "SESSION_ID",
"pageUrl": "https://example.com/pricing",
"pageTitle": "Pricing - Example",
"referrer": "https://google.com",
"browserLanguage": "en-US"
}
client:agent_takeover
L'administrateur prend proactivement la main sur une session IA (la passe à open / human). Réservé aux administrateurs.
{
"type": "client:agent_takeover",
"chatbotId": "YOUR_CHATBOT_ID",
"sessionId": "SESSION_ID"
}
client:end
Termine la session.
{
"type": "client:end",
"chatbotId": "YOUR_CHATBOT_ID",
"sessionId": "SESSION_ID",
"reason": "resolved"
}
client:widget_open / client:widget_close
Envoyé par le Widget pour enregistrer ou désenregistrer une session active pour la Visibilité de l'administrateur (c'est ce qui alimente livechat:widget_sessions).
{
"type": "client:widget_open",
"chatbotId": "YOUR_CHATBOT_ID",
"sessionId": "SESSION_ID",
"pageUrl": "https://example.com",
"pageTitle": "Home",
"browserLanguage": "en-US"
}
Événements serveur (reçus par vous)
livechat:status
Deux formats : un accusé de réception simple { "type": "livechat:status", "ok": true } et un instantané du Statut de session (ci-dessous).
{
"type": "livechat:status",
"chatbotId": "YOUR_CHATBOT_ID",
"sessionId": "SESSION_ID",
"status": "open",
"mode": "human",
"userName": "John",
"userEmail": "john@example.com",
"userLanguage": "en"
}
| Champ | Type | Description |
|---|---|---|
status | string | waiting (aucun agent pour le moment), open (agent Connecté) ou closed. |
mode | string | bot ou human. |
userName | string | null | Nom du Visiteur, s'il a été collecté via les Prospects. |
userEmail | string | null | E-mail du Visiteur, s'il a été collecté. |
userLanguage | string | null | Langue détectée du Visiteur. |
livechat:message
Un Nouveau message (ou issu de l'historique).
{
"type": "livechat:message",
"id": 1024,
"sessionId": "SESSION_ID",
"sender": "admin",
"content": "Hello! How can I help you today?",
"country": "DE",
"createdAt": "2025-01-15T10:30:00Z",
"file": null,
"audience": "admin",
"historical": false
}
| Champ | Type | Description |
|---|---|---|
id | number | ID du message (correspond à l'id de l'historique REST). |
sender | string | user, admin ou system. |
content | string | Texte du message. Pour les clients admin avec la Traduction activée, le texte est déjà traduit dans la Langue de l'administrateur. |
country | string | null | Code pays de l'expéditeur, s'il est détecté. |
createdAt | string | Horodatage ISO 8601. |
file | object | null | Métadonnées du Fichier joint (uploadId, name, mimeType, size, url, isImage) lorsque le message est un fichier importé. |
audience | string | null | "admin" sur la Copie du message destinée à l'administrateur. La Copie destinée à l'utilisateur l'omet. |
historical | boolean | true pour les messages d'historique rejoués lors de la jonction. |
Messages système : lorsque
sendervautsystem,contentest un jeton que votre client doit localiser et non afficher tel quel :__agent_joined__,__livechat_ended__ou__livechat_timeout__.
livechat:typing
Indicateur de saisie d'un autre participant : { type, chatbotId, sessionId, sender, isTyping }.
livechat:presence
Statut En ligne/Hors ligne du Visiteur dans une session : { type, chatbotId, sessionId, online } (booléen).
livechat:meta
Métadonnées de session mises à jour (Page actuelle, Titre, référent), réservé aux administrateurs.
livechat:ended
La session a été fermée.
{
"type": "livechat:ended",
"sessionId": "SESSION_ID",
"reason": "admin_closed"
}
reason prend l'une des valeurs suivantes : admin_closed, already_closed ou timeout.
Événements réservés aux administrateurs
| Événement | Payload | Objectif |
|---|---|---|
livechat:active_count | { chatbotId, count } | Sessions actives (en attente + ouvertes). |
livechat:waiting_count | { chatbotId, count } | Sessions en attente (badge pour les chats Sans réponse). |
livechat:new_request | { chatbotId, sessionId, status, mode, ... } | Un Nouveau Chat en direct nécessite un agent. |
livechat:widget_sessions | { chatbotId, chatbotName, sessions } | Liste actuelle des sessions actives du Widget. |
livechat:notification | { chatbotId, sessionId, content, sender } | Nouveau message pendant que l'agent se trouve ailleurs dans le Tableau de bord. |
Traduction automatique
Le socket peut traduire automatiquement entre les Langues du Visiteur et de l'agent :
- Rejoignez avec
translateEnabled: trueet définissezlangsur Votre langue. - Les messages de l'autre partie arrivent déjà traduits dans votre
lang. Chaque partie conserve son texte d'origine, la Copie traduite est distribuée à l'autre partie. - La Traduction s'appuie sur Gemini, ce qui permet à un agent d'échanger avec un Visiteur dans n'importe quelle Langue sans traduire manuellement.
Exemple : Client de Chat en direct personnalisé
const ws = new WebSocket('wss://webchatagent.com/api/livechat');
ws.onopen = () => {
ws.send(JSON.stringify({
type: 'client:join',
chatbotId: 'YOUR_CHATBOT_ID',
sessionId: 'SESSION_ID',
as: 'user',
lang: 'en'
}));
};
ws.onmessage = (event) => {
const data = JSON.parse(event.data);
switch (data.type) {
case 'livechat:status':
// Join ack ({ ok: true }) or a session snapshot ({ status, mode, ... })
if (data.ok) console.log('Joined');
else console.log(`Status: ${data.status}, mode: ${data.mode}`);
break;
case 'livechat:message':
if (data.sender === 'system') {
// Localize tokens like __agent_joined__ / __livechat_ended__
console.log('[system]', data.content);
} else {
console.log(`${data.sender}: ${data.content}`);
}
break;
case 'livechat:typing':
console.log(`${data.sender} is typing: ${data.isTyping}`);
break;
case 'livechat:ended':
console.log(`Session ended: ${data.reason}`);
ws.close();
break;
}
};
function sendMessage(text) {
ws.send(JSON.stringify({
type: 'client:message',
chatbotId: 'YOUR_CHATBOT_ID',
sessionId: 'SESSION_ID',
sender: 'user',
content: text,
lang: 'en'
}));
}
function sendTyping(isTyping) {
ws.send(JSON.stringify({
type: 'client:typing',
chatbotId: 'YOUR_CHATBOT_ID',
sessionId: 'SESSION_ID',
sender: 'user',
isTyping
}));
}
