KinBot uses Server-Sent Events (SSE) to push real-time updates to the web UI. Connect to the SSE endpoint to receive live notifications about changes.
Requires authentication. Returns a text/event-stream response.
- Connected — Server sends a
connected event with a connectionId
- Ping — Server sends
ping events every 15 seconds to keep the connection alive
- Events — Real-time events are delivered as
message events with JSON data
- Disconnect — Client closes the connection; server cleans up automatically
Each event is a JSON object with a type field and contextual fields:
"kinId": "optional-kin-id",
Real-time message streaming and conversation events.
| Event | Description | Scope |
|---|
chat:message | New message created (user or AI) | Per-Kin |
chat:token | Streaming token chunk during AI response | Per-Kin |
chat:tool-call-start | Tool call started | Per-Kin |
chat:tool-call | Tool call completed | Per-Kin |
chat:tool-result | Tool result received | Per-Kin |
chat:done | AI response finished | Per-Kin |
chat:cleared | Conversation history cleared | Per-Kin |
| Event | Description | Scope |
|---|
reaction:added | Reaction added to a message | Per-Kin |
reaction:removed | Reaction removed from a message | Per-Kin |
| Event | Description | Scope |
|---|
task:status | Task status changed (pending, in_progress, queued, etc.) | Broadcast |
task:done | Task completed or failed | Broadcast |
task:deleted | Task deleted | Broadcast |
queue:update | Concurrency queue state changed (task promoted, new task queued) | Broadcast |
| Event | Description | Scope |
|---|
miniapp:created | A mini-app was created | Broadcast |
miniapp:updated | A mini-app was updated | Broadcast |
miniapp:deleted | A mini-app was deleted | Broadcast |
miniapp:file-updated | A mini-app file was changed | Broadcast |
| Event | Description | Scope |
|---|
memory:created | Memory created | Per-Kin |
memory:updated | Memory updated | Per-Kin |
memory:deleted | Memory deleted | Per-Kin |
| Event | Description | Scope |
|---|
compacting:start | Compaction started | Per-Kin |
compacting:done | Compaction completed (includes summary and memories extracted) | Per-Kin |
compacting:error | Compaction failed (prevents infinite spinner in the UI) | Per-Kin |
| Event | Description | Scope |
|---|
kin:error | Kin processing error | Per-Kin |
kin:created | New Kin created | Broadcast |
kin:updated | Kin metadata changed (avatar, provider, etc.) | Broadcast |
kin:deleted | Kin deleted | Broadcast |
| Event | Description | Scope |
|---|
provider:created | Provider added | Broadcast |
provider:updated | Provider configuration changed | Broadcast |
provider:deleted | Provider removed | Broadcast |
| Event | Description | Scope |
|---|
mcp-server:created | MCP server added | Broadcast |
mcp-server:updated | MCP server config changed or approved | Broadcast |
mcp-server:deleted | MCP server removed | Broadcast |
| Event | Description | Scope |
|---|
contact:created | Contact created | Broadcast |
contact:updated | Contact updated | Broadcast |
contact:deleted | Contact deleted | Broadcast |
| Event | Description | Scope |
|---|
cron:triggered | Cron job triggered | Broadcast |
cron:created | Cron job created | Broadcast |
cron:updated | Cron job updated | Broadcast |
cron:deleted | Cron job deleted | Broadcast |
| Event | Description | Scope |
|---|
webhook:created | Webhook created | Broadcast |
webhook:updated | Webhook updated | Broadcast |
webhook:deleted | Webhook deleted | Broadcast |
webhook:triggered | Webhook received a payload | Per-Kin |
| Event | Description | Scope |
|---|
channel:created | Channel created | Broadcast |
channel:updated | Channel updated | Broadcast |
channel:deleted | Channel deleted | Broadcast |
channel:message-received | Message received from external platform | Per-Kin |
channel:message-sent | Message sent to external platform | Per-Kin |
channel:user-pending | New user pending approval | Broadcast |
channel:user-approved | User approved | Broadcast |
| Event | Description | Scope |
|---|
prompt:pending | New prompt awaiting human response | Per-Kin |
prompt:answered | Human responded to a prompt | Per-Kin |
| Event | Description | Scope |
|---|
notification:new | New notification | Per-User |
notification:read | Notification marked as read | Per-User |
notification:read-all | All notifications marked as read | Per-User |
| Event | Description | Scope |
|---|
quick-session:closed | Quick session closed | Per-Kin |
| Event | Description | Scope |
|---|
knowledge:source-created | Knowledge source added | Per-Kin |
knowledge:source-updated | Knowledge source updated | Per-Kin |
knowledge:source-deleted | Knowledge source deleted | Per-Kin |
| Event | Description | Scope |
|---|
plugin:installed | Plugin installed | Broadcast |
plugin:uninstalled | Plugin uninstalled | Broadcast |
plugin:enabled | Plugin enabled | Broadcast |
plugin:disabled | Plugin disabled | Broadcast |
plugin:configUpdated | Plugin config changed | Broadcast |
plugin:autoDisabled | Plugin auto-disabled due to errors | Broadcast |
| Event | Description | Scope |
|---|
settings:hub-changed | Hub configuration changed | Broadcast |
settings:compacting-threshold-changed | Compacting threshold changed | Broadcast |
| Event | Description | Scope |
|---|
version:update-available | New KinBot version available | Broadcast |
| Event | Description | Scope |
|---|
log:entry | Platform log entry | Broadcast |
Events are delivered based on scope:
- Broadcast — Sent to all connected clients (provider changes, MCP updates, settings)
- Per-Kin — Sent to clients viewing a specific Kin (chat, memories, compacting, reactions)
- Per-User — Sent to a specific user’s connections (notifications)
const evtSource = new EventSource('/api/sse', {
evtSource.onmessage = (event) => {
const data = JSON.parse(event.data)
// Append streaming token to UI
appendToken(data.data.token)
// Finalize message display
refreshMiniApp(data.data.app)
evtSource.onerror = () => {
// EventSource auto-reconnects
console.log('SSE connection lost, reconnecting...')