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.
The chat opens from the floating “Open AI assistant” button, which is visible on every admin page once you are logged in, and slides out as a side panel on the right.
This is not the same AI as the AI helpers in forms (suggesting webhook router and email inbox rules, content monitor CSS selectors and so on): the assistant has a separate daily quota (assistantRequestsPerDay), it does not consume the events limit and is not counted against the AI helpers limit (aiRequestsPerDay).
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": "Set up backup monitoring", "params": { "name": "Nightly backup", "intervalSec": 86400, "graceSec": 3600, "alertTitle": "Backup did not run", "alertMessage": "The backup job ping did not arrive in time" }}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 helpers limit:
| Plan | assistantRequestsPerDay |
|---|---|
| Free | 100 |
| Pro | 5000 |
| Business | 100000 |
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). NOTIFLY_URL for cloud Notifly is https://api.notifly.ru:
curl -X POST "$NOTIFLY_URL/assistant/chat" \ -H "X-Notifly-Key: $NOTIFLY_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{"text":"I want to know if the nightly backup fails"}'Response:
{ "threadId": 184, "messageId": 921, "text": "A heartbeat fits backup monitoring: after a successful run the job pings a unique URL, and if the ping does not arrive in time, Notifly sends an alert. Click the button below to create the monitor.", "actions": [ { "kind": "heartbeat", "label": "Set up backup monitoring", "params": { "name": "Nightly backup", "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: $NOTIFLY_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{"threadId":184,"text":"What if the backup runs weekly rather than daily?"}'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 | device token or API token | list of user’s conversations |
GET /assistant/threads/:id/messages | device token or API token | conversation message history |
DELETE /assistant/threads/:id | device token or API token | delete a conversation entirely |
POST /assistant/chat | device token or API token | send a message, receive a response + actions |
GET /assistant/insights | device token or API 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).
Errors of POST /assistant/chat:
| Code | When |
|---|---|
400 | empty text (or the body is not JSON) |
403 | a request with a channel token (A…) or a share token (S…) |
404 | the threadId does not exist or belongs to another user |
429 | the assistant’s daily quota is exhausted |
502 | the LLM call failed; the quota turn has already been charged by then |
503 | no LLM is configured on the server — the assistant is unavailable (no quota is charged) |
GET /assistant/threads/:id/messages and DELETE /assistant/threads/:id also answer 404 for another user’s or a non-existent conversation.
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. In the admin panel these hints are the
“Recommendations” card on the “All messages” home page: you can refresh or
collapse it, and hide an individual recommendation with the “Dismiss” button
(this hides every recommendation with that code and is remembered in the
browser). When there is nothing to report, the card is not shown. The same data
is available through GET /assistant/insights:
curl "$NOTIFLY_URL/assistant/insights" -H "X-Notifly-Key: $NOTIFLY_API_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, API tokens) — the model does not invent facts. Each heuristic yields at most 5 recommendations. The codes are stable and usable in your own logic:
code | What it warns about |
|---|---|
channel_no_recipient | the channel receives events, but the account has no active devices and the channel has no delivery configured — nobody will see the alerts |
delivery_enabled_empty | a delivery method is enabled but its address is empty: email, SMS, call, Slack, Telegram, webhook, Discord, Teams, Mattermost, PagerDuty or Opsgenie |
monitor_flapping | a monitor (regular or HTTP) is unstable: its consecutive failed checks are at least twice the alert threshold |
no_ssl_monitor | a host is checked over HTTPS, but there is no SSL monitor for its TLS certificate expiry |
heartbeat_never_pinged | a heartbeat was created over a day ago and never received a ping |
api_token_no_scope | an API token with write access 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.