
Comment intégrer
Apprenez à connecter FlowHunt avec des dizaines d'intégrations natives. Un guide étape par étape pour configurer des intégrations dans FlowHunt.

Référence complète pour l’intégration de FlowHunt JS API v2. Intégrez le chatbot, abonnez-vous aux 11 événements, utilisez les variables de flux, déclenchez le trigger Chat Hook en cours de conversation avec sendHook(), suivez les interactions avec les paramètres URL et contrôlez la fenêtre de chat par programmation.
La FlowHunt JS API vous donne un contrôle total sur la façon dont votre chatbot s’intègre à votre site web. En utilisant le code d’intégration v2, vous pouvez intégrer le chatbot, vous abonner aux événements de cycle de vie et d’interaction, transmettre des données dynamiques via des variables de flux, déclencher le trigger Chat Hook en cours de conversation avec sendHook(), suivre les interactions avec des paramètres URL et contrôler la fenêtre de chat par programmation.
Ce guide couvre tous les aspects de la JS API avec des exemples de code que vous pouvez copier et adapter à votre projet.
Copiez et collez l’extrait ci-dessous dans votre HTML juste avant la balise fermante </body>. Remplacez YOUR_CHATBOT_ID et YOUR_WORKSPACE_ID par les valeurs de vos paramètres de chatbot FlowHunt.
<script id="fh-chatbot-script-YOUR_CHATBOT_ID">
var currentScript = document.currentScript
|| document.getElementById('fh-chatbot-script-YOUR_CHATBOT_ID');
var script = document.createElement('script');
script.async = true;
script.src = 'https://app.flowhunt.io/api/chatbot/YOUR_CHATBOT_ID'
+ '?workspace_id=YOUR_WORKSPACE_ID&v=2';
script.onload = function () {
window.FHChatbot_YOUR_CHATBOT_ID.init(function (chatbotManager) {
// The chatbot is ready — use chatbotManager here
});
};
if (currentScript && currentScript.parentNode) {
currentScript.parentNode.insertBefore(script, currentScript.nextSibling);
} else {
document.head.appendChild(script);
}
</script>
L’ID du chatbot dans le nom de la variable globale (window.FHChatbot_YOUR_CHATBOT_ID) utilise des underscores au lieu de tirets.
setConfig()Avant d’appeler init(), vous pouvez remplacer les paramètres par défaut du chatbot en utilisant setConfig() :
<script id="fh-chatbot-script-YOUR_CHATBOT_ID">
var currentScript = document.currentScript
|| document.getElementById('fh-chatbot-script-YOUR_CHATBOT_ID');
var script = document.createElement('script');
script.async = true;
script.src = 'https://app.flowhunt.io/api/chatbot/YOUR_CHATBOT_ID'
+ '?workspace_id=YOUR_WORKSPACE_ID&v=2';
script.onload = function () {
window.FHChatbot_YOUR_CHATBOT_ID.setConfig({
headerTitle: 'Support Assistant',
maxWindowWidth: '700px',
showChatButton: false,
flowVariables: {
userId: '12345',
plan: 'enterprise',
},
urlSuffix: '?utm_source=chatbot',
});
window.FHChatbot_YOUR_CHATBOT_ID.init(function (chatbotManager) {
// Chatbot initialised with custom config
});
};
if (currentScript && currentScript.parentNode) {
currentScript.parentNode.insertBefore(script, currentScript.nextSibling);
} else {
document.head.appendChild(script);
}
</script>
| Option | Type | Description |
|---|---|---|
headerTitle | string | Texte personnalisé du titre de l’en-tête |
maxWindowWidth | string | Largeur maximale de la fenêtre de chat (par exemple, "700px") |
maxWindowHeight | string | Hauteur maximale de la fenêtre de chat |
inputPlaceholder | string | Texte d’espace réservé pour le champ de saisie des messages |
showChatButton | boolean | Afficher ou masquer le bouton de chat flottant par défaut |
openChatPanel | boolean | Ouvrir automatiquement le panneau de chat au chargement de la page |
flowVariables | object | Paires clé-valeur de données personnalisées transmises au flux. Les valeurs peuvent être de tout type sérialisable en JSON (chaîne, nombre, booléen, objet, tableau). |
urlSuffix | string | Chaîne de requête ajoutée à toutes les URL générées par le chatbot |
cookieConsent | boolean | Activer la persistance de session via les cookies |
embedded | string | Activer le mode intégré (pas de bouton de fermeture) |
theme | string | Mode de thème |
Les flowVariables sont fusionnées dans chaque session créée par le chatbot. Elles sont généralement utilisées comme contexte statique (connu au chargement de la page) : l’ID de l’utilisateur, son plan, la locale courante, etc.
window.FHChatbot_YOUR_CHATBOT_ID.setConfig({
flowVariables: {
userId: getCurrentUserId(),
userEmail: getCurrentUserEmail(),
currentPage: window.location.pathname,
plan: 'enterprise',
},
});
Si l’utilisateur navigue après l’ouverture du chat, les valeurs transmises ici deviennent obsolètes. Pour les mettre à jour en cours de conversation, appelez
chatbotManager.sendHook()avecoptions.flowVariables— voir Communication hôte → flux en cours de conversation ci-dessous.
Le paramètre urlSuffix ajoute une chaîne de requête à chaque URL générée par le chatbot. Ceci est utile pour suivre le trafic provenant du chatbot dans les outils d’analyse :
window.FHChatbot_YOUR_CHATBOT_ID.setConfig({
urlSuffix: '?utm_source=chatbot&utm_medium=widget',
});
Cas d’utilisation :
Ajouté en avril 2026 dans le cadre de la fonctionnalité FlowHunt Chat Hook.
Dans les applications monopage (SPA), la fenêtre de chat reste généralement ouverte pendant que l’utilisateur navigue entre les écrans. Une fois le chat lancé, les flowVariables transmises via setConfig() deviennent obsolètes, et il n’existe aucun moyen de signaler au flux qu’un événement s’est produit sur la page hôte. Une seule méthode du gestionnaire — sendHook(name, payload, options?) — couvre à la fois les cas d’usage « déclencher un trigger » et « simplement mettre à jour le contexte » :
name et (en option) un payload pour déclencher le trigger Chat Hook du flux. L’auteur du flux place un seul nœud Chat Hook sur le canevas et branche sur {ChatHook.hook_name} pour décider de l’action à effectuer.options.flowVariables pour fusionner les variables de session en même temps — les valeurs sont persistées avant que le trigger ne se déclenche et restent disponibles pour le reste de la session.options.flowVariables est tout de même fusionné, mais aucun trigger ne s’exécute et aucun crédit n’est facturé. Cela signifie que les pages hôtes peuvent appeler sendHook() de manière optimiste sans savoir si l’auteur du flux a déjà relié un trigger.sendHook() est un no-op sûr avant l’existence de la session (mis en mémoire tampon en interne et envoyé une fois la session créée) et ne lève jamais d’exception vers la page hôte — les erreurs réseau sont uniquement enregistrées via console.warn.
Bornes côté serveur et côté client qui s’appliquent à sendHook(). Les enfreindre n’est pas un crash — le backend renvoie HTTP 422 et le gestionnaire enregistre via console.warn sans lever d’exception.
| Contrainte | Limite | Application | En cas de violation |
|---|---|---|---|
Longueur de name pour sendHook | 1–256 car. | Backend (Pydantic) | HTTP 422, le trigger ne se déclenche pas |
Nombre de clés dans options.flowVariables | ≤ 64 | Backend (Pydantic) | HTTP 422, rien n’est persisté |
Longueur de chaque clé dans options.flowVariables | ≤ 128 car. | Backend (Pydantic) | HTTP 422, rien n’est persisté |
| Appels pré-session mis en tampon par le gestionnaire | 50 | Widget (navigateur) | L’appel le plus ancien est supprimé et un console.warn est enregistré |
Le plafond du tampon pré-session ne compte que sur les pages où la création de session échoue indéfiniment (par exemple, une erreur réseau permanente). Dans des conditions normales, la file d’attente est vidée dès que onFHChatbotSessionCreated se déclenche.
onFHError).hook_name, payload, flow_variables) aux étapes en aval que vous souhaitez déclencher (Generator, Chat Output, Tool Calls, branches conditionnelles sur hook_name, etc.).Le name que la page hôte transmet à sendHook() est une étiquette sur laquelle votre flux peut brancher, et non une clé de routage — le backend ne fait pas correspondre les noms aux nœuds. À la place, l’unique trigger Chat Hook du flux se déclenche et expose le nom comme {ChatHook.hook_name}, que vous référencez dans la logique de votre flux pour décider de l’action à effectuer.
Exemple de prompt système :
If {ChatHook.hook_name} is "screen_changed", briefly summarise the page at
{ChatHook.payload.url}. If it is "user_action", acknowledge the action and
update memory. Otherwise, continue the conversation normally.
Pour un routage plus complexe, reliez une étape conditionnelle sur {ChatHook.hook_name} et créez plusieurs chemins en aval.
chatbotManager.sendHook(name, payload, options?)chatbotManager.sendHook(
name: string,
payload?: Record<string, unknown>,
options?: { flowVariables?: Record<string, unknown> }
): Promise<void>;
Arguments
| Argument | Type | Requis | Description |
|---|---|---|---|
name | string | oui | Étiquette transmise au flux comme {ChatHook.hook_name}. Le trigger se déclenche quelle que soit la valeur ; la logique de votre flux branche dessus. |
payload | object | non | Payload JSON remis au trigger comme {ChatHook.payload}. Validé par rapport au schéma du nœud si activé. Par défaut {}. |
options.flowVariables | object | non | Variables de session à fusionner avant que le trigger ne se déclenche. Disponibles pour les étapes en aval et les futurs messages utilisateur. |
Comportement
onFHChatbotSessionCreated est sûr ; l’appel est mis en mémoire tampon et envoyé une fois la session créée. Le tampon est plafonné — voir Limites d’entrée ci-dessus.sendHook() de manière optimiste avant que l’auteur du flux ne relie un trigger. options.flowVariables est tout de même persisté dans ce cas, donc le même appel sert également de mise à jour contextuelle uniquement.onFHError).name et options.flowVariables sont bornés — voir Limites d’entrée ci-dessus. Les violations renvoient HTTP 422 et rien n’est persisté.onFHChatbotFlowVariablesUpdate si options.flowVariables a été fourni (voir Référence des événements).console.warn.Exemple — suggestion proactive lors d’une navigation SPA
window.FHChatbot_YOUR_CHATBOT_ID.init(function (chatbotManager) {
window.addEventListener('hashchange', function () {
chatbotManager.sendHook('screen_changed', {
url: window.location.href,
screen_name: getScreenName(),
}, {
flowVariables: { current_page_url: window.location.href },
});
});
});
Exemple — mise à jour contextuelle uniquement (pas de Chat Hook relié)
Si le flux n’a pas de trigger Chat Hook, l’appel est un 200 silencieux — la même API peut donc maintenir flow_variables à jour sans rien déclencher :
window.FHChatbot_YOUR_CHATBOT_ID.init(function (chatbotManager) {
window.addEventListener('hashchange', function () {
chatbotManager.sendHook('navigate', {}, {
flowVariables: {
current_page_url: window.location.href,
screen_name: getScreenName(),
},
});
});
});
{ChatHook.hook_name} et {ChatHook.payload.foo} — les valeurs transmises via sendHook('x', { foo: 1 }) sont exposées sur le chemin d’exécution du trigger Chat Hook. Disponibles uniquement sur le chemin lancé par le déclenchement du hook.{flow_variables.foo} — les valeurs transmises via options.flowVariables sont fusionnées dans le sac de variables de la session avant que le trigger ne se déclenche. Chaque chemin d’exécution (y compris les messages utilisateur normaux déclenchés par Chat Input) peut les lire.Si vous voulez que le prochain message utilisateur voie une nouvelle valeur, placez-la dans options.flowVariables — le payload seul n’affecte que l’exécution lancée par ce hook.
La FlowHunt JS API envoie 11 événements personnalisés sur l’objet window. Tous les événements utilisent l’API CustomEvent
avec bubbles: true et composed: true.
onFHChatbotReadyDéclenché lorsque le widget du chatbot est entièrement rendu et prêt à être utilisé.
onFHChatbotSessionCreatedDéclenché lorsqu’une nouvelle session de chat est créée sur le serveur.
event.detail.sessionId — l’ID de la session nouvellement créée.onFHChatbotWindowOpenedDéclenché lorsque l’utilisateur ouvre la fenêtre de chat. Non déclenché en mode intégré.
onFHChatbotWindowClosedDéclenché lorsque l’utilisateur ferme la fenêtre de chat. Non déclenché en mode intégré.
onFHMessageSentDéclenché lorsque l’utilisateur envoie un message.
event.detail.metadata = {
content: 'Hello, I need help with...',
createdAt: '2026-02-19T10:30:00.000Z',
};
onFHMessageReceivedDéclenché lorsque le chatbot reçoit et affiche une réponse.
event.detail.metadata = {
flow_id: 'abc123',
message_id: 'msg_456',
message: 'Sure, I can help you with that!',
sender: {
sender_name: 'Support Agent',
sender_avatar: 'https://example.com/avatar.png',
},
};
sender est optionnel et n’est présent que lorsqu’un agent humain est impliqué.
onFHFormDataSentDéclenché lorsque l’utilisateur soumet des données de formulaire via le chatbot.
event.detail.metadata = {
objectData: { name: 'John', email: 'john@example.com' },
createdAt: '2026-02-19T10:31:00.000Z',
};
onFHFeedbackDéclenché lorsqu’un utilisateur donne un avis positif ou négatif (pouce en haut / pouce en bas) sur un message du chatbot.
event.detail.metadata = {
message_id: 'msg_456',
content: 'Optional feedback text',
feedback: 'P', // 'P' = positive, 'N' = negative
};
onFHToolCallDéclenché lorsqu’un outil ou une action est exécuté pendant le traitement du flux. Déclenché uniquement dans les modes flowAssistant et flowAssistantV3.
event.detail.metadata = {
metadata: {
flow_id: 'abc123',
message_id: 'msg_789',
message: 'Calling search API...',
},
createdAt: '2026-02-19T10:32:00.000Z',
};
onFHErrorDéclenché lorsqu’une erreur survient pendant le fonctionnement du chatbot.
event.detail.metadata = {
metadata: {
flow_id: 'abc123',
message_id: 'msg_err',
message: 'Flow execution failed',
},
createdAt: '2026-02-19T10:33:00.000Z',
};
onFHChatbotFlowVariablesUpdateAjouté en avril 2026.
Déclenché après un appel chatbotManager.sendHook(...) réussi qui a fourni options.flowVariables. Non déclenché pour les appels sendHook() qui omettent flowVariables.
event.detail = {
variables: {
current_page_url: 'https://example.com/products',
screen_name: 'products',
},
};
Utilisez-le pour observer les variables fusionnées (par exemple pour synchroniser votre propre état côté hôte, pour le débogage, ou pour re-rendre un élément d’interface qui dépend des mêmes données).
Il existe deux façons de s’abonner aux événements du chatbot.
Utilisez window.addEventListener n’importe où dans votre page. Cela fonctionne même avant le chargement du chatbot :
<script>
document.addEventListener('DOMContentLoaded', function () {
window.addEventListener('onFHChatbotReady', function () {
console.log('Chatbot is ready');
});
window.addEventListener('onFHChatbotSessionCreated', function (event) {
console.log('Session created:', event.detail.sessionId);
});
window.addEventListener('onFHChatbotWindowOpened', function () {
console.log('Chat window opened');
});
window.addEventListener('onFHChatbotWindowClosed', function () {
console.log('Chat window closed');
});
window.addEventListener('onFHMessageSent', function (event) {
console.log('User sent:', event.detail.metadata.content);
});
window.addEventListener('onFHMessageReceived', function (event) {
console.log('Bot replied:', event.detail.metadata.message);
});
window.addEventListener('onFHFormDataSent', function (event) {
console.log('Form submitted:', event.detail.metadata.objectData);
});
window.addEventListener('onFHFeedback', function (event) {
var fb = event.detail.metadata;
console.log('Feedback on message', fb.message_id, ':', fb.feedback);
});
window.addEventListener('onFHToolCall', function (event) {
console.log('Tool called:', event.detail.metadata);
});
window.addEventListener('onFHError', function (event) {
console.error('Chatbot error:', event.detail.metadata);
});
window.addEventListener('onFHChatbotFlowVariablesUpdate', function (event) {
console.log('Variables merged:', event.detail.variables);
});
});
</script>
Pour supprimer un écouteur, conservez la référence du gestionnaire :
var handleMessage = function (event) {
console.log(event.detail.metadata);
};
window.addEventListener('onFHMessageReceived', handleMessage);
// Later …
window.removeEventListener('onFHMessageReceived', handleMessage);
À l’intérieur du callback init(), utilisez les méthodes intégrées du gestionnaire de chatbot :
window.FHChatbot_YOUR_CHATBOT_ID.init(function (chatbotManager) {
chatbotManager.onSessionCreated(function () {
console.log('Session created');
});
chatbotManager.onWindowOpened(function () {
console.log('Window opened');
});
chatbotManager.onWindowClosed(function () {
console.log('Window closed');
});
chatbotManager.onMessageSent(function (event) {
console.log('User sent:', event.metadata);
});
chatbotManager.onMessageReceived(function (event) {
console.log('Bot replied:', event.metadata);
});
chatbotManager.onFormDataSent(function (event) {
console.log('Form data:', event.metadata);
});
chatbotManager.onFeedback(function (event) {
console.log('Feedback:', event.metadata);
});
chatbotManager.onToolCall(function (event) {
console.log('Tool call:', event.metadata);
});
chatbotManager.onError(function (event) {
console.error('Error:', event.metadata);
});
});
| Méthode | Paramètres | Description |
|---|---|---|
onSessionCreated(fn) | fn: () => void | Écouter la création de session |
onWindowOpened(fn) | fn: () => void | Écouter l’ouverture de la fenêtre |
onWindowClosed(fn) | fn: () => void | Écouter la fermeture de la fenêtre |
onMessageSent(fn) | fn: (event) => void | Écouter les messages de l’utilisateur |
onMessageReceived(fn) | fn: (event) => void | Écouter les réponses du bot |
onFormDataSent(fn) | fn: (event) => void | Écouter les soumissions de formulaires |
onFeedback(fn) | fn: (event) => void | Écouter les retours de l’utilisateur |
onToolCall(fn) | fn: (event) => void | Écouter les exécutions d’outils |
onError(fn) | fn: (event) => void | Écouter les erreurs |
openChat() | — | Ouvrir le panneau de chat |
closeChat() | — | Fermer le panneau de chat |
sendHook(name, payload?, options?) (nouveau) | name: string, payload?: object, options?: { flowVariables?: object } | Déclencher le trigger Chat Hook dans le flux en cours d’exécution (ou fusionner silencieusement options.flowVariables si aucun trigger n’est relié) |
Pour contrôler entièrement quand le chatbot apparaît, masquez le bouton flottant par défaut et ouvrez le chat par programmation — par exemple, depuis votre propre bouton personnalisé.
<button id="my-chat-button">Chat with us</button>
<script id="fh-chatbot-script-YOUR_CHATBOT_ID">
var currentScript = document.currentScript
|| document.getElementById('fh-chatbot-script-YOUR_CHATBOT_ID');
var script = document.createElement('script');
script.async = true;
script.src = 'https://app.flowhunt.io/api/chatbot/YOUR_CHATBOT_ID'
+ '?workspace_id=YOUR_WORKSPACE_ID&v=2';
script.onload = function () {
window.FHChatbot_YOUR_CHATBOT_ID.setConfig({ showChatButton: false });
window.FHChatbot_YOUR_CHATBOT_ID.init(function (chatbotManager) {
document.getElementById('my-chat-button')
.addEventListener('click', function () {
chatbotManager.openChat();
});
});
};
if (currentScript && currentScript.parentNode) {
currentScript.parentNode.insertBefore(script, currentScript.nextSibling);
} else {
document.head.appendChild(script);
}
</script>
Vous pouvez combiner l’activation masquée avec des écouteurs d’événements pour créer des interactions avancées :
<button id="open-chat" style="display:none;">Need help?</button>
<script>
window.addEventListener('onFHChatbotReady', function () {
document.getElementById('open-chat').style.display = 'block';
});
</script>
<script id="fh-chatbot-script-YOUR_CHATBOT_ID">
var currentScript = document.currentScript
|| document.getElementById('fh-chatbot-script-YOUR_CHATBOT_ID');
var script = document.createElement('script');
script.async = true;
script.src = 'https://app.flowhunt.io/api/chatbot/YOUR_CHATBOT_ID'
+ '?workspace_id=YOUR_WORKSPACE_ID&v=2';
script.onload = function () {
window.FHChatbot_YOUR_CHATBOT_ID.setConfig({ showChatButton: false });
window.FHChatbot_YOUR_CHATBOT_ID.init(function (chatbotManager) {
document.getElementById('open-chat')
.addEventListener('click', function () {
chatbotManager.openChat();
});
});
};
if (currentScript && currentScript.parentNode) {
currentScript.parentNode.insertBefore(script, currentScript.nextSibling);
} else {
document.head.appendChild(script);
}
</script>
Un exemple fonctionnel complet qui démontre les remplacements de configuration, le suivi des événements, l’activation personnalisée du chat et la nouvelle méthode sendHook() ensemble :
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>FlowHunt Chatbot Integration</title>
</head>
<body>
<h1>My Website</h1>
<button id="open-chat-btn">Talk to our AI assistant</button>
<button id="close-chat-btn">Close chat</button>
<!-- Subscribe to events before the chatbot loads -->
<script>
document.addEventListener('DOMContentLoaded', function () {
window.addEventListener('onFHChatbotReady', function () {
console.log('Chatbot widget is ready');
});
window.addEventListener('onFHChatbotSessionCreated', function (event) {
console.log('New chat session started:', event.detail.sessionId);
});
window.addEventListener('onFHMessageSent', function (event) {
console.log('User message:', event.detail.metadata.content);
});
window.addEventListener('onFHMessageReceived', function (event) {
console.log('Bot response:', event.detail.metadata.message);
});
window.addEventListener('onFHChatbotFlowVariablesUpdate', function (event) {
console.log('Context updated:', event.detail.variables);
});
window.addEventListener('onFHError', function (event) {
console.error('Chatbot error:', event.detail.metadata);
});
});
</script>
<!-- FlowHunt integration -->
<script id="fh-chatbot-script-YOUR_CHATBOT_ID">
var currentScript = document.currentScript
|| document.getElementById('fh-chatbot-script-YOUR_CHATBOT_ID');
var script = document.createElement('script');
script.async = true;
script.src = 'https://app.flowhunt.io/api/chatbot/YOUR_CHATBOT_ID'
+ '?workspace_id=YOUR_WORKSPACE_ID&v=2';
script.onload = function () {
window.FHChatbot_YOUR_CHATBOT_ID.setConfig({
showChatButton: false,
headerTitle: 'AI Assistant',
maxWindowWidth: '600px',
flowVariables: {
source: 'website',
current_page_url: window.location.href,
},
urlSuffix: '?utm_source=chatbot',
});
window.FHChatbot_YOUR_CHATBOT_ID.init(function (chatbotManager) {
// Open / close from custom buttons
document.getElementById('open-chat-btn')
.addEventListener('click', function () {
chatbotManager.openChat();
});
document.getElementById('close-chat-btn')
.addEventListener('click', function () {
chatbotManager.closeChat();
});
// Keep the flow's context in sync with SPA navigation and
// optionally fire the Chat Hook trigger (if the flow has one wired).
// If the flow has no Chat Hook, the call is a silent 200 — the
// flow_variables still get merged, so the same line covers both
// "notify the flow" and "just update context".
window.addEventListener('hashchange', function () {
chatbotManager.sendHook('screen_changed', {
url: window.location.href,
}, {
flowVariables: { current_page_url: window.location.href },
});
});
});
};
if (currentScript && currentScript.parentNode) {
currentScript.parentNode.insertBefore(script, currentScript.nextSibling);
} else {
document.head.appendChild(script);
}
</script>
</body>
</html>

Apprenez à connecter FlowHunt avec des dizaines d'intégrations natives. Un guide étape par étape pour configurer des intégrations dans FlowHunt.

Un guide complet pour configurer les messages de bienvenue du chatbot et comprendre l'expérience d’onboarding FlowHunt pour les nouveaux utilisateurs, incluant ...

Nouveau sur FlowHunt? Commencez ici. Apprenez les bases de la construction de flux d'IA, du déploiement de chatbots et de la connexion de sources de connaissanc...
Consentement aux Cookies
Nous utilisons des cookies pour améliorer votre expérience de navigation et analyser notre trafic. See our privacy policy.