AI assistant (copilot chat)
AI assistant — a chat built into the admin that knows Notifly’s capabilities and helps configure them. You describe a task in natural language (“I want to be notified if the nightly backup didn’t run”, “check that the site is up”), and the assistant replies with a step-by-step instruction with examples and — importantly — offers ready action-buttons that open a pre-filled creation dialog for the required entity.
This is not the same AI as the assistants inside message sending: the assistant has a separate daily quota (assistantRequestsPerDay), it does not consume the events limit and is not counted against the AI assistants limit.
What it can do
Section titled “What it can do”- Answer questions about the platform: what a heartbeat is, how monitor types differ, what limits Free has, how to configure email delivery.
- Suggest actions. When you ask to “create / add / configure” something, the reply includes an action block — a button that opens the creation dialog (heartbeat, monitor, HTTP monitor, content monitor, port monitor, workflow monitor, metric source, email inbox, webhook router, web script or a new channel) with fields already filled. You only need to choose the channel and confirm.
- Diagnose. The assistant sees a short summary of your account: what’s currently
down/degraded/alerting, how many active and online devices there are, quota usage, recent notifications. To questions like “what’s not working” or “why aren’t notifications arriving” it responds based on the actual state (for example, it may point out that all devices aresuspendeddue to the plan limit — and there is physically no one to show notifications to).
Conversations (threads)
Section titled “Conversations (threads)”The chat is multi-turn: the assistant remembers previous messages within the same conversation (up to the last 20 messages are passed into the model context). Each conversation is a separate thread with its own title (taken from the first message).
- The first message without a
threadIdcreates a new conversation — itsthreadIdis returned in the response; pass it in subsequent requests to continue the same dialog. - List of conversations —
GET /assistant/threads, their history —GET /assistant/threads/:id/messages. - A conversation can be deleted entirely —
DELETE /assistant/threads/:id.
Actions (notifly-action)
Section titled “Actions (notifly-action)”When the assistant suggests configuring something, the response contains an array actions. Each element is a pre-fill for a creation dialog, not an automatic change: nothing is created until you confirm in the opened window.
{ "kind": "heartbeat", "label": "Настроить контроль бэкапа", "params": { "name": "Ночной бэкап", "intervalSec": 86400, "graceSec": 3600, "alertTitle": "Бэкап не выполнился", "alertMessage": "Пинг от задачи бэкапа не пришёл вовремя" }}kind— the entity type:heartbeat,monitor,http_monitor,content_monitor,port_monitor,workflow_monitor,metric_source,email_inbox,webhook_router,web_script,application.label— the button caption in the user’s language.params— fields for pre-filling (all optional, any can be modified in the dialog). The channel (appid) is not included in the action — you choose it when confirming.
A single response may contain several actions (for example, create a channel and a heartbeat to it at once). For entities without a creation dialog — interactive questions (ask) and the browser workflow monitor — there is no ready action: the assistant will explain and point you to the appropriate page.
Each dialog turn (one POST /assistant/chat) consumes one request from the assistant’s separate daily quota. The limit depends on the plan and is not included in the overall events limit or the AI assistants limit:
| Plan | assistantRequestsPerDay |
|---|---|
| Free | 100 |
| Pro | 2000 |
| Business | 20000 |
The quota is decremented before calling the model; when exhausted the request returns 429. Reset occurs at 00:00 MSK, like other daily limits. More — Quotas and tariffs.
Example: sending a message
Section titled “Example: sending a message”The minimal request is only text (a new conversation is created automatically):
curl -X POST "$NOTIFLY_URL/assistant/chat" \ -H "X-Notifly-Key: C_ваш_клиентский_токен" \ -H "Content-Type: application/json" \ -d '{"text":"Хочу узнавать, если ночной бэкап не отработал"}'Response:
{ "threadId": 184, "messageId": 921, "text": "Для контроля бэкапа подойдёт heartbeat: задача после успешного завершения «пингует» уникальный URL, а если пинг не пришёл вовремя — Notifly шлёт алерт. Нажмите кнопку ниже, чтобы создать монитор.", "actions": [ { "kind": "heartbeat", "label": "Настроить контроль бэкапа", "params": { "name": "Ночной бэкап", "intervalSec": 86400, "graceSec": 3600 } } ]}To continue the same dialog — add the threadId from the response:
curl -X POST "$NOTIFLY_URL/assistant/chat" \ -H "X-Notifly-Key: C_ваш_клиентский_токен" \ -H "Content-Type: application/json" \ -d '{"threadId":184,"text":"А если бэкап раз в неделю, а не каждый день?"}'In the response actions may be empty (the array absent) — for purely informational questions there will be no buttons.
REST API
Section titled “REST API”| Method and path | Authorization | Purpose |
|---|---|---|
GET /assistant/threads | client-token | list of user’s conversations |
GET /assistant/threads/:id/messages | client-token | conversation message history |
DELETE /assistant/threads/:id | client-token | delete a conversation entirely |
POST /assistant/chat | client-token | send a message, receive a response + actions |
GET /assistant/insights | client-token | proactive recommendations about the account |
Request body of POST /assistant/chat: text (required), threadId (optional — to continue a conversation; without it a new one is created).
Response of POST /assistant/chat: threadId, messageId, text, actions[] (kind, label, params).
Proactive recommendations (insights)
Section titled “Proactive recommendations (insights)”Besides the dialog, the assistant can look at the account itself and point out
what is not fully configured. These cards are shown on the admin dashboard and are
available through GET /assistant/insights:
curl "$NOTIFLY_URL/assistant/insights" -H "X-Notifly-Key: <client-token>"{ "insights": [ { "code": "channel_no_recipient", "severity": "warn", "title": "Nobody can receive the alerts", "detail": "Channels Prod, Staging receive events, but the account has no active devices and delivery is not enabled for them." }, { "code": "no_ssl_monitor", "severity": "info", "title": "No SSL certificate check for example.com", "detail": "The host is checked over HTTPS, but its certificate expiry is not monitored.", "action": { "kind": "monitor", "label": "Create an SSL monitor", "params": {"kind": "ssl", "target": "example.com", "name": "SSL example.com"} } } ], "generatedAt": "2026-06-23T10:00:00Z"}Recommendations are built by deterministic heuristics over a snapshot of the account (channels and their delivery, heartbeats, monitors, devices, MCP tokens) — the model does not invent facts. The codes are stable and usable in your own logic:
code | What it warns about |
|---|---|
channel_no_recipient | the channel has no recipients — there is nowhere to deliver messages |
delivery_enabled_empty | a delivery method is enabled but the address is empty |
monitor_flapping | the monitor is flapping between up and down |
no_ssl_monitor | there is no TLS certificate expiry check |
heartbeat_never_pinged | a heartbeat was created over a day ago and never received a ping |
mcp_token_no_scope | an MCP token was issued without a scope restriction |
Query parameters:
| Parameter | Meaning |
|---|---|
polish=1 | rephrase the texts with the LLM (charges one assistant quota turn; on any error the original wording is returned) |
refresh=1 | rebuild the snapshot without waiting for the cache to expire |
lang | the language of the polished text (ru by default) |
The response is cached for 10 minutes per user — account state changes slowly
while building the snapshot costs about a dozen database queries. A plain call
(without polish=1) does not consume the quota.