
Sådan forbinder du FlowHunt-chatbots til realtids lager- og leverings-API'er
Lær, hvordan du gør din FlowHunt-chatbot i stand til at besvare kundespørgsmål om produkt-tilgængelighed og ordreleveringsstatus ved at integrere med realtids-A...

Komplet reference for FlowHunt JS API v2-integration. Integrér chatbotten, abonnér på alle 11 events, brug flow-variabler, udløs Chat Hook-triggeren midt i en samtale med sendHook(), spor interaktioner med URL-parametre, og styr chatvinduet programmatisk.
FlowHunt JS API giver dig fuld kontrol over, hvordan din chatbot integreres med din hjemmeside. Ved hjælp af v2-integrationskoden kan du integrere chatbotten, abonnere på livscyklus- og interaktionsevents, sende dynamiske data via flow-variabler, udløse Chat Hook-triggeren midt i en samtale med sendHook(), spore interaktioner med URL-parametre og programmatisk styre chatvinduet.
Denne vejledning dækker alle aspekter af JS API med kodeeksempler, du kan kopiere og tilpasse til dit projekt.
Kopiér og indsæt nedenstående snippet i din HTML lige før den afsluttende </body>-tag. Erstat YOUR_CHATBOT_ID og YOUR_WORKSPACE_ID med værdierne fra dine FlowHunt-chatbotindstillinger.
<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>
Chatbot-ID’et i det globale variabelnavn (window.FHChatbot_YOUR_CHATBOT_ID) bruger underscores i stedet for bindestreger.
setConfig()Før du kalder init(), kan du tilsidesætte standardindstillingerne for chatbotten ved hjælp af 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 | Beskrivelse |
|---|---|---|
headerTitle | string | Brugerdefineret overskriftstekst |
maxWindowWidth | string | Maksimal bredde på chatvinduet (f.eks. "700px") |
maxWindowHeight | string | Maksimal højde på chatvinduet |
inputPlaceholder | string | Pladsholdertekst til beskedindtastningsfeltet |
showChatButton | boolean | Vis eller skjul den flydende standardchatknap |
openChatPanel | boolean | Åbn chatpanelet automatisk ved sideindlæsning |
flowVariables | object | Nøgle-værdi-par med brugerdefinerede data, der sendes til flowet. Værdier kan være enhver JSON-serialiserbar type (string, tal, boolean, object, array). |
urlSuffix | string | Forespørgselsstreng tilføjet til alle chatbot-genererede URL’er |
cookieConsent | boolean | Aktivér sessionspersistens via cookies |
embedded | string | Indstil for at aktivere indlejret tilstand (ingen lukkeknap) |
theme | string | Tematilstand |
flowVariables flettes ind i hver session, chatbotten opretter. De bruges typisk som statisk kontekst (kendt ved sideindlæsning): brugerens ID, plan, aktuelle sprog osv.
window.FHChatbot_YOUR_CHATBOT_ID.setConfig({
flowVariables: {
userId: getCurrentUserId(),
userEmail: getCurrentUserEmail(),
currentPage: window.location.pathname,
plan: 'enterprise',
},
});
Hvis brugeren navigerer, efter chatten er åbnet, bliver værdier sendt her forældede. For at opdatere dem midt i en samtale skal du kalde
chatbotManager.sendHook()medoptions.flowVariables— se Kommunikation fra host til flow midt i samtalen nedenfor.
Parameteren urlSuffix tilføjer en forespørgselsstreng til hver URL genereret af chatbotten. Dette er nyttigt til at spore chatbot-afledt trafik i analyseværktøjer:
window.FHChatbot_YOUR_CHATBOT_ID.setConfig({
urlSuffix: '?utm_source=chatbot&utm_medium=widget',
});
Anvendelsesscenarier:
Tilføjet i april 2026 som en del af FlowHunt Chat Hook-funktionen.
I single-page-applikationer forbliver chatvinduet typisk åbent, mens brugeren navigerer mellem skærme. Når chatten først kører, bliver flowVariables sendt via setConfig() forældede, og der er ingen måde at give flowet et hint om noget, der er sket på host-siden. En enkelt manager-metode — sendHook(name, payload, options?) — dækker både “udløs en trigger”- og “opdatér blot konteksten”-scenarier:
name og (valgfrit) en payload for at udløse flowets Chat Hook-trigger. Flow-forfatteren placerer én Chat Hook-node på canvas og forgrener på {ChatHook.hook_name} for at beslutte, hvad der skal gøres.options.flowVariables for at flette session-variabler ind på samme tid — værdierne bevares, før triggeren udløses, og forbliver tilgængelige for resten af sessionen.options.flowVariables flettes stadig ind, men ingen trigger kører, og ingen credits trækkes. Det betyder, at host-sider kan kalde sendHook() optimistisk uden at vide, om flow-forfatteren allerede har forbundet en trigger.sendHook() er en sikker no-op, før sessionen findes (bufret internt og frigivet, når sessionen er oprettet) og kaster aldrig til host-siden — netværksfejl logges kun via console.warn.
Server- og klientsidegrænser, der gælder for sendHook(). Overtrædelse er ikke et nedbrud — backend returnerer HTTP 422, og manageren logger via console.warn uden at kaste.
| Begrænsning | Grænse | Hvor håndhævet | Ved overtrædelse |
|---|---|---|---|
sendHook name-længde | 1–256 tegn | Backend (Pydantic) | HTTP 422, trigger udløses ikke |
Antal nøgler i options.flowVariables | ≤ 64 | Backend (Pydantic) | HTTP 422, intet bevares |
Længde af hver nøgle i options.flowVariables | ≤ 128 tegn | Backend (Pydantic) | HTTP 422, intet bevares |
| Pre-session-kald bufret af manageren | 50 | Widget (i browseren) | Ældste kø-kald droppes, og en console.warn logges |
Pre-session-bufferens loft har kun betydning på sider, hvor sessionsoprettelse mislykkes på ubestemt tid (f.eks. en permanent netværksfejl). Under normale forhold tømmes køen, så snart onFHChatbotSessionCreated udløses.
onFHError).hook_name, payload, flow_variables) til de downstream-trin, du vil udløse (Generator, Chat Output, Tool Calls, betingede grene på hook_name osv.).Det name, host-siden sender til sendHook(), er en etiket, dit flow kan forgrene på, ikke en routing-nøgle — backend matcher ikke navne mod noder. I stedet udløses flowets enkelte Chat Hook-trigger og eksponerer navnet som {ChatHook.hook_name}, som du refererer i din flow-logik for at beslutte, hvad der skal gøres.
Eksempel på system-prompt:
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.
For mere kompleks routing kan du forbinde et betinget trin til {ChatHook.hook_name} og forgrene til flere downstream-stier.
chatbotManager.sendHook(name, payload, options?)chatbotManager.sendHook(
name: string,
payload?: Record<string, unknown>,
options?: { flowVariables?: Record<string, unknown> }
): Promise<void>;
Argumenter
| Argument | Type | Påkrævet | Beskrivelse |
|---|---|---|---|
name | string | ja | Etiket videresendt til flowet som {ChatHook.hook_name}. Triggeren udløses uanset værdien; din flow-logik forgrener på den. |
payload | object | nej | JSON-payload givet til triggeren som {ChatHook.payload}. Valideret mod nodens schema, hvis aktiveret. Standard {}. |
options.flowVariables | object | nej | Session-variabler, der flettes før triggeren udløses. Tilgængelige for downstream-trin og fremtidige brugerbeskeder. |
Adfærd
onFHChatbotSessionCreated; kaldet bufres og frigives, når sessionen findes. Bufferen har en grænse — se Inputgrænser ovenfor.sendHook() optimistisk, før flow-forfatteren forbinder en trigger. options.flowVariables bevares stadig i dette tilfælde, så det samme kald fungerer som en kontekstopdatering alene.onFHError).name og options.flowVariables har grænser — se Inputgrænser ovenfor. Overtrædelser returnerer HTTP 422, og intet bevares.onFHChatbotFlowVariablesUpdate-event, hvis options.flowVariables blev leveret (se Event-reference).console.warn.Eksempel — proaktivt forslag ved SPA-navigation
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 },
});
});
});
Eksempel — kontekstopdatering alene (ingen Chat Hook forbundet)
Hvis flowet ikke har en Chat Hook-trigger, er kaldet en lydløs 200 — så det samme API kan holde flow_variables synkroniseret uden at udløse noget:
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} og {ChatHook.payload.foo} — værdier sendt via sendHook('x', { foo: 1 }) eksponeres på Chat Hook-triggerens udførelsessti. Kun tilgængelige på den sti, der startes af hook-udløsningen.{flow_variables.foo} — værdier sendt via options.flowVariables flettes ind i sessionens variabel-bag, før triggeren udløses. Hver udførelsessti (inklusive normale Chat Input-udløste brugerbeskeder) kan læse dem.Hvis du vil have, at den næste brugerbesked ser en ny værdi, skal du lægge den i options.flowVariables — payload alene påvirker kun udførelseskørslen, der startes af det hook.
FlowHunt JS API afsender 11 brugerdefinerede events på window-objektet. Alle events bruger CustomEvent
API med bubbles: true og composed: true.
onFHChatbotReadyUdløses, når chatbot-widgetten er fuldt renderet og klar til brug.
onFHChatbotSessionCreatedUdløses, når en ny chatsession oprettes på serveren.
event.detail.sessionId — den nyoprettede sessions ID.onFHChatbotWindowOpenedUdløses, når brugeren åbner chatvinduet. Udløses ikke i indlejret tilstand.
onFHChatbotWindowClosedUdløses, når brugeren lukker chatvinduet. Udløses ikke i indlejret tilstand.
onFHMessageSentUdløses, når brugeren sender en besked.
event.detail.metadata = {
content: 'Hello, I need help with...',
createdAt: '2026-02-19T10:30:00.000Z',
};
onFHMessageReceivedUdløses, når chatbotten modtager og viser et svar.
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 er valgfrit og kun til stede, når en menneskelig agent er involveret.
onFHFormDataSentUdløses, når brugeren indsender formulardata via chatbotten.
event.detail.metadata = {
objectData: { name: 'John', email: 'john@example.com' },
createdAt: '2026-02-19T10:31:00.000Z',
};
onFHFeedbackUdløses, når en bruger giver tommelfinger op / tommelfinger ned-feedback på en chatbot-besked.
event.detail.metadata = {
message_id: 'msg_456',
content: 'Optional feedback text',
feedback: 'P', // 'P' = positive, 'N' = negative
};
onFHToolCallUdløses, når et værktøj eller en handling udføres under flow-behandling. Udløses kun i flowAssistant- og flowAssistantV3-tilstande.
event.detail.metadata = {
metadata: {
flow_id: 'abc123',
message_id: 'msg_789',
message: 'Calling search API...',
},
createdAt: '2026-02-19T10:32:00.000Z',
};
onFHErrorUdløses, når der opstår en fejl under chatbot-drift.
event.detail.metadata = {
metadata: {
flow_id: 'abc123',
message_id: 'msg_err',
message: 'Flow execution failed',
},
createdAt: '2026-02-19T10:33:00.000Z',
};
onFHChatbotFlowVariablesUpdateTilføjet i april 2026.
Udløses efter et vellykket chatbotManager.sendHook(...)-kald, der leverede options.flowVariables. Udløses ikke for sendHook()-kald, der udelader flowVariables.
event.detail = {
variables: {
current_page_url: 'https://example.com/products',
screen_name: 'products',
},
};
Brug det til at observere flettede variabler (f.eks. til at synkronisere din egen host-side-tilstand, til debugging eller til at gen-rendere et UI-element, der afhænger af de samme data).
Der er to måder at abonnere på chatbot-events.
Brug window.addEventListener hvor som helst på din side. Dette virker selv før chatbotten er indlæst:
<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>
For at fjerne en lytter skal du holde fast i handler-referencen:
var handleMessage = function (event) {
console.log(event.detail.metadata);
};
window.addEventListener('onFHMessageReceived', handleMessage);
// Later …
window.removeEventListener('onFHMessageReceived', handleMessage);
Inden i init()-callbacken bruger du chatbot managerens indbyggede metoder:
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);
});
});
| Metode | Parametre | Beskrivelse |
|---|---|---|
onSessionCreated(fn) | fn: () => void | Lyt efter sessionsoprettelse |
onWindowOpened(fn) | fn: () => void | Lyt efter åbning af vinduet |
onWindowClosed(fn) | fn: () => void | Lyt efter lukning af vinduet |
onMessageSent(fn) | fn: (event) => void | Lyt efter brugerbeskeder |
onMessageReceived(fn) | fn: (event) => void | Lyt efter bot-svar |
onFormDataSent(fn) | fn: (event) => void | Lyt efter formularindsendelser |
onFeedback(fn) | fn: (event) => void | Lyt efter brugerfeedback |
onToolCall(fn) | fn: (event) => void | Lyt efter værktøjsudførelser |
onError(fn) | fn: (event) => void | Lyt efter fejl |
openChat() | — | Åbn chatpanelet |
closeChat() | — | Luk chatpanelet |
sendHook(name, payload?, options?) (ny) | name: string, payload?: object, options?: { flowVariables?: object } | Udløs Chat Hook-triggeren i det kørende flow (eller flet options.flowVariables lydløst, hvis ingen trigger er forbundet) |
For at have fuld kontrol over, hvornår chatbotten vises, skjul den flydende standardknap og åbn chatten programmatisk — for eksempel fra din egen brugerdefinerede knap.
<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>
Du kan kombinere skjult aktivering med event listeners for at skabe avancerede interaktioner:
<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>
Et fuldt fungerende eksempel, der demonstrerer konfigurationstilsidesættelser, event-sporing, brugerdefineret chat-aktivering og den nye sendHook()-metode sammen:
<!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>

Lær, hvordan du gør din FlowHunt-chatbot i stand til at besvare kundespørgsmål om produkt-tilgængelighed og ordreleveringsstatus ved at integrere med realtids-A...

En teknisk guide til at mestre avanceret FlowHunt-integration med LiveAgent, med fokus på sprogmålretning, undertrykkelse af markdown, spamfiltrering, API-versi...

Integrer FlowHunt med LiveChat for at aktivere smart AI-til-menneske-eskalering. Implementer AI-chatbots, der automatisk overfører samtaler til LiveChat-agenter...
Cookie Samtykke
Vi bruger cookies til at forbedre din browsingoplevelse og analysere vores trafik. See our privacy policy.