Die FlowHunt JS API gibt Ihnen die volle Kontrolle darüber, wie sich Ihr Chatbot in Ihre Website integriert. Mit dem v2-Integrationscode können Sie den Chatbot einbetten, Lebenszyklus- und Interaktions-Events abonnieren, dynamische Daten über Flow-Variablen übergeben, Interaktionen mit URL-Parametern verfolgen und das Chat-Fenster programmatisch steuern.
Dieser Leitfaden behandelt jeden Aspekt der JS API mit Codebeispielen, die Sie kopieren und an Ihr Projekt anpassen können.
Integrationscode (v2)
Wenn Sie einen Chatbot in FlowHunt erstellen, erhalten Sie ein Integrations-Snippet. Kopieren Sie es und fügen Sie es in Ihr HTML direkt vor dem schließenden </body>-Tag ein:
<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>
Ersetzen Sie YOUR_CHATBOT_ID und YOUR_WORKSPACE_ID durch die Werte aus Ihrem FlowHunt-Dashboard. Die Chatbot-ID im globalen Variablennamen (window.FHChatbot_YOUR_CHATBOT_ID) verwendet Unterstriche anstelle von Bindestrichen.
Konfiguration mit setConfig() überschreiben
Bevor Sie init() aufrufen, können Sie die Standard-Chatbot-Einstellungen mit setConfig() überschreiben:
<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 initialized with custom config
});
};
if (currentScript && currentScript.parentNode) {
currentScript.parentNode.insertBefore(script, currentScript.nextSibling);
} else {
document.head.appendChild(script);
}
</script>
Verfügbare Konfigurationsoptionen
| Option | Type | Beschreibung |
|---|---|---|
headerTitle | string | Benutzerdefinierter Header-Titeltext |
maxWindowWidth | string | Maximale Breite des Chat-Fensters (z. B. '700px') |
maxWindowHeight | string | Maximale Höhe des Chat-Fensters |
inputPlaceholder | string | Platzhaltertext für das Nachrichteneingabefeld |
showChatButton | boolean | Standard-Schwebenden-Chat-Button anzeigen oder ausblenden |
openChatPanel | boolean | Chat-Panel beim Seitenaufruf automatisch öffnen |
flowVariables | object | Schlüssel-Wert-Paare mit benutzerdefinierten Daten, die an den Flow übergeben werden |
urlSuffix | string | Abfragezeichenfolge, die an alle vom Chatbot generierten URLs angehängt wird |
cookieConsent | boolean | Sitzungspersistenz über Cookies aktivieren |
embedded | string | Eingebetteten Modus aktivieren (kein Schließen-Button) |
theme | string | Designmodus |
Flow-Variablen: Dynamische Daten übergeben
Flow-Variablen ermöglichen es Ihnen, benutzerdefinierte Daten von Ihrer Website in den Chatbot-Flow zu senden. Dies ermöglicht personalisierte Gespräche basierend auf dem Benutzerkontext.
window.FHChatbot_YOUR_CHATBOT_ID.setConfig({
flowVariables: {
userId: getCurrentUserId(),
userEmail: getCurrentUserEmail(),
currentPage: window.location.pathname,
plan: 'enterprise'
}
});
Einmal festgelegt, sind diese Variablen in Ihrer Chatbot-Flow-Logik zugänglich, sodass Sie Antworten personalisieren, Gespräche weiterleiten oder Kontext an KI-Agenten übergeben können.
URL-Suffix: Chatbot-Interaktionen verfolgen
Der Parameter urlSuffix hängt eine Abfragezeichenfolge an jede vom Chatbot generierte URL an. Dies ist nützlich, um chatbot-bezogenen Traffic in Analysetools zu verfolgen:
window.FHChatbot_YOUR_CHATBOT_ID.setConfig({
urlSuffix: '?utm_source=chatbot&utm_medium=widget'
});
Anwendungsfälle:
- Konversionen verfolgen von Chatbot-Interaktionen in Google Analytics.
- Benutzerverhalten analysieren nach der Interaktion mit dem Chatbot.
- Kampagnen zuordnen, die das Chatbot-Engagement fördern.
Event-Referenz
Die FlowHunt JS API löst 10 benutzerdefinierte Events auf dem window-Objekt aus. Alle Events verwenden die CustomEvent
-API mit bubbles: true und composed: true.
onFHChatbotReady
Wird ausgelöst, wenn das Chatbot-Widget vollständig gerendert und einsatzbereit ist.
- Event-Daten: Keine
- Wann: Nachdem das Widget-DOM eingehängt und der Chat-Button sichtbar ist.
onFHChatbotSessionCreated
Wird ausgelöst, wenn eine neue Chat-Sitzung auf dem Server erstellt wird. Wird auch beim Neustart der Sitzung ausgelöst.
- Event-Daten: Keine
- Wann: Nach einem erfolgreichen API-Aufruf zur Sitzungserstellung.
onFHChatbotWindowOpened
Wird ausgelöst, wenn der Benutzer das Chat-Fenster öffnet.
- Event-Daten: Keine
- Wann: Das Chat-Panel wird sichtbar.
- Hinweis: Wird im eingebetteten Modus nicht ausgelöst.
onFHChatbotWindowClosed
Wird ausgelöst, wenn der Benutzer das Chat-Fenster schließt.
- Event-Daten: Keine
- Wann: Das Chat-Panel wird ausgeblendet.
- Hinweis: Wird im eingebetteten Modus nicht ausgelöst.
onFHMessageSent
Wird ausgelöst, wenn der Benutzer eine Nachricht sendet.
- Event-Daten (
event.detail.metadata):
{
"content": "Hello, I need help with...",
"createdAt": "2026-02-19T10:30:00.000Z"
}
onFHMessageReceived
Wird ausgelöst, wenn der Chatbot eine Antwort empfängt und anzeigt.
- Event-Daten (
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"
}
}
Das Feld sender ist optional und nur vorhanden, wenn ein menschlicher Agent beteiligt ist.
onFHFormDataSent
Wird ausgelöst, wenn der Benutzer Formulardaten über den Chatbot übermittelt.
- Event-Daten (
event.detail.metadata):
{
"objectData": { "name": "John", "email": "john@example.com" },
"createdAt": "2026-02-19T10:31:00.000Z"
}
onFHFeedback
Wird ausgelöst, wenn ein Benutzer eine Daumen-hoch- oder Daumen-runter-Bewertung zu einer Chatbot-Nachricht abgibt.
- Event-Daten (
event.detail.metadata):
{
"message_id": "msg_456",
"content": "Optional feedback text",
"feedback": "P"
}
Der Wert von feedback ist "P" für positiv (Daumen hoch) oder "N" für negativ (Daumen runter).
onFHToolCall
Wird ausgelöst, wenn ein Tool oder eine Aktion während der Flow-Verarbeitung ausgeführt wird.
- Event-Daten (
event.detail.metadata):
{
"metadata": {
"flow_id": "abc123",
"message_id": "msg_789",
"message": "Calling search API..."
},
"createdAt": "2026-02-19T10:32:00.000Z"
}
Hinweis: Wird nur in den Modi flowAssistant und flowAssistantV3 ausgelöst, nicht im Standard-Chatbot-Modus.
onFHError
Wird ausgelöst, wenn während des Chatbot-Betriebs ein Fehler auftritt.
- Event-Daten (
event.detail.metadata):
{
"metadata": {
"flow_id": "abc123",
"message_id": "msg_err",
"message": "Flow execution failed"
},
"createdAt": "2026-02-19T10:33:00.000Z"
}
Events abonnieren
Es gibt zwei Möglichkeiten, Chatbot-Events zu abonnieren.
Methode 1: Window-Event-Listener
Verwenden Sie window.addEventListener überall auf Ihrer Seite. Dies funktioniert auch, bevor der Chatbot geladen wurde:
<script>
document.addEventListener('DOMContentLoaded', function() {
// Chatbot lifecycle events
window.addEventListener('onFHChatbotReady', function(event) {
console.log('Chatbot is ready');
});
window.addEventListener('onFHChatbotSessionCreated', function(event) {
console.log('Session created');
});
window.addEventListener('onFHChatbotWindowOpened', function(event) {
console.log('Chat window opened');
});
window.addEventListener('onFHChatbotWindowClosed', function(event) {
console.log('Chat window closed');
});
// Message events
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);
});
// Feedback
window.addEventListener('onFHFeedback', function(event) {
var feedback = event.detail.metadata;
console.log('Feedback on message', feedback.message_id, ':',
feedback.feedback);
});
// Tool calls (flowAssistant modes only)
window.addEventListener('onFHToolCall', function(event) {
console.log('Tool called:', event.detail.metadata);
});
// Errors
window.addEventListener('onFHError', function(event) {
console.error('Chatbot error:', event.detail.metadata);
});
});
</script>
Um ein Event nicht mehr abzuhören, verwenden Sie removeEventListener mit derselben Funktionsreferenz:
var handleMessage = function(event) {
console.log(event.detail.metadata);
};
window.addEventListener('onFHMessageReceived', handleMessage);
// Later, when you want to stop listening:
window.removeEventListener('onFHMessageReceived', handleMessage);
Methode 2: Manager-Callback-Methoden
Innerhalb des init()-Callbacks verwenden Sie die integrierten Methoden des Chatbot-Managers:
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);
});
});
Referenz der Manager-Methoden
| Method | Parameters | Beschreibung |
|---|---|---|
onSessionCreated(fn) | fn: () => void | Auf Sitzungserstellung lauschen |
onWindowOpened(fn) | fn: () => void | Auf Fensteröffnung lauschen |
onWindowClosed(fn) | fn: () => void | Auf Fensterschließung lauschen |
onMessageSent(fn) | fn: (event) => void | Auf Benutzernachrichten lauschen |
onMessageReceived(fn) | fn: (event) => void | Auf Bot-Antworten lauschen |
onFormDataSent(fn) | fn: (event) => void | Auf Formularübermittlungen lauschen |
onFeedback(fn) | fn: (event) => void | Auf Benutzerfeedback lauschen |
onToolCall(fn) | fn: (event) => void | Auf Tool-Ausführungen lauschen |
onError(fn) | fn: (event) => void | Auf Fehler lauschen |
openChat() | — | Öffnet das Chat-Panel |
closeChat() | — | Schließt das Chat-Panel |
Benutzerdefinierte Chat-Aktivierung: Button ausblenden und bei Klick öffnen
Um vollständig zu kontrollieren, wann der Chatbot erscheint, blenden Sie den standardmäßigen schwebenden Button aus und öffnen Sie den Chat programmatisch — zum Beispiel über Ihren eigenen benutzerdefinierten Button.
Vollständiges Beispiel
<!-- Your custom chat button -->
<button id="my-chat-button">Chat with us</button>
<!-- FlowHunt integration with hidden default 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) {
// Open chat when your custom button is clicked
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>
Benutzerdefinierten Button erst anzeigen, wenn der Chatbot bereit ist
Sie können die versteckte Aktivierung mit Event-Listenern kombinieren, um erweiterte Interaktionen zu erstellen:
<button id="open-chat" style="display:none;">Need help?</button>
<script>
// Show a custom button only when the chatbot is ready
window.addEventListener('onFHChatbotReady', function() {
document.getElementById('open-chat').style.display = 'block';
});
</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
});
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>
Vollständiges Integrationsbeispiel
Ein vollständiges Arbeitsbeispiel, das Konfigurationsüberschreibungen, Event-Tracking und benutzerdefinierte Chat-Aktivierung zusammen demonstriert:
<!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() {
console.log('New chat session started');
});
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('onFHFeedback', function(event) {
var fb = event.detail.metadata;
if (fb.feedback === 'P') {
console.log('Positive feedback on message', fb.message_id);
} else {
console.log('Negative feedback on message', fb.message_id);
}
});
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',
page: window.location.pathname
},
urlSuffix: '?utm_source=chatbot'
});
window.FHChatbot_YOUR_CHATBOT_ID.init(function(chatbotManager) {
document.getElementById('open-chat-btn')
.addEventListener('click', function() {
chatbotManager.openChat();
});
document.getElementById('close-chat-btn')
.addEventListener('click', function() {
chatbotManager.closeChat();
});
});
};
if (currentScript && currentScript.parentNode) {
currentScript.parentNode.insertBefore(script, currentScript.nextSibling);
} else {
document.head.appendChild(script);
}
</script>
</body>
</html>

