[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"doc-\u002Fen\u002Fdocs\u002Fcanaux\u002Fchat-widget":3,"docs-nav-en":372},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"body":10,"_type":366,"_id":367,"_source":368,"_file":369,"_stem":370,"_extension":371},"\u002Fen\u002Fdocs\u002Fcanaux\u002Fchat-widget","canaux",false,"","Web chat widget","Chat widget embeddable on any website with a single JS script: Shadow DOM, no cookies, 8 languages, anti-abuse limits on by default.",{"type":11,"children":12,"toc":358},"root",[13,29,36,115,121,156,168,185,191,196,249,255,304,310],{"type":14,"tag":15,"props":16,"children":17},"element","p",{},[18,21,27],{"type":19,"value":20},"text","The ",{"type":14,"tag":22,"props":23,"children":24},"strong",{},[25],{"type":19,"value":26},"chat widget",{"type":19,"value":28}," is a JS script you embed on your website (marketing, support, app). It opens a conversation window powered by one of your betool pipelines; the agent's replies are displayed as they are generated (streaming).",{"type":14,"tag":30,"props":31,"children":33},"h2",{"id":32},"features",[34],{"type":19,"value":35},"Features",{"type":14,"tag":37,"props":38,"children":39},"ul",{},[40,51,61,87,97],{"type":14,"tag":41,"props":42,"children":43},"li",{},[44,49],{"type":14,"tag":22,"props":45,"children":46},{},[47],{"type":19,"value":48},"One snippet",{"type":19,"value":50}," to paste into your page. No npm dependency; the widget lives in a Shadow DOM, so your site's CSS does not distort it (and vice versa).",{"type":14,"tag":41,"props":52,"children":53},{},[54,59],{"type":14,"tag":22,"props":55,"children":56},{},[57],{"type":19,"value":58},"Public token",{"type":19,"value":60}," — can be regenerated at any time from the editor. No secret on the client side.",{"type":14,"tag":41,"props":62,"children":63},{},[64,69,71,78,80,85],{"type":14,"tag":22,"props":65,"children":66},{},[67],{"type":19,"value":68},"Per-tab continuity",{"type":19,"value":70}," — the conversation identifier is kept in ",{"type":14,"tag":72,"props":73,"children":75},"code",{"className":74},[],[76],{"type":19,"value":77},"sessionStorage",{"type":19,"value":79},": a page reload resumes the thread, closing the tab ends it. The widget sets ",{"type":14,"tag":22,"props":81,"children":82},{},[83],{"type":19,"value":84},"no cookies",{"type":19,"value":86},".",{"type":14,"tag":41,"props":88,"children":89},{},[90,95],{"type":14,"tag":22,"props":91,"children":92},{},[93],{"type":19,"value":94},"8 languages",{"type":19,"value":96}," — the widget's interface follows the visitor's browser language.",{"type":14,"tag":41,"props":98,"children":99},{},[100,105,107,113],{"type":14,"tag":22,"props":101,"children":102},{},[103],{"type":19,"value":104},"Anti-abuse safeguards active by default",{"type":19,"value":106}," — 20 messages per minute per IP, 10 new sessions per minute per IP, 4,000 characters maximum per message (adjustable; ",{"type":14,"tag":72,"props":108,"children":110},{"className":109},[],[111],{"type":19,"value":112},"0",{"type":19,"value":114}," disables a protection). A global cap per widget (20 times the per-IP limit) also blocks floods spread across multiple IPs.",{"type":14,"tag":30,"props":116,"children":118},{"id":117},"setup",[119],{"type":19,"value":120},"Setup",{"type":14,"tag":122,"props":123,"children":124},"ol",{},[125,144],{"type":14,"tag":41,"props":126,"children":127},{},[128,130,135,137,142],{"type":19,"value":129},"In the model editor, configure the ",{"type":14,"tag":22,"props":131,"children":132},{},[133],{"type":19,"value":134},"Start",{"type":19,"value":136}," node with a ",{"type":14,"tag":22,"props":138,"children":139},{},[140],{"type":19,"value":141},"Chat (web widget)",{"type":19,"value":143}," receiver.",{"type":14,"tag":41,"props":145,"children":146},{},[147,149,154],{"type":19,"value":148},"On save, betool generates the public token and displays the ",{"type":14,"tag":22,"props":150,"children":151},{},[152],{"type":19,"value":153},"Embed snippet",{"type":19,"value":155},", ready to copy:",{"type":14,"tag":157,"props":158,"children":163},"pre",{"className":159,"code":161,"language":162,"meta":7},[160],"language-html","\u003Cscript src=\"https:\u002F\u002Fplatform.betool.ai\u002Fwidget\u002Fv1\u002Fwidget.js\">\u003C\u002Fscript>\n\u003Cscript>\n  BetoolChat.init({ token: \"\u003Cwidget-public-token>\" });\n\u003C\u002Fscript>\n","html",[164],{"type":14,"tag":72,"props":165,"children":166},{"__ignoreMap":7},[167],{"type":19,"value":161},{"type":14,"tag":122,"props":169,"children":171},{"start":170},3,[172],{"type":14,"tag":41,"props":173,"children":174},{},[175,177,183],{"type":19,"value":176},"Paste this snippet into the ",{"type":14,"tag":72,"props":178,"children":180},{"className":179},[],[181],{"type":19,"value":182},"\u003Cbody>",{"type":19,"value":184}," tag of your site. The widget appears automatically, at the bottom right by default.",{"type":14,"tag":30,"props":186,"children":188},{"id":187},"customization",[189],{"type":19,"value":190},"Customization",{"type":14,"tag":15,"props":192,"children":193},{},[194],{"type":19,"value":195},"From the receiver configuration:",{"type":14,"tag":37,"props":197,"children":198},{},[199,209,219,229,239],{"type":14,"tag":41,"props":200,"children":201},{},[202,207],{"type":14,"tag":22,"props":203,"children":204},{},[205],{"type":19,"value":206},"Appearance",{"type":19,"value":208}," — displayed title, primary color, position (four corners), launcher shape (tab or bubble) and its label.",{"type":14,"tag":41,"props":210,"children":211},{},[212,217],{"type":14,"tag":22,"props":213,"children":214},{},[215],{"type":19,"value":216},"Texts",{"type":19,"value":218}," — welcome message, input field placeholder, status text (or a translated \"online\" display).",{"type":14,"tag":41,"props":220,"children":221},{},[222,227],{"type":14,"tag":22,"props":223,"children":224},{},[225],{"type":19,"value":226},"Rendering",{"type":19,"value":228}," — markdown display of replies (enabled by default).",{"type":14,"tag":41,"props":230,"children":231},{},[232,237],{"type":14,"tag":22,"props":233,"children":234},{},[235],{"type":19,"value":236},"Page context",{"type":19,"value":238}," — sends with each message the origin and path of the current page (never the query string). Enabled by default, can be disabled.",{"type":14,"tag":41,"props":240,"children":241},{},[242,247],{"type":14,"tag":22,"props":243,"children":244},{},[245],{"type":19,"value":246},"Scope",{"type":19,"value":248}," — restrict the allowed origins.",{"type":14,"tag":30,"props":250,"children":252},{"id":251},"security",[253],{"type":19,"value":254},"Security",{"type":14,"tag":15,"props":256,"children":257},{},[258,259,265,267,272,274,279,281,287,289,295,297,302],{"type":19,"value":20},{"type":14,"tag":72,"props":260,"children":262},{"className":261},[],[263],{"type":19,"value":264},"token",{"type":19,"value":266}," is ",{"type":14,"tag":22,"props":268,"children":269},{},[270],{"type":19,"value":271},"public by design",{"type":19,"value":273},": it only allows talking to the model that carries this receiver. If you list ",{"type":14,"tag":22,"props":275,"children":276},{},[277],{"type":19,"value":278},"allowed origins",{"type":19,"value":280},", a request from another origin is refused server-side (",{"type":14,"tag":72,"props":282,"children":284},{"className":283},[],[285],{"type":19,"value":286},"403",{"type":19,"value":288},"); an empty list (or ",{"type":14,"tag":72,"props":290,"children":292},{"className":291},[],[293],{"type":19,"value":294},"*",{"type":19,"value":296},") imposes no restriction — reserve it for development. To revoke a compromised token: ",{"type":14,"tag":22,"props":298,"children":299},{},[300],{"type":19,"value":301},"regenerate",{"type":19,"value":303}," button next to the public URL, in the receiver configuration (all snippets already in production then stop working).",{"type":14,"tag":30,"props":305,"children":307},{"id":306},"limitations",[308],{"type":19,"value":309},"Limitations",{"type":14,"tag":37,"props":311,"children":312},{},[313,325,353],{"type":14,"tag":41,"props":314,"children":315},{},[316,318,323],{"type":19,"value":317},"No ",{"type":14,"tag":22,"props":319,"children":320},{},[321],{"type":19,"value":322},"co-browsing",{"type":19,"value":324},": the agent does not see the user's page, only its origin and path (if page context is enabled).",{"type":14,"tag":41,"props":326,"children":327},{},[328,329,334,336,343,345,351],{"type":19,"value":317},{"type":14,"tag":22,"props":330,"children":331},{},[332],{"type":19,"value":333},"attachment upload",{"type":19,"value":335}," from the widget. To receive files, use an ",{"type":14,"tag":337,"props":338,"children":340},"a",{"href":339},"\u002Fen\u002Fdocs\u002Fcanaux\u002Femail",[341],{"type":19,"value":342},"email",{"type":19,"value":344}," or ",{"type":14,"tag":337,"props":346,"children":348},{"href":347},"\u002Fen\u002Fdocs\u002Fcanaux\u002Fwebhook",[349],{"type":19,"value":350},"webhook",{"type":19,"value":352}," pipeline.",{"type":14,"tag":41,"props":354,"children":355},{},[356],{"type":19,"value":357},"No conversation resumption from one visit to the next: closing the tab ends the thread.",{"title":7,"searchDepth":359,"depth":359,"links":360},2,[361,362,363,364,365],{"id":32,"depth":359,"text":35},{"id":117,"depth":359,"text":120},{"id":187,"depth":359,"text":190},{"id":251,"depth":359,"text":254},{"id":306,"depth":359,"text":309},"markdown","content:en:docs:2.canaux:4.chat-widget.md","content","en\u002Fdocs\u002F2.canaux\u002F4.chat-widget.md","en\u002Fdocs\u002F2.canaux\u002F4.chat-widget","md",[373],{"title":374,"_path":375,"children":376},"En","\u002Fen",[377],{"title":378,"_path":379,"children":380},"Docs","\u002Fen\u002Fdocs",[381,394,418,446,459,474,487,548],{"title":382,"_path":383,"children":384},"Getting started","\u002Fen\u002Fdocs\u002Fdemarrer",[385,388,391],{"title":386,"_path":387},"Welcome","\u002Fen\u002Fdocs\u002Fdemarrer\u002Fbienvenue",{"title":389,"_path":390},"Create an account","\u002Fen\u002Fdocs\u002Fdemarrer\u002Fcreer-un-compte",{"title":392,"_path":393},"Connect an LLM key","\u002Fen\u002Fdocs\u002Fdemarrer\u002Fbrancher-llm",{"title":395,"_path":396,"children":397},"Channels","\u002Fen\u002Fdocs\u002Fcanaux",[398,401,404,406,407,409,412,415],{"title":399,"_path":400},"Channels overview","\u002Fen\u002Fdocs\u002Fcanaux\u002Fvue-densemble",{"title":402,"_path":403},"Real-time telephony","\u002Fen\u002Fdocs\u002Fcanaux\u002Ftelephone",{"title":405,"_path":339},"Email",{"title":8,"_path":4},{"title":408,"_path":347},"HTTP Webhook",{"title":410,"_path":411},"Messaging (WhatsApp, Messenger, Telegram, Mattermost)","\u002Fen\u002Fdocs\u002Fcanaux\u002Fmessageries",{"title":413,"_path":414},"Meta Lead Ads","\u002Fen\u002Fdocs\u002Fcanaux\u002Ffacebook-leads",{"title":416,"_path":417},"Schedule (cron)","\u002Fen\u002Fdocs\u002Fcanaux\u002Fschedule",{"title":419,"_path":420,"children":421},"Pipelines","\u002Fen\u002Fdocs\u002Fpipelines",[422,425,428,431,434,437,440,443],{"title":423,"_path":424},"The Visual Editor","\u002Fen\u002Fdocs\u002Fpipelines\u002Fediteur-visuel",{"title":426,"_path":427},"AI Agents","\u002Fen\u002Fdocs\u002Fpipelines\u002Fagents",{"title":429,"_path":430},"Deterministic Operators","\u002Fen\u002Fdocs\u002Fpipelines\u002Foperateurs",{"title":432,"_path":433},"Flow Control","\u002Fen\u002Fdocs\u002Fpipelines\u002Fcontrole-flux",{"title":435,"_path":436},"Code Steps","\u002Fen\u002Fdocs\u002Fpipelines\u002Fcode-step",{"title":438,"_path":439},"Sub-pipelines","\u002Fen\u002Fdocs\u002Fpipelines\u002Fsous-pipelines",{"title":441,"_path":442},"No-code actions","\u002Fen\u002Fdocs\u002Fpipelines\u002Factions-no-code",{"title":444,"_path":445},"Knowledge base","\u002Fen\u002Fdocs\u002Fpipelines\u002Fbase-de-connaissances",{"title":447,"_path":448,"children":449},"Supervision","\u002Fen\u002Fdocs\u002Fsupervision",[450,453,456],{"title":451,"_path":452},"Execution History","\u002Fen\u002Fdocs\u002Fsupervision\u002Fexecutions",{"title":454,"_path":455},"Credits & Metering","\u002Fen\u002Fdocs\u002Fsupervision\u002Fcredits-metering",{"title":457,"_path":458},"Benchmarks","\u002Fen\u002Fdocs\u002Fsupervision\u002Fbenchmarks",{"title":254,"_path":460,"children":461},"\u002Fen\u002Fdocs\u002Fsecurite",[462,465,468,471],{"title":463,"_path":464},"Security principles","\u002Fen\u002Fdocs\u002Fsecurite\u002Fprincipes",{"title":466,"_path":467},"Strict multi-tenancy","\u002Fen\u002Fdocs\u002Fsecurite\u002Fmulti-tenant",{"title":469,"_path":470},"GDPR audit & access log","\u002Fen\u002Fdocs\u002Fsecurite\u002Faudit-rgpd",{"title":472,"_path":473},"Sovereign deployment","\u002Fen\u002Fdocs\u002Fsecurite\u002Fdeploiement-souverain",{"title":475,"_path":476,"children":477},"Developers","\u002Fen\u002Fdocs\u002Fdeveloppeurs",[478,481,484],{"title":479,"_path":480},"Admin API","\u002Fen\u002Fdocs\u002Fdeveloppeurs\u002Fapi-admin",{"title":482,"_path":483},"Outbound webhooks","\u002Fen\u002Fdocs\u002Fdeveloppeurs\u002Fwebhooks-sortants",{"title":485,"_path":486},"Drive betool from Claude (MCP)","\u002Fen\u002Fdocs\u002Fdeveloppeurs\u002Fmcp",{"title":488,"_path":489,"children":490},"Integrations","\u002Fen\u002Fdocs\u002Fintegrations",[491,494,497,500,503,506,509,512,515,518,521,524,527,530,533,536,539,542,545],{"title":492,"_path":493},"Integrations overview","\u002Fen\u002Fdocs\u002Fintegrations\u002Fvue-densemble",{"title":495,"_path":496},"Stripe","\u002Fen\u002Fdocs\u002Fintegrations\u002Fstripe",{"title":498,"_path":499},"GitHub","\u002Fen\u002Fdocs\u002Fintegrations\u002Fgithub",{"title":501,"_path":502},"Google","\u002Fen\u002Fdocs\u002Fintegrations\u002Fgoogle",{"title":504,"_path":505},"LinkedIn Ads","\u002Fen\u002Fdocs\u002Fintegrations\u002Flinkedin-ads",{"title":507,"_path":508},"Kavkom","\u002Fen\u002Fdocs\u002Fintegrations\u002Fkavkom",{"title":510,"_path":511},"Jira","\u002Fen\u002Fdocs\u002Fintegrations\u002Fjira",{"title":513,"_path":514},"Slack","\u002Fen\u002Fdocs\u002Fintegrations\u002Fslack",{"title":516,"_path":517},"SMS","\u002Fen\u002Fdocs\u002Fintegrations\u002Fsms",{"title":519,"_path":520},"Enable Banking (open banking)","\u002Fen\u002Fdocs\u002Fintegrations\u002Fenable-banking",{"title":522,"_path":523},"CRM, marketing & productivity","\u002Fen\u002Fdocs\u002Fintegrations\u002Fcrm-marketing",{"title":525,"_path":526},"HeyGen (video)","\u002Fen\u002Fdocs\u002Fintegrations\u002Fheygen",{"title":528,"_path":529},"La Poste","\u002Fen\u002Fdocs\u002Fintegrations\u002Fla-poste",{"title":531,"_path":532},"Industry CRM (beTool Application, Qhare)","\u002Fen\u002Fdocs\u002Fintegrations\u002Fcrm-metier",{"title":534,"_path":535},"Mitti (field inspections)","\u002Fen\u002Fdocs\u002Fintegrations\u002Fmitti",{"title":537,"_path":538},"Meta (Messenger, Pages, Meta Ads)","\u002Fen\u002Fdocs\u002Fintegrations\u002Fmeta",{"title":540,"_path":541},"Onoff Business (Beta)","\u002Fen\u002Fdocs\u002Fintegrations\u002Fonoff",{"title":543,"_path":544},"Smart Life \u002F Tuya (connected devices)","\u002Fen\u002Fdocs\u002Fintegrations\u002Fsmart-life",{"title":546,"_path":547},"beTool products (Desktop, Kiosk, Terminal)","\u002Fen\u002Fdocs\u002Fintegrations\u002Fproduits-betool",{"title":549,"_path":550,"children":551},"Use cases","\u002Fen\u002Fdocs\u002Fcas-usage",[552,555,558,561,564,567],{"title":553,"_path":554},"Typical business agents","\u002Fen\u002Fdocs\u002Fcas-usage\u002Fvue-densemble",{"title":556,"_path":557},"CFO IA","\u002Fen\u002Fdocs\u002Fcas-usage\u002Fcfo-ia",{"title":559,"_path":560},"COO IA","\u002Fen\u002Fdocs\u002Fcas-usage\u002Fcoo-ia",{"title":562,"_path":563},"CTO IA","\u002Fen\u002Fdocs\u002Fcas-usage\u002Fcto-ia",{"title":565,"_path":566},"Product Manager IA","\u002Fen\u002Fdocs\u002Fcas-usage\u002Fproduct-manager-ia",{"title":568,"_path":569},"Personal assistant","\u002Fen\u002Fdocs\u002Fcas-usage\u002Fassistant-personnel"]