Documentation
Everything you need to embed, host, or integrate your AI chatbot.
Quick Start
- 1
Create an account
Sign up at nuovabot.com. Your first chatbot and workspace are provisioned automatically. No credit card required on the Free plan.
- 2
Upload your documents
Go to Knowledge → Upload. Supported formats: PDF, DOCX, TXT. Documents are automatically chunked, embedded, and indexed. Processing typically takes under 30 seconds.
- 3
Deploy your chatbot
Open the Embed & Deploy tab on your chatbot. Choose a deployment method: copy the widget snippet, share the hosted link, or use the API.
Widget Embed
Add a chat bubble to any website with a single script tag. Copy your snippet from the Embed & Deploy tab — it already contains your chatbot's API key.
<script
src="https://nuovabot.com/widget.js"
data-chatbot-id="your-chatbot-id"
data-api-key="your-api-key"
async
></script>The widget renders inside a Shadow DOM — it won't conflict with your existing styles. Lazy-loads after the page is interactive.
Hosted Chat Page
Each chatbot gets a public, branded chat page you can share directly — no embedding required.
https://nuovabot.com/chat/your-chatbot-slugThe slug is shown in your Embed & Deploy tab. You can share this URL in emails, support pages, or anywhere a direct link works better than an embedded widget.
REST API
Description
POST /api/v1/chat
Send a message to your chatbot and receive a streaming SSE response.
curl -X POST https://nuovabot.com/api/v1/chat \
-H "X-API-Key: your-api-key" \
-H "Content-Type: application/json" \
-d '{
"message": "What is your return policy?",
"conversationId": "optional-existing-conversation-id"
}'Request body
| Field | Type | Description |
|---|---|---|
| message | string (required) | The user's message |
| conversationId | string (optional) | Continue an existing conversation. Omit to start a new one. |
SSE Response Format
Responses are streamed as Server-Sent Events. Each event has an event: type and a JSON data: payload.
| Event type | Payload | Description |
|---|---|---|
| token | { "token": "Hello" } | A chunk of the assistant response text |
| done | { "conversationId": "...", "messageId": "...", "model": "claude-haiku-..." } | Stream complete. Contains conversation metadata. |
| error | { "message": "Rate limit exceeded" } | An error occurred. Stream ends after this event. |
| tool_start | { "toolCallId": "...", "toolName": "create_ticket" } | Chatbot is performing an action (e.g. creating a ticket) |
| tool_result | { "toolCallId": "...", "toolName": "create_ticket", "success": true, "result": "TK-0042" } | Action completed. Includes result data. |
Rate Limits
Rate limits are enforced per organization using a sliding window. Exceeding a limit returns HTTP 429.
| Plan | Messages/min | Messages/day | Messages/month |
|---|---|---|---|
| Free | 5 | 100 | 25 |
| Starter | 15 | 300 | 1,000 |
| Pro | 30 | 1,000 | 4,000 |
| Business | 60 | 2,500 | 10,000 |
Authentication
Two authentication methods are supported depending on where you're calling from.
API Key (widget & server-side)
Pass your chatbot's API key in the X-API-Key header.
X-API-Key: your-chatbot-api-keyAPI keys are shown once at chatbot creation. Store them securely — they cannot be retrieved again (only rotated).
Bearer JWT (dashboard & internal)
Dashboard API calls use Supabase session tokens via the Authorization header. This is handled automatically by the dashboard frontend.
Authorization: Bearer <supabase-session-jwt>