Ship a bot in an afternoon.
Elennai turns your own content into a support agent that answers on your website, in Slack or through the REST API - and then completes the steps on the page for the visitor. Sign up, connect your content, paste a script tag, you're live. This page is the operator manual - skim the bits you need.
<script
src="https://app.elenn.ai/widget/embed.js"
data-bot-key="el_pub_your_bot_key_here"
data-server="https://app.elenn.ai"
async
></script>Paste before </body> on your site. The exact data-bot-key is shown in your dashboard once you've created a bot.
Four steps from sign-up to live bot.
These are the only steps that matter. Everything below this section is optional polish.
Sign up and create a bot
Sign up free - no card required. From the dashboard, click 'New bot', give it a name and accept the prefilled system prompt (you can tune it later).
Add data
Paste FAQ text, drop in .md / .json files, or connect Notion or Google Drive. Every answer the bot gives is grounded in this corpus.
Paste the embed snippet
Copy the <script> tag from the Embed tab and drop it before </body> on your site. The chat bubble appears in the bottom-right corner.
Test and iterate
Open the Test tab and chat with the bot. Tweak the system prompt, upload more docs, or refine suggested questions until the answers look right.
Let it finish the job on the page.
Answering is the half a visitor can already do themselves. A guided action is the other half: the agent opens the right page and completes the steps on it, with a visible cursor, stopping wherever you told it to stop. The full walkthrough is on the guided actions page.
Record a flow by doing it once
Start the recorder, click through the flow on your own site the way a customer would, and stop. Every step is captured from the real HTML you touched - the element, the field, the order. This is also the answer for anything behind a login: the recorder runs in your browser, in your own session.
Or scan the site and pick from what it finds
Point a scan at your site and it walks the pages it is allowed to reach, collects the forms and controls that are really there, and proposes them grouped into named flows. You review the proposals and save the ones you want. Nothing enters your catalogue on its own.
Decide how far it may go
Guided actions are off until you turn them on, and then on per flow. A flow can be gated so the agent asks before it starts, and any step can be marked sensitive so the run stops there and the visitor makes the last click. A flow you never saved is not something the agent can reach for.
Where a run stops
The agent navigates to the right page and completes the steps on that page. A full page reload ends the run. In a single-page app it can keep going across views if you register your router with the widget. And if no element matches with confidence, the run stops instead of clicking something else.
Everything you can tune per bot.
Each card below maps to a real surface in the dashboard. Open the bot editor and follow the path.
System prompt
Defines tone, persona, and what the bot is allowed to say. The default tells it to ground answers in your documents and refuse questions outside the corpus.
Where to find itBot editor → Settings → System prompt
Widget design
Colours, fonts, header copy, bubble icon, logo. Toggle header_logo_full if the logo gets cropped to a small avatar - the full image then renders edge-to-edge.
Where to find itBot editor → Widget design
Auto-design from URL
Paste a URL and the widget picks colours, fonts, and header text that match the host site. Useful for getting a passable design in one click.
Where to find itWidget design → 'Auto-design from URL'
Suggested questions
Three to five starter prompts shown above the input field. Lowers the cold-start friction for new visitors who don't know what to ask.
Where to find itWidget design → Content section
Embed allowlist
The widget only loads on origins you list explicitly. No wildcards - each subdomain and each local dev port has to be added separately.
Where to find itBot editor → Embed → Allowed domains
CSAT feedback
Optional thumbs-up / thumbs-down on every bot reply, with an optional free-text follow-up. Surfaces in the conversation history so you can review what's working. A live-chat conversation can also end with a short survey once it is resolved.
Where to find itWidget design → CSAT section
Attachments
Visitors can attach a file to a message - the screenshot of the error, the invoice they are asking about. It is on unless you turn it off; you pick the size cap and which formats you accept. The file arrives in the conversation, where your team can preview or download it.
Where to find itBot editor → Widget design → Attachments
Plug in the corpus the bot answers from.
8 ways to feed a bot today. Mix and match - one bot can have your crawled site + manual docs + Notion + Drive + a Postgres connection + your own REST API as a tool all at once.
Website crawler
Give Elennai the address of your site and it reads the pages it is allowed to read - your robots.txt and your sitemap draw the boundary - then indexes what it finds. Re-crawl when the site changes, and read the report: it names the pages that failed, so a dead link in your own documentation is something you can go and fix.
Manual paste, Markdown & JSON
Paste FAQ pairs or full articles, or drop in .md / .json files. The fastest way to seed a brand new bot - no integration setup required.
URL ingest
Submit a URL and Elennai fetches and indexes the page. Good for pulling in a help-centre article or marketing page without copy-paste.
Notion sync
Connect Notion in one click, pick the pages or databases you want, and the bot stays in sync. Daily refresh plus secure real-time sync when you edit a page.
Google Drive sync
Connect a Google account and pick the Docs, Sheets, Slides, PDFs, DOCX, or Markdown files you want. We handle the conversion. Re-sync on demand or wait for the periodic refresh.
HubSpot, in both directions
Ingest your HubSpot knowledge base as a source, and let the bot look a contact up in the middle of a conversation so it knows who it is talking to. Going the other way, a conversation can write a contact, a note or a ticket back to HubSpot, so a chat that mattered does not stay stuck in the widget.
Connect your database
Point the bot at a read-only database. You decide which tables and columns it can see, and which questions it's allowed to ask. The bot never writes raw SQL.
Your REST API as a tool
Plug the bot into your own REST endpoints (e.g. 'look up an order in our CRM'). You describe the endpoint and its parameters; credentials are encrypted at rest, and the bot calls it automatically when a question matches. Included on Pro and Scale, or add it to Starter and Growth with the REST API + database connections add-on.
Where visitors actually talk to the bot.
Same bot, multiple surfaces. The embed widget covers most cases; the REST API and backoffice tester cover the rest. Slack is live too.
Embed widget on your site
One script tag. The widget is isolated from your site's design so neither interferes with the other. Works on any framework - we ship setup tips for Next.js, Astro, Remix, Nuxt, SvelteKit, plain HTML, and most CMSes.
Public REST API
Talk to your bot from your own code with a per-account API key. Same answers, same persona, fully isolated from other customers. Useful when you want the bot in a mobile app or internal tool.
Backoffice chat tester
Every bot has a Test tab in the dashboard where you can chat with the bot directly. It shows the exact passages it pulled, so you can spot-check what it's learning before customers see it.
Slack
Install your bot in any Slack workspace and your team can @-mention it in channels or DMs - same knowledge as on your website. Replies are threaded, and a Slack message counts against your plan exactly like a message from the widget.
The people, the second factor, and the way out.
Everything above is about the bot. This is about the account it lives in: who can touch it, how you prove it is you, and how you leave with your data if you ever want to.
Invite your team and pick roles
Invite colleagues by email from your workspace settings. A role decides what a member can open and change, and permissions are per surface - the person working the live-chat inbox does not need the keys to billing. How many seats you get is a plan question; the pricing page has the table.
Two-factor sign in
Enrol an authenticator app from your profile and keep the single-use recovery codes you are given. From then on the second factor is asked for at every sign-in. One honest detail: resetting your password does not clear the factor, so the recovery codes are the way back in if you lose the phone.
Export the whole workspace
A workspace owner can request a full export - conversations, documents, contacts and settings. It is prepared in the background rather than blocking on a click, and you get a download link when it is ready. The link expires, so fetch it when the mail arrives.
Tie chats to logged-in users.
Anonymous visitors and identified users share one conversation. The agent only treats someone as a known person when your own server has vouched for them, so nobody reads another customer's history by claiming to be them.
One route, and what still works
- 1. Verified, recommended - build
GET /api/elennai/identifyon your own site. It reads your session and returns{ "token": "…" }, a JWT signed HS256 with the agent's identity secret, carryingsub, optionalnameandemail, plusiatand anexpabout four hours out. Answer401when nobody is signed in. Same origin, so an HTTP-only session cookie rides along, and the widget probes it on every page load with nothing to configure in Elennai. The dashboard carries ready-made examples for Node, Next.js, PHP, Python, Rails and .NET. - 2. The same token, handed to the page - if that route is impossible, render
<meta name="elennai:identity-token" content="…">, setwindow.ElennaiUser = { token }, or callwindow.Elennai?.identify({ token }). Mint it server-side the same way, and callwindow.Elennai?.reset()on logout. - 3. Legacy, still accepted - a
user_hash(HMAC-SHA256 of the id with the same secret) sent next toexternal_idkeeps verifying, so existing installs do not break. It never expires, so move to the token when you can. Reading the id straight off the page (DOM selector, localStorage key, cookie, window global) also still works, but a visitor can edit all of those: we show the name and nothing else, with no personal history, no orders and no CRM attribution.
Things that trip people up.
Where the edges are.
Knowing the edges matters. We'd rather be clear up front than oversell and disappoint.
Doesn't browse the live web
The bot only answers from the documents, Notion pages, Drive files, databases, and REST APIs you've configured. It won't go fetch a page on the open web mid-conversation.
Acts inside flows you approved, nothing else
The agent can complete the steps of a flow you recorded or accepted from a scan, on the page that flow lives on. It cannot invent a new flow, and steps you marked sensitive stop and hand the click back to the visitor. There is no e-signature integration and no payment pass-through: the transaction happens on your side, on your page.
A page reload ends a guided run
A run lives in the page it started on. If a step reloads the page the run ends there, and the conversation carries on without it. Single-page apps are the exception: register your router with the widget and a run can continue across views.
Doesn't run untrusted code
Postgres data connections execute parameterised SQL you've pre-defined - the model picks a query by name and supplies parameters. It never writes or runs arbitrary SQL or shell commands.
Doesn't train on your data
We run no ML pipeline that trains on your content. Answers come from Google Cloud (Vertex AI) in europe-west4 (Eemshaven, NL), and what Google may do with what we send is governed by its terms for that service; we will publish the applicable clause on our sub-processor page.
Ready to ship?
Start on the permanent Free tier for small projects. Upgrade when traffic justifies it. No card to start, no contract.